/*
 *	main.c
 *
 *	P/ECE CLiP Library Mesh Loader
 *
 *	ExportPieceClipWire - P/ECE CLiP Library 3D Object Exporter (Mesh)の
 *	出力ファイルを読み込む、CLiP用ルーチンの試作目的のプロジェクトです。
 *	このツール単体で利用することは無いと思います。
 *	↓2006/07/28用途変更
 *	XML形式のメッシュデータを、C言語形式に変換するツールとして利用することにしました。
 *
 *	* Tue Jun 27 18:59:35 JST 2006 Naoyuki Sawa
 *	- 作成開始。
 *	* Wed Jun 28 05:13:45 JST 2006 Naoyuki Sawa
 *	- Expatを、DLLでなく、スタティックライブラリを使うよう変更しました。
 *	* Fri Jul 28 00:16:53 JST 2006 Naoyuki Sawa
 *	- これまでは、XML形式のメッシュデータの読み込みテストだけを行うプログラムでしたが、
 *	  今回の変更により、C言語形式に変換するツールとして利用することにしました。
 *	  P/ECE上で、XML形式のメッシュデータをそのまま扱うと、以下のような問題があります。
 *	  ・XMLファイルは大きすぎて、フラッシュメモリを多く消費する。
 *	  ・XMLファイルを読み込むにはExpatをリンクする必要があり、メインRAMを多く消費する。
 *	  ・現在のmesh_load()はファイルからの読み込みにしか対応していないので、
 *	    pexファイル一つだけでアプリケーションを構成することができない。
 *	  以上のような問題点を回避するために、今後は、本ツールを用いてXML形式のメッシュデータを
 *	  C言語形式にコンバートし、pexファイルに直接含めることにしました。
 *	  ツール的なプログラムでは、引き続きmesh_load()によるXMLファイルの読み込みを行います。
 *	  (たとえば、3Dオブジェクトビューアなど)
 *	* Sun Aug 10 21:42:25 JST 2008 Naoyuki Sawa
 *	- tool/ExportPieceClipが、<vector>要素を固定小数点でなく浮動小数点で出力するよう変更したことに追従し、
 *	  mesh_load()とwire_load()に、浮動小数点のまま読み込むか、固定小数点に変換するかの選択を追加しました。
 *	  本ツールにも、浮動小数点のまま読み込むか(-f)、固定小数点に変換するか(-x)のオプションを追加しました。
 */
#include "app.h"

/*****************************************************************************
 *	
 *****************************************************************************/

static void
out_data(const char* prefix, const char* path, const unsigned char* data, int size)
{
	char fname[_MAX_FNAME];
	int i;

	_splitpath(path, NULL, NULL, fname, NULL);
	strupr(fname);
	printf("const unsigned char %s_%s[] = {", prefix, fname);

	for(i = 0; i < size; i++) {
		if(!(i & 15)) {
			printf("\n");
		}
		printf("0x%02X,", data[i]);
	}

	printf("\n};\n");
}

/*****************************************************************************
 *	
 *****************************************************************************/

static int
get_size(const MESH* m)
{
	int size = 0;
	//
	const vector* v;
	const TCOORD* c;
	const FACE* f;
	const FACEVERTEX* fv;
	//
	int nv;
	int nc;
	int nf;
	int nfv;
	//
	int iv;
	int ic;
	int _if;
	int ifv;

	size += sizeof(MESH);
	nv = m->nv;
	nc = m->nc;
	nf = m->nf;
	m++;

	v = (vector*)m;
	for(iv = 0; iv < nv; iv++) {
		size += sizeof(vector);
		v++;
	}

	c = (TCOORD*)v;
	for(ic = 0; ic < nc; ic++) {
		size += sizeof(TCOORD);
		c++;
	}

	f = (FACE*)c;
	for(_if = 0; _if < nf; _if++) {
		size += sizeof(FACE);
		nfv = f->nfv;
		f++;
		//
		fv = (FACEVERTEX*)f;
		for(ifv = 0; ifv < nfv; ifv++) {
			size += sizeof(FACEVERTEX);
			fv++;
		}
		//
		f = (FACE*)fv;
	}

	return size;
}

/*****************************************************************************
 *	
 *****************************************************************************/

int
main(int argc, char* argv[])
{
	MESH* m;
	const char* path;
	int convert_fixed;

	switch(argc) {
	case 1 + 1:
		path = argv[1];
		convert_fixed = 0/*float*/;
		break;
	case 1 + 2:
		path = argv[2];
		       if(!strcmp(argv[1], "-f")) {
			convert_fixed = 0/*float*/;
		} else if(!strcmp(argv[1], "-x")) {
			convert_fixed = 1/*fixed*/;
		} else {
			DIE();
		}
		break;
	default:
		DIE();
	}
	m = mesh_load(path, convert_fixed);
	if(!m) {
		DIE();
	}
	out_data("MESH", path, (unsigned char*)m, get_size(m));
	free(m);

	return 0;
}

