VRLodPtr getSpace(Vec4i p) { if (lod_spaces.count(p)) return lod_spaces[p]; VRLodPtr l = VRLod::create("lod_space"); l->addChild( VRObject::create("lod_entry") ); l->addDistance(max(15*p[3]/scale, 1.0f)); l->setCenter( Vec3f(p[0], p[1], p[2])/scale ); addChild(l); lod_spaces[p] = l; return l; }
VRObjectPtr VRFactory::setupLod(vector<string> paths) { vector<VRObjectPtr> objects; for (auto p : paths) { auto res = VRTransform::create("factory"); loadVRML(p,0,res); objects.push_back( res ); } Vec3f p; commitChanges(); cout << "setupLod - changes commited\n"; if (objects.size() == 0) return 0; // use all geometry to create micro lods VRObjectPtr root = VRObject::create("factory_lod_root"); root->setPersistency(0); vector<VRLodPtr> micro_lods; for (uint i = 0; i<objects.size(); i++) { vector<VRObjectPtr> geos = objects[i]->getChildren(true, "Geometry"); VRProgress prog("setup factory LODs ", geos.size()); for (auto g : geos) { prog.update(1); VRLodPtr lod = VRLod::create("factory_lod"); lod->addChild(g); lod->addEmpty(); lod->setCenter( g->getBBCenter() ); lod->setDistance(0, max(g->getBBMax()*15, 1.0f)); micro_lods.push_back(lod); } } commitChanges(); // use the micro lods to create space lods VRLODSpacePtr lodspace = VRLODSpace::create(); for (auto l : micro_lods) { lodspace->add(l); } root->addChild(lodspace); lodspace->finalize(); return root; }