/*
 *	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オブジェクトビューアなど)
 */
#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;

	if(argc != 1 + 1) {
		DIE();
	}
	m = mesh_load(argv[1]);
	if(!m) {
		DIE();
	}
#if 0 /*{{2006/07/28*/
//	free(m);
//
//	printf("読み込みテストは正常に終了しました。\n");
#else /*}}2006/07/28{{*/
	out_data("MESH", argv[1], (unsigned char*)m, get_size(m));
	free(m);
#endif/*}}2006/07/28*/

	return 0;
}

