/*************************************************************************/
/*	File : CKCamera.h				 				 					 */
/*	Author :  Nicolas Galinotti											 */	
/*																		 */	
/*	Virtools SDK 														 */	 
/*	Copyright (c) Virtools 2000, All Rights Reserved.					 */	
/*************************************************************************/
#if !defined(CKCAMERA_H) || defined(CK_3DIMPLEMENTATION)
#ifndef CK_3DIMPLEMENTATION

#define CKCAMERA_H "$Id:$"


#include "CK3dEntity.h"



#define CK_PERSPECTIVEPROJECTION  1

#define CK_ORTHOGRAPHICPROJECTION 2



#undef CK_PURE

#define CK_PURE = 0

/*************************************************
{filename:CKCamera}
Summary: Camera 

Remarks:
{Image:Camera}
+ A CKCamera represents a potential configuration for a viewpoint:
front plane, back plane, field of view, roll, projection type, zoom type, 
aspect ratio. As it is derived from CK3DEntity and CKBeObject, it has
all the potentialities from those classes, especially the possibility
to have behaviors attached to it. The orientation and position of the camera
is defined the same way a 3dEntity does.

+ For a camera to become active in a rendercontext you should attach the 
viewpoint to it using the function CKRenderContext::AttachViewpointToCamera()

+ Field of View (FOV): It controls how much of a scene is visible and is an angle
measured in radians. The Dev interface gives acces to the notion of focal length
used in photography.  For a standard 35 mm camera the conversion formula between
field of view and focal length is :

		Field Of View = 2 x ArcTan( (35/2) / Focal Length)

+ The class id of CKCamera is CKCID_CAMERA.
See also: CKRenderContext,CKTargetCamera
*************************************************/
class CKCamera : public CK3dEntity {
public:
#endif 

/*************************************************
Summary: Returns the front clipping plane distance

Return Value:
	Front clipping plane distance.
Remarks:
	+ The front plane distance is the distance below which nothing is seen by the camera.
	+ By default, at creation time, the front plane distance is equal to 1.0f.
See also: GetBackPlane,SetFrontPlane
*************************************************/
virtual float	GetFrontPlane() CK_PURE;
/*************************************************
Summary: Sets the front clipping plane distance

Arguments:
	front: The new front clipping plane distance
Remarks:
	+ The front plane distance is the distance below which nothing is seen by the camera.
	+ By default, at creation time, the front plane distance is equal to 1.0f.
See also: SetBackPlane,GetFrontPlane
*************************************************/
virtual void	SetFrontPlane(float front) CK_PURE;
/*************************************************
Summary: Returns the back clipping plane distance

Return Value:
	Back clipping plane distance.
Remarks:
	+ The back plane distance is the distance beyond which nothing is seen by the camera.
	+ By default, at creation time, the back clipping plane distance is equal to 4000.0f.
See also: SetBackPlane,SetFrontPlane
*************************************************/
virtual float	GetBackPlane() CK_PURE;
/*************************************************
Summary: Sets the back clipping plane distance

Arguments:
	back: The new back clipping plane distance
Remarks:
	+ The back plane distance is the distance beyond which nothing is seen by the camera.
	+ By default, at creation time, the back clipping plane distance is equal to 4000.0f.
See also: GetBackPlane,SetFrontPlane
*************************************************/
virtual void	SetBackPlane(float back) CK_PURE;

/*************************************************
Summary: Returns the field of view of the camera

Return Value:
	Field of view of the camera.
Remarks:
	+ By default, the field of view is equal to: 0.5f ( 30°)
See also: SetFov
*************************************************/
virtual float	GetFov() CK_PURE;
/*************************************************
Summary: Changes the field of view of the camera

Arguments:
	 fov: The new field of view of the camera
Remarks:
	+ By default, the field of view is equal to: 0.5f ( 30°)
See also: GetFov
*************************************************/
virtual void	SetFov(float fov) CK_PURE;


/*************************************************
Summary: Returns the current projection type

Return Value:
	CK_PERSPECTIVEPROJECTION : perspective projection (default)
	CK_ORTHOGRAPHICPROJECTION : orthographic projection
Remarks:
	+ The project type is either orthographic or perspective.
See also: SetProjectionType,SetOrthographicZoom
*************************************************/	
virtual int 	GetProjectionType()	 CK_PURE;
/*************************************************
Summary: Sets the projection type of the camera

Arguments:
	proj: The new projection type
Remarks:
+ The project type is either orthographic or perspective.
+ proj = CK_PERSPECTIVEPROJECTION : perspective projection (default)
+ proj = CK_ORTHOGRAPHICPROJECTION : orthographic projection
+ If the projection is orthographic, you can specify a zoom value.
See also: GetProjectionType,SetOrthographicZoom
*************************************************/	
virtual void	SetProjectionType(int proj) CK_PURE;

/*************************************************
Summary: Changes the zoom value in orthographic projection

Arguments:
	zoom: The new zoom value
Remarks:
+ Changes the zoom value. Valid only if in orthographic projection mode.
+ The bigger the value, the bigger the objects... 
+ By default, at creation time, the zoom of the camera is equal to: 1.0f
See also: GetOrthographicZoom,SetProjectionType
*************************************************/
virtual void	SetOrthographicZoom(float zoom) CK_PURE;
/*************************************************
Summary: Returns the zoom value in orthographic projection

Return value
	Zoom factor.
See also: SetOrthographicZoom,SetProjectionType
*************************************************/
virtual float	GetOrthographicZoom() CK_PURE;

//---------------------------------------
// AspectRatio		 


/*****************************************************
Summary:Sets the aspect ratio

Remarks:
	+ The given aspect ratio will be used to resize the 
	viewport of the render context on which this camera is 
	attached.
See also: GetAspectRatio,CKRenderContext::SetViewRect,CKRenderContext::AttachViewpointToCamera
*****************************************************/
virtual void SetAspectRatio(int width,int height) CK_PURE;
/*****************************************************
Summary:Gets the aspect ratio

Remarks:
	+ The given aspect ratio will be used to resize the 
	viewport of the render context on which this camera is 
	attached.
See also: SetAspectRatio,CKRenderContext::SetViewRect,CKRenderContext::AttachViewpointToCamera
*****************************************************/
virtual void GetAspectRatio(int& width,int& height) CK_PURE;

//-------------------------------------
// Result Projection Matrix

/*****************************************************
Summary: Computes the projection matrix

Remarks:
	+ This method uses the fov,aspect ratio, back and front clipping to compute
	a projection matrix.
See also: VxMatrix::Perspective,VxMatrix::Orthographic
*****************************************************/
virtual void	ComputeProjectionMatrix(VxMatrix& mat) CK_PURE;

//---------------------------------------
// Roll Angle				

/*****************************************************
Summary:Rolls back the camera to vertical.

Remarks:
+Rolls back the camera to vertical by aligning its Up axis (Y) 
with the world up axis.
+If the camera as a target this method as no effect as the orientation
of the camera will be forced toward its target.

See Also:CKTargetCamera,SetTarget,Roll
*****************************************************/
virtual void ResetRoll() CK_PURE;
/*****************************************************
Summary:Rolls the camera of the desired angle,

Arguments:
	angle: Angle of rotation around Z axis in radians.
Remarks:
+ If the camera as a target this method as no effect as the orientation
of the camera will be forced toward its target.
+ To align the camera back with the Up vector in the world use ResetRoll
See Also:CKTargetCamera,SetTarget,ResetRoll
*****************************************************/
virtual void Roll(float angle) CK_PURE;

//-------------------------------------------
// Target Access

/*****************************************************
Summary:Returns the target of this camera.

Return Value:
	A pointer to the CK3dEntity used as target for this camera.	
Remarks:
	+ This method is only implemented for a CKTargetCamera
	otherwise it returns NULL.
See Also:CKTargetCamera,SetTarget
*****************************************************/
virtual 	CK3dEntity *GetTarget() CK_PURE;
/*****************************************************
Summary:Sets the target of this camera.

Arguments:
	target: A pointer to the CK3dEntity to use as a target or NULL to remove the current target.
Remarks:
+ This method is only implemented for a CKTargetCamera.
+ If the camera has a target its orientation it always 
updated toward the given target.
See Also:CKTargetCamera,GetTarget
*****************************************************/
virtual 	void SetTarget(CK3dEntity *target) CK_PURE;

/*************************************************
Summary: Dynamic cast operator. 
Arguments:
	iO: A pointer to a CKObject to cast.
Return Value:
	iO casted to the appropriate class or NULL if iO is not from the required class .
Example:
	  CKObject* Object;
	  CKAnimation* anim = CKAnimation::Cast(Object);
Remarks:

*************************************************/
static CKCamera* Cast(CKObject* iO) 
{
	return CKIsChildClassOf(iO,CKCID_CAMERA)?(CKCamera*)iO:NULL;
}

#ifndef CK_3DIMPLEMENTATION
};

#endif
#endif
