// (c) 1995-2007 Electronic Arts Inc.
/*
 	File:		QD3DGeometry.h
 
 	Contains:	Q3Geometry methods										
 
 	Version:	Technology:	Quickdraw 3D 1.5.4
 				Release:	QuickTime 3.0
 
 
 	Bugs?:		Please include the the file and version information (from above) with
 				the problem description.  Developers belonging to one of the Apple
 				developer programs can submit bug reports to:
 
 					devsupport@apple.com
 
*/
#ifndef __QD3DGEOMETRY__
#define __QD3DGEOMETRY__

#ifndef __QD3D__
#include <QD3D.h>
#endif

#ifndef __QD3DSET__
#include <QD3DSet.h>
#endif



#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
	#pragma options align=power
#elif PRAGMA_STRUCT_PACKPUSH
	#pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
	#pragma pack(2)
#endif

#if PRAGMA_ENUM_ALWAYSINT
	#pragma enumsalwaysint on
#elif PRAGMA_ENUM_OPTIONS
	#pragma option enum=int
#elif PRAGMA_ENUM_PACK
	#if __option(pack_enums)
		#define PRAGMA_ENUM_PACK__QD3DGEOMETRY__
	#endif
	#pragma options(!pack_enums)
#endif

/******************************************************************************
 **																			 **
 **								Geometry Routines							 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3ObjectType )
Q3Geometry_GetType				(TQ3GeometryObject 		geometry);

EXTERN_API_C( TQ3Status )
Q3Geometry_GetAttributeSet		(TQ3GeometryObject 		geometry,
								 TQ3AttributeSet *		attributeSet);

EXTERN_API_C( TQ3Status )
Q3Geometry_SetAttributeSet		(TQ3GeometryObject 		geometry,
								 TQ3AttributeSet 		attributeSet);

EXTERN_API_C( TQ3Status )
Q3Geometry_Submit				(TQ3GeometryObject 		geometry,
								 TQ3ViewObject 			view);



/******************************************************************************
 **																			 **
 **							Box	Data Structure Definitions					 **
 **																			 **
 *****************************************************************************/

struct TQ3BoxData {
	TQ3Point3D 						origin;
	TQ3Vector3D 					orientation;
	TQ3Vector3D 					majorAxis;
	TQ3Vector3D 					minorAxis;
	TQ3AttributeSet *				faceAttributeSet;			/* Ordering : Left, right, 	*/
																/*			  front, back, 	*/
																/*			  top, bottom	*/
	TQ3AttributeSet 				boxAttributeSet;
};
typedef struct TQ3BoxData				TQ3BoxData;

/******************************************************************************
 **																			 **
 **								Box Routines							     **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Box_New						(const TQ3BoxData *		boxData);

EXTERN_API_C( TQ3Status )
Q3Box_Submit					(const TQ3BoxData *		boxData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Box_SetData					(TQ3GeometryObject 		box,
								 const TQ3BoxData *		boxData);

EXTERN_API_C( TQ3Status )
Q3Box_GetData					(TQ3GeometryObject 		box,
								 TQ3BoxData *			boxData);

EXTERN_API_C( TQ3Status )
Q3Box_EmptyData					(TQ3BoxData *			boxData);

EXTERN_API_C( TQ3Status )
Q3Box_SetOrigin					(TQ3GeometryObject 		box,
								 const TQ3Point3D *		origin);

EXTERN_API_C( TQ3Status )
Q3Box_SetOrientation			(TQ3GeometryObject 		box,
								 const TQ3Vector3D *	orientation);

EXTERN_API_C( TQ3Status )
Q3Box_SetMajorAxis				(TQ3GeometryObject 		box,
								 const TQ3Vector3D *	majorAxis);

EXTERN_API_C( TQ3Status )
Q3Box_SetMinorAxis				(TQ3GeometryObject 		box,
								 const TQ3Vector3D *	minorAxis);

EXTERN_API_C( TQ3Status )
Q3Box_GetOrigin					(TQ3GeometryObject 		box,
								 TQ3Point3D *			origin);

EXTERN_API_C( TQ3Status )
Q3Box_GetOrientation			(TQ3GeometryObject 		box,
								 TQ3Vector3D *			orientation);

EXTERN_API_C( TQ3Status )
Q3Box_GetMajorAxis				(TQ3GeometryObject 		box,
								 TQ3Vector3D *			majorAxis);

EXTERN_API_C( TQ3Status )
Q3Box_GetMinorAxis				(TQ3GeometryObject 		box,
								 TQ3Vector3D *			minorAxis);

EXTERN_API_C( TQ3Status )
Q3Box_GetFaceAttributeSet		(TQ3GeometryObject 		box,
								 unsigned long 			faceIndex,
								 TQ3AttributeSet *		faceAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Box_SetFaceAttributeSet		(TQ3GeometryObject 		box,
								 unsigned long 			faceIndex,
								 TQ3AttributeSet 		faceAttributeSet);



/******************************************************************************
 **																			 **
 **						Cone Data Structure Definitions					 	 **
 **																			 **
 *****************************************************************************/

struct TQ3ConeData {
	TQ3Point3D 						origin;
	TQ3Vector3D 					orientation;
	TQ3Vector3D 					majorRadius;
	TQ3Vector3D 					minorRadius;
	float 							uMin;
	float 							uMax;
	float 							vMin;
	float 							vMax;
	TQ3EndCap 						caps;
	TQ3AttributeSet 				interiorAttributeSet;
	TQ3AttributeSet 				faceAttributeSet;
	TQ3AttributeSet 				bottomAttributeSet;
	TQ3AttributeSet 				coneAttributeSet;
};
typedef struct TQ3ConeData				TQ3ConeData;
/******************************************************************************
 **																			 **
 **								Cone Routines								 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Cone_New						(const TQ3ConeData *	coneData);

EXTERN_API_C( TQ3Status )
Q3Cone_Submit					(const TQ3ConeData *	coneData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Cone_SetData					(TQ3GeometryObject 		cone,
								 const TQ3ConeData *	coneData);

EXTERN_API_C( TQ3Status )
Q3Cone_GetData					(TQ3GeometryObject 		cone,
								 TQ3ConeData *			coneData);

EXTERN_API_C( TQ3Status )
Q3Cone_SetOrigin				(TQ3GeometryObject 		cone,
								 const TQ3Point3D *		origin);

EXTERN_API_C( TQ3Status )
Q3Cone_SetOrientation			(TQ3GeometryObject 		cone,
								 const TQ3Vector3D *	orientation);

EXTERN_API_C( TQ3Status )
Q3Cone_SetMajorRadius			(TQ3GeometryObject 		cone,
								 const TQ3Vector3D *	majorRadius);

EXTERN_API_C( TQ3Status )
Q3Cone_SetMinorRadius			(TQ3GeometryObject 		cone,
								 const TQ3Vector3D *	minorRadius);

EXTERN_API_C( TQ3Status )
Q3Cone_GetOrigin				(TQ3GeometryObject 		cone,
								 TQ3Point3D *			origin);

EXTERN_API_C( TQ3Status )
Q3Cone_GetOrientation			(TQ3GeometryObject 		cone,
								 TQ3Vector3D *			orientation);

EXTERN_API_C( TQ3Status )
Q3Cone_GetMajorRadius			(TQ3GeometryObject 		cone,
								 TQ3Vector3D *			majorRadius);

EXTERN_API_C( TQ3Status )
Q3Cone_GetMinorRadius			(TQ3GeometryObject 		cone,
								 TQ3Vector3D *			minorRadius);

EXTERN_API_C( TQ3Status )
Q3Cone_SetCaps					(TQ3GeometryObject 		cone,
								 TQ3EndCap 				caps);

EXTERN_API_C( TQ3Status )
Q3Cone_GetCaps					(TQ3GeometryObject 		cone,
								 TQ3EndCap *			caps);

EXTERN_API_C( TQ3Status )
Q3Cone_SetBottomAttributeSet	(TQ3GeometryObject 		cone,
								 TQ3AttributeSet 		bottomAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Cone_GetBottomAttributeSet	(TQ3GeometryObject 		cone,
								 TQ3AttributeSet *		bottomAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Cone_SetFaceAttributeSet		(TQ3GeometryObject 		cone,
								 TQ3AttributeSet 		faceAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Cone_GetFaceAttributeSet		(TQ3GeometryObject 		cone,
								 TQ3AttributeSet *		faceAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Cone_EmptyData				(TQ3ConeData *			coneData);




/******************************************************************************
 **																			 **
 **						Cylinder Data Structure Definitions					 **
 **																			 **
 *****************************************************************************/

