/*
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 */
#define D_CineInfo_StructureDefine
 
#include "AIUseCPA.h"
#include "specif/AIOption.h"
#include "AIMacros.h"
#include "AI_Erm.h"
#include "Intell.h"
#include "StrIntel.h"
#include "AI_Struc.h"
#include "EnumProc.h"
#include "Convert.h"
#include "ActConst.h"
#include "specif/AITools.h"
#include "Operator.h"
 
#include "CAM_Base.h"
#include "CAM_Tool.h"
#include "CAM_Vis.h"
 
#define _WP_D_DEFINE_WAYPOINTS_
#include "WP_Handl.h"
/* in order to compile AI in C++ and link with GAM in C*/
#include "WP_Func.h"
#undef _WP_D_DEFINE_WAYPOINTS_
 
 
 
#define _WP_D_WPGRAPH_FRIEND_
#include "WPgraphe.h"
#undef _WP_D_WPGRAPH_FRIEND_
 
#include "WPWayPt.h"
#define _WP_D_WPARC_FREIND_
#include "WParc.h"
#undef _WP_D_WPARC_FREIND_
 
/*#ifdef ACTIVE_EDITOR*/
#ifdef __cplusplus
extern "C" {
#endif
/*#endif*/
 
HIE_tdxHandleToSuperObject g_hOldTargetedPerso = NULL;
 
/*#ifdef ACTIVE_EDITOR*/
#ifdef __cplusplus
}
#endif
/*#endif*/
 
/*
 **************************************************************************************************
 **************************************************************************************************
 *	MAIN UPDATE POSITION CAMERA FUNCTION
 **************************************************************************************************
 **************************************************************************************************
 */
 
 
/*
 *=================================================================================================
 * Main function to update position of camera.
 * general function, no parameters
 *=================================================================================================
 */
tdstNodeInterpret *CAM_fn_p_stUpdatePosition(HIE_tdxHandleToSuperObject _hSuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo	hCineinfo;
	CAM_tdstUpdateCamera	stStruct;
	MS_tdxHandleToDynam		h_Dynam;
	DNM_tdstDynamics		*p_stDynamics;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	hCineinfo = M_GetMSHandle(_hSuperObjPerso, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/*
	 *	Init camera stucture.
	 */
	CAM_fn_vSetCineinfoWorkFromCurrent(hCineinfo);
	CAM_fn_vInitCameraStructure(_hSuperObjPerso,&stStruct);
 
	if ((g_hOldTargetedPerso) && (g_hOldTargetedPerso != hCineinfo->hWork->hSuperObjectTargeted))
			CAM_fn_vUpdateTargetPosition(hCineinfo);
 
	/*
	 * Update speed of targeted actor
	 */
	MEC_fn_vUpdateSpeed (stStruct.hCineinfoWork->hSuperObjectTargeted);		
			
			
	/*
	 * Update Target position
	 */
	if( ((h_Dynam = M_GetMSHandle(stStruct.hCineinfoWork->hSuperObjectTargeted, Dynam)) == NULL) ||
		((p_stDynamics = fn_p_stDynamGetDynamics(h_Dynam)) == NULL)  )
	{
		return(p_stTree);
	}
/* ANNECY MT - 13/07/99 { */
	else if (!hCineinfo->bCanDoBestPos && DNM_M_bDynamicsIsActorMove(p_stDynamics))
	{
		hCineinfo->bCanDoBestPos = TRUE;
	}
/* END ANNECY MT } */

/*	if(DNM_M_eReportGetDynamicalState(DNM_M_p_stDynamicsGetReport(p_stDynamics)) != DNM_NoMove)*/
	if (!MTH3D_M_bIsNullVector(MTH_M_p_stMoveGetLinear(DNM_M_p_stReportGetAbsoluteCurrPosition(DNM_M_p_stDynamicsGetReport(p_stDynamics)))))
	{
		CAM_fn_vRemindSpeed(hCineinfo,DNM_M_p_stReportGetAbsoluteCurrSpeed(DNM_M_p_stDynamicsGetReport(p_stDynamics)));
		CAM_fn_vRemindPos(stStruct.hCineinfo,DNM_M_p_stReportGetAbsoluteCurrPosition(DNM_M_p_stDynamicsGetReport(p_stDynamics)));
		CAM_fn_vRemindTime(stStruct.hCineinfo,M_xGetUsefulDeltaTimeInSeconds(g_stEngineStructure.stEngineTimer));
	}

	/*
	 * Compute camera position.
	 */
	CAM_fn_vUpdateGeneralCamera(&stStruct);
 
	/*
	 * Fill MACDPID structure
	 */
	CAM_fn_vSendParametersToParsing(&stStruct);
 
	/*
	 * Request meca.
	 */
/*	fn_vBoolAddRequestWithDynam(_hSuperObjPerso,h_Dynam, LRM_eRequest_ActionOnCamera);*/
 
	g_hOldTargetedPerso = hCineinfo->hWork->hSuperObjectTargeted;
	/*
	 *	Reset temporary flags.
	 */
	hCineinfo->ucVolIAFlags = 0;
 
/*	fn_vSetProcedureActionReturn(C_ACTION_ENGINE_STOP);*/
    return (p_stTree);
}
 
 
/*
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 */
 
 
/*
 *=================================================================================================
 *	Change a real parameter in cineinfo.
 *	_lTypeOfChange	:	1	-	Temporary (change in work)
 *						0	-	Permanent (in current, visibility and work if already copied)
 *	_lChangingMode	:	-1	-	Value = init
 *						0	-	Value = current value (current or work if already copied) + add
 *						1	-	Value = passed value
 *=================================================================================================
 */
void CAM_fn_vChangeARealParameter
(
	MS_tdxHandleToCineinfo		_hCineInfo,
	MTH_tdxReal					*_p_xInitialValue,
	MTH_tdxReal					*_p_xCurrentValue,
	MTH_tdxReal					*_p_xVisibilityValue,
	MTH_tdxReal					*_p_xWorkValue,
	long						_lTypeOfChange,
	long						_lChangingMode,
	MTH_tdxReal					_xValue
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
	MTH_tdxReal			xActualValue = MTH_C_ZERO;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	if (_lTypeOfChange == 1)
	{
		CAM_fn_vSetCineinfoWorkFromCurrent(_hCineInfo);
		_p_xCurrentValue = _p_xWorkValue;
	}
 
	switch(_lChangingMode)
	{
	case -1:
		xActualValue = *_p_xInitialValue;
		break;
	case 0:
		if (_hCineInfo->ucVolIAFlags & C_VolIAFlags_CurrentAlreadyCopiedInWork)
			xActualValue = MTH_M_xAdd(*_p_xWorkValue, _xValue);
		else
			xActualValue = MTH_M_xAdd(*_p_xCurrentValue, _xValue);
		break;
	case 1:
		xActualValue = _xValue;
		break;
	}
 
	*_p_xCurrentValue = xActualValue;
 
	if (_lTypeOfChange != 1)
	{
		*_p_xVisibilityValue = xActualValue;
		*_p_xWorkValue = xActualValue;
	}
}
 
/*
 *================================================================================================
 *	Activate or desactivate a camera.
 *=================================================================================================
 */
void CAM_fn_vActivateCamera
(
	MS_tdxHandleToCineinfo	_hCineInfo,
	long					_lTypeOfChange,
	ACP_tdxBool				_bActive
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToInternalCineinfo		hCineInfoCurrent;
    MS_tdxHandleToInternalCineinfo		hCineInfoTest;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	if (_lTypeOfChange == 1)
	{
		CAM_fn_vSetCineinfoWorkFromCurrent(_hCineInfo);
		hCineInfoCurrent = _hCineInfo->hWork;
		hCineInfoTest = hCineInfoCurrent;
	}
	else
	{
		hCineInfoCurrent = _hCineInfo->hCurrent;
		if(_hCineInfo->ucVolIAFlags & C_VolIAFlags_CurrentAlreadyCopiedInWork)
			hCineInfoTest = _hCineInfo->hWork;
		else
			hCineInfoTest = hCineInfoCurrent;
	}
 
	/*
	 *	We want to active/desactive a camera that is already activated/desactivated.
	 */
	if (hCineInfoTest->bIsActive == _bActive)
		return;
 
	/*
	 *	If we activate a camera, we init it.
	 */
/*	if(_bActive)*/
/*		CAM_fn_vInitCompleteCineinfo(_hCineInfo);*/
 
	/*
	 *	Init the activation flag.
	 */
	hCineInfoCurrent->bIsActive = _bActive;
	if(_bActive == FALSE)
		hCineInfoCurrent->eTypeOfViewport = CAM_e_NoViewport;
 
	if (_lTypeOfChange != 1)
	{
		if(_bActive == FALSE)
		{
			_hCineInfo->hVisibility->eTypeOfViewport = CAM_e_NoViewport;
			_hCineInfo->hWork->eTypeOfViewport = CAM_e_NoViewport;
		}
		_hCineInfo->hVisibility->bIsActive = _bActive;
		_hCineInfo->hWork->bIsActive = _bActive;
	}
}
 
 
/*
 **************************************************************************************************
 **************************************************************************************************
	Procedures
	Change Parameters in camera's structure
 **************************************************************************************************
 **************************************************************************************************
 */
 
/*
 *=================================================================================================
 *	Change a vector parameter in cineinfo.
 *	_lTypeOfChange	:	1	-	Temporary (change in work)
 *						0	-	Permanent (in current, visibility and work if already copied)
 *	_lChangingMode	:	-1	-	Value = init
 *						0	-	Value = current value (current or work if already copied) + add
 *						1	-	Value = passed value
 *=================================================================================================
 */
void CAM_fn_vChangeAVectorParameter
(
	MS_tdxHandleToCineinfo		_hCineInfo,
	MTH3D_tdstVector			*_p_stInitialValue,
	MTH3D_tdstVector			*_p_stCurrentValue,
	MTH3D_tdstVector			*_p_stVisibilityValue,
	MTH3D_tdstVector			*_p_stWorkValue,
	long						_lTypeOfChange,
	long						_lChangingMode,
	MTH3D_tdstVector			*_p_stValue
)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
	MTH3D_tdstVector	stActualValue;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	MTH3D_M_vNullVector(&stActualValue);
 
	if (_lTypeOfChange == 1)
	{
		CAM_fn_vSetCineinfoWorkFromCurrent(_hCineInfo);
		_p_stCurrentValue = _p_stWorkValue;
	}
 
	switch(_lChangingMode)
	{
	case -1:
		MTH3D_M_vCopyVector(&stActualValue, _p_stInitialValue);
		break;
	case 0:
		if (_hCineInfo->ucVolIAFlags & C_VolIAFlags_CurrentAlreadyCopiedInWork)
		{
			MTH3D_M_vAddVector(&stActualValue, _p_stWorkValue, _p_stValue);
		}
		else
		{
			MTH3D_M_vAddVector(&stActualValue, _p_stCurrentValue, _p_stValue);
		}
		break;
	case 1:
		MTH3D_M_vCopyVector(&stActualValue, _p_stValue);
		break;
	}
 
	MTH3D_M_vCopyVector(_p_stCurrentValue, &stActualValue);
 
	if (_lTypeOfChange != 1)
	{
		MTH3D_M_vCopyVector(_p_stVisibilityValue, &stActualValue);
		MTH3D_M_vCopyVector(_p_stWorkValue, &stActualValue);
	}
}
 
