/*==========================================================
File:			Bezier.h
Prupose:		Handle a Bezier curve
Author:			Yann Le Tensorer
Creation Date:	23 january 1997
Version:		1.0
Revision:		YLT - 1.1 - 3 february 1997
===========================================================*/

#ifndef __BEZIER_H__
#define __BEZIER_H__

#ifdef _AI_LIB_
// #include "AIUseCPA.h"
#include "dynamic.h"
#else /* _AI_LIB_ */
#include "mth3d.h"
#include "acp_base.h"
#include "gld.h"
#include "dynamic.h"
#endif /* _AI_LIB_ */

/* Object creation modes */
#define C_ucModeNoObject	0								/* no geometric object created */ 
#define C_ucModeRealObject	1								/* a geometric object is created */


/* Main bezier structure */
typedef struct _BezierObject
{
	unsigned char 				ucSamplingRate;				/* sampling rate of curve */
	MTH3D_tdstVector			stStartPoint;				/* first point of curve */
	MTH3D_tdstVector			stEndPoint;					/* last point of curve */
	MTH3D_tdstVector			stStartVector;				/* first tangent vector*/
	MTH3D_tdstVector			stEndVector;				/* last tangent vector*/
	ACP_tdxHandleOfObject		hObject;					/* handle of géométric object*/
	ACP_tdxHandleOfElement		hElement;					/* handle of "line" element*/
	long						color;						/* color of the curve (24 bits)*/
	GLD_tdstViewportAttributes	*p_ViewPortAttributes;		/* pointeur sur les attributs du viewport*/
	unsigned char				ucObjectMode;				/* object mode C_ucModeNoObject or C_ucModeRealObject*/
	MTH3D_tdstVector			*d_stListOfPoints;			/* List of bezier Points, in case mode=C_ucModeNoObject*/
	ACP_tdstDynaParam			*p_stDynaParams;			/* Pointer to dynamic parameters of curve */
	
} tdstBezierObject;