struct TQ3CylinderData {
	TQ3Point3D 						origin;
	TQ3Vector3D 					orientation;
	TQ3Vector3D 					majorRadius;
	TQ3Vector3D 					minorRadius;
	float 							uMin;
	float 							uMax;
	float 							vMin;
	float 							vMax;
	TQ3EndCap 						caps;
	TQ3AttributeSet 				interiorAttributeSet;
	TQ3AttributeSet 				topAttributeSet;
	TQ3AttributeSet 				faceAttributeSet;
	TQ3AttributeSet 				bottomAttributeSet;
	TQ3AttributeSet 				cylinderAttributeSet;
};
typedef struct TQ3CylinderData			TQ3CylinderData;
/******************************************************************************
 **																			 **
 **							Cylinder Routines								 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Cylinder_New					(const TQ3CylinderData * cylinderData);

EXTERN_API_C( TQ3Status )
Q3Cylinder_Submit				(const TQ3CylinderData * cylinderData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Cylinder_SetData				(TQ3GeometryObject 		cylinder,
								 const TQ3CylinderData * cylinderData);

EXTERN_API_C( TQ3Status )
Q3Cylinder_GetData				(TQ3GeometryObject 		cylinder,
								 TQ3CylinderData *		cylinderData);

EXTERN_API_C( TQ3Status )
Q3Cylinder_SetOrigin			(TQ3GeometryObject 		cylinder,
								 const TQ3Point3D *		origin);

EXTERN_API_C( TQ3Status )
Q3Cylinder_SetOrientation		(TQ3GeometryObject 		cylinder,
								 const TQ3Vector3D *	orientation);

EXTERN_API_C( TQ3Status )
Q3Cylinder_SetMajorRadius		(TQ3GeometryObject 		cylinder,
								 const TQ3Vector3D *	majorRadius);

EXTERN_API_C( TQ3Status )
Q3Cylinder_SetMinorRadius		(TQ3GeometryObject 		cylinder,
								 const TQ3Vector3D *	minorRadius);

EXTERN_API_C( TQ3Status )
Q3Cylinder_GetOrigin			(TQ3GeometryObject 		cylinder,
								 TQ3Point3D *			origin);

EXTERN_API_C( TQ3Status )
Q3Cylinder_GetOrientation		(TQ3GeometryObject 		cylinder,
								 TQ3Vector3D *			orientation);

EXTERN_API_C( TQ3Status )
Q3Cylinder_GetMajorRadius		(TQ3GeometryObject 		cylinder,
								 TQ3Vector3D *			majorRadius);

EXTERN_API_C( TQ3Status )
Q3Cylinder_GetMinorRadius		(TQ3GeometryObject 		cylinder,
								 TQ3Vector3D *			minorRadius);


EXTERN_API_C( TQ3Status )
Q3Cylinder_SetCaps				(TQ3GeometryObject 		cylinder,
								 TQ3EndCap 				caps);

EXTERN_API_C( TQ3Status )
Q3Cylinder_GetCaps				(TQ3GeometryObject 		cylinder,
								 TQ3EndCap *			caps);


EXTERN_API_C( TQ3Status )
Q3Cylinder_SetTopAttributeSet	(TQ3GeometryObject 		cylinder,
								 TQ3AttributeSet 		topAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Cylinder_GetTopAttributeSet	(TQ3GeometryObject 		cylinder,
								 TQ3AttributeSet *		topAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Cylinder_SetBottomAttributeSet (TQ3GeometryObject 	cylinder,
								 TQ3AttributeSet 		bottomAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Cylinder_GetBottomAttributeSet (TQ3GeometryObject 	cylinder,
								 TQ3AttributeSet *		bottomAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Cylinder_SetFaceAttributeSet	(TQ3GeometryObject 		cylinder,
								 TQ3AttributeSet 		faceAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Cylinder_GetFaceAttributeSet	(TQ3GeometryObject 		cylinder,
								 TQ3AttributeSet *		faceAttributeSet);

EXTERN_API_C( TQ3Status )
Q3Cylinder_EmptyData			(TQ3CylinderData *		cylinderData);




/******************************************************************************
 **																			 **
 **						Disk Data Structure Definitions						 **
 **																			 **
 *****************************************************************************/

struct TQ3DiskData {
	TQ3Point3D 						origin;
	TQ3Vector3D 					majorRadius;
	TQ3Vector3D 					minorRadius;
	float 							uMin;
	float 							uMax;
	float 							vMin;
	float 							vMax;
	TQ3AttributeSet 				diskAttributeSet;
};
typedef struct TQ3DiskData				TQ3DiskData;
/******************************************************************************
 **																			 **
 **								Disk Routines							 	 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Disk_New						(const TQ3DiskData *	diskData);

EXTERN_API_C( TQ3Status )
Q3Disk_Submit					(const TQ3DiskData *	diskData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Disk_SetData					(TQ3GeometryObject 		disk,
								 const TQ3DiskData *	diskData);

EXTERN_API_C( TQ3Status )
Q3Disk_GetData					(TQ3GeometryObject 		disk,
								 TQ3DiskData *			diskData);

EXTERN_API_C( TQ3Status )
Q3Disk_SetOrigin				(TQ3GeometryObject 		disk,
								 const TQ3Point3D *		origin);

EXTERN_API_C( TQ3Status )
Q3Disk_SetMajorRadius			(TQ3GeometryObject 		disk,
								 const TQ3Vector3D *	majorRadius);

EXTERN_API_C( TQ3Status )
Q3Disk_SetMinorRadius			(TQ3GeometryObject 		disk,
								 const TQ3Vector3D *	minorRadius);

EXTERN_API_C( TQ3Status )
Q3Disk_GetOrigin				(TQ3GeometryObject 		disk,
								 TQ3Point3D *			origin);

EXTERN_API_C( TQ3Status )
Q3Disk_GetMajorRadius			(TQ3GeometryObject 		disk,
								 TQ3Vector3D *			majorRadius);

EXTERN_API_C( TQ3Status )
Q3Disk_GetMinorRadius			(TQ3GeometryObject 		disk,
								 TQ3Vector3D *			minorRadius);


EXTERN_API_C( TQ3Status )
Q3Disk_EmptyData				(TQ3DiskData *			diskData);




/******************************************************************************
 **																			 **
 **					 Ellipse Data Structure Definitions						 **
 **																			 **
 *****************************************************************************/

struct TQ3EllipseData {
	TQ3Point3D 						origin;
	TQ3Vector3D 					majorRadius;
	TQ3Vector3D 					minorRadius;
	float 							uMin;
	float 							uMax;
	TQ3AttributeSet 				ellipseAttributeSet;
};
typedef struct TQ3EllipseData			TQ3EllipseData;
/******************************************************************************
 **																			 **
 **								Ellipse Routines							 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Ellipse_New					(const TQ3EllipseData *	ellipseData);

EXTERN_API_C( TQ3Status )
Q3Ellipse_Submit				(const TQ3EllipseData *	ellipseData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Ellipse_SetData				(TQ3GeometryObject 		ellipse,
								 const TQ3EllipseData *	ellipseData);

EXTERN_API_C( TQ3Status )
Q3Ellipse_GetData				(TQ3GeometryObject 		ellipse,
								 TQ3EllipseData *		ellipseData);

EXTERN_API_C( TQ3Status )
Q3Ellipse_SetOrigin				(TQ3GeometryObject 		ellipse,
								 const TQ3Point3D *		origin);

EXTERN_API_C( TQ3Status )
Q3Ellipse_SetMajorRadius		(TQ3GeometryObject 		ellipse,
								 const TQ3Vector3D *	majorRadius);

EXTERN_API_C( TQ3Status )
Q3Ellipse_SetMinorRadius		(TQ3GeometryObject 		ellipse,
								 const TQ3Vector3D *	minorRadius);

EXTERN_API_C( TQ3Status )
Q3Ellipse_GetOrigin				(TQ3GeometryObject 		ellipse,
								 TQ3Point3D *			origin);

EXTERN_API_C( TQ3Status )
Q3Ellipse_GetMajorRadius		(TQ3GeometryObject 		ellipse,
								 TQ3Vector3D *			majorRadius);

EXTERN_API_C( TQ3Status )
Q3Ellipse_GetMinorRadius		(TQ3GeometryObject 		ellipse,
								 TQ3Vector3D *			minorRadius);


EXTERN_API_C( TQ3Status )
Q3Ellipse_EmptyData				(TQ3EllipseData *		ellipseData);




/******************************************************************************
 ** 																		 **
 **							Ellipsoid Data structures						 **
 ** 																		 **
 *****************************************************************************/

