Beispiel #1
0
Mesh::Mesh(const string &file)
    : scale(1.)
{
    int i;
#define OUT { vertices.clear(); edges.clear(); return; }
    ifstream obj(file.c_str());
    
    if(!obj.is_open()) {
        Debugging::out() << "Error opening file " << file << endl;
        return;
    }
    
    Debugging::out() << "Reading " << file << endl;
    
    if(file.length() < 4) {
        Debugging::out() << "I don't know what kind of file it is" << endl;
        return;
    }
    
    if(string(file.end() - 4, file.end()) == string(".obj"))
        readObj(obj);
    else if(string(file.end() - 4, file.end()) == string(".ply"))
        readPly(obj);        
    else if(string(file.end() - 4, file.end()) == string(".off"))
        readOff(obj);        
    else if(string(file.end() - 4, file.end()) == string(".gts"))
        readGts(obj);
    else if(string(file.end() - 4, file.end()) == string(".stl"))
        readStl(obj);        
    else {
        Debugging::out() << "I don't know what kind of file it is" << endl;
        return;
    }
    
    //reconstruct the rest of the information
    int verts = vertices.size();
    
    if(verts == 0)
        return;
    
    for(i = 0; i < (int)edges.size(); ++i) { //make sure all vertex indices are valid
        if(edges[i].vertex < 0 || edges[i].vertex >= verts) {
            Debugging::out() << "Error: invalid vertex index " << edges[i].vertex << endl;
            OUT;
        }
    }
    
    fixDupFaces();
    
    computeTopology();
    
    if(integrityCheck())
        Debugging::out() << "Successfully read " << file << ": " << vertices.size() << " vertices, " << edges.size() << " edges" << endl;
    else
        Debugging::out() << "Somehow read " << file << ": " << vertices.size() << " vertices, " << edges.size() << " edges" << endl;
    
    computeVertexNormals();
}
Beispiel #2
0
Mesh::Mesh(const string& file, int camNum/*=0*/)
{
#ifndef _EXEC_FAST
	printf("%s%s","Reading ",file.c_str());
#endif

	ifstream obj(file.c_str());

	if(!obj.is_open()) { printf("can not read the mesh file!\n"); return;}

	if(file.length() < 4)
		return;

	if(string(file.end() - 4, file.end()) == string(".off"))
		ReadOff(obj,camNum);     
	else if(string(file.end() - 5, file.end()) == string(".mesh"))
		ReadMesh(obj, camNum);
	else if(string(file.end() - 6, file.end()) == string(".dmesh"))
		ReadMesh(obj,camNum);
	else
		return;

	obj.close();

	int verts = int(vertices.size());
	if(verts == 0)
		return;

	for(int i = 0; i < (int)edges.size(); ++i)					//保证所有的顶点都是有效的
	{ 
		if(edges.at(i).vertex<0||edges.at(i).vertex>=verts)
		{
			vertices.clear(); 
			edges.clear(); 
			cout<<"error!"<<i<<endl;
			return;
		}
	}

	computeVertexNormals();
#ifndef _EXEC_FAST
	printf(" success!\n");
#endif
}
TriangleMeshSmoother::TriangleMeshSmoother(osg::Geometry& geometry, float creaseAngle, bool comparePosition, int mode):
    _geometry(geometry),
    _creaseAngle(creaseAngle),
    _graph(0),
    _mode(mode)
{
    if(!_geometry.getVertexArray() || !_geometry.getVertexArray()->getNumElements()) {
        return;
    }

    osgUtil::SharedArrayOptimizer deduplicator;
    deduplicator.findDuplicatedUVs(geometry);

    // duplicate shared arrays as it isn't safe to duplicate vertices when arrays are shared.
    if (geometry.containsSharedArrays()) {
        geometry.duplicateSharedArrays();
    }

    if(!_geometry.getNormalArray() || _geometry.getNormalArray()->getNumElements() != _geometry.getVertexArray()->getNumElements()) {
        _geometry.setNormalArray(new osg::Vec3Array(_geometry.getVertexArray()->getNumElements()), osg::Array::BIND_PER_VERTEX);
    }

    // build a unifier to consider deduplicated vertex indices
    _graph = new TriangleMeshGraph(_geometry, comparePosition);

    unsigned int nbTriangles = 0;
    for(unsigned int i = 0 ; i < _geometry.getNumPrimitiveSets() ; ++ i) {
        osg::PrimitiveSet* primitive = _geometry.getPrimitiveSet(i);

        if(!primitive || !primitive->getNumIndices()) {
            continue;
        }
        else if(primitive->getMode() > osg::PrimitiveSet::TRIANGLES) {
            OSG_INFO << "[smoother] Cannot smooth geometry '" << _geometry.getName()
                        << "' due to not tessellated primitives" << std::endl;
            return;
        }
        else if(primitive->getMode() == osg::PrimitiveSet::TRIANGLES) {
            nbTriangles += primitive->getNumIndices() / 3;
        }
    }
    _triangles.reserve(nbTriangles);

    // collect all buffers that are BIND_PER_VERTEX for eventual vertex duplication
    addArray(_geometry.getVertexArray());
    addArray(_geometry.getColorArray());
    addArray(_geometry.getSecondaryColorArray());
    addArray(_geometry.getFogCoordArray());
    for(unsigned int i = 0; i < _geometry.getNumTexCoordArrays(); ++ i) {
        addArray(_geometry.getTexCoordArray(i));
    }
    for(unsigned int i = 0; i < _geometry.getNumVertexAttribArrays(); ++ i) {
        addArray(_geometry.getVertexAttribArray(i));
    }

    switch(_mode) {
        case recompute:
            computeVertexNormals();
            break;
        case smooth_all:
            smoothVertexNormals(true, true);
            break;
        case smooth_flipped:
            smoothVertexNormals(true, false);
            break;
        case diagnose:
            smoothVertexNormals(false, false);
            break;
    };

    // deduplicate UVs array that were only shared within the geometry
    deduplicator.deduplicateUVs(geometry);
}