1 #include "../include/animorph/VertexVector.h"
2 #include "../include/animorph/util.h"
3
4 #include <iostream>
5
6 using namespace std;
7 using namespace Animorph;
8
load(const std::string & filename)9 bool VertexVector::load (const std::string& filename)
10 {
11 FileReader file_reader;
12
13 file_reader.open (filename);
14
15 if (!file_reader)
16 return false;
17
18 fromStream (file_reader);
19
20 return true;
21 }
22
fromStream(std::ifstream & in_stream)23 void VertexVector::fromStream (std::ifstream &in_stream)
24 {
25 char buffer[MAX_LINE_BUFFER];
26 float x, y, z;
27 x = y = z = 0.0;
28
29 clear ();
30
31 while (in_stream.getline (buffer, MAX_LINE_BUFFER))
32 {
33 if (sscanf (buffer, "%f,%f,%f\n", &x, &y, &z) == 3)
34 {
35 Vertex vertex (x, y, z);
36
37 push_back (vertex);
38 }
39 else
40 {
41 cerr << "illegal line in vertex data file:" << endl << buffer << endl;
42 }
43 }
44 }
45
setCoordinates(std::vector<Vector3f> & vertexvector_orginal)46 int VertexVector::setCoordinates (std::vector <Vector3f> &vertexvector_orginal)
47 {
48 VertexVector &vertexvector_morph = (*this);
49
50 // false number of vertices!
51 if (vertexvector_orginal.size () != size ())
52 return -1;
53
54 for (unsigned int i = 0; i < size (); i++)
55 {
56 Vertex &vertex_morph = vertexvector_morph[i];
57 Vector3f &vertex_orginal = vertexvector_orginal[i];
58
59 vertex_morph.co = vertex_orginal;
60 }
61
62 return 0;
63 }
64
65 /*Subdivision surfaces */
66
load(const std::string & filename)67 bool subdVertexVector::load (const std::string& filename)
68 {
69 FileReader file_reader;
70
71 file_reader.open (filename);
72
73 if (!file_reader)
74 return false;
75
76 fromStream (file_reader);
77
78 return true;
79 }
80
loadFromFaceVector(FaceVector & facevector)81 void subdVertexVector::loadFromFaceVector (FaceVector &facevector)
82 {
83 for (FaceVector::iterator facevector_it = facevector.begin ();
84 facevector_it != facevector.end ();
85 facevector_it++)
86 {
87 int v0, v1, v2, v3;
88 Face face = *facevector_it;
89 unsigned int facesize = face.getSize();
90
91 v0 = face.getVertexAtIndex(0);
92 v1 = face.getVertexAtIndex(1);
93 v2 = face.getVertexAtIndex(2);
94
95 if (facesize == 3)
96 {
97 push_back (subdVertex (v0, v1, v2));
98 }
99 else if (facesize == 4)
100 {
101 v3 = face.getVertexAtIndex(3);
102 push_back (subdVertex (v0, v1, v2, v3));
103 }
104 }
105 }
106
fromStream(std::ifstream & in_stream)107 void subdVertexVector::fromStream (std::ifstream &in_stream)
108 {
109 char buffer[MAX_LINE_BUFFER];
110 int v0, v1, v2, v3, nr_indices;
111 v0 = v1 = v2 = v3 = 0;
112
113 clear ();
114
115 while (in_stream.getline (buffer, MAX_LINE_BUFFER))
116 {
117 nr_indices = sscanf (buffer, "%d,%d,%d,%d\n", &v0, &v1, &v2, &v3);
118
119 if (nr_indices == 4)
120 {
121 push_back (subdVertex (v0, v1, v2, v3));
122 }
123 else if (nr_indices == 3)
124 {
125 push_back (subdVertex (v0, v1, v2));
126 }
127 else
128 {
129 cerr << "illegal line in subdvertex data file:" << endl << buffer << endl;
130 continue;
131 }
132 }
133 }
134
updateFacePoints(VertexVector & vertexvector)135 void subdVertexVector::updateFacePoints (VertexVector &vertexvector)
136 {
137 for (subdVertexVector::iterator subdvv_it = (*this).begin ();
138 subdvv_it != (*this).end ();
139 subdvv_it++)
140 {
141 //subdVertex &subdvertex = *subdvv_it;
142 (*subdvv_it).co.zero();
143 //unsigned int facesize = subdvertex.getSize();
144 int j;
145
146 for (j = 0; j != (*subdvv_it).getSize(); ++j)
147 {
148 (*subdvv_it).co += vertexvector[(*subdvv_it).getVertexAtIndex(j)].co;
149 }
150 (*subdvv_it).co /= (*subdvv_it).getSize();
151 }
152 }
153
updateEdgePoints(VertexVector & vertexvector,subdVertexVector & facepoints)154 void subdVertexVector::updateEdgePoints (VertexVector &vertexvector, subdVertexVector &facepoints)
155 {
156 for (subdVertexVector::iterator subdvv_it = (*this).begin ();
157 subdvv_it != (*this).end ();
158 subdvv_it++)
159 {
160 //subdVertex &subdvertex = *subdvv_it;
161 (*subdvv_it).co.zero();
162 float size = (*subdvv_it).getSize();
163 int j;
164
165 (*subdvv_it).co = (vertexvector[(*subdvv_it).getVertexAtIndex(0)].co + vertexvector[(*subdvv_it).getVertexAtIndex(1)].co);
166
167 for (j=2; j != size; ++j)
168 {
169 (*subdvv_it).co += facepoints[(*subdvv_it).getVertexAtIndex(j)].co;
170 }
171 (*subdvv_it).co /= size;
172 }
173 }
174
load(const std::string & filename)175 bool origVertexVector::load (const std::string& filename)
176 {
177 FileReader file_reader;
178
179 file_reader.open (filename);
180
181 if (!file_reader)
182 return false;
183
184 fromStream (file_reader);
185
186 return true;
187 }
188
fromStream(std::ifstream & in_stream)189 void origVertexVector::fromStream (std::ifstream &in_stream)
190 {
191 char buffer[MAX_LINE_BUFFER];
192 char buffer1[MAX_LINE_BUFFER];
193
194 clear ();
195
196 while (in_stream.getline (buffer, MAX_LINE_BUFFER) && in_stream.getline (buffer1, MAX_LINE_BUFFER))
197 {
198 std::vector <int> i_faceVerts;
199
200 stringTokeni(buffer, ",", i_faceVerts);
201
202 std::vector <int> i_edgeVerts;
203
204 stringTokeni(buffer1, ",", i_edgeVerts);
205 push_back(origVertex (i_faceVerts, i_edgeVerts));
206 }
207 }
208
updateOrigVertexPoints(VertexVector & vertexvector,subdVertexVector & facepoints,subdVertexVector & edgepoints)209 void origVertexVector::updateOrigVertexPoints (VertexVector &vertexvector, subdVertexVector &facepoints, subdVertexVector &edgepoints)
210 {
211 size_t j(0);
212
213 for (origVertexVector::iterator origv_it = (*this).begin ();
214 origv_it != (*this).end ();
215 origv_it++)
216 {
217
218 (*origv_it).co.zero();
219
220 (*origv_it).co = vertexvector[j].co;
221
222 (*origv_it).co *= ((*origv_it).getValence() - 3);
223
224
225 int k(0);
226 Vector3f tempR;
227 Vector3f tempQ;
228 tempR.zero ();
229 tempQ.zero ();
230
231 for (k = 0; k != (*origv_it).getValence(); ++k)
232 {
233 tempR += edgepoints[(*origv_it).getEdgeVertexAtIndex(k)].co;
234 }
235
236 tempR /= (*origv_it).getValence();
237 tempR *= 2.0f;
238
239 (*origv_it).co += tempR;
240
241 for (k = 0; k != (*origv_it).getFValence(); ++k)
242 {
243 tempQ += facepoints[(*origv_it).getFaceVertexAtIndex(k)].co;
244 }
245
246 tempQ /= ((*origv_it).getFValence());
247 (*origv_it).co += tempQ;
248 (*origv_it).co /= (*origv_it).getValence();
249 j++;
250 }
251 }
252