//
// restricted VRML 2 parser
//
// used in G-PASS (3d Shadow) project
// 
// Copyright 1999-2000 Consilium AB
// Copyright 1999-2000 Antonio Solo (aka SoloTony)
//

#ifndef _vrml_2_h_included_
#define _vrml_2_h_included_

// array of 3 float values
struct _float3 
{
	float d[3];
	inline float& operator[](int i){return d[i];}
};
// array of 4 float values
struct _float4
{
	float d[4];
	inline float& operator[](int i){return d[i];}
};
// array of 64 string values
struct _str64
{
	char d[64];
	inline char& operator[](int i){return d[i];}
	inline operator char*(){return d;}
};

//forward declarations
struct _Node;
typedef _Node* _pNode;

// nodes list
typedef CList<_pNode, _pNode> _List;
typedef _List* _pList;
// int list
typedef CList<int, int> _IntList;
typedef _IntList* _pIntList;
// float arrays list
typedef CList<_float3, _float3> _CoordList;
typedef _CoordList* _pCoordList;

// VRML node type
enum
{
	S_Anchor_children				= 0x00000001,
	S_Anchor_description			= 0x00000002,

	S_Coordinate_point				= 0x00000001,

	S_Group_children				= 0x00000001,

	S_IndexedFaceSet_coord			= 0x00000001,
	S_IndexedFaceSet_normal			= 0x00000002,
	S_IndexedFaceSet_coordIndex		= 0x00000004,
	S_IndexedFaceSet_normalIndex	= 0x00000008,

	S_Normal_vector					= 0x00000001,

	S_Shape_geometry				= 0x00000001,

	S_Transform_center				= 0x00000001,
	S_Transform_children			= 0x00000002,
	S_Transform_rotation			= 0x00000004,
	S_Transform_scale				= 0x00000008,
	S_Transform_scaleOrientation	= 0x00000010,
	S_Transform_translation			= 0x00000020

};

// VRML 'Anchor' node data
struct S_Anchor 
{
	int fields;
	_pList children;
	_str64 description; 
};
// VRML 'Coordinate' node data
struct S_Coordinate 
{	
	int fields;
	_pCoordList point; 
};
// VRML 'Group' node data
struct S_Group
{
	int fields;
	_pList children;
};
// VRML 'IndexedFaceSet' node data
struct S_IndexedFaceSet
{	
	int fields;
	_pNode coord;
	_pNode normal;
	_pIntList coordIndex;
	_pIntList normalIndex;
};
// VRML 'Normal' node data
struct S_Normal
{
	int fields;
	_pCoordList vector;
};
// VRML 'Shape' node data
struct S_Shape
{
	int fields;
	_pNode geometry;
};
// VRML 'Transform' node data
struct S_Transform
{
	int fields;
	_float3 center;
	_pList children;
	_float4 rotation;
	_float3 scale;
	_float4 scaleOrientation;
	_float3 translation;
};

// base VRML node object
struct _Node
{
	_str64 name;
	virtual void Trace() = 0;
	_Node();									// _Node default constructor
};
// VRML 'Anchor' node object
struct _Anchor : public _Node
{
	S_Anchor a;
	virtual void Trace();
};
// VRML 'Coordinate' node object
struct _Coordinate : public _Node
{
	S_Coordinate c;
	virtual void Trace();
};
// VRML 'Group' node object
struct _Group : public _Node
{
	S_Group g;
	virtual void Trace();
};
// VRML 'IndexedFaceSet' node object
struct _IndexedFaceSet : public _Node
{
	S_IndexedFaceSet i;
	virtual void Trace();
};
// VRML 'Normal' node object
struct _Normal : public _Node
{
	S_Normal n;
	virtual void Trace();
};
// VRML 'Transform' node object
struct _Transform : public _Node
{
	S_Transform t;
	virtual void Trace();
};
// VRML 'Shape' node object
struct _Shape : public _Node
{
	S_Shape s;
	virtual void Trace();
};


////////////////////////////////////////////////////////////////////////////
//                        parser callback functions
// return pointer to root object
_pList CreateRootNodesList();
// append _Node object into _List object
void AppendNode(_pList, _pNode);
// show warning if root list at the end is empty
void WarningOnEmptyRootList();
// create _List object, return pointer to it
_pList CreateNodesList();
// show warning if non-root list at the end is empty
void WarningOnEmptyList();
// create _Anchor object, return pointer to it
_pNode CreateAnchor(S_Anchor);
// create _Coordinate object, return pointer to it
_pNode CreateCoordinate(S_Coordinate);
// create _Group object, return pointer to it
_pNode CreateGroup(S_Group);
// create _IndexedFaceSet object, return pointer to it
_pNode CreateIndexedFaceSet(S_IndexedFaceSet);
// create _Normal object, return pointer to it
_pNode CreateNormal(S_Normal);
// create _Shape object, return pointer to it
_pNode CreateShape(S_Shape);
// create _Transform object, return pointer to it
_pNode CreateTransform(S_Transform);
// this function is related to lexic analyser
// skip data between { } brackets
void SkipNode(_str64 nodeName);
// set name to the _Node object
void SetNodeName(_pNode, _str64);
// create _CoordList object, return pointer to it
_pCoordList CreateCoordList();
// delete _CoordList object
void DestroyCoordList(_pCoordList);
// append int value into _CoordList object
void AppendToCoordList(_pCoordList, _float3);
// create _IntList object, return pointer to it
_pIntList CreateIntList();
// delete _IntList object
void DestroyIntList(_pIntList);
// append int value into _IntList object
void AppendToIntList(_pIntList, int);
// error processor, needed for parser
void yyerror(LPCSTR);
// lexical analyzer, needed for parser
int yyparse();


#endif //#ifndef _vrml_2_h_included_