/*
 *=================================================================================================
 * Procedure to change a vector parameter
 * parameters :
 *  Constant	-> 0 : Permanent 1 : Temporary
 *	Constant	-> changing mode (-1 restore, 0 set, 1 add)
 *  Vector		-> value to set or to add to current value
 *=================================================================================================
 */
tdstNodeInterpret *CAM_fn_p_stChangeVectorParameter(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo			hCineInfo;
	HIE_tdxHandleToSuperObject		hCamera;
	long							lChangingMode;
	long							lTypeOfChange;
	tdstGetSetParam					stValue;
	MTH3D_tdstVector				*p_stValue;
	MTH3D_tdstVector				*p_stInitialValue;
	MTH3D_tdstVector				*p_stCurrentValue;
	MTH3D_tdstVector				*p_stVisibilityValue;
	MTH3D_tdstVector				*p_stWorkValue;
    enum tdeProcedureId_			eProcedureId=M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineInfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	M_EvalNextParameter(&stValue);
	lTypeOfChange = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	lChangingMode = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	p_stValue = &M_GetSetParam_stVertexValue(&stValue);
 
	switch(eProcedureId)
	{
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeShiftTarget :
			p_stInitialValue = &(hCineInfo->hInit->stShiftTarget);
			p_stCurrentValue = &(hCineInfo->hCurrent->stShiftTarget);
			p_stVisibilityValue = &(hCineInfo->hVisibility->stShiftTarget);
			p_stWorkValue = &(hCineInfo->hWork->stShiftTarget);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeShiftPos :
			p_stInitialValue = &(hCineInfo->hInit->stShiftPos);
			p_stCurrentValue = &(hCineInfo->hCurrent->stShiftPos);
			p_stVisibilityValue = &(hCineInfo->hVisibility->stShiftPos);
			p_stWorkValue = &(hCineInfo->hWork->stShiftPos);
			break;
		/*---------------------------------------------------------------------------------------*/
		default :
			return (p_stTree);
 
	}
 
	CAM_fn_vChangeAVectorParameter
	(
		hCineInfo,
		p_stInitialValue,
		p_stCurrentValue,
		p_stVisibilityValue,
		p_stWorkValue,
		lTypeOfChange,
		lChangingMode,
		p_stValue
	);
    return (p_stTree);
}
 
/*
 *=================================================================================================
 * Procedure to change a real parameter
 * parameters :
 *  Constant	-> 0 : Permanent 1 : Temporary
 *	Constant	-> changing mode (-1 restore, 0 set, 1 add)
 *  Real		-> value to set or to add to current value
 *=================================================================================================
 */