struct TQ3EllipsoidData {
	TQ3Point3D 						origin;
	TQ3Vector3D 					orientation;
	TQ3Vector3D 					majorRadius;
	TQ3Vector3D 					minorRadius;
	float 							uMin;
	float 							uMax;
	float 							vMin;
	float 							vMax;
	TQ3EndCap 						caps;
	TQ3AttributeSet 				interiorAttributeSet;
	TQ3AttributeSet 				ellipsoidAttributeSet;
};
typedef struct TQ3EllipsoidData			TQ3EllipsoidData;
/******************************************************************************
 ** 																		 **
 **							Ellipsoid Routines   							 **
 ** 																		 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Ellipsoid_New					(const TQ3EllipsoidData * ellipsoidData);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_Submit				(const TQ3EllipsoidData * ellipsoidData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_SetData				(TQ3GeometryObject 		ellipsoid,
								 const TQ3EllipsoidData * ellipsoidData);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_GetData				(TQ3GeometryObject 		ellipsoid,
								 TQ3EllipsoidData *		ellipsoidData);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_SetOrigin			(TQ3GeometryObject 		ellipsoid,
								 const TQ3Point3D *		origin);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_SetOrientation		(TQ3GeometryObject 		ellipsoid,
								 const TQ3Vector3D *	orientation);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_SetMajorRadius		(TQ3GeometryObject 		ellipsoid,
								 const TQ3Vector3D *	majorRadius);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_SetMinorRadius		(TQ3GeometryObject 		ellipsoid,
								 const TQ3Vector3D *	minorRadius);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_GetOrigin			(TQ3GeometryObject 		ellipsoid,
								 TQ3Point3D *			origin);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_GetOrientation		(TQ3GeometryObject 		ellipsoid,
								 TQ3Vector3D *			orientation);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_GetMajorRadius		(TQ3GeometryObject 		ellipsoid,
								 TQ3Vector3D *			majorRadius);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_GetMinorRadius		(TQ3GeometryObject 		ellipsoid,
								 TQ3Vector3D *			minorRadius);

EXTERN_API_C( TQ3Status )
Q3Ellipsoid_EmptyData			(TQ3EllipsoidData *		ellipsoidData);




/******************************************************************************
 **																			 **
 **					General Polygon Data Structure Definitions				 **
 **																			 **
 *****************************************************************************/

enum TQ3GeneralPolygonShapeHint {
	kQ3GeneralPolygonShapeHintComplex = 0,
	kQ3GeneralPolygonShapeHintConcave = 1,
	kQ3GeneralPolygonShapeHintConvex = 2
};
typedef enum TQ3GeneralPolygonShapeHint TQ3GeneralPolygonShapeHint;


struct TQ3GeneralPolygonContourData {
	unsigned long 					numVertices;
	TQ3Vertex3D *					vertices;
};
typedef struct TQ3GeneralPolygonContourData TQ3GeneralPolygonContourData;

struct TQ3GeneralPolygonData {
	unsigned long 					numContours;
	TQ3GeneralPolygonContourData *	contours;
	TQ3GeneralPolygonShapeHint 		shapeHint;
	TQ3AttributeSet 				generalPolygonAttributeSet;
};
typedef struct TQ3GeneralPolygonData	TQ3GeneralPolygonData;
/******************************************************************************
 **																			 **
 **							General polygon Routines						 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3GeneralPolygon_New			(const TQ3GeneralPolygonData * generalPolygonData);

EXTERN_API_C( TQ3Status )
Q3GeneralPolygon_Submit			(const TQ3GeneralPolygonData * generalPolygonData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3GeneralPolygon_SetData		(TQ3GeometryObject 		generalPolygon,
								 const TQ3GeneralPolygonData * generalPolygonData);

EXTERN_API_C( TQ3Status )
Q3GeneralPolygon_GetData		(TQ3GeometryObject 		polygon,
								 TQ3GeneralPolygonData * generalPolygonData);

EXTERN_API_C( TQ3Status )
Q3GeneralPolygon_EmptyData		(TQ3GeneralPolygonData * generalPolygonData);

EXTERN_API_C( TQ3Status )
Q3GeneralPolygon_GetVertexPosition (TQ3GeometryObject 	generalPolygon,
								 unsigned long 			contourIndex,
								 unsigned long 			pointIndex,
								 TQ3Point3D *			position);

EXTERN_API_C( TQ3Status )
Q3GeneralPolygon_SetVertexPosition (TQ3GeometryObject 	generalPolygon,
								 unsigned long 			contourIndex,
								 unsigned long 			pointIndex,
								 const TQ3Point3D *		position);

EXTERN_API_C( TQ3Status )
Q3GeneralPolygon_GetVertexAttributeSet (TQ3GeometryObject  generalPolygon,
								 unsigned long 			contourIndex,
								 unsigned long 			pointIndex,
								 TQ3AttributeSet *		attributeSet);

EXTERN_API_C( TQ3Status )
Q3GeneralPolygon_SetVertexAttributeSet (TQ3GeometryObject  generalPolygon,
								 unsigned long 			contourIndex,
								 unsigned long 			pointIndex,
								 TQ3AttributeSet 		attributeSet);

EXTERN_API_C( TQ3Status )
Q3GeneralPolygon_SetShapeHint	(TQ3GeometryObject 		generalPolygon,
								 TQ3GeneralPolygonShapeHint  shapeHint);

EXTERN_API_C( TQ3Status )
Q3GeneralPolygon_GetShapeHint	(TQ3GeometryObject 		generalPolygon,
								 TQ3GeneralPolygonShapeHint * shapeHint);




/******************************************************************************
 **																			 **
 **						Line Data Structure Definitions						 **
 **																			 **
 *****************************************************************************/

struct TQ3LineData {
	TQ3Vertex3D 					vertices[2];
	TQ3AttributeSet 				lineAttributeSet;
};
typedef struct TQ3LineData				TQ3LineData;
/******************************************************************************
 **																			 **
 **							Line Routines									 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Line_New						(const TQ3LineData *	lineData);

EXTERN_API_C( TQ3Status )
Q3Line_Submit					(const TQ3LineData *	lineData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Line_GetData					(TQ3GeometryObject 		line,
								 TQ3LineData *			lineData);

EXTERN_API_C( TQ3Status )
Q3Line_SetData					(TQ3GeometryObject 		line,
								 const TQ3LineData *	lineData);

EXTERN_API_C( TQ3Status )
Q3Line_GetVertexPosition		(TQ3GeometryObject 		line,
								 unsigned long 			index,
								 TQ3Point3D *			position);

EXTERN_API_C( TQ3Status )
Q3Line_SetVertexPosition		(TQ3GeometryObject 		line,
								 unsigned long 			index,
								 const TQ3Point3D *		position);

EXTERN_API_C( TQ3Status )
Q3Line_GetVertexAttributeSet	(TQ3GeometryObject 		line,
								 unsigned long 			index,
								 TQ3AttributeSet *		attributeSet);

EXTERN_API_C( TQ3Status )
Q3Line_SetVertexAttributeSet	(TQ3GeometryObject 		line,
								 unsigned long 			index,
								 TQ3AttributeSet 		attributeSet);

EXTERN_API_C( TQ3Status )
Q3Line_EmptyData				(TQ3LineData *			lineData);




/******************************************************************************
 **																			 **
 **						Marker Data Structure Definitions					 **
 **																			 **
 *****************************************************************************/

struct TQ3MarkerData {
	TQ3Point3D 						location;
	long 							xOffset;
	long 							yOffset;
	TQ3Bitmap 						bitmap;
	TQ3AttributeSet 				markerAttributeSet;
};
typedef struct TQ3MarkerData			TQ3MarkerData;
/******************************************************************************
 **																			 **
 **								Marker Routines								 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Marker_New					(const TQ3MarkerData *	markerData);

EXTERN_API_C( TQ3Status )
Q3Marker_Submit					(const TQ3MarkerData *	markerData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Marker_SetData				(TQ3GeometryObject 		geometry,
								 const TQ3MarkerData *	markerData);

EXTERN_API_C( TQ3Status )
Q3Marker_GetData				(TQ3GeometryObject 		geometry,
								 TQ3MarkerData *		markerData);

EXTERN_API_C( TQ3Status )
Q3Marker_EmptyData				(TQ3MarkerData *		markerData);

EXTERN_API_C( TQ3Status )
Q3Marker_GetPosition			(TQ3GeometryObject 		marker,
								 TQ3Point3D *			location);

EXTERN_API_C( TQ3Status )
Q3Marker_SetPosition			(TQ3GeometryObject 		marker,
								 const TQ3Point3D *		location);

EXTERN_API_C( TQ3Status )
Q3Marker_GetXOffset				(TQ3GeometryObject 		marker,
								 long *					xOffset);

EXTERN_API_C( TQ3Status )
Q3Marker_SetXOffset				(TQ3GeometryObject 		marker,
								 long 					xOffset);

EXTERN_API_C( TQ3Status )
Q3Marker_GetYOffset				(TQ3GeometryObject 		marker,
								 long *					yOffset);

EXTERN_API_C( TQ3Status )
Q3Marker_SetYOffset				(TQ3GeometryObject 		marker,
								 long 					yOffset);

EXTERN_API_C( TQ3Status )
Q3Marker_GetBitmap				(TQ3GeometryObject 		marker,
								 TQ3Bitmap *			bitmap);

EXTERN_API_C( TQ3Status )
Q3Marker_SetBitmap				(TQ3GeometryObject 		marker,
								 const TQ3Bitmap *		bitmap);




/******************************************************************************
 **																			 **
 **						Mesh Data Structure Definitions						 **
 **																			 **
 *****************************************************************************/
