]> git.mxchange.org Git - simgear.git/commitdiff
Add the ability to set three levels of detail for static scenery using the property...
authorehofman <ehofman>
Sun, 28 Sep 2003 08:38:48 +0000 (08:38 +0000)
committerehofman <ehofman>
Sun, 28 Sep 2003 08:38:48 +0000 (08:38 +0000)
simgear/scene/model/animation.cxx
simgear/scene/model/animation.hxx
simgear/scene/model/model.cxx

index 928d90f112b1f14d90f01f0d724eb00e67319e21..8988c3399767214327accdc88dc3e3f681ea1566 100644 (file)
@@ -97,7 +97,7 @@ set_scale (sgMat4 &matrix, double x, double y, double z)
 static void
 change_alpha( ssgBase *_branch, float _blend )
 {
-  unsigned int i;
+  int i;
 
   for (i = 0; i < ((ssgBranch *)_branch)->getNumKids(); i++)
     change_alpha( ((ssgBranch *)_branch)->getKid(i), _blend );
@@ -214,19 +214,55 @@ SGNullAnimation::~SGNullAnimation ()
 // Implementation of SGRangeAnimation
 ////////////////////////////////////////////////////////////////////////
 
-SGRangeAnimation::SGRangeAnimation (SGPropertyNode_ptr props)
-  : SGAnimation(props, new ssgRangeSelector)
+SGRangeAnimation::SGRangeAnimation (SGPropertyNode *prop_root,
+                                    SGPropertyNode_ptr props)
+  : SGAnimation(props, new ssgRangeSelector),
+    _min(0.0), _max(0.0)
 {
-    float ranges[] = { props->getFloatValue("min-m", 0),
-                       props->getFloatValue("max-m", 5000) };
+    float ranges[2];
+
+    SGPropertyNode_ptr node = props->getChild( "min-property" );
+    if (node != 0) {
+       _min_prop = (SGPropertyNode *)prop_root->getNode(node->getStringValue(), true);
+       ranges[0] = _min_prop->getFloatValue();
+    } else {
+       ranges[0] = _min = props->getFloatValue("min-m", 0);
+    }
+    node = props->getChild( "max-property" );
+    if (node != 0) {
+       _max_prop = (SGPropertyNode *)prop_root->getNode(node->getStringValue(), true);
+       ranges[1] = _max_prop->getFloatValue();
+    } else {
+       ranges[1] = _max = props->getFloatValue("max-m", 0);
+    }
     ((ssgRangeSelector *)_branch)->setRanges(ranges, 2);
-                       
 }
 
 SGRangeAnimation::~SGRangeAnimation ()
 {
 }
 
+void
+SGRangeAnimation::update()
+{
+    float ranges[2];
+    bool upd = false;
+    if (_min_prop != 0) {
+       ranges[0] = _min_prop->getFloatValue();
+       upd = true;
+    } else {
+       ranges[0] = _min;
+    }
+    if (_max_prop != 0) {
+       ranges[1] = _max_prop->getFloatValue();
+       upd = true;
+    } else {
+       ranges[1] = _max;
+    }
+    if (upd)
+       ((ssgRangeSelector *)_branch)->setRanges(ranges, 2);
+}
+
 
 \f
 ////////////////////////////////////////////////////////////////////////
index c5079b594ab0da93a6b272f904161835ee21d1dc..609c33d5dd63d3d9edfd10b7dff6ed3f48bf7f83 100644 (file)
@@ -99,8 +99,15 @@ public:
 class SGRangeAnimation : public SGAnimation
 {
 public:
-  SGRangeAnimation (SGPropertyNode_ptr props);
+  SGRangeAnimation (SGPropertyNode *prop_root,
+                    SGPropertyNode_ptr props);
   virtual ~SGRangeAnimation ();
+  virtual void update();
+private:
+  SGPropertyNode_ptr _min_prop;
+  SGPropertyNode_ptr _max_prop;
+  float _min;
+  float _max;
 };
 
 
index 9d387ae286faed145f74a52938e447b184232665..757c3d2c84994e4bdb4b0b683f44a19c33f00a84 100644 (file)
@@ -107,7 +107,7 @@ sgMakeAnimation( ssgBranch * model,
   if (!strcmp("none", type)) {
     animation = new SGNullAnimation(node);
   } else if (!strcmp("range", type)) {
-    animation = new SGRangeAnimation(node);
+    animation = new SGRangeAnimation(prop_root, node);
   } else if (!strcmp("billboard", type)) {
     animation = new SGBillboardAnimation(node);
   } else if (!strcmp("select", type)) {