1 #include "../include/animorph/Target.h"
2 #include <cstdio>
3 #ifdef DEBUG
4 #include <StopClock/StopClock.h>
5 #endif
6 
7 using namespace std;
8 using namespace Animorph;
9 
createStream(std::ostringstream & out_stream)10 void Target::createStream (std::ostringstream &out_stream)
11 {
12   for (Target::iterator target_it = begin ();
13        target_it != end ();
14        target_it++)
15   {
16     TargetData td = (*target_it);
17 
18     out_stream << td.vertex_number << ","
19     << td.morph_vector.x << ","
20     << td.morph_vector.y << ","
21     << td.morph_vector.z << ","
22     << endl;
23   }
24 }
25 
26 /*void  Target::fromStream (std::ifstream &in_stream)
27 {
28   char buffer[MAX_LINE_BUFFER];
29   Target &target = (*this);
30 
31   clear ();
32 
33   while (in_stream.getline (buffer, MAX_LINE_BUFFER))
34   {
35     TargetData td;
36 
37     if (sscanf (buffer, "%d,%f,%f,%f\n", &td.vertex_number,
38                 &td.morph_vector.x, &td.morph_vector.y, &td.morph_vector.z) == 4)
39     {
40       target.push_back (td);
41     }
42     else
43     {
44       cerr << "illegal target format line: " << endl << buffer << endl;
45     }
46   }
47 }*/
48 
load(const std::string & filename)49 bool Target::load (const std::string& filename)
50 {
51   /* FileReader file_reader;
52 
53    file_reader.open (filename);
54 
55    if (!file_reader)
56      return false;
57 
58    fromStream (file_reader);*/
59 
60   // this is done in C because of speed reasons!
61 
62   clear ();
63 
64   FILE *fd = fopen (filename.c_str (), "r");
65   if (!fd) return false;
66 
67   // get the current locale
68   char *locale = ::setlocale (LC_NUMERIC, NULL);
69 
70   // set it to "C"-Style ( the . (dot) means the decimal marker for floats)
71   ::setlocale (LC_NUMERIC, "C");
72 
73   Target &target(*this);
74 
75   int ret = 0;
76   bool rc = true; // assume "success" by default
77 
78   for(;;)
79   {
80     TargetData td;
81 
82     ret = fscanf (fd, "%d,%f,%f,%f", &td.vertex_number,
83                   &td.morph_vector.x, &td.morph_vector.y, &td.morph_vector.z);
84 
85     if (ret == EOF) // end of file reached?
86         break;
87 
88     if ((ret != 4) && (ret != 0))
89     {
90 
91       cerr << "Illegal line while reading target '" << filename << "'!" << endl;
92       clear ();
93       rc = false; // mark the error
94       break;
95     }
96 
97     target.push_back (td);
98     modVertex.push_back (td.vertex_number);
99   }
100 
101   // reset locale after file was written
102   ::setlocale (LC_NUMERIC, locale);
103 
104   fclose (fd);
105 
106   return rc;
107 }
108 
109 
save(const std::string & filename)110 bool Target::save (const std::string& filename)
111 {
112   FileWriter file_writer;
113 
114   file_writer.open (filename);
115 
116   if (!file_writer)
117     return false;
118 
119   std::ostringstream out_stream;
120   createStream (out_stream);
121 
122   file_writer << out_stream.str ();
123 
124   return true;
125 }
126