/* ************************************************************************************************** ************************************************************************************************** ************************************************************************************************** ************************************************************************************************** */ #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); }