// (c) 1995-2007 Electronic Arts Inc.
/*
 	File:		QD3DTransform.h
 
 	Contains:	Q3Transform routines 												
 
 	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 __QD3DTRANSFORM__
#define __QD3DTRANSFORM__

#ifndef __QD3D__
#include <QD3D.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__QD3DTRANSFORM__
	#endif
	#pragma options(!pack_enums)
#endif

/******************************************************************************
 **																			 **
 **							Transform Routines							     **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3ObjectType )
Q3Transform_GetType				(TQ3TransformObject 	transform);

EXTERN_API_C( TQ3Matrix4x4 *)
Q3Transform_GetMatrix			(TQ3TransformObject 	transform,
								 TQ3Matrix4x4 *			matrix);

EXTERN_API_C( TQ3Status )
Q3Transform_Submit				(TQ3TransformObject 	transform,
								 TQ3ViewObject 			view);


/******************************************************************************
 **																			 **
 **							MatrixTransform Routines					     **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3TransformObject )
Q3MatrixTransform_New			(const TQ3Matrix4x4 *	matrix);

EXTERN_API_C( TQ3Status )
Q3MatrixTransform_Submit		(const TQ3Matrix4x4 *	matrix,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3MatrixTransform_Set			(TQ3TransformObject 	transform,
								 const TQ3Matrix4x4 *	matrix);

EXTERN_API_C( TQ3Status )
Q3MatrixTransform_Get			(TQ3TransformObject 	transform,
								 TQ3Matrix4x4 *			matrix);


/******************************************************************************
 **																			 **
 **							RotateTransform Data						     **
 **																			 **
 *****************************************************************************/

struct TQ3RotateTransformData {
	TQ3Axis 						axis;
	float 							radians;
};
typedef struct TQ3RotateTransformData	TQ3RotateTransformData;
/******************************************************************************
 **																			 **
 **							RotateTransform Routines					     **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3TransformObject )
Q3RotateTransform_New			(const TQ3RotateTransformData * data);


EXTERN_API_C( TQ3Status )
Q3RotateTransform_Submit		(const TQ3RotateTransformData * data,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3RotateTransform_SetData		(TQ3TransformObject 	transform,
								 const TQ3RotateTransformData * data);

EXTERN_API_C( TQ3Status )
Q3RotateTransform_GetData		(TQ3TransformObject 	transform,
								 TQ3RotateTransformData * data);

EXTERN_API_C( TQ3Status )
Q3RotateTransform_SetAxis		(TQ3TransformObject 	transform,
								 TQ3Axis 				axis);

EXTERN_API_C( TQ3Status )
Q3RotateTransform_SetAngle		(TQ3TransformObject 	transform,
								 float 					radians);

EXTERN_API_C( TQ3Status )
Q3RotateTransform_GetAxis		(TQ3TransformObject 	renderable,
								 TQ3Axis *				axis);

EXTERN_API_C( TQ3Status )
Q3RotateTransform_GetAngle		(TQ3TransformObject 	transform,
								 float *				radians);


/******************************************************************************
 **																			 **
 **					RotateAboutPointTransform Data							 **
 **																			 **
 *****************************************************************************/

struct TQ3RotateAboutPointTransformData {
	TQ3Axis 						axis;
	float 							radians;
	TQ3Point3D 						about;
};
typedef struct TQ3RotateAboutPointTransformData TQ3RotateAboutPointTransformData;
/******************************************************************************
 **																			 **
 **					RotateAboutPointTransform Routines						 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3TransformObject )
Q3RotateAboutPointTransform_New	(const TQ3RotateAboutPointTransformData * data);

EXTERN_API_C( TQ3Status )
Q3RotateAboutPointTransform_Submit (const TQ3RotateAboutPointTransformData * data,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3RotateAboutPointTransform_SetData (TQ3TransformObject  transform,
								 const TQ3RotateAboutPointTransformData * data);

EXTERN_API_C( TQ3Status )
Q3RotateAboutPointTransform_GetData (TQ3TransformObject  transform,
								 TQ3RotateAboutPointTransformData * data);

EXTERN_API_C( TQ3Status )
Q3RotateAboutPointTransform_SetAxis (TQ3TransformObject  transform,
								 TQ3Axis 				axis);

EXTERN_API_C( TQ3Status )
Q3RotateAboutPointTransform_GetAxis (TQ3TransformObject  transform,
								 TQ3Axis *				axis);


EXTERN_API_C( TQ3Status )
Q3RotateAboutPointTransform_SetAngle (TQ3TransformObject  transform,
								 float 					radians);

EXTERN_API_C( TQ3Status )
Q3RotateAboutPointTransform_GetAngle (TQ3TransformObject  transform,
								 float *				radians);


EXTERN_API_C( TQ3Status )
Q3RotateAboutPointTransform_SetAboutPoint (TQ3TransformObject  transform,
								 const TQ3Point3D *		about);

EXTERN_API_C( TQ3Status )
Q3RotateAboutPointTransform_GetAboutPoint (TQ3TransformObject  transform,
								 TQ3Point3D *			about);


/******************************************************************************
 **																			 **
 **					RotateAboutAxisTransform Data							 **
 **																			 **
 *****************************************************************************/