tdstNodeInterpret *CAM_fn_p_stChangeRealParameter(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo			hCineInfo;
	HIE_tdxHandleToSuperObject		hCamera;
	MTH_tdxReal						xValue;
	long							lChangingMode;
	long							lTypeOfChange; /* permanent or not */
	tdstGetSetParam					stValue;
	MTH_tdxReal						*p_xInitialValue=NULL;
	MTH_tdxReal						*p_xCurrentValue=NULL;
	MTH_tdxReal						*p_xVisibilityValue=NULL;
	MTH_tdxReal						*p_xWorkValue=NULL;
    enum tdeProcedureId_			eProcedureId=M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineInfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	M_EvalNextParameter(&stValue);
	lTypeOfChange = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	lChangingMode = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	xValue = M_GetSetParam_xValue(&stValue);
 
	switch(eProcedureId)
	{
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeDistMin :
			p_xInitialValue = &(hCineInfo->hInit->xDistMin);
			p_xCurrentValue = &(hCineInfo->hCurrent->xDistMin);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xDistMin);
			p_xWorkValue = &(hCineInfo->hWork->xDistMin);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeDistMax :
			p_xInitialValue = &(hCineInfo->hInit->xDistMax);
			p_xCurrentValue = &(hCineInfo->hCurrent->xDistMax);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xDistMax);
			p_xWorkValue = &(hCineInfo->hWork->xDistMax);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeBoundDistMin :
			p_xInitialValue = &(hCineInfo->hInit->xBoundDistMin);
			p_xCurrentValue = &(hCineInfo->hCurrent->xBoundDistMin);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xBoundDistMin);
			p_xWorkValue = &(hCineInfo->hWork->xBoundDistMin);
			break;
		/*---------------------------------------------------------------------------------------*/
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
		case eProc_Cam_ChangeBoundDistMax :
			p_xInitialValue = &(hCineInfo->hInit->xBoundDistMax);
			p_xCurrentValue = &(hCineInfo->hCurrent->xBoundDistMax);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xBoundDistMax);
			p_xWorkValue = &(hCineInfo->hWork->xBoundDistMax);
			break;
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeAngleAlpha :
			p_xInitialValue = &(hCineInfo->hInit->xAngleAlpha);
			p_xCurrentValue = &(hCineInfo->hCurrent->xAngleAlpha);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xAngleAlpha);
			p_xWorkValue = &(hCineInfo->hWork->xAngleAlpha);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeAngleShiftAlpha :
			p_xInitialValue = &(hCineInfo->hInit->xAngleShiftAlpha);
			p_xCurrentValue = &(hCineInfo->hCurrent->xAngleShiftAlpha);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xAngleShiftAlpha);
			p_xWorkValue = &(hCineInfo->hWork->xAngleShiftAlpha);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeAngleTheta :
			p_xInitialValue = &(hCineInfo->hInit->xAngleTheta);
			p_xCurrentValue = &(hCineInfo->hCurrent->xAngleTheta);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xAngleTheta);
			p_xWorkValue = &(hCineInfo->hWork->xAngleTheta);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeAngleShiftTheta :
			p_xInitialValue = &(hCineInfo->hInit->xAngleShiftTheta);
			p_xCurrentValue = &(hCineInfo->hCurrent->xAngleShiftTheta);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xAngleShiftTheta);
			p_xWorkValue = &(hCineInfo->hWork->xAngleShiftTheta);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeLinearSpeed:
			p_xInitialValue = &(hCineInfo->hInit->xLinearSpeed);
			p_xCurrentValue = &(hCineInfo->hCurrent->xLinearSpeed);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xLinearSpeed);
			p_xWorkValue = &(hCineInfo->hWork->xLinearSpeed);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeLinearIncreaseSpeed :
			p_xInitialValue = &(hCineInfo->hInit->xLinearIncreaseSpeed);
			p_xCurrentValue = &(hCineInfo->hCurrent->xLinearIncreaseSpeed);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xLinearIncreaseSpeed);
			p_xWorkValue = &(hCineInfo->hWork->xLinearIncreaseSpeed);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeLinearDecreaseSpeed :
			p_xInitialValue = &(hCineInfo->hInit->xLinearDecreaseSpeed);
			p_xCurrentValue = &(hCineInfo->hCurrent->xLinearDecreaseSpeed);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xLinearDecreaseSpeed);
			p_xWorkValue = &(hCineInfo->hWork->xLinearDecreaseSpeed);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeAngularSpeed:
			p_xInitialValue = &(hCineInfo->hInit->xAngularSpeed);
			p_xCurrentValue = &(hCineInfo->hCurrent->xAngularSpeed);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xAngularSpeed);
			p_xWorkValue = &(hCineInfo->hWork->xAngularSpeed);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeAngularIncreaseSpeed :
			p_xInitialValue = &(hCineInfo->hInit->xAngularIncreaseSpeed);
			p_xCurrentValue = &(hCineInfo->hCurrent->xAngularIncreaseSpeed);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xAngularIncreaseSpeed);
			p_xWorkValue = &(hCineInfo->hWork->xAngularIncreaseSpeed);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeAngularDecreaseSpeed :
			p_xInitialValue = &(hCineInfo->hInit->xAngularDecreaseSpeed);
			p_xCurrentValue = &(hCineInfo->hCurrent->xAngularDecreaseSpeed);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xAngularDecreaseSpeed);
			p_xWorkValue = &(hCineInfo->hWork->xAngularDecreaseSpeed);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeTargetSpeed:
			p_xInitialValue = &(hCineInfo->hInit->xTargetSpeed);
			p_xCurrentValue = &(hCineInfo->hCurrent->xTargetSpeed);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xTargetSpeed);
			p_xWorkValue = &(hCineInfo->hWork->xTargetSpeed);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeTargetIncreaseSpeed :
			p_xInitialValue = &(hCineInfo->hInit->xTargetIncreaseSpeed);
			p_xCurrentValue = &(hCineInfo->hCurrent->xTargetIncreaseSpeed);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xTargetIncreaseSpeed);
			p_xWorkValue = &(hCineInfo->hWork->xTargetIncreaseSpeed);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeTargetDecreaseSpeed :
			p_xInitialValue = &(hCineInfo->hInit->xTargetDecreaseSpeed);
			p_xCurrentValue = &(hCineInfo->hCurrent->xTargetDecreaseSpeed);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xTargetDecreaseSpeed);
			p_xWorkValue = &(hCineInfo->hWork->xTargetDecreaseSpeed);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeFocal :
			p_xInitialValue = &(hCineInfo->hInit->xFocal);
			p_xCurrentValue = &(hCineInfo->hCurrent->xFocal);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xFocal);
			p_xWorkValue = &(hCineInfo->hWork->xFocal);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeZMin :
			p_xInitialValue = &(hCineInfo->hInit->xZMin);
			p_xCurrentValue = &(hCineInfo->hCurrent->xZMin);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xZMin);
			p_xWorkValue = &(hCineInfo->hWork->xZMin);
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ChangeZMax :
			p_xInitialValue = &(hCineInfo->hInit->xZMax);
			p_xCurrentValue = &(hCineInfo->hCurrent->xZMax);
			p_xVisibilityValue = &(hCineInfo->hVisibility->xZMax);
			p_xWorkValue = &(hCineInfo->hWork->xZMax);
			break;
		/*---------------------------------------------------------------------------------------*/
		default :
			break;
	}
 
	CAM_fn_vChangeARealParameter
	(
		hCineInfo,
		p_xInitialValue,
		p_xCurrentValue,
		p_xVisibilityValue,
		p_xWorkValue,
		lTypeOfChange,
		lChangingMode,
		xValue
	);
    return (p_stTree);
}
 
/*
 *=================================================================================================
 * Procedure to change Super Object Targeted
 * parameters :
 *  Constant	-> 0 : Permanent 1 : Temporary
 *	Constant	-> changing mode (-1 restore initial, 0 reset, 1 set)
 *  Perso		-> New Super object targeted
 *=================================================================================================
 */
tdstNodeInterpret *CAM_fn_p_stChangeTgtPerso(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo			hCineInfo;
    MS_tdxHandleToInternalCineinfo	hCineInfoCurrent;
	HIE_tdxHandleToSuperObject		hCamera;
	HIE_tdxHandleToSuperObject		hNewSuperObjectTargeted;
	HIE_tdxHandleToSuperObject		hOldSuperObjectTargeted;
	long							lChangingMode;
	long							lTypeOfChange;
	tdstGetSetParam					stValue;
    enum tdeProcedureId_			eProcedureId = M_eProcedureIdInterpret(p_stTree-1);
/*	MS_tdxHandleToDynam				h_Dynam;*/
/*	DNM_tdstDynamics				*p_stDynamics;*/
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineInfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
 	M_EvalNextParameter(&stValue);
	lTypeOfChange = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	lChangingMode = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	hNewSuperObjectTargeted = (HIE_tdxHandleToSuperObject) M_GetSetParam_p_stSupObjValue(&stValue);
 
	if (lTypeOfChange == 1)
	{
		CAM_fn_vSetCineinfoWorkFromCurrent(hCineInfo);
		hCineInfoCurrent = hCineInfo->hWork;
	}
	else
	{
		hCineInfoCurrent = hCineInfo->hCurrent;
	}
 
	switch(lChangingMode)
	{
	case -1:
		hNewSuperObjectTargeted = hCineInfo->hInit->hSuperObjectTargeted;
		break;
	case 0:
		hNewSuperObjectTargeted = NULL;
		break;
	case 1:
		break;
	}
 
	hOldSuperObjectTargeted = hCineInfoCurrent->hSuperObjectTargeted;
	hCineInfoCurrent->hSuperObjectTargeted = hNewSuperObjectTargeted;
 
	if (lTypeOfChange != 1)
	{
		hCineInfo->hVisibility->hSuperObjectTargeted = hNewSuperObjectTargeted;
		hCineInfo->hWork->hSuperObjectTargeted = hNewSuperObjectTargeted;
	}
 
	if ((g_hOldTargetedPerso) && (g_hOldTargetedPerso != hNewSuperObjectTargeted))
			CAM_fn_vUpdateTargetPosition(hCineInfo);
 
    /* END ANNECY MT }*/
    return (p_stTree);
}
 
/*
 *=================================================================================================
 * Procedure to set parameters for apex camera
 *
 * Parameters
 *  Constant	-> 0 : Permanent 1 : Temporary
 *	Constant	-> changing mode (-1 restore initial, 0 reset, 1 set)
 *  Perso		-> New Super object targeted
 *	Real		-> Ratio
 *=================================================================================================
 */
