diff --git a/src/Objects/newmat.cxx b/src/Objects/newmat.cxx index c2f32754f..c15c9849d 100644 --- a/src/Objects/newmat.cxx +++ b/src/Objects/newmat.cxx @@ -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()); diff --git a/src/Objects/newmat.hxx b/src/Objects/newmat.hxx index 57a9e9df9..fedfda1d4 100644 --- a/src/Objects/newmat.hxx +++ b/src/Objects/newmat.hxx @@ -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; diff --git a/src/Objects/obj.cxx b/src/Objects/obj.cxx index 479e5a56a..ff7e5ed72 100644 --- a/src/Objects/obj.cxx +++ b/src/Objects/obj.cxx @@ -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); } }