|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tdoubleparamfile.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tfilepath_io.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tconvert.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool parseDouble(double &value, char *&s) {
|
|
Rozhuk Ivan |
823a31 |
if (!(*s == '-' || *s == '.' || ('0' <= *s && *s <= '9'))) return false;
|
|
Shinya Kitaoka |
120a6e |
char *t = s;
|
|
Shinya Kitaoka |
120a6e |
if (*s == '-') s++;
|
|
Shinya Kitaoka |
120a6e |
while ('0' <= *s && *s <= '9') s++;
|
|
Shinya Kitaoka |
120a6e |
if (*s == '.') {
|
|
Shinya Kitaoka |
120a6e |
s++;
|
|
Shinya Kitaoka |
120a6e |
while ('0' <= *s && *s <= '9') s++;
|
|
Shinya Kitaoka |
120a6e |
if (*s == 'e' || *s == 'E') {
|
|
Shinya Kitaoka |
120a6e |
s++;
|
|
Shinya Kitaoka |
120a6e |
if (*s == '+' || *s == '-') s++;
|
|
Shinya Kitaoka |
120a6e |
while ('0' <= *s && *s <= '9') s++;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
std::string w(t, s - t);
|
|
Shinya Kitaoka |
120a6e |
value = std::stod(w);
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int split(std::vector<double> &values, char *s) {</double>
|
|
Shinya Kitaoka |
120a6e |
int count = 0;
|
|
Shinya Kitaoka |
120a6e |
for (;;) {
|
|
Shinya Kitaoka |
120a6e |
while (*s == ' ' || *s == '\t') s++;
|
|
Shinya Kitaoka |
120a6e |
if (*s == '\0') break;
|
|
Shinya Kitaoka |
120a6e |
double value = 0;
|
|
Shinya Kitaoka |
120a6e |
bool found = parseDouble(value, s);
|
|
Shinya Kitaoka |
120a6e |
if (found) {
|
|
Shinya Kitaoka |
120a6e |
count++;
|
|
Shinya Kitaoka |
120a6e |
values.push_back(value);
|
|
Shinya Kitaoka |
120a6e |
while (*s == ' ' || *s == '\t') s++;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (*s == ',' || *s == ';') {
|
|
Shinya Kitaoka |
120a6e |
if (!found) {
|
|
Shinya Kitaoka |
120a6e |
count++;
|
|
Shinya Kitaoka |
120a6e |
values.push_back(0);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
s++;
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (!found) break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return count;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamFileData::TDoubleParamFileData() : m_params(), m_dirtyFlag(false) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamFileData::~TDoubleParamFileData() {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TDoubleParamFileData::setParams(
|
|
Shinya Kitaoka |
120a6e |
const TDoubleKeyframe::FileParams ¶ms) {
|
|
Shinya Kitaoka |
120a6e |
m_params = params;
|
|
Shinya Kitaoka |
120a6e |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TDoubleParamFileData::invalidate() {
|
|
Shinya Kitaoka |
120a6e |
m_dirtyFlag = true;
|
|
Shinya Kitaoka |
120a6e |
m_values.clear();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
double TDoubleParamFileData::getValue(double frame, double defaultValue) {
|
|
Shinya Kitaoka |
120a6e |
if (frame < 0) return defaultValue;
|
|
Shinya Kitaoka |
120a6e |
int intFrame = (int)frame;
|
|
Shinya Kitaoka |
120a6e |
if (m_dirtyFlag) read();
|
|
Shinya Kitaoka |
120a6e |
if (intFrame >= (int)m_values.size())
|
|
Shinya Kitaoka |
120a6e |
return defaultValue;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
return m_values[intFrame];
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TDoubleParamFileData::read() {
|
|
Shinya Kitaoka |
120a6e |
m_dirtyFlag = false;
|
|
Shinya Kitaoka |
120a6e |
m_values.clear();
|
|
Shinya Kitaoka |
120a6e |
int k = m_params.m_fieldIndex;
|
|
Shinya Kitaoka |
120a6e |
if (k < 0) return;
|
|
Shinya Kitaoka |
120a6e |
TFilePath fp = m_params.m_path;
|
|
Shinya Kitaoka |
120a6e |
Tifstream is(fp);
|
|
Shinya Kitaoka |
120a6e |
char buffer[2048];
|
|
Shinya Kitaoka |
120a6e |
memset(buffer, 0, sizeof buffer);
|
|
Shinya Kitaoka |
120a6e |
while (is) {
|
|
Shinya Kitaoka |
120a6e |
is.getline(buffer, sizeof(buffer) - 1);
|
|
Shinya Kitaoka |
120a6e |
std::vector<double> fields;</double>
|
|
Shinya Kitaoka |
120a6e |
QString line(buffer);
|
|
Shinya Kitaoka |
120a6e |
if (line.size() == 0 || line.startsWith("#")) continue;
|
|
Shinya Kitaoka |
120a6e |
split(fields, buffer);
|
|
Shinya Kitaoka |
120a6e |
double value = 0;
|
|
Shinya Kitaoka |
120a6e |
if (k < (int)fields.size()) value = fields[k];
|
|
Shinya Kitaoka |
120a6e |
m_values.push_back(value);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|