tdstNodeInterpret *CAM_fn_p_stChangeSecondTgtPerso(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo			hCineInfo;
    MS_tdxHandleToInternalCineinfo	hCineInfoCurrent;
	HIE_tdxHandleToSuperObject		hCamera;
	HIE_tdxHandleToSuperObject		hNewSuperObjectTargeted;
	MTH_tdxReal						xRatio;
	long							lChangingMode;
	long							lTypeOfChange;
	tdstGetSetParam					stValue;
    enum tdeProcedureId_			eProcedureId = M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineInfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
 	M_EvalNextParameter(&stValue);
	lTypeOfChange = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	lChangingMode = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	hNewSuperObjectTargeted = (HIE_tdxHandleToSuperObject) M_GetSetParam_p_stSupObjValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	xRatio = M_GetSetParam_xValue(&stValue);
 
	/* Be sure that we are not in computed mode anymore */
	if(hCineInfo->ucPerIAFlags & C_PerIAFlags_VisibilityCopied)
	{
		CAM_fn_vSetCineinfoCurrentFromVisibility(hCineInfo);
		if(hCineInfo->ucVolIAFlags & C_VolIAFlags_CurrentAlreadyCopiedInWork)
			CAM_fn_vSetCineinfoWorkFromVisibility(hCineInfo);
	}
 
	if (lTypeOfChange == 1)
	{
		CAM_fn_vSetCineinfoWorkFromCurrent(hCineInfo);
		hCineInfoCurrent = hCineInfo->hWork;
	}
	else
	{
		hCineInfoCurrent = hCineInfo->hCurrent;
	}
 
	switch(lChangingMode)
	{
	case -1:
		hNewSuperObjectTargeted = hCineInfo->hInit->hSuperObjectTargeted;
		break;
	case 0:
		hNewSuperObjectTargeted = NULL;
		break;
	case 1:
		break;
	}
 
	hCineInfoCurrent->hSecondSuperObjectTargeted = hNewSuperObjectTargeted;
 
	if (lTypeOfChange != 1)
	{
		hCineInfo->hVisibility->hSecondSuperObjectTargeted = hNewSuperObjectTargeted;
		hCineInfo->hWork->hSecondSuperObjectTargeted = hNewSuperObjectTargeted;
	}
 
	hCineInfo->xApexRatio = xRatio;
 
	return (p_stTree);
}
 
/*
 *=================================================================================================
 * Procedure to change the Channel
 * parameters :
 *  Constant	-> 0 : Permanent 1 : Temporary
 *	Constant	-> changing mode (-1 init, 0 reset, 1 set)
 *  Channel		-> channel number
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
tdstNodeInterpret *CAM_fn_p_stChangeChannel(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
	HIE_tdxHandleToSuperObject		hCamera;
    MS_tdxHandleToCineinfo			hCineInfo;
    MS_tdxHandleToInternalCineinfo	hCineInfoCurrent;
	long							lChangingMode;
	long							lTypeOfChange;
	char							cChannelNumber;
	tdstGetSetParam					stValue;
    enum tdeProcedureId_			eProcedureId=M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineInfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
 	M_EvalNextParameter(&stValue);
	lTypeOfChange = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	lChangingMode = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	cChannelNumber = (char) M_GetSetParam_lModuleValue(&stValue);
 
	if (lTypeOfChange == 1)
	{
		CAM_fn_vSetCineinfoWorkFromCurrent(hCineInfo);
		hCineInfoCurrent = hCineInfo->hWork;
	}
	else
	{
		hCineInfoCurrent = hCineInfo->hCurrent;
	}
 
	switch(lChangingMode)
	{
		case -1:
			cChannelNumber =  hCineInfo->hInit->cChannel;
			break;
		case 0 :
			cChannelNumber = -1;
			break;
		case 1 :
			break;
	}
 
	hCineInfoCurrent->cChannel = cChannelNumber;
 
	if (lTypeOfChange != 1)
	{
		hCineInfo->hVisibility->cChannel = cChannelNumber;
		hCineInfo->hWork->cChannel = cChannelNumber;
	}
 
	return (p_stTree);
}
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
 
/*
 *=================================================================================================
 * Procedure to set active a camera .
 * parameters :
 *  Constant	->	0 : Permanent 1 : Temporary
 *	Constant	->	0  : Desactive
 *					1  : Active
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
tdstNodeInterpret *CAM_fn_p_stActivate(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo			hCineInfo;
	HIE_tdxHandleToSuperObject		hCamera;
	tdstGetSetParam					stValue;
	ACP_tdxBool						bActive;
	long							lTypeOfChange;
	long							lValue;
    enum tdeProcedureId_			eProcedureId=M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId), p_SuperObjPerso, &hCamera);
	/********************************************************************************/
 
	hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineInfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
 	M_EvalNextParameter(&stValue);
	lTypeOfChange = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	lValue = M_GetSetParam_lValue(&stValue);
	if(lValue == 0)
		bActive = FALSE;
	else
		bActive = TRUE;
 
	CAM_fn_vActivateCamera(hCineInfo, lTypeOfChange, bActive);
 
    return (p_stTree);
}
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
 
/*
 *=================================================================================================
 * Procedure to change the camera assigned to a viewport .
 *
 * First parameter (CONSTANT):
 *		1 -> Main Viewport
 *		2 -> Secondary Viewport
 * Second Parameter (CONSTANT):
 *		0 -> Not Desactived the old camera
 *		1 -> Deactived the old camera
 * Fourth Parameter (PERSO):
 *		Handle of the new camera
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
tdstNodeInterpret *CAM_fn_p_stAssociateViewport(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo			hNewCineInfo = NULL;
    MS_tdxHandleToCineinfo			hOldCineInfo = NULL;
	HIE_tdxHandleToSuperObject		hNewCamera;
	HIE_tdxHandleToSuperObject		hOldCamera;
	long							lViewport;
	long							lDeactived;
	tdstGetSetParam					stValue;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/* Get the viewport */
	M_EvalNextParameter(&stValue);
	lViewport = M_GetSetParam_lValue(&stValue);
 
	/* Get the flag of deactivation */
	M_EvalNextParameter(&stValue);
	lDeactived = M_GetSetParam_lValue(&stValue);
 
	/* Get the handle of the new camera */
	M_EvalNextParameter(&stValue);
	hNewCamera = (HIE_tdxHandleToSuperObject)M_GetSetParam_p_stSupObjValue(&stValue);;
 
    /* Get the handle of the old camera */
    hOldCamera = CAM_fn_hGetActiveCamera(lViewport);
 
	/*
	 *	Check for parameters.
	 */
	if (hNewCamera == hOldCamera)
		return (p_stTree);
	if ((lViewport > CAM_Nb_Viewport) || (lViewport == CAM_e_NoViewport))
	    return (p_stTree);
 
	/*
	 *	Get cineinfo of new camera.
	 */
	if (hNewCamera != NULL)
		hNewCineInfo = M_GetMSHandle(hNewCamera, Cineinfo);
	/*
	 * Viewport haven't yet a camera
	 */
	if (hOldCamera != NULL)
		hOldCineInfo = M_GetMSHandle(hOldCamera, Cineinfo);
 
#if defined(__DEBUG_AI__)
	if ((hNewCineInfo == NULL) && (hNewCamera != NULL))
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	if (hNewCamera != NULL)
	{
		/*
		 *	Activate the new camera and assign the new camera to the wanted viewport.
		 *---------------------------------------------------------------------------
		 */
		CAM_fn_vActivateCamera(hNewCineInfo, 0, TRUE);
 
		hNewCineInfo->hWork->eTypeOfViewport = (enum e_ucListViewport_) lViewport;
		CAM_fn_vAssignCameraToAViewport(lViewport, hNewCamera);
		hNewCineInfo->hCurrent->eTypeOfViewport = (enum e_ucListViewport_) lViewport;
		hNewCineInfo->hVisibility->eTypeOfViewport = (enum e_ucListViewport_) lViewport;
 
		/* Micro */
		GAM_fn_vChangeCharacterForMicro(hNewCamera);
	}
 
	/*
	 *	Desactivate the old camera if necessary.
	 *------------------------------------------
	 */
	if
	(
		(hOldCamera != NULL)
	&&	(g_stEngineStructure.h_StdCamCaracter != hOldCamera)  /* the standard camera should not be deactivated*/
	)
	{
		if (lDeactived == 1)
			CAM_fn_vActivateCamera(hOldCineInfo, 0, FALSE);
 
		hOldCineInfo->hCurrent->eTypeOfViewport = CAM_e_NoViewport;
		hOldCineInfo->hVisibility->eTypeOfViewport = CAM_e_NoViewport;
		hOldCineInfo->hWork->eTypeOfViewport = CAM_e_NoViewport;
	}
    return (p_stTree);
}
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
 
/*
 *=================================================================================================
 * Procedure to set IA Flags
 * parameters :
 *  Constant	-> 0 : Permanent 1 : Temporary
 *	Constant	-> changing mode (1 : set, 0 reset, -1 : reinit)
 *=================================================================================================
	*/
