#include"stdafx.h"
#include"CameraInfo.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CameraInfo::CameraInfo()
{
	ViewLoop=NULL;
	CurTime=0.0f;
	Mode=CM_TRACK;
	Animate=true;
	CamATrkFlg=true;
	TarATrkFlg=true;
	Vel=0.5f;
	NearClip=1.0f; 
	FarClip=350.0f;
	FOV=Stuff::Pi_Over_3;
	
}

CameraInfo::~CameraInfo()
{

}

void CameraInfo::ValidateTime()
{
	if(CurTime<=-1.0f) CurTime=0.0f;
	else
		if(CurTime<0.0f) CurTime=1.0f+CurTime;
		
		if(CurTime>=2.0f) CurTime=0.0f;
		else
			if(CurTime>=1.0f) CurTime-=1.0f;
			
			
}


void CameraInfo::SetTime(float tme) 
{
	CurTime=tme; 
	ValidateTime(); 
	UpdateCPos(); 
}

void CameraInfo::AddTime(float tme) 
{
	if(!Animate || Mode==CM_FREE) return;
	CurTime+=tme*Vel; 
	ValidateTime(); 
	UpdateCPos(); 
}

void CameraInfo::ZeroTime() 
{
	CurTime=0.0; 
	UpdateCPos(); 
}

void CameraInfo::SetMode(CAMMODE cmd)
{
	Mode=cmd;
	//if(CMode==CM_FREE) CMode.Animate=false;
}

void CameraInfo::UpdateCPos()
{
	if(!ViewLoop) return;
	Stuff::Point3D p3d;
	Stuff::Vector3D v3d;
	
	float tme=CurTime;
	
	if(UseTarget && TargetLoc==Loc) TargetLoc.x+=0.0001f;
	
	if(Mode==CM_TRACK)
	{
		ViewLoop->Evaluate(tme,&p3d,&v3d);
		
		Loc.x=p3d.x;
		Loc.z=p3d.z;
		
		if(UseTarget)
		{
			v3d.x=TargetLoc.x-Loc.x;
			v3d.y=TargetLoc.y-Loc.y;
			v3d.z=TargetLoc.z-Loc.z;
		}
		
		v3d.Normalize(v3d);
		Dir=v3d;
	}
	
	
	if(Mode==CameraInfo::CM_FREE)
	{
		if(UseTarget)
		{
			v3d.x=TargetLoc.x-Loc.x;
			v3d.y=TargetLoc.y-Loc.y;
			v3d.z=TargetLoc.z-Loc.z;
			v3d.Normalize(v3d);
			Dir=v3d;
		}
		
	}
	
}

