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

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

	return 0;
}