tdstNodeInterpret *CAM_fn_p_stSetIAFlags(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo			hCineInfo;
	HIE_tdxHandleToSuperObject		hCamera;
	long							lChangingMode;
	long							lTypeOfChange; /* permanent or not */
	tdstGetSetParam					stValue;
	unsigned short					uwFlag = 0;
    enum tdeProcedureId_			eProcedureId=M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineInfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
 	M_EvalNextParameter(&stValue);
	lTypeOfChange = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	lChangingMode = M_GetSetParam_lValue(&stValue);
 
	switch (eProcedureId)
	{
		/*---------------------------------------------------------------------------------------*/
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
		case eProc_Cam_ResetIAFlags :
			uwFlag = hCineInfo->hInit->uwIAFlags;
			break;
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoDynamicTarget :
			uwFlag = C_IAFlags_NoDynamicTarget;
			if (lChangingMode == -1)
			{
				if (hCineInfo->hInit->uwIAFlags & C_IAFlags_NoDynamicTarget)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoAverageMoveTgtPerso:
			uwFlag = C_IAFlags_NoAverageMoveTgtPerso;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwIAFlags & C_IAFlags_NoAverageMoveTgtPerso)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoParseCutAngle :
			uwFlag = C_IAFlags_NoParseCutAngle;
			if (lChangingMode == -1)
			{
				if (hCineInfo->hInit->uwIAFlags & C_IAFlags_NoParseCutAngle)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoVisibility :
			uwFlag = C_IAFlags_NoVisibility;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwIAFlags & C_IAFlags_NoVisibility)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
		case eProc_Cam_SetFlagNoVisibilityWithDynHie :
			uwFlag = C_IAFlags_NoVisibilityWithDynHie;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwIAFlags & C_IAFlags_NoVisibilityWithDynHie)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoDynChangeTheta :
			uwFlag = C_IAFlags_NoDynChangeTheta;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwIAFlags & C_IAFlags_NoDynChangeTheta)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
		case eProc_Cam_SetFlagNoShiftUntilPosReached:
			uwFlag = C_IAFlags_NoShiftUntilPosReached;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwIAFlags & C_IAFlags_NoShiftUntilPosReached)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoDynSpeed:
			uwFlag = C_IAFlags_NoDynSpeed;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwIAFlags & C_IAFlags_NoDynSpeed)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		default :
			break;
	}
 
	CAM_fn_vSetResetInternalFlag
	(
		hCineInfo,
		&(hCineInfo->hCurrent->uwIAFlags),
		&(hCineInfo->hVisibility->uwIAFlags),
		&(hCineInfo->hWork->uwIAFlags),
		lTypeOfChange,
		lChangingMode,
		uwFlag
	);
 
    return (p_stTree);
}
/*
 *=================================================================================================
 * Procedure to set DNM Flags
 * parameters :
 *  Constant	-> 0 : Permanent 1 : Temporary
 *	Constant	-> changing mode (1 : set, 0 reset)
 *=================================================================================================
 */
tdstNodeInterpret *CAM_fn_p_stSetDNMFlags(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo			hCineInfo;
	HIE_tdxHandleToSuperObject		hCamera;
	long							lChangingMode;
	long							lTypeOfChange; /* permanent or not */
	tdstGetSetParam					stValue;
	unsigned short					uwFlag = 0;
    enum tdeProcedureId_			eProcedureId=M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
	hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
 
#if defined(__DEBUG_AI__)
	if (hCineInfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
 	M_EvalNextParameter(&stValue);
	lTypeOfChange = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	lChangingMode = M_GetSetParam_lValue(&stValue);
 
	switch (eProcedureId)
	{
		/*---------------------------------------------------------------------------------------*/
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
		case eProc_Cam_ResetDNMFlags :
			uwFlag = hCineInfo->hInit->uwDNMFlags;
			break;
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoLinearParsing :
			uwFlag = DNM_CAM_C_NoLinearParsing;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwDNMFlags & DNM_CAM_C_NoLinearParsing)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoLinearInertia :
			uwFlag = DNM_CAM_C_NoLinearInertia;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwDNMFlags & DNM_CAM_C_NoLinearInertia)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoAngularParsing :
			uwFlag = DNM_CAM_C_NoAngularParsing;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwDNMFlags & DNM_CAM_C_NoAngularParsing)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoAngularInertia :
			uwFlag = DNM_CAM_C_NoAngularInertia;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwDNMFlags & DNM_CAM_C_NoAngularInertia)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoTargetParsing :
			uwFlag = DNM_CAM_C_NoTargetParsing;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwDNMFlags & DNM_CAM_C_NoTargetParsing)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoTargetInertia :
			uwFlag = DNM_CAM_C_NoTargetInertia;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwDNMFlags & DNM_CAM_C_NoTargetInertia)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagFixedOrientation :
			uwFlag = DNM_CAM_C_FixedOrientation;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwDNMFlags & DNM_CAM_C_FixedOrientation)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_SetFlagNoObstacle:
			uwFlag = DNM_CAM_C_NoObstacle;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwDNMFlags & DNM_CAM_C_NoObstacle)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
		/*---------------------------------------------------------------------------------------*/
/* ANNECY MT - 28/07/99 { */
		case eProc_Cam_SetFlagNoCollisionWhenNotMoving:
			uwFlag = DNM_CAM_C_NoCollisionWhenNotMoving;
			if (lChangingMode == -1)
			{
				if(hCineInfo->hInit->uwDNMFlags & DNM_CAM_C_NoCollisionWhenNotMoving)
					lChangingMode = 1;
				else
					lChangingMode = 0;
			}
			break;
/* END ANNECY MT } */
		/*---------------------------------------------------------------------------------------*/
		default :
			break;
	}
 
	CAM_fn_vSetResetInternalFlag
	(
		hCineInfo,
		&(hCineInfo->hCurrent->uwDNMFlags),
		&(hCineInfo->hVisibility->uwDNMFlags),
		&(hCineInfo->hWork->uwDNMFlags),
		lTypeOfChange,
		lChangingMode,
		uwFlag
	);
 
    return (p_stTree);
}
 
 
/*
 **************************************************************************************************
 **************************************************************************************************
	Other procedures : For private cineinfo.
 **************************************************************************************************
 **************************************************************************************************
 */
 
 
/*
 *=================================================================================================
 * Procedure to  display infos
 * parameters :
 *	Constant	-> changing mode
 *					0 -> show info is unset,
 *					1 -> show info is set,
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
tdstNodeInterpret *CAM_fn_p_stShowInfo(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo			hCineInfo;
	HIE_tdxHandleToSuperObject		hCamera;
	long							lMode;
	tdstGetSetParam					stValue;
    enum tdeProcedureId_			eProcedureId=M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineInfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* Get action parameter */
	M_EvalNextParameter(&stValue);
	lMode = M_GetSetParam_lValue(&stValue);
 
	/* Set new display mode */
	switch(lMode)
	{
	case 0:	hCineInfo->ucPerIAFlags &= ~C_PerIAFlags_ShowInfo;	break;
	case 1:	hCineInfo->ucPerIAFlags |= C_PerIAFlags_ShowInfo;	break;
	}
 
    return (p_stTree);
}
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
/*
 *=================================================================================================
 * Procedure to set camera Constants
 * parameters :
 *	Constant	-> changing mode
 *	Real		-> Value
 *=================================================================================================
 */