typedef struct OpaqueTQ3MeshComponent* 	TQ3MeshComponent;
typedef struct OpaqueTQ3MeshVertex* 	TQ3MeshVertex;
typedef struct OpaqueTQ3MeshFace* 		TQ3MeshFace;
typedef struct OpaqueTQ3MeshEdge* 		TQ3MeshEdge;
typedef struct OpaqueTQ3MeshContour* 	TQ3MeshContour;
/******************************************************************************
 **																			 **
 **							Mesh Routines								 	 **
 **																			 **
 *****************************************************************************/
/*
 *  Constructors
 */
EXTERN_API_C( TQ3GeometryObject )
Q3Mesh_New						(void);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_VertexNew				(TQ3GeometryObject 		mesh,
								 const TQ3Vertex3D *	vertex);

EXTERN_API_C( TQ3MeshFace )
Q3Mesh_FaceNew					(TQ3GeometryObject 		mesh,
								 unsigned long 			numVertices,
								 const TQ3MeshVertex *	vertices,
								 TQ3AttributeSet 		attributeSet);

/*
 *  Destructors
 */
EXTERN_API_C( TQ3Status )
Q3Mesh_VertexDelete				(TQ3GeometryObject 		mesh,
								 TQ3MeshVertex 			vertex);

EXTERN_API_C( TQ3Status )
Q3Mesh_FaceDelete				(TQ3GeometryObject 		mesh,
								 TQ3MeshFace 			face);

/*
 * Methods
 */
EXTERN_API_C( TQ3Status )
Q3Mesh_DelayUpdates				(TQ3GeometryObject 		mesh);

EXTERN_API_C( TQ3Status )
Q3Mesh_ResumeUpdates			(TQ3GeometryObject 		mesh);

EXTERN_API_C( TQ3MeshContour )
Q3Mesh_FaceToContour			(TQ3GeometryObject 		mesh,
								 TQ3MeshFace 			containerFace,
								 TQ3MeshFace 			face);

EXTERN_API_C( TQ3MeshFace )
Q3Mesh_ContourToFace			(TQ3GeometryObject 		mesh,
								 TQ3MeshContour 		contour);

/*
 * Mesh
 */
EXTERN_API_C( TQ3Status )
Q3Mesh_GetNumComponents			(TQ3GeometryObject 		mesh,
								 unsigned long *		numComponents);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetNumEdges				(TQ3GeometryObject 		mesh,
								 unsigned long *		numEdges);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetNumVertices			(TQ3GeometryObject 		mesh,
								 unsigned long *		numVertices);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetNumFaces				(TQ3GeometryObject 		mesh,
								 unsigned long *		numFaces);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetNumCorners			(TQ3GeometryObject 		mesh,
								 unsigned long *		numCorners);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetOrientable			(TQ3GeometryObject 		mesh,
								 TQ3Boolean *			orientable);

/*
 * Component
 */
EXTERN_API_C( TQ3Status )
Q3Mesh_GetComponentNumVertices	(TQ3GeometryObject 		mesh,
								 TQ3MeshComponent 		component,
								 unsigned long *		numVertices);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetComponentNumEdges		(TQ3GeometryObject 		mesh,
								 TQ3MeshComponent 		component,
								 unsigned long *		numEdges);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetComponentBoundingBox	(TQ3GeometryObject 		mesh,
								 TQ3MeshComponent 		component,
								 TQ3BoundingBox *		boundingBox);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetComponentOrientable	(TQ3GeometryObject 		mesh,
								 TQ3MeshComponent 		component,
								 TQ3Boolean *			orientable);

/*
 * Vertex
 */
EXTERN_API_C( TQ3Status )
Q3Mesh_GetVertexCoordinates		(TQ3GeometryObject 		mesh,
								 TQ3MeshVertex 			vertex,
								 TQ3Point3D *			coordinates);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetVertexIndex			(TQ3GeometryObject 		mesh,
								 TQ3MeshVertex 			vertex,
								 unsigned long *		index);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetVertexOnBoundary		(TQ3GeometryObject 		mesh,
								 TQ3MeshVertex 			vertex,
								 TQ3Boolean *			onBoundary);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetVertexComponent		(TQ3GeometryObject 		mesh,
								 TQ3MeshVertex 			vertex,
								 TQ3MeshComponent *		component);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetVertexAttributeSet	(TQ3GeometryObject 		mesh,
								 TQ3MeshVertex 			vertex,
								 TQ3AttributeSet *		attributeSet);


EXTERN_API_C( TQ3Status )
Q3Mesh_SetVertexCoordinates		(TQ3GeometryObject 		mesh,
								 TQ3MeshVertex 			vertex,
								 const TQ3Point3D *		coordinates);

EXTERN_API_C( TQ3Status )
Q3Mesh_SetVertexAttributeSet	(TQ3GeometryObject 		mesh,
								 TQ3MeshVertex 			vertex,
								 TQ3AttributeSet 		attributeSet);


/*
 * Face
 */
EXTERN_API_C( TQ3Status )
Q3Mesh_GetFaceNumVertices		(TQ3GeometryObject 		mesh,
								 TQ3MeshFace 			face,
								 unsigned long *		numVertices);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetFacePlaneEquation		(TQ3GeometryObject 		mesh,
								 TQ3MeshFace 			face,
								 TQ3PlaneEquation *		planeEquation);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetFaceNumContours		(TQ3GeometryObject 		mesh,
								 TQ3MeshFace 			face,
								 unsigned long *		numContours);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetFaceIndex				(TQ3GeometryObject 		mesh,
								 TQ3MeshFace 			face,
								 unsigned long *		index);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetFaceComponent			(TQ3GeometryObject 		mesh,
								 TQ3MeshFace 			face,
								 TQ3MeshComponent *		component);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetFaceAttributeSet		(TQ3GeometryObject 		mesh,
								 TQ3MeshFace 			face,
								 TQ3AttributeSet *		attributeSet);


EXTERN_API_C( TQ3Status )
Q3Mesh_SetFaceAttributeSet		(TQ3GeometryObject 		mesh,
								 TQ3MeshFace 			face,
								 TQ3AttributeSet 		attributeSet);

/*
 * Edge
 */
EXTERN_API_C( TQ3Status )
Q3Mesh_GetEdgeVertices			(TQ3GeometryObject 		mesh,
								 TQ3MeshEdge 			edge,
								 TQ3MeshVertex *		vertex1,
								 TQ3MeshVertex *		vertex2);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetEdgeFaces				(TQ3GeometryObject 		mesh,
								 TQ3MeshEdge 			edge,
								 TQ3MeshFace *			face1,
								 TQ3MeshFace *			face2);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetEdgeOnBoundary		(TQ3GeometryObject 		mesh,
								 TQ3MeshEdge 			edge,
								 TQ3Boolean *			onBoundary);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetEdgeComponent			(TQ3GeometryObject 		mesh,
								 TQ3MeshEdge 			edge,
								 TQ3MeshComponent *		component);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetEdgeAttributeSet		(TQ3GeometryObject 		mesh,
								 TQ3MeshEdge 			edge,
								 TQ3AttributeSet *		attributeSet);


EXTERN_API_C( TQ3Status )
Q3Mesh_SetEdgeAttributeSet		(TQ3GeometryObject 		mesh,
								 TQ3MeshEdge 			edge,
								 TQ3AttributeSet 		attributeSet);

/*
 * Contour
 */
EXTERN_API_C( TQ3Status )
Q3Mesh_GetContourFace			(TQ3GeometryObject 		mesh,
								 TQ3MeshContour 		contour,
								 TQ3MeshFace *			face);

