Subversion Repositories gelsvn

Rev

Rev 341 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 341 Rev 595
Line -... Line 1...
-
 
1
/* ----------------------------------------------------------------------- *
-
 
2
 * This file is part of GEL, http://www.imm.dtu.dk/GEL
-
 
3
 * Copyright (C) the authors and DTU Informatics
-
 
4
 * For license and list of authors, see ../../doc/intro.pdf
-
 
5
 * ----------------------------------------------------------------------- */
-
 
6
 
-
 
7
#include "obj_save.h"
-
 
8
 
1
#include <fstream>
9
#include <fstream>
2
#include <iostream>
10
#include <iostream>
3
#include <string>
11
#include <string>
-
 
12
#include <vector>
-
 
13
 
-
 
14
#include <CGLA/Vec3f.h>
-
 
15
 
4
#include "obj_save.h"
16
#include "Manifold.h"
5
#include "HMesh/FaceCirculator.h"
17
#include "AttributeVector.h"
6
 
18
 
7
namespace HMesh
19
namespace HMesh
8
{
20
{
9
	using namespace std;
21
    using namespace std;
10
	using namespace CGLA;
22
    using namespace CGLA;
11
	using namespace HMesh;
-
 
12
	
23
 
13
	bool obj_save(const std::string& filename, Manifold& m)
24
    bool obj_save(const string& filename, Manifold& m)
14
	{
25
    {
15
		ofstream os(filename.data());
26
        ofstream os(filename.data());
16
		if(os.bad()) return false;
27
        if(os.bad())
17
		int k=0;
-
 
18
		vector<int> touched_vals(m.no_vertices());
28
            return false;
19
		for(VertexIter vi = m.vertices_begin(); vi != m.vertices_end(); ++vi,++k)
-
 
20
		{
29
 
21
			touched_vals[k] = vi->touched;
30
        VertexAttributeVector<int> vmap;
22
			vi->touched = k+1;
31
        int k = 0;
-
 
32
        for(VertexIDIterator v = m.vertices_begin(); v != m.vertices_end(); ++v){
23
			Vec3f p = vi->pos;
33
            Vec3d p = m.pos(*v);
24
			os << "v "<< p[0] << " " << p[1] << " " << p[2] << "\n";
34
            os << "v "<< p[0] << " " << p[1] << " " << p[2] << "\n";
-
 
35
            vmap[*v] = k++;
-
 
36
        }
25
		}
37
 
26
		for(FaceIter fi = m.faces_begin();fi != m.faces_end(); ++fi)
38
        for(FaceIDIterator f = m.faces_begin(); f != m.faces_end(); ++f){        
27
		{
-
 
28
			std::vector<int> verts;
39
            vector<int> verts;
29
			for(FaceCirculator fc(fi);!fc.end();++fc)
40
            for(Walker w = m.walker(*f); !w.full_circle(); w = w.circulate_face_ccw()){
30
			{
-
 
31
				int vertex_idx = fc.get_vertex()->touched;
41
                int idx = vmap[w.vertex()];			
32
				if(vertex_idx > k)
42
                assert(static_cast<size_t>(idx) < m.no_vertices());
33
				{
-
 
34
					cout << vertex_idx  << " " << k << endl;
43
                // move subscript range from 0..size-1 to 1..size according to OBJ standards
35
					verts.push_back(0);
44
                verts.push_back(idx + 1);
36
				}
45
            }
37
				else
46
			os << "f ";
38
				{
-
 
39
					assert(vertex_idx <= k);
-
 
40
					verts.push_back(vertex_idx);
-
 
41
				}
-
 
42
			}
-
 
43
			assert(verts.size()==3);
47
            for(size_t i = 0; i < verts.size() ; ++i){
44
			for(size_t i=1;i<(verts.size()-1);++i)
48
                os << verts[i] << " ";
45
			{
49
            }
46
				os << "f ";
50
			os<<endl;
47
				os << verts[0] << " " << verts[i] << " " << verts[i+1] << "\n";
-
 
48
			}
51
        }
49
		}
52
 
50
		k=0;
-
 
51
		for(VertexIter vi = m.vertices_begin(); vi != m.vertices_end(); ++vi,++k)
-
 
52
			vi->touched = touched_vals[k];
-
 
53
		return true;
53
        return true;
54
	}
54
    }
55
	
55
 
56
}
56
}