1 #include "../include/animorph/FaceGroup.h"
2
3 #include <cstring>
4
5 using namespace std;
6 using namespace Animorph;
7
8 const int MAX_LINE = 350000;
9
load(const std::string & filename)10 bool FaceGroup::load (const std::string& filename)
11 {
12 FileReader file_reader;
13
14 file_reader.open (filename);
15
16 if (!file_reader)
17 return false;
18
19 fromStream (file_reader);
20
21 loadVisibilities(filename);
22
23 return true;
24 }
25
calcVertexes(const FaceVector & facevector)26 void FaceGroup::calcVertexes (const FaceVector &facevector)
27 {
28 if(loaded) return;
29
30 loaded = true;
31
32 int vertexCounter;
33
34 for (FaceGroup::iterator facegroup_it = (*this).begin ();
35 facegroup_it != (*this).end ();
36 facegroup_it++)
37 {
38 string partname = (*facegroup_it).first;
39 FGroupData &groupdata = (*facegroup_it).second.facesIndexes;
40 vertexCounter = 0;
41
42 for (unsigned int i = 0; i < groupdata.size (); i++)
43 {
44 const Face &face(facevector[groupdata[i]]);
45
46 for (unsigned int j = 0; j < face.getSize(); j++)
47 {
48 const int tmp = face.getVertexAtIndex(j);
49
50 if(vertexes[partname].find(tmp) == vertexes[partname].end())
51 {
52 vertexes[partname][tmp] = 0;
53 }
54 }
55 }
56
57 for (VertexData::iterator vertexgroup_it = vertexes[partname].begin ();
58 vertexgroup_it != vertexes[partname].end ();
59 vertexgroup_it++)
60 {
61 vertexes[partname][(*vertexgroup_it).first] = vertexCounter++;
62 }
63 }
64
65 //cout << vertexes.size() << endl;
66 }
67
fromStream(std::ifstream & in_stream)68 void FaceGroup::fromStream (std::ifstream &in_stream)
69 {
70 FGroup data;
71 string fgroup_ident;
72
73 clear ();
74
75 char buffer[MAX_LINE];
76 while (in_stream.getline (buffer, MAX_LINE))
77 {
78 if (isalpha (buffer[0])) // line is a fgroup identifier
79 {
80 char *p;
81 p = strrchr(buffer,',');
82 if ( p == NULL)
83 p = buffer;
84 else
85 p++;
86
87 data.facesIndexes.clear();
88 fgroup_ident = p;
89
90 UtilStringDelSurround (fgroup_ident, "\n\r\t:");
91 }
92 else // line is a vgroup number
93 {
94 data.visible = true;
95 stringTokeni(buffer, " ", data.facesIndexes);
96 (*this)[fgroup_ident] = data;
97 }
98 }
99 }
100
toggleVisible(const std::string & name)101 void FaceGroup::toggleVisible(const std::string& name)
102 {
103 if (count (name))
104 {
105 (*this)[name].visible = !((*this)[name].visible);
106 }
107 }
108
saveVisibilities(const std::string & filename,std::ios_base::openmode mode)109 bool FaceGroup::saveVisibilities (const std::string& filename, std::ios_base::openmode mode)
110 {
111 FileWriter file_writer;
112 file_writer.open (filename, mode);
113
114 if (!file_writer)
115 return false;
116
117 std::ostringstream out_stream;
118 createStreamVisibilities (out_stream);
119
120 file_writer << out_stream.str ();
121
122 return true;
123 }
124
loadVisibilities(const std::string & filename)125 bool FaceGroup::loadVisibilities (const std::string& filename)
126 {
127 FileReader file_reader;
128
129 file_reader.open (filename);
130
131 if (!file_reader)
132 return false;
133
134 fromStreamVisibilities (file_reader);
135
136 return true;
137 }
138
createStreamVisibilities(std::ostringstream & out_stream)139 void FaceGroup::createStreamVisibilities (std::ostringstream &out_stream)
140 {
141 for (FaceGroup::iterator facegroup_it = (*this).begin ();
142 facegroup_it != (*this).end ();
143 facegroup_it++)
144 {
145 string partname = (*facegroup_it).first;
146 bool visible = (*facegroup_it).second.visible;
147
148 if(visible)
149 {
150 out_stream << "#v," << partname << endl;
151 }
152 }
153 }
154
fromStreamVisibilities(std::ifstream & in_stream)155 void FaceGroup::fromStreamVisibilities (std::ifstream &in_stream)
156 {
157 char buffer[MAX_LINE];
158 char line[MAX_LINE];
159 while (in_stream.getline (buffer, MAX_LINE))
160 {
161 if(sscanf(buffer, "nv,%s", line) == 1)
162 {
163 //ema if(find(line) != end())
164 {
165 (*this)[line].visible = false;
166 }
167 }
168 }
169 }
170