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