]> git.mxchange.org Git - flightgear.git/commitdiff
put a separate LOD node in front of ever random object so we can randomize
authorcurt <curt>
Tue, 16 Jul 2002 20:43:40 +0000 (20:43 +0000)
committercurt <curt>
Tue, 16 Jul 2002 20:43:40 +0000 (20:43 +0000)
the exact pop in location of each object ... this allows us to put some objects further out and perhaps hide the popping just a tiny bit?

src/Objects/newmat.cxx
src/Objects/newmat.hxx
src/Objects/obj.cxx

index c2f32754fc3f5bbc341149250956b67a8ce0975a..c15c9849da62dbf8693255c93a5b16857672eaa8 100644 (file)
@@ -91,7 +91,7 @@ FGNewMat::FGNewMat (ssgSimpleState * s)
 
 FGNewMat::~FGNewMat (void)
 {
-  for (int i = 0; i < objects.size(); i++)
+  for (unsigned int i = 0; i < objects.size(); i++)
     objects[i].model->deRef();
 }
 
@@ -145,7 +145,7 @@ FGNewMat::read_properties (const SGPropertyNode * props)
 
   vector<SGPropertyNode_ptr> object_nodes =
     ((SGPropertyNode *)props)->getChildren("object");
-  for (int i = 0; i < object_nodes.size(); i++) {
+  for (unsigned int i = 0; i < object_nodes.size(); i++) {
     const SGPropertyNode * object_node = object_nodes[i];
     if (object_node->hasChild("path")) {
       Object object;
@@ -154,19 +154,22 @@ FGNewMat::read_properties (const SGPropertyNode * props)
       ssgTexturePath((char *)path.dir().c_str());
       ssgEntity * model = ssgLoad((char *)path.c_str());
       if (model != 0) {
-       float ranges[] = {0, object_node->getDoubleValue("range-m", 2000)};
-       object.model = new ssgRangeSelector;
-       ((ssgRangeSelector *)object.model)->setRanges(ranges, 2);
+          // float ranges[] = {0, object_node->getDoubleValue("range-m", 2000)};
+          // object.model = new ssgRangeSelector;
+          // ((ssgRangeSelector *)object.model)->setRanges(ranges, 2);
        if (object_node->getBoolValue("billboard", false)) {
          ssgCutout * cutout = new ssgCutout(false);
          cutout->addKid(model);
-         ((ssgBranch *)object.model)->addKid(cutout);
+         // ((ssgBranch *)object.model)->addKid(cutout);
+         object.model = cutout;
        } else {
-         ((ssgBranch *)object.model)->addKid(model);
+            // ((ssgBranch *)object.model)->addKid(model);
+            object.model = model;
        }
        object.model->ref();
        object.coverage = object_node->getDoubleValue("coverage", 100000);
        object.group_lod = object_node->getDoubleValue("group-range-m", 5000);
+       object.lod = object_node->getDoubleValue("range-m", 2000);
        objects.push_back(object);
       } else {
        SG_LOG(SG_INPUT, SG_ALERT, "Failed to load object " << path.str());
index 57a9e9df94a898055d656165de76e9ddf2c8769f..fedfda1d4d704b795a3f07886a3643effcd844c5 100644 (file)
@@ -175,6 +175,14 @@ public:
   }
 
 
+  /**
+   * Get the target LOD range for a dynamic object for this material.
+   */
+  virtual double get_object_lod (int i) const {
+    return objects[i].lod;
+  }
+
+
   /**
    * Get the current state.
    */
@@ -254,6 +262,7 @@ private:
     ssgEntity * model;
     double coverage;
     double group_lod;
+    double lod;
   };
 
   vector<Object> objects;
index 479e5a56a397634dfef5840d6a10ded8112fa9b4..ff7e5ed72050d1c3191748ecfb493acaa0ec158c 100644 (file)
@@ -391,7 +391,18 @@ gen_random_surface_objects (ssgLeaf *leaf,
                sgPostMultMat4(OBJ, OBJ_pos);
                ssgTransform * pos = new ssgTransform;
                pos->setTransform(OBJ);
-               pos->addKid(mat->get_object(j));
+                float obj_range = mat->get_object_lod(j);
+                float range_div = (sg_random() * obj_range);
+                if (range_div < 0.0000001) {
+                    // avoid a divide by zero error
+                    range_div = 1.0;
+                }
+                float random_range = 160.0 * obj_range / range_div + obj_range;
+                float ranges[] = {0, random_range};
+                ssgRangeSelector *range = new ssgRangeSelector;
+                range->setRanges(ranges, 2);
+                range->addKid(mat->get_object(j));
+                pos->addKid(range);
                location->addKid(pos);
                num -= 1.0;
              }
@@ -407,9 +418,20 @@ gen_random_surface_objects (ssgLeaf *leaf,
                  sgMakeTransMat4(OBJ_pos, result);
                  sgCopyMat4(OBJ, ROT);
                  sgPostMultMat4(OBJ, OBJ_pos);
-                 ssgTransform * pos = new ssgTransform;
-                 pos->setTransform(OBJ);
-                 pos->addKid(mat->get_object(j));
+                 ssgTransform * pos = new ssgTransform;
+                 pos->setTransform(OBJ);
+                  float obj_range = mat->get_object_lod(j);
+                  float range_div = (sg_random() * obj_range);
+                  if (range_div < 0.0000001) {
+                      // avoid a divide by zero error
+                      range_div = 1.0;
+                  }
+                  float random_range = 160.0 * obj_range / range_div + obj_range;
+                  float ranges[] = {0, random_range};
+                  ssgRangeSelector *range = new ssgRangeSelector;
+                  range->setRanges(ranges, 2);
+                  range->addKid(mat->get_object(j));
+                 pos->addKid(range);
                  location->addKid(pos);
                }
              }