#ifdef __cplusplus
extern "C" {
#endif

/*==========================================================
Function name:	fn_vBezierObject_Calculate
Description:	Calculates the points of the bézier curve according to the 
				parameters specified when creating the object.
Input:			p_BezierObject:	Pointer to a pre-created bezier object
Output:			none
Author:			Yann Le Tensorer
Date:			23 january 1997
Revision:
==========================================================*/
void fn_vBezierObject_Calculate(tdstBezierObject *p_BezierObject);

/*==========================================================
Function name:	fn_vBezierObject_Create
Description:	Create Bezier curve (in ram only) between two points
Input:			p_BezierObject:	pointer to a preallocated tdstBezierObject
				ucSamplingRate:	number of segment to define the curve) 
				stStartPoint:	First vertex of the curve
				stEndPoint:		Last vertex of the curve
				stStartVector:	Tangent vector at the first point
				stEndVector:	Tangent vector at the last point
				ucObjectMode:	Creation mode (C_ucModeNoObject ou C_ucModeRealObject)
								C_ucModeNoObject does not create a geometric object 
								whereas C_ucModeRealObject does.
Output:			none
Author:			Yann Le Tensorer
Date:			23 january 1997
Revision:		YLT - 03 february 1997
==========================================================*/
void fn_vBezierObject_Create(	tdstBezierObject	*p_BezierObject,
							unsigned char		ucSamplingRate,		
							MTH3D_tdstVector*	p_stStartPoint,
							MTH3D_tdstVector*	p_stEndPoint,
							MTH3D_tdstVector*	p_stStartVector,
							MTH3D_tdstVector*	p_stEndVector,
							unsigned char		ucObjectMode,
							ACP_tdstDynaParam*	p_stDynaParams);

/*==========================================================
Function name:	fn_vBezierObject_SetColor
Description:	Set the color of a bezier object.
Input:			p_BezierObject:	pointer to a pre-created tdstBezierObject
				color:			24 bit color of object. (0->7=B;  8->15=G; 16->23=R ; 24->32=Unused) 
Output:			none
Author:			Yann Le Tensorer
Date:			24 january 1997
Revision:
==========================================================*/
void fn_vBezierObject_SetColor(tdstBezierObject *p_BezierObject,long color);


/*==========================================================
Function name:	fn_vBezierObject_SetViewPortAttributes
Description:	Set the viewportattributes for drawing.
Input:			p_BezierObject:			pointer to a pre-created tdstBezierObject
				p_ViewPortAttributes:	pointer to  pre-defined viewport attributes
Output:			none
Author:			Yann Le Tensorer
Date:			24 january 1997
Revision:
==========================================================*/
void fn_vBezierObject_SetViewPortAttributes(tdstBezierObject *p_BezierObject,GLD_tdstViewportAttributes *p_ViewPortAttributes);

/*==========================================================
Function name:	fn_vBezierObject_Draw
Description:	Draw Bezier object on screen
Input:			p_BezierObject:	pointer to a pre-created tdstBezierObject
Output:			none
Author:			Yann Le Tensorer
Date:			24 january 1997
Revision:
==========================================================*/
void fn_vBezierObject_Draw(tdstBezierObject *p_BezierObject);

/*==========================================================
Function name:	fn_vBezierObject_Free
Description:	Free memory allocated by the bezier objet
Input:			p_BezierObject:	pointer to a tdstBezierObject
Output:			none
Author:			Yann Le Tensorer
Date:			29 january 1997
Revision:
==========================================================*/
void fn_vBezierObject_Free(tdstBezierObject	*p_BezierObject);


/*==========================================================
Function name:	fn_vBezierObject_ChangeParams
Description:	Changes the parameters of a bezier objet and recalculates the coordinates
				of the points.
Input:			p_BezierObject:	Pointer to a pre-created bezier object
				p_stStartPoint: Pointer to the start point 
				p_stEndPoint:	Pointer to the end Point	
				p_stStartVector:Pointer to the start vector	
				p_stEndVector:	Pointer to the end vector
Output:			none
Author:			Yann Le Tensorer
Date:			28 january 1997
Revision:

Notes:			If an input parameter is 0, this parameter is simply not
				affected. This enables to change easily only one parameter
==========================================================*/
void fn_vBezierObject_ChangeParams(tdstBezierObject	*p_BezierObject,
							MTH3D_tdstVector*	p_stStartPoint,
							MTH3D_tdstVector*	p_stEndPoint,
							MTH3D_tdstVector*	p_stStartVector,
							MTH3D_tdstVector*	p_stEndVector);

/*==========================================================
Function name:	fn_vBezierObject_GetParams
Description:	Gets the parameters of a bezier objet
Input:			p_BezierObject:	Pointer to a pre-created bezier object
				p_stStartPoint: Pointer to the start point 
				p_stEndPoint:	Pointer to the end Point	
				p_stStartVector:Pointer to the start vector	
				p_stEndVector:	Pointer to the end vector
Output:			*p_stStartPoint:start point 
				*p_stEndPoint:	end Point	
				*p_stStartVectorstart vector	
				*p_stEndVector:	end vector

Author:			Yann Le Tensorer
Date:			4 february 1997
Revision:

Notes:			If an input parameter is 0, this parameter is simply not
				affected. 
==========================================================*/
void fn_vBezierObject_GetParams(tdstBezierObject	*p_BezierObject,
							MTH3D_tdstVector*	p_stStartPoint,
							MTH3D_tdstVector*	p_stEndPoint,
							MTH3D_tdstVector*	p_stStartVector,
							MTH3D_tdstVector*	p_stEndVector);

/*==========================================================
Function name:	fn_xBezierObject_GetSpeed
Description:	returns the speed at a given sample (n° of the point) of a bezier object
Input:			p_stDynaParam:	pointer to a pre-created tdstDynaParam structure
				ucSampleNo:		n° of the point to get the speed from.
Output:			return value is the speed.
Author:			Yann Le Tensorer
Date:			03 february 1997
Revision:
==========================================================*/
MTH_tdxReal fn_xBezierObject_GetSpeed(tdstBezierObject	*p_BezierObject,unsigned char ucSampleNo);

/*==========================================================
Function name:	fn_xBezierObject_GetPoint
Description:	returns the coordinates in the global repère of the point at a 
				given sample (n° of the point) of a bezier object.
Input:			p_stDynaParam:	pointer to a pre-created tdstDynaParam structure
				ucSampleNo:		n° of the point to get the coordinates from.
				p_ReturnVector: pointer to a vector to be returned.
Output:			*p_ReturnVector is a vector countaining the.coordinates of the point.
Author:			Yann Le Tensorer
Date:			03 february 1997
Revision:
==========================================================*/
void fn_vBezierObject_GetPoint(tdstBezierObject	*p_BezierObject,unsigned char ucSampleNo,MTH3D_tdstVector* p_ReturnVector);

/*===============================================================================
Function name:	fn_bBezierObject_SetSamplingRate
Description:	Modifies the sampling rate of a bezier object, and changes all
				the depending parameters (including dynamic sampling rate)
Input:			p_BezierObject:	pointer to a preallocated tdstBezierObject
				ucSamplingRate:	New sampling rate
Output:			return value is true if sampling rate could be modified,
				false if not.
Author:			Yann Le Tensorer
Date:			5 february 1997
Revision:		
Note:			The sampling rate can only be modified for objects that have been
				created using C_ucModeNoObject at their creation.
================================================================================*/

ACP_tdxBool fn_bBezierObject_SetSamplingRate(tdstBezierObject	*p_BezierObject,
											 unsigned char		ucSamplingRate);

/*==========================================================
Function name:	fn_ucBezierObject_GetSamplingRate
Description:	Gets the sampling rate of a BezierObject objet
Input:			p_BezierObject:	Pointer to a pre-created Bezier object
Output:			return value is the sampling rate of the circle arc object
Author:			Yann Le Tensorer
Date:			5 february 1997
Revision:
==========================================================*/
unsigned char fn_ucBezierObject_GetSamplingRate(tdstBezierObject	*p_BezierObject);

#ifdef __cplusplus
}
#endif

#endif