tdstNodeInterpret *CAM_fn_p_stChangeConstants(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo		hCineInfo;
	HIE_tdxHandleToSuperObject	hCamera;
	register long				lMode;
	MTH_tdxReal					xVal;
/*	MTH3D_tdstVector			stVect;*/
	tdstGetSetParam				stValue;
    enum tdeProcedureId_		eProcedureId = M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	M_EvalNextParameter(&stValue);
	lMode = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	xVal = M_GetSetParam_xValue(&stValue);
 
 
	/* lMode == 39 is here, because it happens very often*/
	if (lMode == 39)
	{
		hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
		if(((short) xVal) & 0x0002)		/* Reset work */
		{
#if defined(__DEBUG_AI__)
			if (hCineInfo == NULL)
			{
				M_AIFatalError(E_uwAIFatalNotMSCamera);
			}
#endif
			hCineInfo->ucVolIAFlags &= ~(C_VolIAFlags_CurrentAlreadyCopiedInWork);
			CAM_g_stCameraConstants.wFlags &= ~((short) xVal);
			return p_stTree;
		}
		else
		{
			CAM_g_stCameraConstants.wFlags |= (short) xVal;
			return p_stTree;
		}
	}
 
	if (lMode < 17)
	{
		/* lMode 1 -> 16*/
		*( ((MTH_tdxReal*)(&CAM_g_stCameraConstants.xRayCameraSphereToGo1)) + (lMode-1)) = xVal;
		return p_stTree;
	}
	if (lMode < 23)
	{
		/* lMode 17 -> 22*/
		*( ((short*)(&CAM_g_stCameraConstants.xNumRayCameraCanGo)) + (lMode-17)) = ((short)xVal);
		return p_stTree;
	}
	if (lMode < 30)
	{
		/* lMode 23 -> 29*/
		return p_stTree;
	}
	if (lMode < 39)
	{
		/* lMode 30 -> 38*/
		*( ((MTH_tdxReal*)(&CAM_g_stCameraConstants.xDynSpeed_LinearFactNorm)) + (lMode-30)) = xVal;
		return p_stTree;
	}
	if (lMode == 40)
	{
		/* lMode 40*/
		CAM_g_stCameraConstants.wFlags &= ~((short) xVal);
		return p_stTree;
	}
	if (lMode < 44)
	{
		/* lMode 41 -> 43*/
		*( ((MTH_tdxReal*)(&CAM_g_stCameraConstants.xBaseCutAngle)) + (lMode-41)) = xVal;
		return p_stTree;
	}
	if (lMode == 44)
	{
		hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
		if (hCineInfo == NULL)
		{
			M_AIFatalError(E_uwAIFatalNotMSCamera);
		}
#endif
		hCineInfo -> bCanDoBestPos = xVal ? TRUE : FALSE;
		return p_stTree;
	}
	return p_stTree;
}
 
	
/*
	switch(lMode)
	{
	case 1:		CAM_g_stCameraConstants.xRayCameraSphereToGo1 = xVal; break;
	case 2:		CAM_g_stCameraConstants.xRayCameraSphereToGo2 = xVal; break;
	case 3:		CAM_g_stCameraConstants.xRayCameraSphereToSee1 = xVal; break;
	case 4:		CAM_g_stCameraConstants.xRayCameraSphereToSee2 = xVal; break;
 
	case 5:		CAM_g_stCameraConstants.xBaseAngleComputePosNormal = xVal; break;
	case 6:		CAM_g_stCameraConstants.xBaseAngleComputePosFailure = xVal; break;
 
	case 7:		CAM_g_stCameraConstants.xAverageForComputePos = xVal; break;
	case 8:		CAM_g_stCameraConstants.xAverageForComputeLinearSpeed = xVal; break;
 
	case 9:		CAM_g_stCameraConstants.xMinLinearSpeedCamera = xVal; break;
	case 10:	CAM_g_stCameraConstants.xMinLinearSpeedTgtPerso = xVal; break;
	case 11:	CAM_g_stCameraConstants.xMinAngularSpeedTgtPerso = xVal; break;
 
	case 12:	CAM_g_stCameraConstants.xEpsilonDynTgtAngle = xVal; break;
	case 13:	CAM_g_stCameraConstants.xEpsilonDynTgtFocalAngle = xVal; break;
	case 14:	CAM_g_stCameraConstants.xEpsilonForEqualVectors = xVal; break;
 
	case 15:	CAM_g_stCameraConstants.xOffsetMinDistPerso = xVal; break;
	case 16:	CAM_g_stCameraConstants.xDistanceForNoCut = xVal; break;
 
	case 17:	CAM_g_stCameraConstants.xNumRayCameraCanGo = (short) xVal; break;
	case 18:	CAM_g_stCameraConstants.xNumRayCameraCanSee = (short) xVal; break;
 
	case 19:	CAM_g_stCameraConstants.xTickTestVisibility = (short) xVal; break;
	case 20:	CAM_g_stCameraConstants.xTickFindBetterPos = (short) xVal; break;
	case 21:	CAM_g_stCameraConstants.xTickFindBetterPosIfNoMove = (short) xVal; break;
	case 22:	CAM_g_stCameraConstants.xTickFailureCantSee = (short) xVal; break;
 
	case 30:	CAM_g_stCameraConstants.xDynSpeed_LinearFactNorm = xVal; break;
	case 31:	CAM_g_stCameraConstants.xDynSpeed_LinearMax = xVal; break;
	case 32:	CAM_g_stCameraConstants.xDynSpeed_LinearMulPerso = xVal; break;
	case 33:	CAM_g_stCameraConstants.xDynSpeed_AngularFactNorm = xVal; break;
	case 34:	CAM_g_stCameraConstants.xDynSpeed_AngularMax = xVal; break;
	case 35:	CAM_g_stCameraConstants.xDynSpeed_AngularMulPerso = xVal; break;
	case 36:	CAM_g_stCameraConstants.xDynSpeed_TargetFactNorm = xVal; break;
	case 37:	CAM_g_stCameraConstants.xDynSpeed_TargetMax = xVal; break;
	case 38:	CAM_g_stCameraConstants.xDynSpeed_TargetMulPerso = xVal; break;
 
	case 39:
				hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
				if(((short) xVal) & 0x0002)		// Reset work 
				{
#if defined(__DEBUG_AI__)
					if (hCineInfo == NULL)
						M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
					hCineInfo->ucVolIAFlags &= ~(C_VolIAFlags_CurrentAlreadyCopiedInWork);
				}
				else
				{
					CAM_g_stCameraConstants.wFlags |= (short) xVal; break;
				}
	case 40:	CAM_g_stCameraConstants.wFlags &= ~((short) xVal); break;
 
	case 41:	CAM_g_stCameraConstants.xBaseCutAngle = xVal; break;
	case 42:	CAM_g_stCameraConstants.xCutAngleFactorPos = xVal; break;
	case 43:	CAM_g_stCameraConstants.xCutAngleFactorTgt = xVal; break;
 
	default:	break;
	}
 
	return (p_stTree);
}
 
/*
 *=================================================================================================
 *=================================================================================================
 */
extern void CAM_memcpy(void *dest, void *src, long size);
tdstNodeInterpret *CAM_fn_p_stConstants(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
    enum tdeProcedureId_			eProcedureId = M_eProcedureIdInterpret(p_stTree-1);
	switch(eProcedureId)
	{
	case eProc_Cam_SaveConstants:
		CAM_memcpy(&CAM_g_stCopyCameraConstants, &CAM_g_stCameraConstants, sizeof(CAM_tdstCameraConstants));
		break;
 
	case eProc_Cam_RestoreConstants:
		CAM_memcpy(&CAM_g_stCameraConstants, &CAM_g_stCopyCameraConstants, sizeof(CAM_tdstCameraConstants));
		break;
		default:
		  break;
	}
 
	return (p_stTree);
}
 
/*
 *=================================================================================================
 * Procedure to set ForceTarget or ForcePosition
 * parameters :
 *  Constant	-> 0 : Permanent 1 : Temporary
 *	Constant	-> changing mode (1 : set, 0 reset)
 *  Vector		-> new position
 *=================================================================================================
 */
