#include "MovieObject.h"
// コンストラクタ
MovieObject::MovieObject()
:_lastAccess(0)
{
}
// テーブルからデータをセット
int MovieObject::SetData(mwut::STR_TABLE table) {
_frame.clear();
int addLines = 0;
for (int r = 0; r < table.size(); r++) {
// 行チェック
int cols = (int)table[r].size();
if (cols < 4 || (cols - 1) % 3 != 0) continue;
bool check = true;
for (int c = 0; c < cols; c++) {
if (atof(table[r][c].c_str()) == 0 && table[r][c] != "0") check = false;
}
if (!check) continue;
// データ読み込み
FrameInfo fi;
fi.eTime = (float)atof(table[r][0].c_str());
int nElements = (cols - 1) / 3;
const double FixedArea = 200.F * 200.F;
double area = 0;
for (int e = 0; e < nElements; e++) {
double d = atof(table[r][(size_t)e * 3 + 3].c_str());
fi.elements.push_back(Element(
(float)atof(table[r][(size_t)e * 3 + 1].c_str()),
(float)atof(table[r][(size_t)e * 3 + 2].c_str()),
(float)d));
area += d * d;
}
double adj = (area == 0 ? 0 : sqrt(FixedArea / area));
if (adj > 1.0) {
for (int e = 0; e < nElements; e++) {
fi.elements[e].d *= adj;
}
}
_frame.push_back(fi);
addLines++;
}
return addLines;
}
// ファイル名からデータをセット
int MovieObject::SetData(const std::string& filename) {
mwut::STR_TABLE table;
if (!mwut::ReadTable(filename, table)) return 0;
return SetData(table);
}
// 指定時間以前の要素群を返す
std::vector<Element> MovieObject::GetElements(float sTime) {
if (this->IsEmpty()) {
std::vector<Element> elems;
return elems;
}
// 前回結果の時間がすでに前方の場合は最初に戻す
if (_lastAccess < 0 || _lastAccess >= _frame.size()) _lastAccess = 0;
if (_frame[_lastAccess].eTime > sTime) _lastAccess = 0;
// 前回結果から前方に探索
int index = _lastAccess;
for (; index < _frame.size(); index++) {
if (_frame[index].eTime > sTime) break;
}
if (index > 0) index--;
_lastAccess = index;
return _frame[index].elements;
}