/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/

#include "stdafx.h"
#include "mg/MGStl.h"
#include "mg/Group.h"
#include "resource.h"
#include "IO/GLObjImporter.h"
#include "IO/GLStlImporter.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CGLObjImporter::CGLObjImporter()
	 : CGLFileImporter(IDS_FILTER_OBJ)
{
}

bool CGLObjImporter::Load(MGGroup& group){
	CString fileName = GetFileName();// 読み込まれたファイル名を取得
	buildStl(fileName,group);// objファイルを読み込みstlファイルを出力する
	return true;
}

/// objファイルを読み込みgroupごとにstlを作成し、groupに出力する
void CGLObjImporter::buildStl(
		const CString& objFilePath,	/// objファイルパス
		MGGroup& group		///Generated stls will be pushed back one obj group by one.
){
    std::ifstream f(objFilePath);
	std::string objData;

	// 読み込んだobjデータを入れておく
	std::vector<MGPosition> vs;
	std::vector<MGPosition> vns;
	std::vector<int> fs;

	// 1行ずつ読み込んでデータを取得する
	// vsには、v 1行のデータx,y,z値を入れている
	// vnsには、vn 1行のデータx,y,z値を入れている
	// fsには、f 1行のデータx,y,z値、かつ、/で区切った値(三角形なので3つ)を入れている
	// 詳しくは、objフォーマットを参照する
    while(getline(f, objData)){
		size_t delpos=objData.find(' ');
		std::string keyword=objData.substr(0,delpos);
		objData.erase(0,delpos+1);
		std::istringstream istrstrm(objData);
		BOOL triangleFlag = true;//
		double xyz[3]={0.,0.,0.};
		if(keyword == "v"){
			for (int i=0; i<3; i++)
				MGCL::get_real(' ',istrstrm,xyz[i]);
			vs.push_back(MGPosition(3,xyz));
		}else if(keyword == "vn"){
			for (int i=0; i<3; i++)
				MGCL::get_real(' ',istrstrm,xyz[i]);
			vns.push_back(MGPosition(3,xyz));
		}else if(keyword == "g"){
			if(fs.size()){
				group.append(new MGStl(vs,fs));
				fs.clear();
			}
		}else if(keyword == "f"){
			//Currrently we process only triangles.
			int triangleId[3];
			for (int i=0; i<3; i++){
				int id=0;
				MGCL::get_integer(' ',istrstrm,id);
				fs.push_back(id);
				triangleId[i]=id;
			}
			int nextStl;
			if(istrstrm >> nextStl){
				fs.push_back(triangleId[0]);
				fs.push_back(triangleId[2]);
				fs.push_back(nextStl);
			}
		}
    }

	// 読み込んだobjデータより、stlファイルを生成する	
	if(fs.size()){
		group.append(new MGStl(vs,fs));
	}
}
