Subversion Repositories gelsvn

Rev

Rev 39 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 39 Rev 119
1
#pragma warning(disable: 4786) // disable warning C4786: symbol greater than 255 
1
#pragma warning(disable: 4786) // disable warning C4786: symbol greater than 255 
2
 
2
 
3
#include <iostream>
3
#include <iostream>
4
#include "TriMeshBuilder.h"
4
#include "TriMeshBuilder.h"
5
 
5
 
6
#define my_max(x,y) ((x)>(y)?(x):(y))
6
#define my_max(x,y) ((x)>(y)?(x):(y))
7
 
7
 
8
using namespace std;
8
using namespace std;
9
 
9
 
10
namespace IMesh
10
namespace IMesh
11
{
11
{
12
 
12
 
13
	TriMeshBuilder::TriMeshBuilder(): did_call_get_trimesh(false)
13
	TriMeshBuilder::TriMeshBuilder(): did_call_get_trimesh(false)
14
	{
14
	{
15
		// Register the default face set
15
		// Register the default face set
16
		register_face_set();
16
		register_face_set();
17
		
17
		
18
		// Register the vertex position attribute. There is really no sense
18
		// Register the vertex position attribute. There is really no sense
19
		// in a mesh without geometry, so this is default.
19
		// in a mesh without geometry, so this is default.
20
		register_vertex_attribute("VA_POS", VA_POS);
20
		register_vertex_attribute("VA_POS", VA_POS);
21
		assert(VA_POS.idx == 0);
21
		assert(VA_POS.idx == 0);
22
	}
22
	}
23
 
23
 
24
	void TriMeshBuilder::clear()
24
	void TriMeshBuilder::clear()
25
	{
25
	{
26
		// If a trimesh was not emitted, we remove any allocated dynamic memory
26
		// If a trimesh was not emitted, we remove any allocated dynamic memory
27
		if(!did_call_get_trimesh)
27
		if(!did_call_get_trimesh)
28
			clean_up();
28
			clean_up();
29
 
29
 
30
		// Clear all variables
30
		// Clear all variables
31
		TriMeshData::clear();
31
		TriMeshData::clear();
32
		did_call_get_trimesh = false;
32
		did_call_get_trimesh = false;
33
 
33
 
34
		// Register the default face set
34
		// Register the default face set
35
		register_face_set();
35
		register_face_set();
36
		
36
		
37
		// Register the vertex position attribute. There is really no sense
37
		// Register the vertex position attribute. There is really no sense
38
		// in a mesh without geometry, so this is default.
38
		// in a mesh without geometry, so this is default.
39
		register_vertex_attribute("VA_POS", VA_POS);
39
		register_vertex_attribute("VA_POS", VA_POS);
40
		assert(VA_POS.idx == 0);
40
		assert(VA_POS.idx == 0);
41
	}
41
	}
42
	
42
	
43
	TriMeshBuilder::~TriMeshBuilder()
43
	TriMeshBuilder::~TriMeshBuilder()
44
	{
44
	{
45
		// If a trimesh was not emitted, we remove allocated dynamic memory.
45
		// If a trimesh was not emitted, we remove allocated dynamic memory.
46
		if(!did_call_get_trimesh)
46
		if(!did_call_get_trimesh)
47
			clean_up();
47
			clean_up();
48
	}
48
	}
49
		
49
		
50
	int TriMeshBuilder::register_face_set()
50
	int TriMeshBuilder::register_face_set()
51
	{
51
	{
52
		assert(!did_call_get_trimesh);
52
		assert(!did_call_get_trimesh);
53
		int n = face_sets.size();
53
		int n = face_sets.size();
54
		if(n==0)
54
		if(n==0)
55
			face_sets.push_back(new FaceSet);
55
			face_sets.push_back(new FaceSet);
56
		else 
56
		else 
57
			face_sets.push_back(new FaceSet(*face_sets[0]));
57
			face_sets.push_back(new FaceSet(*face_sets[0]));
58
		return n;
58
		return n;
59
	}
59
	}
60
 
60
 
61
	void TriMeshBuilder::register_face_colors()
61
	void TriMeshBuilder::register_face_colors()
62
	{
62
	{
63
		assert(!did_call_get_trimesh);
63
		assert(!did_call_get_trimesh);
64
		register_face_attribute("FA_COL", FA_COL);
64
		register_face_attribute("FA_COL", FA_COL);
65
	}
65
	}
66
	
66
	
67
	void TriMeshBuilder::register_face_normals()
67
	void TriMeshBuilder::register_face_normals()
68
	{
68
	{
69
		assert(!did_call_get_trimesh);
69
		assert(!did_call_get_trimesh);
70
		register_face_attribute("FA_NORM", FA_NORM);
70
		register_face_attribute("FA_NORM", FA_NORM);
71
	}
71
	}
72
 
72
 
73
		
73
		
74
	void TriMeshBuilder::register_vertex_normals(int face_set)
74
	void TriMeshBuilder::register_vertex_normals(int face_set)
75
	{
75
	{
76
		assert(!did_call_get_trimesh);
76
		assert(!did_call_get_trimesh);
77
		register_vertex_attribute("VA_NORM", VA_NORM, face_set);
77
		register_vertex_attribute("VA_NORM", VA_NORM, face_set);
78
	}
78
	}
79
	
79
	
80
 
80
 
81
	void TriMeshBuilder::register_vertex_colors(int face_set)
81
	void TriMeshBuilder::register_vertex_colors(int face_set)
82
	{
82
	{
83
		assert(!did_call_get_trimesh);
83
		assert(!did_call_get_trimesh);
84
		register_vertex_attribute("VA_COL", VA_COL, face_set);
84
		register_vertex_attribute("VA_COL", VA_COL, face_set);
85
	}
85
	}
86
		
86
		
87
 
87
 
88
	void TriMeshBuilder::register_vertex_texcoords(int face_set)
88
	void TriMeshBuilder::register_vertex_texcoords(int face_set)
89
	{
89
	{
90
		assert(!did_call_get_trimesh);
90
		assert(!did_call_get_trimesh);
91
		register_vertex_attribute("VA_TEX", VA_TEX, face_set);
91
		register_vertex_attribute("VA_TEX", VA_TEX, face_set);
92
	}
92
	}
93
	
93
	
94
	void TriMeshBuilder::add_face(const CGLA::Vec3i& face)
94
	void TriMeshBuilder::add_face(const CGLA::Vec3i& face)
95
	{
95
	{
96
		assert(!did_call_get_trimesh);
96
		assert(!did_call_get_trimesh);
97
		++faces_size;
97
		++faces_size;
98
 
98
 
99
		int i; // To placate MSVC 6.0 ... which sucks
99
		int i; // To placate MSVC 6.0 ... which sucks
100
		for(i=0;i<face_sets.size();++i)
100
		for(i=0;i<face_sets.size();++i)
101
			face_sets[i]->push_back(face);
101
			face_sets[i]->push_back(face);
102
	}
102
	}
103
 
103
 
104
 
104
 
105
	
105
	
106
	TriMesh* TriMeshBuilder::get_trimesh() 
106
	TriMesh* TriMeshBuilder::get_trimesh() 
107
	{
107
	{
108
		assert(!did_call_get_trimesh);
108
		assert(!did_call_get_trimesh);
109
 
109
 
110
#ifndef NDEBUG
110
#ifndef NDEBUG
111
		int face_set_no;  // To placate MSVC 6.0 ... which sucks
111
		int face_set_no;  // To placate MSVC 6.0 ... which sucks
112
		for(face_set_no=0;face_set_no<face_sets.size();++face_set_no)
112
		for(face_set_no=0;face_set_no<face_sets.size();++face_set_no)
113
			{
113
			{
114
				int n = face_sets[face_set_no]->size();
114
				int n = face_sets[face_set_no]->size();
115
				if(n != faces_size)
115
				if(n != faces_size)
116
					{
116
					{
117
						cout << "Face set " << face_set_no << " has wrong size : "
117
						cout << "Face set " << face_set_no << " has wrong size : "
118
								 << n << endl;
118
								 << n << endl;
119
						exit(1);
119
						exit(1);
120
					}
120
					}
121
 
121
 
122
				int j;
122
				int j;
123
				int max_vertex=-1;
123
				int max_vertex=-1;
124
				for(j=0;j<n;++j)
124
				for(j=0;j<n;++j)
125
					{
125
					{
126
						max_vertex = my_max(max_vertex, (*face_sets[face_set_no])[j][0]);
126
						max_vertex = my_max(max_vertex, (*face_sets[face_set_no])[j][0]);
127
						max_vertex = my_max(max_vertex, (*face_sets[face_set_no])[j][1]);
127
						max_vertex = my_max(max_vertex, (*face_sets[face_set_no])[j][1]);
128
						max_vertex = my_max(max_vertex, (*face_sets[face_set_no])[j][2]);
128
						max_vertex = my_max(max_vertex, (*face_sets[face_set_no])[j][2]);
129
					}
129
					}
130
 
130
 
131
				int vattr_no;
131
				int vattr_no;
132
				for(vattr_no=0; vattr_no<face_set_mapping.size(); ++vattr_no)
132
				for(vattr_no=0; vattr_no<face_set_mapping.size(); ++vattr_no)
133
				{
133
				{
134
					if(face_set_mapping[vattr_no] == face_set_no)
134
					if(face_set_mapping[vattr_no] == face_set_no)
135
						if(vert_attr[vattr_no]->size() > (max_vertex+1))
135
						if(vert_attr[vattr_no]->size() > (max_vertex+1))
136
							{
136
							{
137
								cout << "Excess vertex attributes in attribute vector "
137
								cout << "Excess vertex attributes in attribute vector "
138
										 << vattr_no  << " associated with face set "
138
										 << vattr_no  << " associated with face set "
139
										 << face_set_no << endl;
139
										 << face_set_no << endl;
140
								exit(1);
140
								exit(1);
141
							}
141
							}
142
 
142
 
143
						else if(vert_attr[vattr_no]->size() < (max_vertex+1))
143
						else if(vert_attr[vattr_no]->size() < (max_vertex+1))
144
							{
144
							{
145
								cout << "Face set " << face_set_no << " addresses beyond the "
145
								cout << "Face set " << face_set_no << " addresses beyond the "
146
										 << "end of attribute vector " << vattr_no << endl;
146
										 << "end of attribute vector " << vattr_no << endl;
147
								exit(1);
147
								exit(1);
148
							}
148
							}
149
				}
149
				}
150
 
150
 
151
			}
151
			}
152
		int i;
152
		int i;
153
		for(i=0;i<face_attr.size();++i)
153
		for(i=0;i<face_attr.size();++i)
154
			{
154
			{
155
				int n = face_attr[i]->size();
155
				int n = face_attr[i]->size();
156
				if(n != faces_size)
156
				if(n != faces_size)
157
					{
157
					{
158
						cout << "Face attribute vector " << i 
158
						cout << "Face attribute vector " << i 
159
								 << " has wrong size : " << n << endl;
159
								 << " has wrong size : " << n << endl;
160
						exit(0);
160
						exit(0);
161
					}
161
					}
162
			}
162
			}
163
#endif
163
#endif
164
 
164
 
165
		did_call_get_trimesh = true;
165
		did_call_get_trimesh = true;
166
		return new TriMesh(*this);
166
		return new TriMesh(*this);
167
	}
167
	}
168
}
168
}
169
 
169