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