MaterialRecPtr VRMesure::setTransMat() { SimpleMaterialRecPtr mat = SimpleMaterial::create(); mat->setDiffuse(Color3f(0.7,0.7,0.7)); mat->setAmbient(Color3f(0.2, 0.2, 0.2)); mat->setTransparency(0.7); return mat; }
VRGeometryPtr loadPly(string filename) { GeoUInt8PropertyRecPtr Type = GeoUInt8Property::create(); GeoUInt32PropertyRecPtr Length = GeoUInt32Property::create(); GeoPnt3fPropertyRecPtr Pos = GeoPnt3fProperty::create(); GeoVec3fPropertyRecPtr Norms = GeoVec3fProperty::create(); GeoVec3fPropertyRecPtr Cols = GeoVec3fProperty::create(); GeoUInt32PropertyRecPtr Indices = GeoUInt32Property::create(); SimpleMaterialRecPtr Mat = SimpleMaterial::create(); GeoVec2fPropertyRecPtr Tex = GeoVec2fProperty::create(); Mat->setLit(false); Mat->setDiffuse(Color3f(0.8,0.8,0.6)); Mat->setAmbient(Color3f(0.4, 0.4, 0.2)); Mat->setSpecular(Color3f(0.1, 0.1, 0.1)); ifstream file(filename.c_str()); string line; list<element> elements; while (getline(file, line)) { if (line == "end_header") break; auto data = splitString(line, ' '); if (data[0] == "element") elements.push_back( element(data[1], toInt(data[2]) ) ); if (data[0] == "property") { if (data.size() == 3) elements.back().properties.push_back( property(data[1], data[2]) ); else elements.back().properties.push_back( property(data[1], data[2]) ); } } int N = 0; for (auto e : elements) N += e.N; VRProgress progress("load PLY " + filename, N); for (auto e : elements) { if (e.type == "vertex") { Vec3f p, n; Vec3i c; Vec2f t; bool doP = 0, doN = 0, doC = 0, doT = 0; for (int i=0; i<e.N; i++) { progress.update(1); getline(file, line); istringstream iss(line); for (auto prop : e.properties) { if (prop.name == "x") { iss >> p[0]; doP = 1; } if (prop.name == "y") { iss >> p[1]; doP = 1; } if (prop.name == "z") { iss >> p[2]; doP = 1; } if (prop.name == "nx") { iss >> n[0]; doN = 1; }
/** Create a mesh using vectors with positions, normals, indices && optionaly texture coordinates **/ void VRGeometry::create(int type, vector<Vec3f> pos, vector<Vec3f> norms, vector<int> inds, vector<Vec2f> texs) { bool doTex = (texs.size() == pos.size()); GeoUInt8PropertyRecPtr Type = GeoUInt8Property::create(); GeoUInt32PropertyRecPtr Length = GeoUInt32Property::create(); GeoPnt3fPropertyRecPtr Pos = GeoPnt3fProperty::create(); GeoVec3fPropertyRecPtr Norms = GeoVec3fProperty::create(); GeoUInt32PropertyRecPtr Indices = GeoUInt32Property::create(); SimpleMaterialRecPtr Mat = SimpleMaterial::create(); GeoVec2fPropertyRecPtr Tex = 0; if (doTex) Tex = GeoVec2fProperty::create(); Type->addValue(type); Length->addValue(inds.size()); //positionen und Normalen for(uint i=0;i<pos.size();i++) { Pos->addValue(pos[i]); Norms->addValue(norms[i]); if (doTex) Tex->addValue(texs[i]); } for(uint i=0;i<inds.size();i++) { Indices->addValue(inds[i]); } Mat->setDiffuse(Color3f(0.8,0.8,0.6)); Mat->setAmbient(Color3f(0.4, 0.4, 0.2)); Mat->setSpecular(Color3f(0.1, 0.1, 0.1)); GeometryRecPtr geo = Geometry::create(); geo->setTypes(Type); geo->setLengths(Length); geo->setIndices(Indices); geo->setPositions(Pos); geo->setNormals(Norms); if (doTex) geo->setTexCoords(Tex); geo->setMaterial(Mat); setMesh(geo); }
void VRBlinds::create() { vector<Vec3f> norms; vector<int> inds; vector<Vec2f> texs; for (int i=0;i<20;i++) {//20 blend elements bl_pos_closed.push_back(Vec3f(0.55, -0.07*i, 0)); bl_pos_closed.push_back(Vec3f(0.55, -0.07*(i+0.3), -0.04)); bl_pos_closed.push_back(Vec3f(0.55, -0.07*(i+0.9), -0.08)); bl_pos_closed.push_back(Vec3f(-0.55, -0.07*(i+0.9), -0.08)); bl_pos_closed.push_back(Vec3f(-0.55, -0.07*(i+0.3), -0.04)); bl_pos_closed.push_back(Vec3f(-0.55, -0.07*i, 0)); bl_pos_open.push_back(Vec3f(0.55, -0.01*i, 0)); bl_pos_open.push_back(Vec3f(0.55, -0.01*(i-0.7), -0.05)); bl_pos_open.push_back(Vec3f(0.55, -0.01*i, -0.1)); bl_pos_open.push_back(Vec3f(-0.55, -0.01*i, -0.1)); bl_pos_open.push_back(Vec3f(-0.55, -0.01*(i-0.7), -0.05)); bl_pos_open.push_back(Vec3f(-0.55, -0.01*i, 0)); inds.push_back(i*6+0);//quad1 inds.push_back(i*6+1);//quad1 inds.push_back(i*6+4);//quad1 inds.push_back(i*6+5);//quad1 for (int j=1;j<5;j++) inds.push_back(i*6+j);//quad2 for (int j=0;j<6;j++) norms.push_back(Vec3f(0,1,0)); texs.push_back(Vec2f(1,0)); texs.push_back(Vec2f(1,0.5)); texs.push_back(Vec2f(1,1)); texs.push_back(Vec2f(0,1)); texs.push_back(Vec2f(0,0.5)); texs.push_back(Vec2f(0,0)); } blend_geo = new VRGeometry("blend"); blend_geo->create(GL_QUADS, bl_pos_open, norms, inds, texs); Vec3f pos = window->getGeometricCenter(); Vec3f norm = window->getAverageNormal(); norm.normalize(); pos[2] = window->getMax(2); Matrix m = window->getWorldMatrix(); m.mult(pos, pos); m.mult(norm, norm); blend_geo->setPose(pos, pos + norm, Vec3f(0,1,0)); scene->add(blend_geo); SimpleMaterialRecPtr mat = SimpleMaterial::create(); mat->setDiffuse(Color3f(0.5,0.5,0.5)); mat->setAmbient(Color3f(0.2, 0.2, 0.2)); mat->setSpecular(Color3f(0.1, 0.1, 0.1)); blend_geo->setMaterial(mat); }