tdstNodeInterpret *CAM_fn_p_stSetForce(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
    MS_tdxHandleToCineinfo			hCineInfo;
	HIE_tdxHandleToSuperObject		hCamera;
	long							lChangingMode;
	long							lTypeOfChange;
	tdstGetSetParam					stValue;
	unsigned short					uwFlag = 0;
    enum tdeProcedureId_			eProcedureId = M_eProcedureIdInterpret(p_stTree-1);
	MTH3D_tdstVector				*p_stValue, stTempVector;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineInfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineInfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
 	M_EvalNextParameter(&stValue);
	lTypeOfChange = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	lChangingMode = M_GetSetParam_lValue(&stValue);
 
	M_EvalNextParameter(&stValue);
	p_stValue = &M_GetSetParam_stVertexValue(&stValue);
	MTH3D_M_vCopyVector(&stTempVector, p_stValue);
 
	switch (eProcedureId)
	{
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ForceTarget :
 
			if(lChangingMode == 1)
			{
				MTH3D_M_vCopyVector(&hCineInfo->stForceTarget, p_stValue);
			}
			uwFlag = C_IAFlags_TargetIsAlreadyComputed;
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ForcePosition :
 
			if(lChangingMode == 1)
			{
				MTH3D_M_vCopyVector(&hCineInfo->stForcePosition, p_stValue);
			}
			uwFlag = C_IAFlags_PositionIsAlreadyComputed;
			break;
		/*---------------------------------------------------------------------------------------*/
		case eProc_Cam_ForceRefAxis :
 
			M_EvalNextParameter(&stValue);
			p_stValue = &M_GetSetParam_stVertexValue(&stValue);
 
			if(lChangingMode == 1)
			{
				MTH3D_M_vCopyVector(&hCineInfo->stForceRefAxisY, &stTempVector);
				MTH3D_M_vCopyVector(&hCineInfo->stForceRefAxisZ, p_stValue);
			}
			uwFlag = C_IAFlags_RefAxisIsAlreadyComputed;
			break;
		/*---------------------------------------------------------------------------------------*/
		default :
			break;
	}
 
	CAM_fn_vSetResetInternalFlag
	(
		hCineInfo,
		&(hCineInfo->hCurrent->uwIAFlags),
		&(hCineInfo->hVisibility->uwIAFlags),
		&(hCineInfo->hWork->uwIAFlags),
		lTypeOfChange,
		lChangingMode,
		uwFlag
	);
 
    return (p_stTree);
}
 
 
/*
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 */
 
 
/*
 *=================================================================================================
 * Reset camera
 * No Parameter.
 *=================================================================================================
 */
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT 08/06/99 { */
tdstNodeInterpret *CAM_fn_p_stReset(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
	HIE_tdxHandleToSuperObject	hCamera;
    MS_tdxHandleToCineinfo		hCineinfo;
    enum tdeProcedureId_		eProcedureId = M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineinfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	/* Init camera structure */
	CAM_fn_vInitCompleteCineinfo(hCineinfo);
 
    return (p_stTree);
}
#endif /* _AI_EXCLUDE_NEVER_USED_ } */
 
/*
 *=================================================================================================
 *	To force camera to go to a failure visibility position.
 *	No Parameter:
 *=================================================================================================
 */
extern char	cRefAxisIsAlreadyComputed;
extern char	cNoDynChangeTheta;
extern char	cCanTestStatic;
tdstNodeInterpret *CAM_fn_p_stForceBestPos(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
	HIE_tdxHandleToSuperObject	hCamera;
    MS_tdxHandleToCineinfo		hCineinfo;
 	CAM_tdstUpdateCamera		stStruct;
	enum tdeProcedureId_		eProcedureId = M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineinfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
/* ANNECY MT - 12/07/99 { */
	if (!hCineinfo->bCanDoBestPos)
	{
		MTH3D_M_vCopyVector(&hCineinfo->stForcePosition, &(hCamera->hGlobalMatrix->stTranslationVector));
		CAM_fn_vSetResetInternalFlag
		(
			hCineinfo,
			&(hCineinfo->hCurrent->uwIAFlags),
			&(hCineinfo->hVisibility->uwIAFlags),
			&(hCineinfo->hWork->uwIAFlags),
			1,
			1,
			C_IAFlags_PositionIsAlreadyComputed
		);
		return(p_stTree);
	}
/* END ANNECY MT } */

	/*
	 *	To have the actual good camera parameters.
	 */
	CAM_fn_vSetCineinfoWorkFromCurrent(hCineinfo);
	CAM_fn_vInitCameraStructure(hCamera, &stStruct);
 
	cRefAxisIsAlreadyComputed = stStruct.hCineinfoWork->uwIAFlags & C_IAFlags_RefAxisIsAlreadyComputed ? 1 : 0;
	cNoDynChangeTheta = stStruct.hCineinfoWork->uwIAFlags & C_IAFlags_NoDynChangeTheta ? 1 : 0;
	cCanTestStatic = 1;
 
	/*
	 *	Compute target and real wanted camera pos (this is necessary
	 *	for failure when we want a more correct position.
	 */
	CAM_fn_vComputeReferencePoint(&stStruct);
	CAM_fn_vComputeTarget(&stStruct);
	CAM_fn_vComputeRealWantedPos(&stStruct);
	CAM_fn_vComputeMovePosWithDynTheta(&stStruct);
 
	/*
	 *	If no perso, can't do it.
	 */
	if(stStruct.hCineinfoCurrent->hSuperObjectTargeted == NULL)
		return(p_stTree);
 
	/*
	 *	Force visibility failure.
	 */
	CAM_fn_vForceFailureVisibility(&stStruct);
	CAM_fn_vComputeFailureVisibility(&stStruct);
	stStruct.hCineinfoWork->uwDNMFlags |= (DNM_CAM_C_NoLinearParsing|DNM_CAM_C_NoAngularParsing);
 
/* ANNECY MT - 12/07/99 { */
	hCineinfo->bCanDoBestPos = FALSE;
/* END ANNECY MT } */

	return (p_stTree);
}
 
/*
 *=================================================================================================
 *	To force camera to go to a failure visibility position.
 *	No Parameter:
 *=================================================================================================
 */
tdstNodeInterpret *CAM_fn_p_stForceNormalState(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
	HIE_tdxHandleToSuperObject	hCamera;
    MS_tdxHandleToCineinfo		hCineinfo;
	enum tdeProcedureId_		eProcedureId = M_eProcedureIdInterpret(p_stTree-1);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineinfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	if (hCineinfo->ucPerIAFlags & C_PerIAFlags_VisibilityCopied)
		CAM_fn_vSetCineinfoCurrentFromVisibility(hCineinfo);
 
	hCineinfo->ucPerIAFlags &= ~C_PerIAFlags_ConstraintMoveVisFailure;
/*	hCineinfo->ucVolIAFlags &= ~C_VolIAFlags_CurrentAlreadyCopiedInWork;*/
	hCineinfo->eState = CAM_e_State_GoToOptimal;
 
    return (p_stTree);
}
 
/*
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 */
 
/*
 *=================================================================================================
 *	To force camera to follow on a rail
 * No Parameter
 *=================================================================================================
 */
#define CAM_M_vSetIn0ToPiBy2(V)	if (V > MTH_C_PiBy2)	V = MTH_M_xSub(MTH_C_Pi, V)
 
#if !defined(_AI_EXCLUDE_NEVER_USED_) /* MT {*/
tdstNodeInterpret *CAM_fn_p_stForceMovingOnRail(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree)
{
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
	HIE_tdxHandleToSuperObject	hCamera;
    MS_tdxHandleToCineinfo		hCineinfo;
 	CAM_tdstUpdateCamera		stStruct;
	long						lCurrentIndex;
	long						lNbWp;
	WP_tdhWayPoint				hWayPoint;
	WP_tdhWayPoint				hNextWayPoint =  NULL;
	WP_tdhWayPoint				hPreviousWayPoint = NULL;
	WP_tdhWayPoint				hOldPreviousWayPoint = NULL;
	MS_tdxHandleToMSWay			h_MSWay;
	MTH3D_tdstVector			stTargetPosition;
	MTH3D_tdstVector			stWpPosition;
	MTH3D_tdstVector			stPreviousWpPosition;
	MTH3D_tdstVector			stOldPreviousWpPosition;
	MTH3D_tdstVector			stNextWpPosition;
	MTH3D_tdstVector			stWantedPosition;
 
	MTH_tdxReal					xDistMin, xDistMax, xDistCurrent, xDistWanted = 0;
	MTH_tdxReal					xDist1, xDist2, xDist3;
	char						cCas = 0;
	ACP_tdxBool					bWantedPositionIsAlreadyComputed = FALSE;
	enum tdeProcedureId_		eProcedureId = M_eProcedureIdInterpret(p_stTree-1);
 
	static long					lSens = 1;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
	/********************************************************************************/
	/* BEWARE THE ULTRA OPERATOR : Must be at the beginning and respect this syntax */
	/********************************************************************************/
	fn_vGetUltraOperatorPerso(fn_ucGetProcedureUltraOperator(eProcedureId),p_SuperObjPerso,&hCamera);
	/********************************************************************************/
 
	hCineinfo = M_GetMSHandle(hCamera, Cineinfo);
#if defined(__DEBUG_AI__)
	if (hCineinfo == NULL)
		M_AIFatalError(E_uwAIFatalNotMSCamera);
#endif
 
	h_MSWay = M_GetMSHandle(hCamera, MSWay);
	if ( h_MSWay == NULL)
	    return (p_stTree);
 
	/* Init camera structure */
	CAM_fn_vSetCineinfoWorkFromCurrent(hCineinfo);
	CAM_fn_vInitCameraStructure(hCamera, &stStruct);
 
	/*
	 * Get dist min & dist max
	 */
	 xDistMin = hCineinfo->hWork->xDistMin;
	 xDistMax = hCineinfo->hWork->xDistMax;
 
	 if (MTH_M_bEqual(xDistMin, xDistMax))
		cCas = 1;
 
	/*
	 * Get target position
	 */
 	POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectMatrix(hCineinfo->hWork->hSuperObjectTargeted), &stTargetPosition);
 
	/*
	 * Compute distance between target & camera
	 */
	xDistCurrent = MTH3D_M_xVectorGap(&stStruct.stCurrentCameraPos, &stTargetPosition);
 
	/*
	 *	Test of Distance
	 */
	if (cCas)
	{
		if (!MTH_M_bEqualWithEpsilon(xDistMin, xDistCurrent, MTH_M_xFloatToReal(0.1f)))
			xDistWanted = xDistMin;
		else
		{	MTH3D_M_vCopyVector(&stWantedPosition, &stStruct.stCurrentCameraPos);
			bWantedPositionIsAlreadyComputed = TRUE;
		}
	}
	else
	{
		if (MTH_M_bLess(xDistCurrent, xDistMin))
			xDistWanted = xDistMin;
		else
		{
			if (MTH_M_bGreater(xDistCurrent, xDistMax))
				xDistWanted = xDistMax;
			else
			{	MTH3D_M_vCopyVector(&stWantedPosition, &stStruct.stCurrentCameraPos);
				xDistWanted = xDistMax;
				bWantedPositionIsAlreadyComputed = TRUE;
			}
		}
	}
 
	MTH3D_M_vCopyVector(&stWantedPosition, &stStruct.stCurrentCameraPos);
	if (!bWantedPositionIsAlreadyComputed)
	{
		CAM_fn_vComputeReferencePoint(&stStruct);
 
		/* Get the current Wp */
		lCurrentIndex = MSWay_fn_lGetCurrentIndexInPath(h_MSWay);
		hWayPoint = MSWay_fn_hGetWayPointOfPath (h_MSWay,lCurrentIndex);
 
		/* Number of Wp */
		lNbWp = MSWay_fn_lGetNumberWayPointInPath(h_MSWay);
		/* Position of the current Wp */
		WP_fnv_WayPoint_GetVertex(hWayPoint, &stWpPosition);
 
		if (CAM_fn_bEqualVectorWithEpsilon(&stWpPosition, &stStruct.stCurrentCameraPos, WP_fnx_WayPoint_GetRadius(hWayPoint)))
		/* Camera is on Wp*/
		{
			hPreviousWayPoint = MSWay_fn_hGetWayPointOfPath (h_MSWay,lCurrentIndex-1);
			if (hPreviousWayPoint)
				WP_fnv_WayPoint_GetVertex(hPreviousWayPoint, &stOldPreviousWpPosition);
			else
				MTH3D_M_vCopyVector(&stOldPreviousWpPosition, &stWpPosition);
 
			hWayPoint = MSWay_fn_hGetWayPointOfPath (h_MSWay,lCurrentIndex+1);
			MTH3D_M_vCopyVector(&stPreviousWpPosition, &stWpPosition);
 
			if (hWayPoint)
				WP_fnv_WayPoint_GetVertex(hWayPoint, &stWpPosition);
 
			/* compute the distance between cameratarget and the current section of path */
			xDist1= Cam_fn_xComputeProjectionRail(&stStruct.stTargetedPersoPos, &stPreviousWpPosition, &stOldPreviousWpPosition);
 
			/*	compute the distance between cameratarget and the next section of path*/
			xDist2 = Cam_fn_xComputeProjectionRail(&stStruct.stTargetedPersoPos, &stPreviousWpPosition, &stWpPosition);
 
			if (xDist1 <= xDist2)
			{
				lSens = -1;
				MSWay_fn_lIncrementCurrentIndexInPath(h_MSWay, -1);
				/* select the current section of path */
				Cam_fn_vComputeMovingOnRail(&stStruct,&stWantedPosition,&stPreviousWpPosition, &stOldPreviousWpPosition,xDistWanted);
			}
			else
			{
				/* select the next section of path */
				lSens = 1;
				MSWay_fn_lIncrementCurrentIndexInPath(h_MSWay, 1);
				Cam_fn_vComputeMovingOnRail(&stStruct,&stWantedPosition,&stWpPosition,&stPreviousWpPosition,xDistWanted);
			}
		}
 
		else
		{
 
			hPreviousWayPoint = MSWay_fn_hGetWayPointOfPath (h_MSWay,lCurrentIndex-lSens);
			if (hPreviousWayPoint)
				WP_fnv_WayPoint_GetVertex(hPreviousWayPoint, &stPreviousWpPosition);
			else
			{
				hPreviousWayPoint = hWayPoint;
				MTH3D_M_vCopyVector(&stPreviousWpPosition, &stWpPosition);
			}
			/*	compute the distance between cameratarget and the current section of path*/
			xDist1 = Cam_fn_xComputeProjectionRail(&stStruct.stTargetedPersoPos, &stPreviousWpPosition, &stWpPosition);
 
			hOldPreviousWayPoint = MSWay_fn_hGetWayPointOfPath (h_MSWay,lCurrentIndex - (2*lSens));
			if (hOldPreviousWayPoint)
				WP_fnv_WayPoint_GetVertex(hOldPreviousWayPoint, &stOldPreviousWpPosition);
			else
			{
				hOldPreviousWayPoint = hPreviousWayPoint;
				MTH3D_M_vCopyVector(&stOldPreviousWpPosition, &stPreviousWpPosition);
			}
			/*	compute the distance between cameratarget and the previous section of path*/
			xDist2 = Cam_fn_xComputeProjectionRail(&stStruct.stTargetedPersoPos, &stPreviousWpPosition, &stOldPreviousWpPosition);
 
 
			hNextWayPoint = MSWay_fn_hGetWayPointOfPath (h_MSWay,lCurrentIndex+lSens);
			if (hNextWayPoint)
			{
				WP_fnv_WayPoint_GetVertex(hNextWayPoint, &stNextWpPosition);
			}
			else
			{
				hNextWayPoint = hWayPoint;
				MTH3D_M_vCopyVector(&stNextWpPosition, &stWpPosition);
			}
			/*	compute the distance between cameratarget and the current section of path*/
			xDist3 = Cam_fn_xComputeProjectionRail(&stStruct.stTargetedPersoPos, &stNextWpPosition, &stWpPosition);
 
 
			if (xDist3 <= xDist1)
			{
				if (xDist3 <= xDist2)
				{
					MTH3D_M_vCopyVector(&stWantedPosition, &stWpPosition);
				}
				else
				{
					if (xDist1 <= xDist2)
					{
						Cam_fn_vComputeMovingOnRail(&stStruct,&stWantedPosition,&stWpPosition,&stPreviousWpPosition,xDistWanted);
					}
					else
					{
						if (CAM_fn_bEqualVectorWithEpsilon(&stPreviousWpPosition, &stStruct.stCurrentCameraPos, WP_fnx_WayPoint_GetRadius(hPreviousWayPoint)))
						{
							Cam_fn_vComputeMovingOnRail(&stStruct,&stWantedPosition,&stPreviousWpPosition,&stOldPreviousWpPosition,xDistWanted);
							lSens = -lSens;
							MSWay_fn_lIncrementCurrentIndexInPath(h_MSWay, lSens);
						}
						else
						{
							MTH3D_M_vCopyVector(&stWantedPosition, &stPreviousWpPosition);
						}
					}
				}
			}
			else
			{
				if (xDist1 <= xDist2)
				{
					Cam_fn_vComputeMovingOnRail(&stStruct,&stWantedPosition,&stWpPosition,&stPreviousWpPosition,xDistWanted);
				}
				else
				{
					if (CAM_fn_bEqualVectorWithEpsilon(&stPreviousWpPosition, &stStruct.stCurrentCameraPos, WP_fnx_WayPoint_GetRadius(hPreviousWayPoint)))
					{
						lSens = -lSens;
						MSWay_fn_lIncrementCurrentIndexInPath(h_MSWay, lSens);
						Cam_fn_vComputeMovingOnRail(&stStruct,&stWantedPosition,&stPreviousWpPosition,&stOldPreviousWpPosition,xDistWanted);
					}
					else
					{
						MTH3D_M_vCopyVector(&stWantedPosition, &stPreviousWpPosition);
					}
				}
			}
		}
	}
 
	/* Set the wanted position*/
	MTH3D_M_vCopyVector(&hCineinfo->stForcePosition, &stWantedPosition);
	CAM_fn_vSetResetInternalFlag
	(
		hCineinfo,
		&(hCineinfo->hCurrent->uwIAFlags),
		&(hCineinfo->hVisibility->uwIAFlags),
		&(hCineinfo->hWork->uwIAFlags),
		1,
		1,
		C_IAFlags_PositionIsAlreadyComputed
	);
 
    return (p_stTree);
}
#endif /* _AI_EXCLUDE_NEVER_USED_ }*/
 
 
/*
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 **************************************************************************************************
 */
 
/*
 *=================================================================================================
 *	To update the Look mode
 * 
 *=================================================================================================
 */
tdstNodeInterpret *CAM_fn_p_stCameraMode(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree) 
{
	tdstGetSetParam	stValue;
 
	M_EvalNextParameter(&stValue);
	g_stEngineStructure.cCameraMode = (char)M_GetSetParam_lValue(&stValue);
 
	return (p_stTree);
}
