Newer
Older
PrismSoftware / ECTrainer2 / MovieObject.cpp
#include "MovieObject.h"


// コンストラクタ
MovieObject::MovieObject() 
	:_lastAccess(0)
{

}

// テーブルからデータをセット
int MovieObject::SetData(mwut::STR_TABLE table) {
	
	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;
		for (int e = 0; e < nElements; e++) {
			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)atof(table[r][(size_t)e * 3 + 3].c_str())));
		}
		_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 (_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;
}