struct TQ3RotateAboutAxisTransformData {
	TQ3Point3D 						origin;
	TQ3Vector3D 					orientation;
	float 							radians;
};
typedef struct TQ3RotateAboutAxisTransformData TQ3RotateAboutAxisTransformData;
/******************************************************************************
 **																			 **
 **					RotateAboutAxisTransform Routines						 **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3TransformObject )
Q3RotateAboutAxisTransform_New	(const TQ3RotateAboutAxisTransformData * data);

EXTERN_API_C( TQ3Status )
Q3RotateAboutAxisTransform_Submit (const TQ3RotateAboutAxisTransformData * data,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3RotateAboutAxisTransform_SetData (TQ3TransformObject 	transform,
								 const TQ3RotateAboutAxisTransformData * data);

EXTERN_API_C( TQ3Status )
Q3RotateAboutAxisTransform_GetData (TQ3TransformObject 	transform,
								 TQ3RotateAboutAxisTransformData * data);


EXTERN_API_C( TQ3Status )
Q3RotateAboutAxisTransform_SetOrientation (TQ3TransformObject  transform,
								 const TQ3Vector3D *	axis);

EXTERN_API_C( TQ3Status )
Q3RotateAboutAxisTransform_GetOrientation (TQ3TransformObject  transform,
								 TQ3Vector3D *			axis);


EXTERN_API_C( TQ3Status )
Q3RotateAboutAxisTransform_SetAngle (TQ3TransformObject  transform,
								 float 					radians);

EXTERN_API_C( TQ3Status )
Q3RotateAboutAxisTransform_GetAngle (TQ3TransformObject  transform,
								 float *				radians);


EXTERN_API_C( TQ3Status )
Q3RotateAboutAxisTransform_SetOrigin (TQ3TransformObject  transform,
								 const TQ3Point3D *		origin);

EXTERN_API_C( TQ3Status )
Q3RotateAboutAxisTransform_GetOrigin (TQ3TransformObject  transform,
								 TQ3Point3D *			origin);


/******************************************************************************
 **																			 **
 **							ScaleTransform Routines						     **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3TransformObject )
Q3ScaleTransform_New			(const TQ3Vector3D *	scale);

EXTERN_API_C( TQ3Status )
Q3ScaleTransform_Submit			(const TQ3Vector3D *	scale,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3ScaleTransform_Set			(TQ3TransformObject 	transform,
								 const TQ3Vector3D *	scale);

EXTERN_API_C( TQ3Status )
Q3ScaleTransform_Get			(TQ3TransformObject 	transform,
								 TQ3Vector3D *			scale);


/******************************************************************************
 **																			 **
 **							TranslateTransform Routines					     **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3TransformObject )
Q3TranslateTransform_New		(const TQ3Vector3D *	translate);

EXTERN_API_C( TQ3Status )
Q3TranslateTransform_Submit		(const TQ3Vector3D *	translate,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3TranslateTransform_Set		(TQ3TransformObject 	transform,
								 const TQ3Vector3D *	translate);

EXTERN_API_C( TQ3Status )
Q3TranslateTransform_Get		(TQ3TransformObject 	transform,
								 TQ3Vector3D *			translate);

/******************************************************************************
 **																			 **
 **							QuaternionTransform Routines				     **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3TransformObject )
Q3QuaternionTransform_New		(const TQ3Quaternion *	quaternion);

EXTERN_API_C( TQ3Status )
Q3QuaternionTransform_Submit	(const TQ3Quaternion *	quaternion,
								 TQ3ViewObject 			view);

EXTERN_API_C( TQ3Status )
Q3QuaternionTransform_Set		(TQ3TransformObject 	transform,
								 const TQ3Quaternion *	quaternion);

EXTERN_API_C( TQ3Status )
Q3QuaternionTransform_Get		(TQ3TransformObject 	transform,
								 TQ3Quaternion *		quaternion);


/******************************************************************************
 **																			 **
 **							ResetTransform Routines						     **
 **																			 **
 *****************************************************************************/
EXTERN_API_C( TQ3TransformObject )
Q3ResetTransform_New			(void);

EXTERN_API_C( TQ3Status )
Q3ResetTransform_Submit			(TQ3ViewObject 			view);





#if PRAGMA_ENUM_ALWAYSINT
	#pragma enumsalwaysint reset
#elif PRAGMA_ENUM_OPTIONS
	#pragma option enum=reset
#elif defined(PRAGMA_ENUM_PACK__QD3DTRANSFORM__)
	#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 /* __QD3DTRANSFORM__ */

