/*	
 *	clipwire.h
 *
 *	ワイヤーフレーム描画を定義します。
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2004 Naoyuki Sawa
 *
 *	* Tue Dec 21 04:30:00 JST 2004 Naoyuki Sawa
 *	- 作成開始。
 *	- このモジュールは、cliprend.hへの追加機能です。
 *	  cliprend.hに含めても良かったのですが、後付けの追加機能なので分離しました。
 *	- もともと、ワイヤーフレーム描画は計画していなかったために、
 *	  一般的な名称をテクスチャ付きポリゴン描画用に割り当ててしまっています。
 *	  本当はワイヤーフレームオブジェクトも「メッシュ(MESH)」なのですけれど、
 *	  もう使ってしまっているので、ワイヤーフレームオブジェクトは「WIRE」としました。
 *	  このような経緯により、名称の非対称性が発生してしまっています。(2004/12/21現在)
 *	* Thu Jun 29 14:56:58 JST 2006 Naoyuki Sawa
 *	- wire_load()の宣言を追加しました。
 *	* Wed Jul 05 03:16:43 JST 2006 Naoyuki Sawa
 *	- render_line_3d()の引数型を変更しました。
 *	  これまで、始点・終点の(x,y,z)座標をすべてバラで引き渡していたのを変更し、
 *	  始点ベクトルと終点ベクトルへのconstポインタにて引き渡すよう変更しました。
 *	  この変更により、引数の数が4つに収まり、すべてレジスタ渡しとなって、高速化されます。
 *	- 2006/07/05現在、本ライブラリにおいて、(const vector*)型の引数を使うのは初めてです。
 *	  これまでは、変更前のように、ベクトルの(x,y,z)座標をすべてバラで引き渡すか、
 *	  または、ベクトルの値渡しとしていました。(主に、clipfixモジュールを参照してください)
 *	  今回の変更は、ライブラリ全体から見るとやや統一性に欠けますが、前述した高速化の利点と、
 *	  変更前の仕様では引数が多すぎて見た目にも判り辛かったことを考慮し、変更を決定しました。
 *	  本関数を利用しているプログラムは、まだほとんど無いので、変更の影響は小さいと思います。
 *	* Sun Aug 10 21:42:25 JST 2008 Naoyuki Sawa
 *	- tool/ExportPieceClipが、<vector>要素を固定小数点でなく浮動小数点で出力するよう変更したことに追従し、
 *	  mesh_load()とwire_load()に、浮動小数点のまま読み込むか、固定小数点に変換するかの選択を追加しました。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_WIRE_H__
#define __CLIP_WIRE_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

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

typedef struct _WSEG {		/* セグメント(線分)            */
	short iv0;		/* +0,2 始点頂点座標インデクス */
	short iv1;		/* +2,2 終点頂点座標インデクス */
} WSEG;				/* =4 */

typedef struct _WIRE {		/* ワイヤーフレーム           */
	short nv;		/* +0,2        頂点座標の数   */
	short ns;		/* +2,2        セグメントの数 */
//	vector v[nv];		/* +4,12nv     頂点座標リスト */
//	WSEG   s[ns];		/* +4+12nv,4ns 線分リスト     */
} WIRE;				/* =4+12nv+4ns */

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

/* ワイヤーフレームを描きます。
 * [in]
 *	render		レンダラーへのポインタ。
 *	wire		描画するワイヤーフレーム。
 *	color		ワイヤーフレームの色。
 * [note]
 *	* ワイヤーフレーム描画は、Zバッファを使いません。
 *	  複数回のワイヤーフレーム描画を行うと、後で描いたものが手前なります。
 *	* 2004/12/21現在、ワイヤーフレームデータにはカラーを持たせていません。
 *	  関数呼び出し時にカラーを指定する、簡易な仕様としています。
 *	  この簡易仕様により、一回のワイヤーフレーム描画に含まれる全ての線分は
 *	  すべて同じカラーで描かれるために、線分の奥行きソートが不要となり、
 *	  実装が単純化されています。
 */
void render_wire(RENDER* render, const WIRE* wire, int color);

///* 3D空間に線分を描きます。
// * [in]
// *	render		レンダラーへのポインタ。
// *	(x0,y0,z0)	始点座標。
// *	(x1,y1,z1)	終点座標。
// *	color		カラー。
// * [note]
// *	* 単一セグメントで構成されたワイヤーフレームの描画処理と等価です。
// *	  3Dゲームにおいてレーザーの描画などに利用するために用意しました。
// */
//void render_line_3d(RENDER* render, fixed x0, fixed y0, fixed z0, fixed x1, fixed y1, fixed z1, int color);
//↓
//↓* Wed Jul 05 03:16:43 JST 2006 Naoyuki Sawa
//↓- render_line_3d()の引数型を変更しました。
//↓  これまで、始点・終点の(x,y,z)座標をすべてバラで引き渡していたのを変更し、
//↓  始点ベクトルと終点ベクトルへのconstポインタにて引き渡すよう変更しました。
//↓  この変更により、引数の数が4つに収まり、すべてレジスタ渡しとなって、高速化されます。
//↓- 2006/07/05現在、本ライブラリにおいて、(const vector*)型の引数を使うのは初めてです。
//↓  これまでは、変更前のように、ベクトルの(x,y,z)座標をすべてバラで引き渡すか、
//↓  または、ベクトルの値渡しとしていました。(主に、clipfixモジュールを参照してください)
//↓  今回の変更は、ライブラリ全体から見るとやや統一性に欠けますが、前述した高速化の利点と、
//↓  変更前の仕様では引数が多すぎて見た目にも判り辛かったことを考慮し、変更を決定しました。
//↓  本関数を利用しているプログラムは、まだほとんど無いので、変更の影響は小さいと思います。
//↓
/* 3D空間に線分を描きます。
 * [in]
 *	render		レンダラーへのポインタ。
 *	v0		始点座標ベクトルへのポインタ。
 *	v1		終点座標ベクトルへのポインタ。
 *	color		カラー。
 * [note]
 *	* 単一セグメントで構成されたワイヤーフレームの描画処理と等価です。
 *	  3Dゲームにおいてレーザーの描画などに利用するために用意しました。
 */
void render_line_3d(RENDER* render, const vector* v0, const vector* v1, int color);

/* ワイヤフレームファイルをロードします。
 * [in]
 *	filename	ワイヤフレームファイル名。
 *	//{{2008/08/10:追加
 *	convert_fixed	0 = <vector>要素を浮動小数点のままで、浮動小数点WIREとする。
 *			1 = <vector>要素を固定小数点に変換し、固定小数点WIREとする。
 *	//}}2008/08/10:追加
 * [out]
 *	戻り値		ワイヤフレーム構造体のメモリブロック。
 *			不要になったら、free()を呼び出して解放してください。
 * [note]
 *	* ファイルが見つからなかったり、読み込みエラーが発生した場合は、DIE()によって停止します。
 *	  本関数が失敗時にNULLを返すことは無いので、呼び出し側にて戻り値を検査する必要はありません。
 *	* ワイヤフレームファイル形式については、tool/ExportPieceClipを参照してください。
 *	  独自定義のXML形式ワイヤフレーム情報を出力する、Metasequoia用の自作プラグインです。
 */
//{{2008/08/10:変更
//WIRE* wire_load(const char* filename); /* → clipobj3.c */
//↓2008/08/10:変更
WIRE* wire_load(const char* filename, int convert_fixed); /* → clipobj3.c */
//}}2008/08/10:変更

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /*__CLIP_WIRE_H__*/
