/*
 *	main.c
 *
 *	P/ECE CLiP Library Wire Loader
 *
 *	ExportPieceClipWire - P/ECE CLiP Library 3D Object Exporter (Wire)の
 *	出力ファイルを読み込む、CLiP用ルーチンの試作目的のプロジェクトです。
 *	このツール単体で利用することは無いと思います。
 *	↓2006/07/28用途変更
 *	XML形式のワイヤーフレームデータを、C言語形式に変換するツールとして利用することにしました。
 *
 *	* Thu Jun 29 14:41:47 JST 2006 Naoyuki Sawa
 *	- 作成開始。
 *	* Fri Jul 28 00:16:53 JST 2006 Naoyuki Sawa
 *	- これまでは、XML形式のワイヤーフレームデータの読み込みテストだけを行うプログラムでしたが、
 *	  今回の変更により、C言語形式に変換するツールとして利用することにしました。
 *	  P/ECE上で、XML形式のワイヤーフレームデータをそのまま扱うと、以下のような問題があります。
 *	  ・XMLファイルは大きすぎて、フラッシュメモリを多く消費する。
 *	  ・XMLファイルを読み込むにはExpatをリンクする必要があり、メインRAMを多く消費する。
 *	  ・現在のwire_load()はファイルからの読み込みにしか対応していないので、
 *	    pexファイル一つだけでアプリケーションを構成することができない。
 *	  以上のような問題点を回避するために、今後は、本ツールを用いてXML形式のワイヤーフレームデータを
 *	  C言語形式にコンバートし、pexファイルに直接含めることにしました。
 *	  ツール的なプログラムでは、引き続きwire_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 WIRE* w)
{
	int size = 0;
	//
	const vector* v;
	const WSEG* s;
	//
	int nv;
	int ns;
	//
	int iv;
	int is;

	size += sizeof(WIRE);
	nv = w->nv;
	ns = w->ns;
	w++;

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

	s = (WSEG*)v;
	for(is = 0; is < ns; is++) {
		size += sizeof(WSEG);
		s++;
	}

	return size;
}

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

int
main(int argc, char* argv[])
{
	WIRE* w;
	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();
	}
	w = wire_load(path, convert_fixed);
	if(!w) {
		DIE();
	}
	out_data("WIRE", path, (unsigned char*)w, get_size(w));
	free(w);

	return 0;
}

