/*****************************************************************************
 * Bison/Flexプログラム部分をテストするための、Windowsアプリケーションの雛型 *
 * □ビルド・実行方法:                                                       *
 * ┃"C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"  *
 * ┃make -f winapp.mk run                                                   *
 *****************************************************************************/
#ifndef __WINAPP_H__
#define __WINAPP_H__
/*{{定型コード:winapp.h======================================================*/
#include <clip.h>
/* y.tab.y */
extern int yynerrs;
#if     (YYDEBUG!=0)
extern int yydebug;
#endif/*(YYDEBUG!=0)*/
int yyparse();
void yyerror(const char* fmt, ...);
/* lex.yy.l */
extern FILE* yyin;
extern FILE* yyout;
extern int yylineno;
int yylex();
void yylex_init(FILE* input_file);
/* winapp.c */
void push_location(const char* path);
void pop_location();
/*}}定型コード:winapp.h======================================================*/
//-----------------------------------------------------------------------------
//構造体定義
//-----------------------------------------------------------------------------
typedef struct _ST_Mesh			ST_Mesh;
typedef struct _ST_MeshHdr		ST_MeshHdr;
typedef struct _ST_MeshBody		ST_MeshBody;
typedef struct _ST_Vectors		ST_Vectors;
typedef struct _ST_VectorsHdr		ST_VectorsHdr;
typedef struct _ST_VectorsBody		ST_VectorsBody;
typedef struct _ST_VectorRow		ST_VectorRow;
typedef struct _ST_Vector		ST_Vector;
typedef struct _ST_VectorRef		ST_VectorRef;
typedef struct _ST_Tcoords		ST_Tcoords;
typedef struct _ST_TcoordsHdr		ST_TcoordsHdr;
typedef struct _ST_TcoordsBody		ST_TcoordsBody;
typedef struct _ST_TcoordRow		ST_TcoordRow;
typedef struct _ST_Tcoord		ST_Tcoord;
typedef struct _ST_TcoordRef		ST_TcoordRef;
typedef struct _ST_Face			ST_Face;
typedef struct _ST_FaceHdr		ST_FaceHdr;
typedef struct _ST_FaceBody		ST_FaceBody;
typedef struct _ST_FaceVertexRow	ST_FaceVertexRow;
typedef struct _ST_FaceVertex		ST_FaceVertex;
typedef struct _ST_LabelOffset		ST_LabelOffset;
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//メッシュ
/*typedef*/ struct _ST_Mesh {
	ST_MeshHdr*			pMeshHdr;
	ST_MeshBody*			pMeshBody;
} /*ST_Mesh*/;
ST_Mesh* Mesh_New(ST_MeshHdr* pMeshHdr, ST_MeshBody* pMeshBody);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//メッシュヘッダ
/*typedef*/ struct _ST_MeshHdr {
	char*				pMeshLabel;
	char*				pTextureName;				//NULL可
} /*ST_MeshHdr*/;
ST_MeshHdr* MeshHdr_New(char* pMeshLabel, char* pTextureName/*NULL可*/);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//メッシュボディ
/*typedef*/ struct _ST_MeshBody {
	ST_Vectors*			pVectors;				//NULL可		Mesh_New()にて、非NULLに設定される。
	ST_Tcoords*			pTcoords;				//NULL可		Mesh_New()にて、非NULLに設定される。
	GSList/*<ST_Face*>*/*		pFaceList;
} /*ST_MeshBody*/;
ST_MeshBody* MeshBody_New();
ST_MeshBody* MeshBody_AddVectors(ST_MeshBody* pMeshBody, ST_Vectors* pVectors);
ST_MeshBody* MeshBody_AddTcoords(ST_MeshBody* pMeshBody, ST_Tcoords* pTcoords);
ST_MeshBody* MeshBody_AddFace(ST_MeshBody* pMeshBody, ST_Face* pFace);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//頂点座標リスト
/*typedef*/ struct _ST_Vectors {
	ST_VectorsHdr*			pVectorsHdr;
	ST_VectorsBody*			pVectorsBody;
} /*ST_Vectors*/;
ST_Vectors* Vectors_New(ST_VectorsHdr* pVectorsHdr, ST_VectorsBody* pVectorsBody);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//頂点座標リストヘッダ
/*typedef*/ struct _ST_VectorsHdr {
	int				dummy;
} /*ST_VectorsHdr*/;
ST_VectorsHdr* VectorsHdr_New();
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//頂点座標リストボディ
/*typedef*/ struct _ST_VectorsBody {
	GSList/*<ST_VectorRow*>*/*	pVectorRowList;
} /*ST_VectorsBody*/;
ST_VectorsBody* VectorsBody_New();
ST_VectorsBody* VectorsBody_AddVectorRow(ST_VectorsBody* pVectorsBody, ST_VectorRow* pVectorRow);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//頂点座標行
/*typedef*/ struct _ST_VectorRow {
	ST_Vector*			pVector;
	char*				pVectorLabel;				//NULL可
} /*ST_VectorRow*/;
ST_VectorRow* VectorRow_New(ST_Vector* pVector, char* pVectorLabel/*NULL可*/);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//頂点座標
/*typedef*/ struct _ST_Vector {
	double				x, y, z;
} /*ST_Vector*/;
ST_Vector* Vector_New(double x, double y, double z);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//頂点座標参照
#define VectorRef_type_pVector		1
#define VectorRef_type_iVectorIndex	2
#define VectorRef_type_pLabelOffset	3
/*typedef*/ struct _ST_VectorRef {
	int				type;					//VectorRef_type_*	Mesh_New()にて、(type=VectorRef_type_iVectorIndex)に統一される。
	union {
		ST_Vector*		pVector;
		int			iVectorIndex;
		ST_LabelOffset*		pLabelOffset;
	} data;
} /*ST_VectorRef*/;
ST_VectorRef* VectorRef_NewVector(ST_Vector* pVector);
ST_VectorRef* VectorRef_NewIndex(int iVectorIndex);
ST_VectorRef* VectorRef_NewLabelOffset(char* pVectorLabel, int iOffset);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//テクスチャ座標リスト
/*typedef*/ struct _ST_Tcoords {
	ST_TcoordsHdr*			pTcoordsHdr;
	ST_TcoordsBody*			pTcoordsBody;
} /*ST_Tcoords*/;
ST_Tcoords* Tcoords_New(ST_TcoordsHdr* pTcoordsHdr, ST_TcoordsBody* pTcoordsBody);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//テクスチャ座標リストヘッダ
/*typedef*/ struct _ST_TcoordsHdr {
	int				dummy;
} /*ST_TcoordsHdr*/;
ST_TcoordsHdr* TcoordsHdr_New();
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//テクスチャ座標リストボディ
/*typedef*/ struct _ST_TcoordsBody {
	GSList/*<ST_TcoordRow*>*/*	pTcoordRowList;
} /*ST_TcoordsBody*/;
ST_TcoordsBody* TcoordsBody_New();
ST_TcoordsBody* TcoordsBody_AddTcoordRow(ST_TcoordsBody* pTcoordsBody, ST_TcoordRow* pTcoordRow);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//テクスチャ座標行
/*typedef*/ struct _ST_TcoordRow {
	ST_Tcoord*			pTcoord;
	char*				pTcoordLabel;				//NULL可
} /*ST_TcoordRow*/;
ST_TcoordRow* TcoordRow_New(ST_Tcoord* pTcoord, char* pTcoordLabel/*NULL可*/);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//テクスチャ座標
/*typedef*/ struct _ST_Tcoord {
	int				s, t;
} /*ST_Tcoord*/;
ST_Tcoord* Tcoord_New(int s, int t);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//テクスチャ座標参照
#define TcoordRef_type_pTcoord		1
#define TcoordRef_type_iTcoordIndex	2
#define TcoordRef_type_pLabelOffset	3
/*typedef*/ struct _ST_TcoordRef {
	int				type;					//TcoordRef_type_*	Mesh_New()にて、(type=TcoordRef_type_iTcoordIndex)に統一される。
	union {
		ST_Tcoord*		pTcoord;
		int			iTcoordIndex;
		ST_LabelOffset*		pLabelOffset;
	} data;
} /*ST_TcoordRef*/;
ST_TcoordRef* TcoordRef_NewTcoord(ST_Tcoord* pTcoord);
ST_TcoordRef* TcoordRef_NewIndex(int iTcoordIndex);
ST_TcoordRef* TcoordRef_NewLabelOffset(char* pTcoordLabel, int iOffset);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//フェイス
/*typedef*/ struct _ST_Face {
	ST_FaceHdr*			pFaceHdr;
	ST_FaceBody*			pFaceBody;
} /*ST_Face*/;
ST_Face* Face_New(ST_FaceHdr* pFaceHdr, ST_FaceBody* pFaceBody);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//フェイスヘッダ
/*typedef*/ struct _ST_FaceHdr {
	int				iFaceColor;
} /*ST_FaceHdr*/;
ST_FaceHdr* FaceHdr_New(int iFaceColor);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//フェイスボディ
/*typedef*/ struct _ST_FaceBody {
	GSList/*<ST_FaceVertexRow*>*/*	pFaceVertexRowList;
} /*ST_FaceBody*/;
ST_FaceBody* FaceBody_New();
ST_FaceBody* FaceBody_AddFaceVertexRow(ST_FaceBody* pFaceBody, ST_FaceVertexRow* pFaceVertexRow);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//フェイス頂点行
/*typedef*/ struct _ST_FaceVertexRow {
	ST_FaceVertex*			pFaceVertex;
} /*ST_FaceVertexRow*/;
ST_FaceVertexRow* FaceVertexRow_New(ST_FaceVertex* pFaceVertex);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//フェイス頂点
/*typedef*/ struct _ST_FaceVertex {
	ST_VectorRef*			pVectorRef;
	ST_TcoordRef*			pTcoordRef;				//NULL可
} /*ST_FaceVertex*/;
ST_FaceVertex* FaceVertex_New(ST_VectorRef* pVectorRef, ST_TcoordRef* pTcoordRef/*NULL可*/);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//ラベルオフセット
/*typedef*/ struct _ST_LabelOffset {
	char*				pLabel;
	int				iOffset;
} /*ST_LabelOffset*/;
ST_LabelOffset* LabelOffset_New(char* pLabel, int iOffset);
//-----------------------------------------------------------------------------
//グローバル関数宣言
//-----------------------------------------------------------------------------
int cast_dbl_to_int(double d);
void addMesh(ST_Mesh* pMesh);
//-----------------------------------------------------------------------------
//変更履歴
//-----------------------------------------------------------------------------
// * Fri May 11 23:59:59 JST 2018 Naoyuki Sawa
// - 1st リリース。
//   dVslDefCをベースにして作成しました。
//-----------------------------------------------------------------------------
//バージョン定義
//-----------------------------------------------------------------------------
#define VERSION "20180511"
//-----------------------------------------------------------------------------
#endif/*__WINAPP_H__*/
