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