void FLogistics::fillContainer(shared_ptr<FContainer> c, int N, VRTransformPtr t) { for (int i=0; i<N; i++) { auto p = addProduct(); t = static_pointer_cast<VRTransform>(t->duplicate(true)); t->setVisible(true); t->setPersistency(0); p->setTransformation(t); c->add( p ); } }
shared_ptr<FContainer> FLogistics::addContainer(VRTransformPtr t) { if (t == 0) return 0; auto c = shared_ptr<FContainer>(new FContainer()); t = static_pointer_cast<VRTransform>(t->duplicate(true)); t->setVisible(true); t->setPersistency(0); c->setTransformation(t); objects[c->getID()] = c; return c; }
PyObject* VRScriptManager::loadGeometry(VRScriptManager* self, PyObject *args, PyObject *kwargs) { const char* path = ""; int ignoreCache = 0; const char* preset = "OSG"; const char* parent = ""; const char* kwlist[] = {"path", "cached", "preset", "parent", NULL}; string format = "s|iss:loadGeometry"; if (! PyArg_ParseTupleAndKeywords(args, kwargs, format.c_str(), (char**)kwlist, &path, &ignoreCache, &preset, &parent)) return NULL; VRObjectPtr prnt = VRSceneManager::getCurrent()->getRoot()->find( parent ); VRTransformPtr obj = VRImport::get()->load( path, prnt, ignoreCache, preset); if (obj == 0) { VRGuiManager::get()->printInfo("Warning: " + string(path) + " not loaded!\n"); Py_RETURN_NONE; } obj->setPersistency(0); return VRPyTypeCaster::cast(obj); }
VRTransformPtr VRFactory::loadVRML(string path) { // wrl filepath ifstream file(path); if (!file.is_open()) { cout << "file " << path << " not found" << endl; return 0; } // get file size file.seekg(0, ios_base::end); size_t fileSize = file.tellg(); file.seekg(0, ios_base::beg); VRProgress prog("load VRML " + path, fileSize); int state = 0; map<int, string> states; states[0] = "Transform "; // 0 states[1] = "diffuseColor "; // 6 states[2] = "coord "; // 21 +2 states[3] = "normal "; // x +2 states[4] = "coordIndex "; // x +1 states[5] = "colorIndex "; // x +1 states[6] = "normalIndex "; // x +1 Vec3f color; Vec3f last_col(-1,-1,-1); Geo geo; Pnt3f v; Vec3f n; int i; //vector<VRGeometryPtr> geos; vector<Geo> geos; map<Vec3f, VRMaterialPtr> mats; bool new_obj = true; bool new_color = true; int li = 0; string line; while ( getline(file, line) ) { prog.update( line.size() ); li++; for (auto d : states) { //if ( line[d.second.size()-1] != ' ') continue; // optimization if ( line.compare(0, d.second.size(), d.second) == 0) { //if (state != d.first) cout << "got on line " << li << ": " << states[d.first] << " instead of: " << states[state] << endl; switch (d.first) { case 0: break; case 1: new_obj = true; if (line.size() > 12) color = toVec3f( line.substr(12) ); if (mats.count(color) == 0) { mats[color] = VRMaterial::create("fmat"); mats[color]->setDiffuse(color); } if (color != last_col) { new_color = true; last_col = color; } break; case 2: geo.updateN(); break; case 3: break; case 4: break; case 5: break; } state = d.first+1; if (state == 7) state = 0; break; } } if (line[0] != ' ') continue; if (state == 6) continue; // skip color indices stringstream ss(line); switch (state) { case 3: while(ss >> v[0] && ss >> v[1] && ss >> v[2] && ss.get()) { if (!new_color && new_obj) new_obj = !geo.inBB(v); // strange artifacts!! geo.updateBB(v); if (new_obj) { new_obj = false; new_color = false; geo.init(geos, mats[color]); } geo.pos->addValue(v); } break; case 4: while(ss >> n[0] && ss >> n[1] && ss >> n[2] && ss.get()) geo.norms->addValue( n ); break; case 5: while(ss >> i && ss.get()) if (i >= 0) geo.inds_p->addValue( geo.Np + i ); break; case 0: while(ss >> i && ss.get()) if (i >= 0) geo.inds_n->addValue( geo.Nn + i ); break; } } file.close(); cout << "\nloaded " << geos.size() << " geometries" << endl; VRTransformPtr res = VRTransform::create("factory"); res->setPersistency(0); for (auto g : geos) { //Vec3f d = g.vmax - g.vmin; //if (d.length() < 0.1) continue; // skip very small objects if (g.inds_n->size() != g.inds_p->size()) { // not happening cout << " wrong indices lengths: " << g.inds_p->size() << " " << g.inds_n->size() << endl; continue; } if (g.inds_p->size() == 0) { // not happening cout << " empty geo: " << g.inds_p->size() << " " << g.inds_n->size() << endl; continue; } res->addChild(g.geo); GeoUInt32PropertyRecPtr Length = GeoUInt32Property::create(); Length->addValue(g.geo->getMesh()->getIndices()->size()); g.geo->setLengths(Length); } cout << "\nloaded2 " << res->getChildrenCount() << " geometries" << endl; return res; }