EXTERN_API_C( TQ3Status )
Q3Mesh_GetContourNumVertices	(TQ3GeometryObject 		mesh,
								 TQ3MeshContour 		contour,
								 unsigned long *		numVertices);

/*
 * Corner
 */
EXTERN_API_C( TQ3Status )
Q3Mesh_GetCornerAttributeSet	(TQ3GeometryObject 		mesh,
								 TQ3MeshVertex 			vertex,
								 TQ3MeshFace 			face,
								 TQ3AttributeSet *		attributeSet);

EXTERN_API_C( TQ3Status )
Q3Mesh_SetCornerAttributeSet	(TQ3GeometryObject 		mesh,
								 TQ3MeshVertex 			vertex,
								 TQ3MeshFace 			face,
								 TQ3AttributeSet 		attributeSet);


/*
 * Public Mesh Iterators
 */

struct TQ3MeshIterator {
	void *							var1;
	void *							var2;
	void *							var3;
	struct {
		void *							field1;
		char 							field2[4];
	} 								var4;
};
typedef struct TQ3MeshIterator			TQ3MeshIterator;
EXTERN_API_C( TQ3MeshComponent )
Q3Mesh_FirstMeshComponent		(TQ3GeometryObject 		mesh,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshComponent )
Q3Mesh_NextMeshComponent		(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_FirstComponentVertex		(TQ3MeshComponent 		component,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_NextComponentVertex		(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshEdge )
Q3Mesh_FirstComponentEdge		(TQ3MeshComponent 		component,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshEdge )
Q3Mesh_NextComponentEdge		(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_FirstMeshVertex			(TQ3GeometryObject 		mesh,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_NextMeshVertex			(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshFace )
Q3Mesh_FirstMeshFace			(TQ3GeometryObject 		mesh,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshFace )
Q3Mesh_NextMeshFace				(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshEdge )
Q3Mesh_FirstMeshEdge			(TQ3GeometryObject 		mesh,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshEdge )
Q3Mesh_NextMeshEdge				(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshEdge )
Q3Mesh_FirstVertexEdge			(TQ3MeshVertex 			vertex,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshEdge )
Q3Mesh_NextVertexEdge			(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_FirstVertexVertex		(TQ3MeshVertex 			vertex,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_NextVertexVertex			(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshFace )
Q3Mesh_FirstVertexFace			(TQ3MeshVertex 			vertex,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshFace )
Q3Mesh_NextVertexFace			(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshEdge )
Q3Mesh_FirstFaceEdge			(TQ3MeshFace 			face,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshEdge )
Q3Mesh_NextFaceEdge				(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_FirstFaceVertex			(TQ3MeshFace 			face,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_NextFaceVertex			(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshFace )
Q3Mesh_FirstFaceFace			(TQ3MeshFace 			face,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshFace )
Q3Mesh_NextFaceFace				(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshContour )
Q3Mesh_FirstFaceContour			(TQ3MeshFace 			face,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshContour )
Q3Mesh_NextFaceContour			(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshEdge )
Q3Mesh_FirstContourEdge			(TQ3MeshContour 		contour,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshEdge )
Q3Mesh_NextContourEdge			(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_FirstContourVertex		(TQ3MeshContour 		contour,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshVertex )
Q3Mesh_NextContourVertex		(TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshFace )
Q3Mesh_FirstContourFace			(TQ3MeshContour 		contour,
								 TQ3MeshIterator *		iterator);

EXTERN_API_C( TQ3MeshFace )
Q3Mesh_NextContourFace			(TQ3MeshIterator *		iterator);


#define	Q3ForEachMeshComponent(m,c,i)										\
	for ( (c) = Q3Mesh_FirstMeshComponent((m),(i));							\
		  (c);																\
		  (c) = Q3Mesh_NextMeshComponent((i)) )

#define Q3ForEachComponentVertex(c,v,i)										\
	for ( (v) = Q3Mesh_FirstComponentVertex((c),(i));						\
		  (v);																\
		  (v) = Q3Mesh_NextComponentVertex((i)) )
		  
#define Q3ForEachComponentEdge(c,e,i)										\
	for ( (e) = Q3Mesh_FirstComponentEdge((c),(i));							\
		  (e);																\
		  (e) = Q3Mesh_NextComponentEdge((i)) )

#define Q3ForEachMeshVertex(m,v,i)											\
	for ( (v) = Q3Mesh_FirstMeshVertex((m),(i));							\
		  (v);																\
		  (v) = Q3Mesh_NextMeshVertex((i)) )

#define Q3ForEachMeshFace(m,f,i)											\
	for ( (f) = Q3Mesh_FirstMeshFace((m),(i));								\
		  (f);																\
		  (f) = Q3Mesh_NextMeshFace((i)) )

#define Q3ForEachMeshEdge(m,e,i)											\
	for ( (e) = Q3Mesh_FirstMeshEdge((m),(i));								\
		  (e);																\
		  (e) = Q3Mesh_NextMeshEdge((i)) )

#define Q3ForEachVertexEdge(v,e,i)											\
	for ( (e) = Q3Mesh_FirstVertexEdge((v),(i));							\
		  (e);																\
		  (e) = Q3Mesh_NextVertexEdge((i)) )


#define Q3ForEachVertexVertex(v,n,i)										\
	for ( (n) = Q3Mesh_FirstVertexVertex((v),(i));							\
		  (n);																\
		  (n) = Q3Mesh_NextVertexVertex((i)) )

#define Q3ForEachVertexFace(v,f,i)											\
	for ( (f) = Q3Mesh_FirstVertexFace((v),(i));							\
		  (f);																\
		  (f) = Q3Mesh_NextVertexFace((i)) )

#define Q3ForEachFaceEdge(f,e,i)											\
	for ( (e) = Q3Mesh_FirstFaceEdge((f),(i));								\
		  (e);																\
		  (e) = Q3Mesh_NextFaceEdge((i)) )

#define Q3ForEachFaceVertex(f,v,i)											\
	for ( (v) = Q3Mesh_FirstFaceVertex((f),(i));							\
		  (v);																\
		  (v) = Q3Mesh_NextFaceVertex((i)) )
	
#define Q3ForEachFaceFace(f,n,i)											\
	for ( (n) = Q3Mesh_FirstFaceFace((f),(i));  							\
		  (n);																\
		  (n) = Q3Mesh_NextFaceFace((i)) )
		  
#define Q3ForEachFaceContour(f,h,i)											\
	for ( (h) = Q3Mesh_FirstFaceContour((f),(i));							\
	      (h);																\
	      (h) = Q3Mesh_NextFaceContour((i)) )

#define Q3ForEachContourEdge(h,e,i)											\
	for ( (e) = Q3Mesh_FirstContourEdge((h),(i));							\
	      (e);																\
	      (e) = Q3Mesh_NextContourEdge((i)) )

#define Q3ForEachContourVertex(h,v,i)										\
	for ( (v) = Q3Mesh_FirstContourVertex((h),(i));							\
	      (v);																\
	      (v) = Q3Mesh_NextContourVertex((i)) )

#define Q3ForEachContourFace(h,f,i)											\
	for ( (f) = Q3Mesh_FirstContourFace((h),(i));							\
	      (f);																\
	      (f) = Q3Mesh_NextContourFace((i)) )



/******************************************************************************
 **																			 **
 **							Maximum order for NURB Curves					 **
 **																			 **
 *****************************************************************************/
#define kQ3NURBCurveMaxOrder	16

/******************************************************************************
 **																			 **
 **						NURB Data Structure Definitions						 **
 **																			 **
 *****************************************************************************/

struct TQ3NURBCurveData {
	unsigned long 					order;
	unsigned long 					numPoints;
	TQ3RationalPoint4D *			controlPoints;
	float *							knots;
	TQ3AttributeSet 				curveAttributeSet;
};
typedef struct TQ3NURBCurveData			TQ3NURBCurveData;
/******************************************************************************
 **																			 **
 **								NURB Curve Routines							 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3NURBCurve_New					(const TQ3NURBCurveData * curveData);

EXTERN_API_C( TQ3Status )
Q3NURBCurve_Submit				(const TQ3NURBCurveData * curveData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3NURBCurve_SetData				(TQ3GeometryObject 		curve,
								 const TQ3NURBCurveData * nurbCurveData);

EXTERN_API_C( TQ3Status )
Q3NURBCurve_GetData				(TQ3GeometryObject 		curve,
								 TQ3NURBCurveData *		nurbCurveData);

EXTERN_API_C( TQ3Status )
Q3NURBCurve_EmptyData			(TQ3NURBCurveData *		nurbCurveData);

EXTERN_API_C( TQ3Status )
Q3NURBCurve_SetControlPoint		(TQ3GeometryObject 		curve,
								 unsigned long 			pointIndex,
								 const TQ3RationalPoint4D * point4D);

EXTERN_API_C( TQ3Status )
Q3NURBCurve_GetControlPoint		(TQ3GeometryObject 		curve,
								 unsigned long 			pointIndex,
								 TQ3RationalPoint4D *	point4D);

EXTERN_API_C( TQ3Status )
Q3NURBCurve_SetKnot				(TQ3GeometryObject 		curve,
								 unsigned long 			knotIndex,
								 float 					knotValue);

EXTERN_API_C( TQ3Status )
Q3NURBCurve_GetKnot				(TQ3GeometryObject 		curve,
								 unsigned long 			knotIndex,
								 float *				knotValue);


/******************************************************************************
 **																			 **
 **							Maximum NURB Patch Order						 **
 **																			 **
 *****************************************************************************/
#define kQ3NURBPatchMaxOrder	11
/******************************************************************************
 **																			 **
 **						NURB Patch Data Structure Definitions				 **
 **																			 **
 *****************************************************************************/

struct TQ3NURBPatchTrimCurveData {
	unsigned long 					order;
	unsigned long 					numPoints;
	TQ3RationalPoint3D *			controlPoints;
	float *							knots;
};
typedef struct TQ3NURBPatchTrimCurveData TQ3NURBPatchTrimCurveData;

struct TQ3NURBPatchTrimLoopData {
	unsigned long 					numTrimCurves;
	TQ3NURBPatchTrimCurveData *		trimCurves;
};
typedef struct TQ3NURBPatchTrimLoopData	TQ3NURBPatchTrimLoopData;

struct TQ3NURBPatchData {
	unsigned long 					uOrder;
	unsigned long 					vOrder;
	unsigned long 					numRows;
	unsigned long 					numColumns;
	TQ3RationalPoint4D *			controlPoints;
	float *							uKnots;
	float *							vKnots;
	unsigned long 					numTrimLoops;
	TQ3NURBPatchTrimLoopData *		trimLoops;
	TQ3AttributeSet 				patchAttributeSet;
};
typedef struct TQ3NURBPatchData			TQ3NURBPatchData;
/******************************************************************************
 **																			 **
 **								NURB Patch Routines							 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3NURBPatch_New					(const TQ3NURBPatchData * nurbPatchData);

EXTERN_API_C( TQ3Status )
Q3NURBPatch_Submit				(const TQ3NURBPatchData * nurbPatchData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3NURBPatch_SetData				(TQ3GeometryObject 		nurbPatch,
								 const TQ3NURBPatchData * nurbPatchData);

EXTERN_API_C( TQ3Status )
Q3NURBPatch_GetData				(TQ3GeometryObject 		nurbPatch,
								 TQ3NURBPatchData *		nurbPatchData);

EXTERN_API_C( TQ3Status )
Q3NURBPatch_SetControlPoint		(TQ3GeometryObject 		nurbPatch,
								 unsigned long 			rowIndex,
								 unsigned long 			columnIndex,
								 const TQ3RationalPoint4D * point4D);

EXTERN_API_C( TQ3Status )
Q3NURBPatch_GetControlPoint		(TQ3GeometryObject 		nurbPatch,
								 unsigned long 			rowIndex,
								 unsigned long 			columnIndex,
								 TQ3RationalPoint4D *	point4D);

EXTERN_API_C( TQ3Status )
Q3NURBPatch_SetUKnot			(TQ3GeometryObject 		nurbPatch,
								 unsigned long 			knotIndex,
								 float 					knotValue);

EXTERN_API_C( TQ3Status )
Q3NURBPatch_SetVKnot			(TQ3GeometryObject 		nurbPatch,
								 unsigned long 			knotIndex,
								 float 					knotValue);

EXTERN_API_C( TQ3Status )
Q3NURBPatch_GetUKnot			(TQ3GeometryObject 		nurbPatch,
								 unsigned long 			knotIndex,
								 float *				knotValue);

EXTERN_API_C( TQ3Status )
Q3NURBPatch_GetVKnot			(TQ3GeometryObject 		nurbPatch,
								 unsigned long 			knotIndex,
								 float *				knotValue);

EXTERN_API_C( TQ3Status )
Q3NURBPatch_EmptyData			(TQ3NURBPatchData *		nurbPatchData);




/******************************************************************************
 **																			 **
 **						Pixmap Marker Data Structure Definitions			 **
 **																			 **
 *****************************************************************************/

struct TQ3PixmapMarkerData {
	TQ3Point3D 						position;
	long 							xOffset;
	long 							yOffset;
	TQ3StoragePixmap 				pixmap;
	TQ3AttributeSet 				pixmapMarkerAttributeSet;
};
typedef struct TQ3PixmapMarkerData		TQ3PixmapMarkerData;
/******************************************************************************
 **																			 **
 **								Pixmap Marker Routines						 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3PixmapMarker_New				(const TQ3PixmapMarkerData * pixmapMarkerData);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_Submit			(const TQ3PixmapMarkerData * pixmapMarkerData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_SetData			(TQ3GeometryObject 		geometry,
								 const TQ3PixmapMarkerData * pixmapMarkerData);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_GetData			(TQ3GeometryObject 		geometry,
								 TQ3PixmapMarkerData *	pixmapMarkerData);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_EmptyData		(TQ3PixmapMarkerData *	pixmapMarkerData);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_GetPosition		(TQ3GeometryObject 		pixmapMarker,
								 TQ3Point3D *			position);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_SetPosition		(TQ3GeometryObject 		pixmapMarker,
								 const TQ3Point3D *		position);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_GetXOffset		(TQ3GeometryObject 		pixmapMarker,
								 long *					xOffset);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_SetXOffset		(TQ3GeometryObject 		pixmapMarker,
								 long 					xOffset);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_GetYOffset		(TQ3GeometryObject 		pixmapMarker,
								 long *					yOffset);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_SetYOffset		(TQ3GeometryObject 		pixmapMarker,
								 long 					yOffset);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_GetPixmap		(TQ3GeometryObject 		pixmapMarker,
								 TQ3StoragePixmap *		pixmap);

EXTERN_API_C( TQ3Status )
Q3PixmapMarker_SetPixmap		(TQ3GeometryObject 		pixmapMarker,
								 const TQ3StoragePixmap * pixmap);




/******************************************************************************
 **																			 **
 **						Point Data Structure Definitions					 **
 **																			 **
 *****************************************************************************/

struct TQ3PointData {
	TQ3Point3D 						point;
	TQ3AttributeSet 				pointAttributeSet;
};
typedef struct TQ3PointData				TQ3PointData;
/******************************************************************************
 **																			 **
 **								Point Routines								 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Point_New						(const TQ3PointData *	pointData);

EXTERN_API_C( TQ3Status )
Q3Point_Submit					(const TQ3PointData *	pointData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Point_GetData					(TQ3GeometryObject 		point,
								 TQ3PointData *			pointData);

EXTERN_API_C( TQ3Status )
Q3Point_SetData					(TQ3GeometryObject 		point,
								 const TQ3PointData *	pointData);

EXTERN_API_C( TQ3Status )
Q3Point_EmptyData				(TQ3PointData *			pointData);

EXTERN_API_C( TQ3Status )
Q3Point_SetPosition				(TQ3GeometryObject 		point,
								 const TQ3Point3D *		position);

EXTERN_API_C( TQ3Status )
Q3Point_GetPosition				(TQ3GeometryObject 		point,
								 TQ3Point3D *			position);




/******************************************************************************
 **																			 **
 **						Polygon Data Structure Definitions					 **
 **																			 **
 *****************************************************************************/

struct TQ3PolygonData {
	unsigned long 					numVertices;
	TQ3Vertex3D *					vertices;
	TQ3AttributeSet 				polygonAttributeSet;
};
typedef struct TQ3PolygonData			TQ3PolygonData;
/******************************************************************************
 **																			 **
 **							Polygon Routines								 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Polygon_New					(const TQ3PolygonData *	polygonData);

EXTERN_API_C( TQ3Status )
Q3Polygon_Submit				(const TQ3PolygonData *	polygonData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Polygon_SetData				(TQ3GeometryObject 		polygon,
								 const TQ3PolygonData *	polygonData);

EXTERN_API_C( TQ3Status )
Q3Polygon_GetData				(TQ3GeometryObject 		polygon,
								 TQ3PolygonData *		polygonData);

EXTERN_API_C( TQ3Status )
Q3Polygon_EmptyData				(TQ3PolygonData *		polygonData);

EXTERN_API_C( TQ3Status )
Q3Polygon_GetVertexPosition		(TQ3GeometryObject 		polygon,
								 unsigned long 			index,
								 TQ3Point3D *			point);

EXTERN_API_C( TQ3Status )
Q3Polygon_SetVertexPosition		(TQ3GeometryObject 		polygon,
								 unsigned long 			index,
								 const TQ3Point3D *		point);

EXTERN_API_C( TQ3Status )
Q3Polygon_GetVertexAttributeSet	(TQ3GeometryObject 		polygon,
								 unsigned long 			index,
								 TQ3AttributeSet *		attributeSet);

EXTERN_API_C( TQ3Status )
Q3Polygon_SetVertexAttributeSet	(TQ3GeometryObject 		polygon,
								 unsigned long 			index,
								 TQ3AttributeSet 		attributeSet);




/******************************************************************************
 **																			 **
 **						Polyhedron Data Structure Definitions				 **
 **																			 **
 *****************************************************************************/

enum TQ3PolyhedronEdgeMasks {
	kQ3PolyhedronEdgeNone		= 0,
	kQ3PolyhedronEdge01			= 1 << 0,
	kQ3PolyhedronEdge12			= 1 << 1,
	kQ3PolyhedronEdge20			= 1 << 2,
	kQ3PolyhedronEdgeAll		= kQ3PolyhedronEdge01 | kQ3PolyhedronEdge12 | kQ3PolyhedronEdge20
};
typedef enum TQ3PolyhedronEdgeMasks TQ3PolyhedronEdgeMasks;


typedef unsigned long 					TQ3PolyhedronEdge;

struct TQ3PolyhedronEdgeData {
	unsigned long 					vertexIndices[2];
	unsigned long 					triangleIndices[2];
	TQ3AttributeSet 				edgeAttributeSet;
};
typedef struct TQ3PolyhedronEdgeData	TQ3PolyhedronEdgeData;

struct TQ3PolyhedronTriangleData {
	unsigned long 					vertexIndices[3];
	TQ3PolyhedronEdge 				edgeFlag;
	TQ3AttributeSet 				triangleAttributeSet;
};
typedef struct TQ3PolyhedronTriangleData TQ3PolyhedronTriangleData;

struct TQ3PolyhedronData {
	unsigned long 					numVertices;
	TQ3Vertex3D *					vertices;
	unsigned long 					numEdges;
	TQ3PolyhedronEdgeData *			edges;
	unsigned long 					numTriangles;
	TQ3PolyhedronTriangleData *		triangles;
	TQ3AttributeSet 				polyhedronAttributeSet;
};
typedef struct TQ3PolyhedronData		TQ3PolyhedronData;
/******************************************************************************
 **																			 **
 **								Polyhedron Routines							 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Polyhedron_New				(const TQ3PolyhedronData * polyhedronData);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_Submit				(const TQ3PolyhedronData * polyhedronData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_SetData			(TQ3GeometryObject 		polyhedron,
								 const TQ3PolyhedronData * polyhedronData);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_GetData			(TQ3GeometryObject 		polyhedron,
								 TQ3PolyhedronData *	polyhedronData);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_EmptyData			(TQ3PolyhedronData *	polyhedronData);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_SetVertexPosition	(TQ3GeometryObject 		polyhedron,
								 unsigned long 			index,
								 const TQ3Point3D *		point);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_GetVertexPosition	(TQ3GeometryObject 		polyhedron,
								 unsigned long 			index,
								 TQ3Point3D *			point);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_SetVertexAttributeSet (TQ3GeometryObject 	polyhedron,
								 unsigned long 			index,
								 TQ3AttributeSet 		attributeSet);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_GetVertexAttributeSet (TQ3GeometryObject 	polyhedron,
								 unsigned long 			index,
								 TQ3AttributeSet *		attributeSet);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_GetTriangleData	(TQ3GeometryObject 		polyhedron,
								 unsigned long 			triangleIndex,
								 TQ3PolyhedronTriangleData * triangleData);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_SetTriangleData	(TQ3GeometryObject 		polyhedron,
								 unsigned long 			triangleIndex,
								 const TQ3PolyhedronTriangleData * triangleData);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_GetEdgeData		(TQ3GeometryObject 		polyhedron,
								 unsigned long 			edgeIndex,
								 TQ3PolyhedronEdgeData * edgeData);

EXTERN_API_C( TQ3Status )
Q3Polyhedron_SetEdgeData		(TQ3GeometryObject 		polyhedron,
								 unsigned long 			edgeIndex,
								 const TQ3PolyhedronEdgeData * edgeData);




/******************************************************************************
 **																			 **
 **						PolyLine Data Structure Definitions					 **
 **																			 **
 *****************************************************************************/

struct TQ3PolyLineData {
	unsigned long 					numVertices;
	TQ3Vertex3D *					vertices;
	TQ3AttributeSet *				segmentAttributeSet;
	TQ3AttributeSet 				polyLineAttributeSet;
};
typedef struct TQ3PolyLineData			TQ3PolyLineData;
/******************************************************************************
 **																			 **
 **							PolyLine Routines								 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3PolyLine_New					(const TQ3PolyLineData * polylineData);

EXTERN_API_C( TQ3Status )
Q3PolyLine_Submit				(const TQ3PolyLineData * polyLineData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3PolyLine_SetData				(TQ3GeometryObject 		polyLine,
								 const TQ3PolyLineData * polyLineData);

EXTERN_API_C( TQ3Status )
Q3PolyLine_GetData				(TQ3GeometryObject 		polyLine,
								 TQ3PolyLineData *		polyLineData);

EXTERN_API_C( TQ3Status )
Q3PolyLine_EmptyData			(TQ3PolyLineData *		polyLineData);

EXTERN_API_C( TQ3Status )
Q3PolyLine_GetVertexPosition	(TQ3GeometryObject 		polyLine,
								 unsigned long 			index,
								 TQ3Point3D *			position);

EXTERN_API_C( TQ3Status )
Q3PolyLine_SetVertexPosition	(TQ3GeometryObject 		polyLine,
								 unsigned long 			index,
								 const TQ3Point3D *		position);

EXTERN_API_C( TQ3Status )
Q3PolyLine_GetVertexAttributeSet (TQ3GeometryObject 	polyLine,
								 unsigned long 			index,
								 TQ3AttributeSet *		attributeSet);

EXTERN_API_C( TQ3Status )
Q3PolyLine_SetVertexAttributeSet (TQ3GeometryObject 	polyLine,
								 unsigned long 			index,
								 TQ3AttributeSet 		attributeSet);

EXTERN_API_C( TQ3Status )
Q3PolyLine_GetSegmentAttributeSet (TQ3GeometryObject 	polyLine,
								 unsigned long 			index,
								 TQ3AttributeSet *		attributeSet);

EXTERN_API_C( TQ3Status )
Q3PolyLine_SetSegmentAttributeSet (TQ3GeometryObject 	polyLine,
								 unsigned long 			index,
								 TQ3AttributeSet 		attributeSet);





/******************************************************************************
 **																			 **
 **						Torus Data Structure Definitions					 **
 **																			 **
 *****************************************************************************/

struct TQ3TorusData {
	TQ3Point3D 						origin;
	TQ3Vector3D 					orientation;
	TQ3Vector3D 					majorRadius;
	TQ3Vector3D 					minorRadius;
	float 							ratio;
	float 							uMin;
	float 							uMax;
	float 							vMin;
	float 							vMax;
	TQ3EndCap 						caps;
	TQ3AttributeSet 				interiorAttributeSet;
	TQ3AttributeSet 				torusAttributeSet;
};
typedef struct TQ3TorusData				TQ3TorusData;
/******************************************************************************
 **																			 **
 **								Torus Routines								 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Torus_New						(const TQ3TorusData *	torusData);

EXTERN_API_C( TQ3Status )
Q3Torus_Submit					(const TQ3TorusData *	torusData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Torus_SetData					(TQ3GeometryObject 		torus,
								 const TQ3TorusData *	torusData);

EXTERN_API_C( TQ3Status )
Q3Torus_GetData					(TQ3GeometryObject 		torus,
								 TQ3TorusData *			torusData);

EXTERN_API_C( TQ3Status )
Q3Torus_SetOrigin				(TQ3GeometryObject 		torus,
								 const TQ3Point3D *		origin);

EXTERN_API_C( TQ3Status )
Q3Torus_SetOrientation			(TQ3GeometryObject 		torus,
								 const TQ3Vector3D *	orientation);

EXTERN_API_C( TQ3Status )
Q3Torus_SetMajorRadius			(TQ3GeometryObject 		torus,
								 const TQ3Vector3D *	majorRadius);

EXTERN_API_C( TQ3Status )
Q3Torus_SetMinorRadius			(TQ3GeometryObject 		torus,
								 const TQ3Vector3D *	minorRadius);

EXTERN_API_C( TQ3Status )
Q3Torus_SetRatio				(TQ3GeometryObject 		torus,
								 float 					ratio);

EXTERN_API_C( TQ3Status )
Q3Torus_GetOrigin				(TQ3GeometryObject 		torus,
								 TQ3Point3D *			origin);

EXTERN_API_C( TQ3Status )
Q3Torus_GetOrientation			(TQ3GeometryObject 		torus,
								 TQ3Vector3D *			orientation);

EXTERN_API_C( TQ3Status )
Q3Torus_GetMajorRadius			(TQ3GeometryObject 		torus,
								 TQ3Vector3D *			majorRadius);

EXTERN_API_C( TQ3Status )
Q3Torus_GetMinorRadius			(TQ3GeometryObject 		torus,
								 TQ3Vector3D *			minorRadius);

EXTERN_API_C( TQ3Status )
Q3Torus_GetRatio				(TQ3GeometryObject 		torus,
								 float *				ratio);

EXTERN_API_C( TQ3Status )
Q3Torus_EmptyData				(TQ3TorusData *			torusData);




/******************************************************************************
 **																			 **
 **						Triangle Data Structure Definitions					 **
 **																			 **
 *****************************************************************************/

struct TQ3TriangleData {
	TQ3Vertex3D 					vertices[3];
	TQ3AttributeSet 				triangleAttributeSet;
};
typedef struct TQ3TriangleData			TQ3TriangleData;
/******************************************************************************
 **																			 **
 **							Triangle Routines								 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3Triangle_New					(const TQ3TriangleData * triangleData);

EXTERN_API_C( TQ3Status )
Q3Triangle_Submit				(const TQ3TriangleData * triangleData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3Triangle_SetData				(TQ3GeometryObject 		triangle,
								 const TQ3TriangleData * triangleData);

EXTERN_API_C( TQ3Status )
Q3Triangle_GetData				(TQ3GeometryObject 		triangle,
								 TQ3TriangleData *		triangleData);

EXTERN_API_C( TQ3Status )
Q3Triangle_EmptyData			(TQ3TriangleData *		triangleData);

EXTERN_API_C( TQ3Status )
Q3Triangle_GetVertexPosition	(TQ3GeometryObject 		triangle,
								 unsigned long 			index,
								 TQ3Point3D *			point);

EXTERN_API_C( TQ3Status )
Q3Triangle_SetVertexPosition	(TQ3GeometryObject 		triangle,
								 unsigned long 			index,
								 const TQ3Point3D *		point);

EXTERN_API_C( TQ3Status )
Q3Triangle_GetVertexAttributeSet (TQ3GeometryObject 	triangle,
								 unsigned long 			index,
								 TQ3AttributeSet *		attributeSet);

EXTERN_API_C( TQ3Status )
Q3Triangle_SetVertexAttributeSet (TQ3GeometryObject 	triangle,
								 unsigned long 			index,
								 TQ3AttributeSet 		attributeSet);




/******************************************************************************
 **																			 **
 **						TriGrid Data Structure Definitions					 **
 **																			 **
 *****************************************************************************/

struct TQ3TriGridData {
	unsigned long 					numRows;
	unsigned long 					numColumns;
	TQ3Vertex3D *					vertices;
	TQ3AttributeSet *				facetAttributeSet;
	TQ3AttributeSet 				triGridAttributeSet;
};
typedef struct TQ3TriGridData			TQ3TriGridData;
/******************************************************************************
 **																			 **
 **								TriGrid Routines							 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3TriGrid_New					(const TQ3TriGridData *	triGridData);

EXTERN_API_C( TQ3Status )
Q3TriGrid_Submit				(const TQ3TriGridData *	triGridData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3TriGrid_SetData				(TQ3GeometryObject 		triGrid,
								 const TQ3TriGridData *	triGridData);

EXTERN_API_C( TQ3Status )
Q3TriGrid_GetData				(TQ3GeometryObject 		triGrid,
								 TQ3TriGridData *		triGridData);

EXTERN_API_C( TQ3Status )
Q3TriGrid_EmptyData				(TQ3TriGridData *		triGridData);

EXTERN_API_C( TQ3Status )
Q3TriGrid_GetVertexPosition		(TQ3GeometryObject 		triGrid,
								 unsigned long 			rowIndex,
								 unsigned long 			columnIndex,
								 TQ3Point3D *			position);

EXTERN_API_C( TQ3Status )
Q3TriGrid_SetVertexPosition		(TQ3GeometryObject 		triGrid,
								 unsigned long 			rowIndex,
								 unsigned long 			columnIndex,
								 const TQ3Point3D *		position);

EXTERN_API_C( TQ3Status )
Q3TriGrid_GetVertexAttributeSet	(TQ3GeometryObject 		triGrid,
								 unsigned long 			rowIndex,
								 unsigned long 			columnIndex,
								 TQ3AttributeSet *		attributeSet);

EXTERN_API_C( TQ3Status )
Q3TriGrid_SetVertexAttributeSet	(TQ3GeometryObject 		triGrid,
								 unsigned long 			rowIndex,
								 unsigned long 			columnIndex,
								 TQ3AttributeSet 		attributeSet);

EXTERN_API_C( TQ3Status )
Q3TriGrid_GetFacetAttributeSet	(TQ3GeometryObject 		triGrid,
								 unsigned long 			faceIndex,
								 TQ3AttributeSet *		facetAttributeSet);

EXTERN_API_C( TQ3Status )
Q3TriGrid_SetFacetAttributeSet	(TQ3GeometryObject 		triGrid,
								 unsigned long 			faceIndex,
								 TQ3AttributeSet 		facetAttributeSet);




/******************************************************************************
 **																			 **
 **						TriMesh Data Structure Definitions					 **
 **																			 **
 *****************************************************************************/

struct TQ3TriMeshTriangleData {
	unsigned long 					pointIndices[3];
};
typedef struct TQ3TriMeshTriangleData	TQ3TriMeshTriangleData;

struct TQ3TriMeshEdgeData {
	unsigned long 					pointIndices[2];
	unsigned long 					triangleIndices[2];
};
typedef struct TQ3TriMeshEdgeData		TQ3TriMeshEdgeData;

struct TQ3TriMeshAttributeData {
	TQ3AttributeType 				attributeType;				/* The type of attribute 		 */
	void *							data;						/* Pointer to the contiguous     */
																/* attribute data.				 */
	char *							attributeUseArray;			/* This is only used with custom */
																/* attributes 					 */
};
typedef struct TQ3TriMeshAttributeData	TQ3TriMeshAttributeData;

struct TQ3TriMeshData {
	TQ3AttributeSet 				triMeshAttributeSet;

	unsigned long 					numTriangles;
	TQ3TriMeshTriangleData *		triangles;

	unsigned long 					numTriangleAttributeTypes;
	TQ3TriMeshAttributeData *		triangleAttributeTypes;

	unsigned long 					numEdges;
	TQ3TriMeshEdgeData *			edges;

	unsigned long 					numEdgeAttributeTypes;
	TQ3TriMeshAttributeData *		edgeAttributeTypes;

	unsigned long 					numPoints;
	TQ3Point3D *					points;

	unsigned long 					numVertexAttributeTypes;
	TQ3TriMeshAttributeData *		vertexAttributeTypes;

	TQ3BoundingBox 					bBox;
};
typedef struct TQ3TriMeshData			TQ3TriMeshData;
/******************************************************************************
 **																			 **
 **							TriMesh Routines								 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3GeometryObject )
Q3TriMesh_New					(const TQ3TriMeshData *	triMeshData);

EXTERN_API_C( TQ3Status )
Q3TriMesh_Submit				(const TQ3TriMeshData *	triMeshData,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3TriMesh_SetData				(TQ3GeometryObject 		triMesh,
								 const TQ3TriMeshData *	triMeshData);

EXTERN_API_C( TQ3Status )
Q3TriMesh_GetData				(TQ3GeometryObject 		triMesh,
								 TQ3TriMeshData *		triMeshData);

EXTERN_API_C( TQ3Status )
Q3TriMesh_EmptyData				(TQ3TriMeshData *		triMeshData);





#if PRAGMA_ENUM_ALWAYSINT
	#pragma enumsalwaysint reset
#elif PRAGMA_ENUM_OPTIONS
	#pragma option enum=reset
#elif defined(PRAGMA_ENUM_PACK__QD3DGEOMETRY__)
	#pragma options(pack_enums)
#endif

#if PRAGMA_STRUCT_ALIGN
	#pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
	#pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
	#pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __QD3DGEOMETRY__ */

