1459 lines
44 KiB
C
1459 lines
44 KiB
C
/*---------------------------------------------------------------------------*/
|
||
/* Operator.c : Definition of Operator.*/
|
||
/* auteur : Olivier Didelot.*/
|
||
/* date : 21/01/1997*/
|
||
/**/
|
||
/* 970129 : Bug in EvalOperator case eOperator_Dot (Fabien Morales)*/
|
||
/* modify : 31/01/1997 (O.C) script & editor names + Lint*/
|
||
/* modify : Olivier Couvreur*/
|
||
/* date : 03/02/1997 Lint 0 warnings excepted those specified at the end of AIMacros.h*/
|
||
/* modify : Olivier Couvreur*/
|
||
/* date : 18/02/1997 CPA_EXPORT + new functions for editor*/
|
||
/* modify : Olivier Couvreur*/
|
||
/* date : 21/02/1997 Rethink operators support*/
|
||
/* Add /,+=,-=,/=,*=,++,-- operators + rewrite of sz????NameFromId*/
|
||
/* modify : Olivier Couvreur*/
|
||
/* date : 03/04/1997 Add unary minus operator*/
|
||
/* modify : Olivier Couvreur*/
|
||
/* date : 27/06/1997 Now operators use function pointers !*/
|
||
/*---------------------------------------------------------------------------*/
|
||
#include "AIUseCPA.h"
|
||
|
||
#include "specif/AIOption.h"
|
||
#include "AIMacros.h"
|
||
#include "AI_Erm.h"
|
||
|
||
#include "AI_Struc.h"
|
||
#include "StrIntel.h"
|
||
#include "DsgMem.h"
|
||
#include "ActConst.h"
|
||
|
||
#include "Intell.h"
|
||
#include "GetSet.h"
|
||
|
||
#include "EnumOper.h"
|
||
#include "EnumFild.h"
|
||
#include "EnumKey.h"
|
||
|
||
#include "specif/AITools.h"
|
||
|
||
#include "safe.h"
|
||
|
||
#if defined(__DEBUG_AI__)
|
||
#include "ConvVar.h"
|
||
#endif
|
||
|
||
#if defined(ACTIVE_AIDEBUG) /*** DR ***/
|
||
#include "AID_Erm.h"
|
||
#include "specif/AID_Trac.h"
|
||
#endif /*ACTIVE_AIDEBUG*/
|
||
|
||
/* for long*/
|
||
#define AI_MTH_M_lAdd(A,B) ( (A)+(B) )
|
||
#define AI_MTH_M_lSub(A,B) ( (A)-(B) )
|
||
#define AI_MTH_M_lMul(A,B) ( (A)*(B) )
|
||
#define AI_MTH_M_lDiv(A,B) ( (A)/(B) )
|
||
|
||
/* for real*/
|
||
#define AI_MTH_M_xAdd(A,B) MTH_M_xAdd(A,B)
|
||
#define AI_MTH_M_xSub(A,B) MTH_M_xSub(A,B)
|
||
#define AI_MTH_M_xMul(A,B) MTH_M_xMul(A,B)
|
||
#define AI_MTH_M_xDiv(A,B) MTH_M_xDiv(A,B)
|
||
|
||
#define M_Operator_Arith(ucIsThereFloat,Func,p_stParam1,p_stParam2,p_stValue) \
|
||
if ((ucIsThereFloat)) \
|
||
{ \
|
||
M_Full_GetSetParam_Float(p_stValue, \
|
||
AI_MTH_M_x##Func( \
|
||
M_GetSetParam_xValue(p_stParam1), \
|
||
M_GetSetParam_xValue(p_stParam2) \
|
||
) \
|
||
); \
|
||
} \
|
||
else \
|
||
{ \
|
||
M_Full_GetSetParam_Integer(p_stValue, \
|
||
AI_MTH_M_l##Func( \
|
||
M_GetSetParam_lValue(p_stParam1), \
|
||
M_GetSetParam_lValue(p_stParam2) \
|
||
) \
|
||
); \
|
||
}
|
||
|
||
/************************************************************************************/
|
||
/* HERE IS THE BEGINNING */
|
||
/************************************************************************************/
|
||
#if !defined(OPTIMIZED_COMMAND)
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
tdstNodeInterpret *fn_p_stDefaultOperator(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
p_SuperObjPerso=p_SuperObjPerso;
|
||
p_stValue=p_stValue;
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidOperator);
|
||
#endif /* _DEBUG_AI__*/
|
||
return(p_stTree);
|
||
}
|
||
#endif /* _DEBUG_AI__*/
|
||
#endif /* OPTIMIZED_COMMAND*/
|
||
|
||
tdstNodeInterpret *fn_p_stScalarOperator(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam2;
|
||
tdeOperatorId eOperatorId = M_eOperatorIdInterpret(p_stTree-1);
|
||
unsigned char ucIsThereFloat;
|
||
|
||
/* unless this is the unary minus operator, there are two operands*/
|
||
if ( eOperatorId == eOperator_ScalarUnaryMinus)
|
||
{
|
||
M_Full_GetSetParam_Integer(p_stValue,0);
|
||
}
|
||
else
|
||
{
|
||
/* get the first one*/
|
||
M_EvalNextParameter(p_stValue);
|
||
|
||
/* in case of multiplications*/
|
||
if ( (eOperatorId == eOperator_ScalarMulScalar) || (eOperatorId == eOperator_ScalarDivScalar) )
|
||
{
|
||
/* if the first operand is null, it is not necessary to evaluate the second one!*/
|
||
if ( MTH_M_bIsNull(M_ReturnParam_xValue(p_stValue)) )
|
||
{
|
||
/* then just skip it! (dont worry, the exchange structure already contains 0)*/
|
||
return fn_p_stSkipThisArgument(p_stTree);
|
||
}
|
||
}
|
||
}
|
||
|
||
M_EvalNextParameter(&stParam2);
|
||
|
||
/* conversion in float if necessary : simplify the macro M_Operator_Arith*/
|
||
ucIsThereFloat = fn_ucAreThereFloatIfYesConvertThem(p_stValue,&stParam2);
|
||
|
||
/* do operation*/
|
||
switch ( eOperatorId )
|
||
{
|
||
case eOperator_ScalarPlusScalar:
|
||
M_Operator_Arith(ucIsThereFloat,Add,p_stValue,&stParam2,p_stValue);
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eOperator_ScalarUnaryMinus:
|
||
case eOperator_ScalarMinusScalar:
|
||
M_Operator_Arith(ucIsThereFloat,Sub,p_stValue,&stParam2,p_stValue);
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eOperator_ScalarMulScalar:
|
||
M_Operator_Arith(ucIsThereFloat,Mul,p_stValue,&stParam2,p_stValue);
|
||
return(p_stTree);
|
||
break;
|
||
|
||
case eOperator_ScalarDivScalar:
|
||
if
|
||
(
|
||
((ucIsThereFloat) && (MTH_M_bDifferentWithEpsilon(M_GetSetParam_xValue(&stParam2),MTH_C_ZERO,MTH_C_EpsilonPlus)))
|
||
|| ((!ucIsThereFloat) && ( M_GetSetParam_lValue(&stParam2)!=0))
|
||
)
|
||
{
|
||
M_Operator_Arith(ucIsThereFloat,Div,p_stValue,&stParam2,p_stValue);
|
||
}
|
||
else
|
||
{
|
||
M_Full_GetSetParam_Integer(p_stValue,0);
|
||
#if defined(__DEBUG_AI__)
|
||
SAF_M_AssertWithMsg(FALSE, "Division par z<>ro !")
|
||
M_AIFatalError(E_uwAIDivisionByZero);
|
||
#endif /* __DEBUG_AI__*/
|
||
}
|
||
return(p_stTree);
|
||
|
||
default:
|
||
break;
|
||
}
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidOperator);
|
||
#endif /* __DEBUG_AI__*/
|
||
M_Full_GetSetParam_Integer(p_stValue,0);
|
||
return(p_stTree);
|
||
}
|
||
|
||
|
||
/* Vector operator*/
|
||
tdstNodeInterpret *fn_p_stVectorOperator(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam1, stParam2;
|
||
tdeOperatorId eOperatorId=M_eOperatorIdInterpret(p_stTree-1);
|
||
MTH3D_tdstVector *p_stVector,*p_stVector1,*p_stVector2=NULL;
|
||
MTH_tdxReal xFactor=MTH_C_ONE;
|
||
|
||
M_EvalNextParameter(&stParam1);
|
||
#if defined(__DEBUG_AI__)
|
||
M_VerifyTypeOfParamAction(&stParam1, E_vt_Vector);
|
||
#endif
|
||
p_stVector1=&M_GetSetParam_stVertexValue(&stParam1);
|
||
|
||
if (eOperatorId!=eOperator_VectorUnaryMinus)
|
||
{
|
||
M_EvalNextParameter(&stParam2);
|
||
if ( (eOperatorId==eOperator_VectorPlusVector) || (eOperatorId==eOperator_VectorMinusVector) )
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
M_VerifyTypeOfParamAction(&stParam2, E_vt_Vector);
|
||
#endif /* __DEBUG_AI__*/
|
||
p_stVector2=&M_GetSetParam_stVertexValue(&stParam2);
|
||
}
|
||
else
|
||
{
|
||
xFactor=M_ReturnParam_xValue(&stParam2);
|
||
}
|
||
}
|
||
|
||
p_stVector=&M_GetSetParam_stVertexValue(p_stValue);
|
||
M_GetSetParam_Type(p_stValue)=E_vt_Vector;
|
||
|
||
/* do operation*/
|
||
switch(eOperatorId)
|
||
{
|
||
case eOperator_VectorPlusVector:
|
||
MTH3D_M_vAddVector(p_stVector,p_stVector1,p_stVector2);
|
||
return(p_stTree);
|
||
case eOperator_VectorMinusVector:
|
||
MTH3D_M_vSubVector(p_stVector,p_stVector1,p_stVector2);
|
||
return(p_stTree);
|
||
case eOperator_VectorMulScalar:
|
||
MTH3D_M_vMulScalarVector(p_stVector,xFactor,p_stVector1);
|
||
return(p_stTree);
|
||
case eOperator_VectorDivScalar:
|
||
if (MTH_M_bDifferentWithEpsilon(xFactor,MTH_C_ZERO,MTH_C_EpsilonPlus))
|
||
{
|
||
MTH3D_M_vDivScalarVector(p_stVector,p_stVector1,xFactor);
|
||
}
|
||
else
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
M_AIFatalError(E_uwAIDivisionByZero);
|
||
#endif /* __DEBUG_AI__*/
|
||
MTH3D_M_vNullVector(p_stVector);
|
||
}
|
||
return(p_stTree);
|
||
case eOperator_VectorUnaryMinus:
|
||
MTH3D_M_vNegVector(p_stVector,p_stVector1);
|
||
return(p_stTree);
|
||
default:
|
||
break;
|
||
}
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidOperator);
|
||
#endif /* __DEBUG_AI__*/
|
||
MTH3D_M_vNullVector(p_stVector);
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*********************************************************************************************************************/
|
||
/* for dot and affect and ultra operator */
|
||
/*********************************************************************************************************************/
|
||
|
||
|
||
|
||
tdstNodeInterpret *fn_p_stOperatorGetPerso(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, HIE_tdxHandleToSuperObject *hSuperObjPersoFound)
|
||
{
|
||
HIE_tdxHandleToSuperObject hSuperObjPerso;
|
||
tdstGetSetParam stValue;
|
||
#if defined(__DEBUG_AI__)
|
||
tdeTypeInterpret eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
/*M_AI_DEBUG_ASSERT*/
|
||
SAF_M_AssertWithMsg
|
||
(
|
||
(eTypeInterpret==E_ti_PersoRef) ||
|
||
(eTypeInterpret==E_ti_DsgVarRef) ||
|
||
(
|
||
(eTypeInterpret==E_ti_KeyWord) &&
|
||
(
|
||
/*(M_eKeyWordIdInterpret(p_stTree)==eKeyWord_World) ||*/
|
||
(M_eKeyWordIdInterpret(p_stTree)==eKeyWord_MainActor) ||
|
||
(M_eKeyWordIdInterpret(p_stTree)==eKeyWord_Me)
|
||
)
|
||
) ||
|
||
(
|
||
(eTypeInterpret==E_ti_Operator) &&
|
||
(
|
||
(M_eOperatorIdInterpret(p_stTree)==eOperator_Dot) ||
|
||
(M_eOperatorIdInterpret(p_stTree)==eOperator_ModelCast)
|
||
)
|
||
)
|
||
,
|
||
"Variable Perso invalide"
|
||
/*E_uwAIFatalInvalidAccessToFieldOrDsgVar*/
|
||
);
|
||
#endif /*__DEBUG_AI__*/
|
||
M_EvalNextParameter(&stValue);
|
||
#if defined(__DEBUG_AI__)
|
||
/*check that we got a perso*/
|
||
M_VerifyTypeOfParamAction(&stValue, E_vt_Perso);
|
||
/* and that the engine object is not NULL*/
|
||
M_AI_DEBUG_ASSERT(M_GetSetParam_p_stEngineObjValue(&stValue), E_uwAIFatalCantFindPerso);
|
||
#endif /* __DEBUG_AI__*/
|
||
|
||
/*now that the engine object is checked as valid, we can get the parent superobject */
|
||
hSuperObjPerso = M_GetSetParam_p_stSupObjValue(&stValue);
|
||
|
||
#if defined(__DEBUG_AI__)
|
||
/*check that it is valid however...*/
|
||
M_AI_DEBUG_ASSERT((hSuperObjPerso != NULL), E_uwAIFatalCantFindPerso);
|
||
#endif /* __DEBUG_AI__*/
|
||
|
||
*hSuperObjPersoFound=hSuperObjPerso;
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
static void fn_vOperatorGetField(enum tdeFieldId_ eFieldId,HIE_tdxHandleToSuperObject hSuperObjPerso,tdstGetSetParam *p_stValue)
|
||
{
|
||
if (fn_ucGetFieldValue(eFieldId, hSuperObjPerso, p_stValue) == C_INVALID_GET)
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vTestGetDsgVarOrField(1,0,0,eFieldId,hSuperObjPerso ,p_stValue);
|
||
#else
|
||
M_AIFatalError(E_uwAIFatalInvalidAccessToField);
|
||
#endif
|
||
}
|
||
}
|
||
|
||
static void fn_vOperatorSetField(enum tdeFieldId_ eFieldId,HIE_tdxHandleToSuperObject hSuperObjPerso,tdstGetSetParam *p_stValue)
|
||
{
|
||
if (fn_ucSetFieldValue(eFieldId, hSuperObjPerso, p_stValue) == C_INVALID_SET)
|
||
{
|
||
M_AIFatalError(E_uwAIFatalInvalidAccessToField);
|
||
}
|
||
}
|
||
|
||
static void fn_vOperatorGetDsgVar(unsigned char ucVarId,unsigned char ucIndex,HIE_tdxHandleToSuperObject hSuperObjPerso,tdstGetSetParam *p_stValue)
|
||
{
|
||
if (fn_ucGetDsgVar(ucVarId, ucIndex, AI_M_stGetMindOfSuperObj(hSuperObjPerso), p_stValue)==C_INVALID_GET)
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
|
||
fn_vTestGetDsgVarOrField(0,ucVarId,ucIndex,(tdeFieldId) 0,hSuperObjPerso ,p_stValue);
|
||
#endif
|
||
}
|
||
}
|
||
|
||
static void fn_vOperatorSetDsgVar(unsigned char ucVarId,unsigned char ucIndex,HIE_tdxHandleToSuperObject hSuperObjPerso,tdstGetSetParam *p_stValue)
|
||
{
|
||
if (fn_ucSetDsgVar(ucVarId, ucIndex, AI_M_stGetMindOfSuperObj(hSuperObjPerso), p_stValue)==C_INVALID_SET)
|
||
{
|
||
|
||
#if defined(__DEBUG_AI__)
|
||
char Message[255];
|
||
|
||
sprintf(Message, "Invalid Access to Dsg Var %s ", M_GetDsgVarName(AI_M_stGetMindOfSuperObj(hSuperObjPerso),ucVarId ));
|
||
SAF_M_AssertWithMsg(FALSE, Message );
|
||
#endif
|
||
/*M_AIFatalError(E_uwAIFatalInvalidAccessToDsgVar); */
|
||
/* error or not ????*/
|
||
}
|
||
}
|
||
|
||
/*********************************************************************************************************************/
|
||
/* THE ARRAY OPERATOR */
|
||
/*********************************************************************************************************************/
|
||
tdstNodeInterpret *fn_p_stArrayOperator(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
unsigned char ucVarId=0;
|
||
unsigned char ucIndex=0;
|
||
HIE_tdxHandleToSuperObject hSuperObjPerso=p_SuperObjPerso;
|
||
tdeTypeInterpret eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
|
||
if (eTypeInterpret==E_ti_Operator)
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
M_AI_DEBUG_ASSERT((M_eOperatorIdInterpret(p_stTree) == eOperator_Dot) , E_uwAIFatalInvalidAccessToDsgVar);
|
||
#endif /* __DEBUG_AI__*/
|
||
p_stTree++;
|
||
p_stTree=fn_p_stOperatorGetPerso(p_SuperObjPerso,p_stTree,&hSuperObjPerso);
|
||
}
|
||
|
||
#if defined(__DEBUG_AI__)
|
||
M_AI_DEBUG_ASSERT( (M_GetTypeInterpret(p_stTree)==E_ti_DsgVarRef) , E_uwAIFatalInvalidAccessToDsgVar);
|
||
#endif /* __DEBUG_AI__*/
|
||
ucVarId= (unsigned char) M_ucVarIdInterpret(p_stTree);
|
||
p_stTree++;
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
ucIndex=(unsigned char) M_lValueInterpret(p_stValue);
|
||
|
||
fn_vOperatorGetDsgVar(ucVarId,ucIndex,hSuperObjPerso,p_stValue);
|
||
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*********************************************************************************************************************/
|
||
/* THE DOT OPERATOR */
|
||
/*********************************************************************************************************************/
|
||
tdstNodeInterpret *fn_p_stDotOperator(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
HIE_tdxHandleToSuperObject hSuperObjPerso;
|
||
tdeTypeInterpret eTypeInterpret;
|
||
unsigned char ucIndex=0;
|
||
|
||
p_stTree=fn_p_stOperatorGetPerso(p_SuperObjPerso,p_stTree,&hSuperObjPerso);
|
||
|
||
eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
#if defined(__DEBUG_AI__)
|
||
M_AI_DEBUG_ASSERT(
|
||
(eTypeInterpret==E_ti_Field) ||
|
||
(eTypeInterpret==E_ti_DsgVarRef) ||
|
||
(
|
||
(eTypeInterpret==E_ti_Operator) && (M_eOperatorIdInterpret(p_stTree)==eOperator_ModelCast)
|
||
)
|
||
, E_uwAIFatalInvalidAccessToFieldOrDsgVar);
|
||
#endif /*__DEBUG_AI__*/
|
||
|
||
/* to swap*/
|
||
if (eTypeInterpret==E_ti_DsgVarRef)
|
||
{
|
||
unsigned char ucVarId = (unsigned char) M_ucVarIdInterpret(p_stTree);
|
||
p_stTree ++; /*BBB side effect operator out of the macro argument...*/
|
||
fn_vOperatorGetDsgVar(ucVarId,ucIndex,hSuperObjPerso,p_stValue);
|
||
#if defined( ACTIVE_AIDEBUG )
|
||
AIDebug_M_SetDsgVar( AI_M_stGetMindOfSuperObj(p_SuperObjPerso), p_stValue, (p_stTree-1) );
|
||
#endif
|
||
}
|
||
else if (eTypeInterpret==E_ti_Field)
|
||
{
|
||
enum tdeFieldId_ eFieldId = M_eFieldIdInterpret(p_stTree);
|
||
p_stTree ++; /*BBB side effect operator out of the macro argument...*/
|
||
fn_vOperatorGetField(eFieldId,hSuperObjPerso,p_stValue);
|
||
#if defined( ACTIVE_AIDEBUG )
|
||
AIDebug_M_SetField( AI_M_stGetMindOfSuperObj(p_SuperObjPerso), p_stValue, (p_stTree-1) );
|
||
#endif
|
||
}
|
||
else if ( (eTypeInterpret==E_ti_Operator) && (M_eOperatorIdInterpret(p_stTree)==eOperator_ModelCast) )
|
||
{
|
||
/*p_stTree=fn_p_stModelCastOperator(p_SuperObjPerso, p_stTree, p_stValue);*/
|
||
p_stTree=fn_p_stEvalTree(p_SuperObjPerso,p_stTree,p_stValue);
|
||
}
|
||
return(p_stTree);
|
||
}
|
||
|
||
/*********************************************************************************************************************/
|
||
/* THE DOT OPERATOR FOR VECTOR .X .Y .Z : */
|
||
/*********************************************************************************************************************/
|
||
tdstNodeInterpret *fn_p_stVectorDotOperator(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdeOperatorId eOperatorId=M_eOperatorIdInterpret(p_stTree-1);
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
if (M_IsVectorType(p_stValue))
|
||
{
|
||
MTH3D_tdstVector *p_stVector=&M_GetSetParam_stVertexValue(p_stValue);
|
||
|
||
switch(eOperatorId)
|
||
{
|
||
case eOperator_GetVectorX:
|
||
M_Full_GetSetParam_Float(p_stValue,MTH3D_M_xGetXofVector(p_stVector) );
|
||
return(p_stTree);
|
||
|
||
case eOperator_GetVectorY:
|
||
M_Full_GetSetParam_Float(p_stValue,MTH3D_M_xGetYofVector(p_stVector) );
|
||
return(p_stTree);
|
||
|
||
case eOperator_GetVectorZ:
|
||
M_Full_GetSetParam_Float(p_stValue,MTH3D_M_xGetZofVector(p_stVector) );
|
||
return(p_stTree);
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
#if defined(__DEBUG_AI__) || (defined(U64) && defined(D_CHECK_AI_FPCO))
|
||
M_AIFatalError(E_uwAIFatalNotValidOperator);
|
||
#endif
|
||
return(p_stTree);
|
||
}
|
||
|
||
|
||
/* for affect operator*/
|
||
static void fn_vGetFieldOrDsgVarForAffectOperator(HIE_tdxHandleToSuperObject hSuperObjPerso,tdeTypeInterpret eTypeInterpret,unsigned char ucVarId,unsigned char ucIndex,tdeFieldId eFieldId,tdstGetSetParam *p_stValue)
|
||
{
|
||
if (eTypeInterpret==E_ti_DsgVarRef)
|
||
{
|
||
/* read dsgvar value in stValue*/
|
||
fn_vOperatorGetDsgVar(ucVarId,ucIndex,hSuperObjPerso,p_stValue);
|
||
}
|
||
else if (eTypeInterpret==E_ti_Field)
|
||
{
|
||
/* read field value in stValue*/
|
||
fn_vOperatorGetField(eFieldId,hSuperObjPerso,p_stValue);
|
||
}
|
||
}
|
||
|
||
static void fn_vSetFieldOrDsgVarForAffectOperator(HIE_tdxHandleToSuperObject hSuperObjPerso,tdeTypeInterpret eTypeInterpret,unsigned char ucVarId,unsigned char ucIndex,tdeFieldId eFieldId,tdstGetSetParam *p_stValue)
|
||
{
|
||
if (eTypeInterpret==E_ti_DsgVarRef)
|
||
{
|
||
/* write dsgvar value from p_stValue*/
|
||
fn_vOperatorSetDsgVar(ucVarId,ucIndex,hSuperObjPerso,p_stValue);
|
||
}
|
||
else if (eTypeInterpret==E_ti_Field)
|
||
{
|
||
/* write field value from p_stValue*/
|
||
fn_vOperatorSetField(eFieldId,hSuperObjPerso,p_stValue);
|
||
}
|
||
}
|
||
|
||
static void fn_vSetVectorComponentForAffectOperator(unsigned char ucXYZflag,MTH3D_tdstVector *p_stVector,MTH_tdxReal xReal)
|
||
{
|
||
switch(ucXYZflag)
|
||
{
|
||
case 1:
|
||
MTH3D_M_vSetXofVector(p_stVector,xReal);
|
||
break;
|
||
case 2:
|
||
MTH3D_M_vSetYofVector(p_stVector,xReal);
|
||
break;
|
||
case 3:
|
||
MTH3D_M_vSetZofVector(p_stVector,xReal);
|
||
break;
|
||
}
|
||
}
|
||
|
||
static void fn_vBuildVectorForAffectOperator(unsigned char ucXYZflag,tdstGetSetParam *p_stParam,MTH_tdxReal xReal)
|
||
{
|
||
MTH3D_tdstVector *p_stVector=&M_GetSetParam_stVertexValue(p_stParam);
|
||
MTH3D_M_vNullVector(p_stVector);
|
||
fn_vSetVectorComponentForAffectOperator(ucXYZflag,p_stVector,xReal);
|
||
M_GetSetParam_Type(p_stParam)=E_vt_Vector;
|
||
}
|
||
|
||
|
||
|
||
tdstNodeInterpret *fn_p_stAffectOperator(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam1, stParam2;
|
||
tdeFieldId eFieldId=eNbField;
|
||
unsigned char ucVarId=0xFF;
|
||
unsigned char ucIndex=0;
|
||
unsigned char ucXYZflag=0;
|
||
unsigned char ucNbParam=0;
|
||
|
||
#if defined(ACTIVE_AIDEBUG)
|
||
unsigned short uwUpdateIndex = 0;
|
||
#endif /*ACTIVE_AIDEBUG*/
|
||
|
||
HIE_tdxHandleToSuperObject hSuperObjPerso = p_SuperObjPerso;
|
||
tdeOperatorId eOperatorId = M_eOperatorIdInterpret(p_stTree-1);
|
||
tdeTypeInterpret eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
|
||
if ( eOperatorId == eOperator_AffectArray )
|
||
{
|
||
ucNbParam = fn_ucGetTreeNbParam(p_stTree)-1;
|
||
}
|
||
|
||
/****************************/
|
||
/** get perso if necessary **/
|
||
/****************************/
|
||
|
||
if ( eTypeInterpret == E_ti_Operator )
|
||
{
|
||
/* traitement des champs et de l'op<6F>rateur ".X" ".Y" ".Z" en <20>criture.*/
|
||
#if defined(__DEBUG_AI__)
|
||
M_AI_DEBUG_ASSERT(
|
||
(M_eOperatorIdInterpret(p_stTree) == eOperator_Dot) ||
|
||
(M_eOperatorIdInterpret(p_stTree) == eOperator_Array) ||
|
||
(M_eOperatorIdInterpret(p_stTree) == eOperator_GetVectorX) ||
|
||
(M_eOperatorIdInterpret(p_stTree) == eOperator_GetVectorY) ||
|
||
(M_eOperatorIdInterpret(p_stTree) == eOperator_GetVectorZ),
|
||
E_uwAIWrongOperatorInLeftAffect
|
||
);
|
||
#endif /* __DEBUG_AI__*/
|
||
{
|
||
register tdeOperatorId eOpId = M_eOperatorIdInterpret(p_stTree);
|
||
if ( eOpId == eOperator_GetVectorX )
|
||
ucXYZflag = 1;
|
||
else if ( eOpId == eOperator_GetVectorY )
|
||
ucXYZflag = 2;
|
||
else if ( eOpId == eOperator_GetVectorZ )
|
||
ucXYZflag = 3;
|
||
}
|
||
if ( ucXYZflag )
|
||
{
|
||
p_stTree ++;
|
||
eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
}
|
||
}
|
||
|
||
if ( eTypeInterpret == E_ti_Operator )
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
M_AI_DEBUG_ASSERT((M_eOperatorIdInterpret(p_stTree) == eOperator_Array) || (M_eOperatorIdInterpret(p_stTree) == eOperator_Dot) , E_uwAIWrongOperatorInLeftAffect);
|
||
#endif /* __DEBUG_AI__*/
|
||
|
||
if ( M_eOperatorIdInterpret(p_stTree) == eOperator_Dot )
|
||
{
|
||
#if defined(ACTIVE_AIDEBUG)
|
||
/* prepare without update because the return value for dot is useless*/
|
||
AIDebug_M_PrepareOperator( AI_M_stGetMindOfSuperObj(p_SuperObjPerso), p_stValue, p_stTree );
|
||
#endif
|
||
/*p_stTree++; it is useless to affect, because we do it just below... increment in the argument instead*/
|
||
p_stTree=fn_p_stOperatorGetPerso(p_SuperObjPerso,p_stTree + 1,&hSuperObjPerso);
|
||
eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
}
|
||
else /* eOperator_Array*/
|
||
{
|
||
#if defined(ACTIVE_AIDEBUG)
|
||
/* prepare without update because the return value for array is useless*/
|
||
AIDebug_M_PrepareOperator( AI_M_stGetMindOfSuperObj(p_SuperObjPerso), p_stValue, p_stTree );
|
||
#endif
|
||
p_stTree ++;
|
||
eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
if ( eTypeInterpret == E_ti_Operator )
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
M_AI_DEBUG_ASSERT((M_eOperatorIdInterpret(p_stTree) == eOperator_Dot) , E_uwAIWrongOperatorInLeftAffect);
|
||
#endif /* __DEBUG_AI__*/
|
||
if ( M_eOperatorIdInterpret(p_stTree) == eOperator_Dot )
|
||
{
|
||
#if defined(ACTIVE_AIDEBUG)
|
||
/* prepare without update because the return value for dot is useless*/
|
||
AIDebug_M_PrepareOperator( AI_M_stGetMindOfSuperObj(p_SuperObjPerso), p_stValue, p_stTree );
|
||
#endif
|
||
/*p_stTree++; it is useless to affect, because we do it just below... increment in the argument instead*/
|
||
p_stTree = fn_p_stOperatorGetPerso(p_SuperObjPerso, p_stTree + 1, &hSuperObjPerso);
|
||
}
|
||
}
|
||
ucVarId = (unsigned char) M_ucVarIdInterpret(p_stTree);
|
||
p_stTree ++;
|
||
eTypeInterpret = E_ti_Operator;
|
||
}
|
||
}
|
||
|
||
/****************************/
|
||
/** get field or dsgvarid **/
|
||
/****************************/
|
||
if ( eTypeInterpret == E_ti_DsgVarRef )
|
||
{
|
||
ucVarId = (unsigned char) M_ucVarIdInterpret(p_stTree);
|
||
#if defined( ACTIVE_AIDEBUG )
|
||
uwUpdateIndex = AIDebug_M_SetDsgVar( AI_M_stGetMindOfSuperObj(p_SuperObjPerso), p_stValue, p_stTree );
|
||
#endif /*ACTIVE_AIDEBUG*/
|
||
p_stTree ++;
|
||
}
|
||
else if ( eTypeInterpret == E_ti_Field )
|
||
{
|
||
eFieldId = M_eFieldIdInterpret(p_stTree);
|
||
#if defined( ACTIVE_AIDEBUG )
|
||
uwUpdateIndex = AIDebug_M_SetField( AI_M_stGetMindOfSuperObj(p_SuperObjPerso), p_stValue, p_stTree );
|
||
#endif /*ACTIVE_AIDEBUG*/
|
||
p_stTree ++;
|
||
}
|
||
else if ( eTypeInterpret == E_ti_Operator )
|
||
{
|
||
M_EvalNextParameter(p_stValue);
|
||
ucIndex = (unsigned char) M_ReturnParam_lValue(p_stValue);
|
||
eTypeInterpret = E_ti_DsgVarRef;
|
||
}
|
||
#if defined(__DEBUG_AI__)
|
||
else
|
||
{
|
||
M_AIFatalError(E_uwAIFatalInvalidAccessToFieldOrDsgVar);
|
||
}
|
||
#endif /* __DEBUG_AI__*/
|
||
|
||
|
||
/************************/
|
||
/** read parameters **/
|
||
/************************/
|
||
if ( eOperatorId == eOperator_Affect )
|
||
{
|
||
if ( ucXYZflag )
|
||
{
|
||
/* read dsgvar or field value in stValue */
|
||
fn_vGetFieldOrDsgVarForAffectOperator(hSuperObjPerso,eTypeInterpret,ucVarId,ucIndex,eFieldId,p_stValue);
|
||
|
||
#if defined(__DEBUG_AI__)
|
||
M_AI_DEBUG_ASSERT(M_IsVectorType(p_stValue), E_uwAIWrongOperatorInLeftAffect);
|
||
#endif /* __DEBUG_AI__*/
|
||
|
||
/* Eval right parameter of affect*/
|
||
M_EvalNextParameter(&stParam1);
|
||
|
||
fn_vSetVectorComponentForAffectOperator(ucXYZflag,&M_GetSetParam_stVertexValue(p_stValue),M_ReturnParam_xValue(&stParam1));
|
||
/* voila dans p_stValue on a le Vecteur Complet surcharg<72> avec xReal*/
|
||
}
|
||
else /* a simple affectation: dont check that the affected value can be null...*/
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vSetDontCheckNULLFlag(1);
|
||
#endif /* __DEBUG_AI__ */
|
||
|
||
/* Eval right parameter of affect*/
|
||
M_EvalNextParameter(p_stValue);
|
||
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vSetDontCheckNULLFlag(-1);
|
||
#endif /* __DEBUG_AI__ */
|
||
|
||
}
|
||
}
|
||
else if ( eOperatorId == eOperator_AffectArray )
|
||
{
|
||
if ( ucNbParam > 0 )
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
{
|
||
AI_tdstMind *p_stMind=AI_M_stGetMindOfSuperObj(hSuperObjPerso);
|
||
tdeDsgVarTypeId eDsgVarType=M_GetDsgVarType(p_stMind,ucVarId);
|
||
tdstArray *p_stArray;
|
||
M_AI_DEBUG_ASSERT((fn_GetDsgVarType(eDsgVarType)==E_vt_Array), E_uwAIWrongOperatorInLeftAffect);
|
||
p_stArray=(tdstArray*) M_GetDsgVarAddr(p_stMind,ucVarId);
|
||
M_AI_DEBUG_ASSERT((ucIndex+ucNbParam<=M_ARRAY_SIZE(p_stArray)), E_uwAIWrongOperatorInLeftAffect);
|
||
}
|
||
#endif
|
||
do
|
||
{
|
||
/* Eval right parameter of affect*/
|
||
M_EvalNextParameter(p_stValue);
|
||
fn_vOperatorSetDsgVar(ucVarId,ucIndex,hSuperObjPerso,p_stValue);
|
||
ucIndex ++;
|
||
ucNbParam --;
|
||
}
|
||
while ( ucNbParam );
|
||
}
|
||
M_Full_GetSetParam_ActionReturn(p_stValue,C_ACTION_ENGINE_CONTINUE);
|
||
return(p_stTree);
|
||
}
|
||
else /* PlusAffect,MinusAffect,MulAffect,DivAffect,PlusPlusAffect,MinusMinusAffect*/
|
||
{
|
||
unsigned char ucIsVector=0;
|
||
/**************************/
|
||
/** read field or dsgvar **/
|
||
/**************************/
|
||
/* read dsgvar or field value in &stParam2*/
|
||
fn_vGetFieldOrDsgVarForAffectOperator(hSuperObjPerso,eTypeInterpret,ucVarId,ucIndex,eFieldId,&stParam2);
|
||
|
||
/* read right parameter in stParam1*/
|
||
if ( (eOperatorId == eOperator_MinusMinusAffect) || (eOperatorId == eOperator_PlusPlusAffect) )
|
||
{
|
||
if (!ucXYZflag)
|
||
{
|
||
M_Full_GetSetParam_Integer(&stParam1,1);
|
||
}
|
||
else
|
||
{
|
||
/* met 1,0,0 ou 0,1,0 ou 0,0,1 dans le vecteur de stParam1*/
|
||
fn_vBuildVectorForAffectOperator(ucXYZflag,&stParam1,MTH_C_ONE);
|
||
}
|
||
}
|
||
else /* PlusAffect,LessAffect,MulAffect*/
|
||
{
|
||
M_EvalNextParameter(&stParam1);
|
||
|
||
if (ucXYZflag)
|
||
{
|
||
/* met x,0,0 ou 0,x,0 ou 0,0,x dans le vecteur de stParam1*/
|
||
fn_vBuildVectorForAffectOperator(ucXYZflag,&stParam1,M_ReturnParam_xValue(&stParam1));
|
||
}
|
||
}
|
||
|
||
/* Vector checking*/
|
||
ucIsVector = (unsigned char) M_IsVectorType(&stParam2);
|
||
if ( ucIsVector )
|
||
{
|
||
ucIsVector=2;
|
||
if (!M_IsVectorType(&stParam1))
|
||
{
|
||
if
|
||
(
|
||
(eOperatorId==eOperator_SetVectorX)
|
||
||(eOperatorId==eOperator_SetVectorY)
|
||
||(eOperatorId==eOperator_SetVectorZ)
|
||
||(eOperatorId==eOperator_MulAffect)
|
||
||(eOperatorId==eOperator_DivAffect)
|
||
||(ucXYZflag)
|
||
)
|
||
{
|
||
ucIsVector=1;
|
||
}
|
||
else
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
M_AIFatalError(E_uwAIFatalInvalidAccessToFieldOrDsgVar);
|
||
#endif
|
||
MTH3D_M_vNullVector(&M_GetSetParam_stVertexValue(&stParam1));
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (M_IsVectorType(&stParam1))
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
M_AIFatalError(E_uwAIFatalInvalidAccessToFieldOrDsgVar);
|
||
#endif
|
||
M_Full_GetSetParam_Float(&stParam1,MTH_C_ZERO);
|
||
}
|
||
}
|
||
|
||
/******************/
|
||
/** do operation **/
|
||
/******************/
|
||
if ( ucIsVector )
|
||
{
|
||
MTH3D_tdstVector *p_stVector1=NULL,*p_stVector2;
|
||
MTH_tdxReal xReal = MTH_C_ZERO;
|
||
MTH3D_tdstVector *p_stVector=&M_GetSetParam_stVertexValue(p_stValue);
|
||
M_GetSetParam_Type(p_stValue)=E_vt_Vector;
|
||
|
||
p_stVector2=&M_GetSetParam_stVertexValue(&stParam2);
|
||
if ( ucIsVector == 1 )
|
||
{
|
||
xReal=M_ReturnParam_xValue(&stParam1);
|
||
MTH3D_M_vCopyVector(p_stVector,p_stVector2);
|
||
}
|
||
else
|
||
{
|
||
p_stVector1 = &M_GetSetParam_stVertexValue(&stParam1);
|
||
}
|
||
|
||
switch(eOperatorId)
|
||
{
|
||
case eOperator_SetVectorX :
|
||
MTH3D_M_vSetXofVector(p_stVector,xReal);
|
||
break;
|
||
|
||
case eOperator_SetVectorY :
|
||
MTH3D_M_vSetYofVector(p_stVector,xReal);
|
||
break;
|
||
|
||
case eOperator_SetVectorZ :
|
||
MTH3D_M_vSetZofVector(p_stVector,xReal);
|
||
break;
|
||
|
||
case eOperator_MulAffect:
|
||
if (!ucXYZflag)
|
||
{
|
||
MTH3D_M_vMulScalarVector(p_stVector, xReal, p_stVector2);
|
||
}
|
||
else
|
||
{
|
||
MTH3D_M_vCopyVector(p_stVector,p_stVector2);
|
||
switch ( ucXYZflag )
|
||
{
|
||
case 1:
|
||
xReal = MTH3D_M_xGetXofVector(p_stVector1);
|
||
MTH3D_M_vSetXofVector(p_stVector,MTH_M_xMul(MTH3D_M_xGetXofVector(p_stVector2),xReal));
|
||
break;
|
||
|
||
case 2:
|
||
xReal = MTH3D_M_xGetYofVector(p_stVector1);
|
||
MTH3D_M_vSetYofVector(p_stVector,MTH_M_xMul(MTH3D_M_xGetYofVector(p_stVector2),xReal));
|
||
break;
|
||
|
||
case 3:
|
||
xReal = MTH3D_M_xGetZofVector(p_stVector1);
|
||
MTH3D_M_vSetZofVector(p_stVector,MTH_M_xMul(MTH3D_M_xGetZofVector(p_stVector2),xReal));
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
|
||
case eOperator_DivAffect:
|
||
if ( !ucXYZflag )
|
||
{
|
||
MTH3D_M_vDivScalarVector(p_stVector,p_stVector2,xReal);
|
||
}
|
||
else
|
||
{
|
||
MTH3D_M_vCopyVector(p_stVector,p_stVector2);
|
||
switch ( ucXYZflag )
|
||
{
|
||
case 1:
|
||
xReal = MTH3D_M_xGetXofVector(p_stVector1);
|
||
MTH3D_M_vSetXofVector(p_stVector,MTH_M_xDiv(MTH3D_M_xGetXofVector(p_stVector2),xReal));
|
||
break;
|
||
|
||
case 2:
|
||
xReal = MTH3D_M_xGetYofVector(p_stVector1);
|
||
MTH3D_M_vSetYofVector(p_stVector,MTH_M_xDiv(MTH3D_M_xGetYofVector(p_stVector2),xReal));
|
||
break;
|
||
|
||
case 3:
|
||
xReal = MTH3D_M_xGetZofVector(p_stVector1);
|
||
MTH3D_M_vSetZofVector(p_stVector,MTH_M_xDiv(MTH3D_M_xGetZofVector(p_stVector2),xReal));
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
|
||
case eOperator_PlusAffect:
|
||
case eOperator_PlusPlusAffect:
|
||
MTH3D_M_vAddVector(p_stVector,p_stVector2,p_stVector1);
|
||
break;
|
||
|
||
case eOperator_MinusAffect:
|
||
case eOperator_MinusMinusAffect:
|
||
MTH3D_M_vSubVector(p_stVector,p_stVector2,p_stVector1);
|
||
break;
|
||
|
||
default:
|
||
#if defined(__DEBUG_AI__)
|
||
M_AIFatalError(E_uwAIFatalInvalidAccessToFieldOrDsgVar);
|
||
#endif
|
||
MTH3D_M_vNullVector(p_stVector);
|
||
break;
|
||
}
|
||
}
|
||
else /* operator is not applied to vectors*/
|
||
{
|
||
/* conversion in float if necessary : simplify the macro M_Operator_Arith*/
|
||
unsigned char ucIsThereFloat = fn_ucAreThereFloatIfYesConvertThem(&stParam1,&stParam2);
|
||
|
||
M_Full_GetSetParam_Integer(p_stValue,0);
|
||
|
||
switch(eOperatorId)
|
||
{
|
||
case eOperator_PlusAffect:
|
||
case eOperator_PlusPlusAffect:
|
||
M_Operator_Arith(ucIsThereFloat,Add,&stParam2,&stParam1,p_stValue);
|
||
break;
|
||
|
||
case eOperator_MinusAffect:
|
||
case eOperator_MinusMinusAffect:
|
||
M_Operator_Arith(ucIsThereFloat,Sub,&stParam2,&stParam1,p_stValue);
|
||
break;
|
||
|
||
case eOperator_MulAffect:
|
||
M_Operator_Arith(ucIsThereFloat,Mul,&stParam2,&stParam1,p_stValue);
|
||
break;
|
||
case eOperator_DivAffect:
|
||
if
|
||
(
|
||
((ucIsThereFloat) && (MTH_M_bDifferentWithEpsilon(M_GetSetParam_xValue(&stParam1),MTH_C_ZERO,MTH_C_EpsilonPlus)))
|
||
||
|
||
((!ucIsThereFloat) && ( M_GetSetParam_lValue(&stParam1) != 0))
|
||
)
|
||
{
|
||
M_Operator_Arith(ucIsThereFloat,Div,&stParam2,&stParam1,p_stValue);
|
||
}
|
||
#if defined(__DEBUG_AI__)
|
||
else
|
||
{
|
||
M_AIFatalError(E_uwAIDivisionByZero);
|
||
}
|
||
#endif
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/****************************/
|
||
/** affect field or dsgvar **/
|
||
/****************************/
|
||
fn_vSetFieldOrDsgVarForAffectOperator(hSuperObjPerso,eTypeInterpret,ucVarId,ucIndex,eFieldId,p_stValue);
|
||
|
||
#if defined(ACTIVE_AIDEBUG)
|
||
AIDebug_fn_vUpdateGetSetParam( AI_M_stGetMindOfSuperObj(p_SuperObjPerso), uwUpdateIndex, p_stValue );
|
||
#endif /*ACTIVE_AIDEBUG*/
|
||
|
||
/**********************/
|
||
/** return to engine **/
|
||
/**********************/
|
||
M_Full_GetSetParam_ActionReturn(p_stValue,C_ACTION_ENGINE_CONTINUE);
|
||
return(p_stTree);
|
||
}
|
||
|
||
|
||
|
||
/*old code
|
||
tdstNodeInterpret *fn_p_stAffectOperator(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
tdstGetSetParam stParam1, stParam2;
|
||
tdeFieldId eFieldId=eNbField;
|
||
unsigned char ucVarId=0xFF;
|
||
|
||
unsigned char ucXYZflag=0;
|
||
|
||
// bSomethingDone = TRUE; // Do not make the Schedule !!!
|
||
|
||
HIE_tdxHandleToSuperObject hSuperObjPerso=p_SuperObjPerso;
|
||
tdeOperatorId eOperatorId=M_eOperatorIdInterpret(p_stTree-1);
|
||
tdeTypeInterpret eTypeInterpret=M_GetTypeInterpret(p_stTree);
|
||
|
||
|
||
// **************************
|
||
// * get perso if necessary *
|
||
// **************************
|
||
|
||
if (eTypeInterpret==E_ti_Operator)
|
||
{
|
||
// traitement des champs et de l'op<6F>rateur ".X" ".Y" ".Z" en <20>criture.
|
||
#if defined(__DEBUG_AI__)
|
||
M_AI_DEBUG_ASSERT((M_eOperatorIdInterpret(p_stTree) == eOperator_Dot) ||
|
||
(M_eOperatorIdInterpret(p_stTree) == eOperator_GetVectorX) ||
|
||
(M_eOperatorIdInterpret(p_stTree) == eOperator_GetVectorY) ||
|
||
(M_eOperatorIdInterpret(p_stTree) == eOperator_GetVectorZ)
|
||
, E_uwAIWrongOperatorInLeftAffect);
|
||
#endif // __DEBUG_AI__
|
||
if (M_eOperatorIdInterpret(p_stTree) != eOperator_Dot)
|
||
{
|
||
switch(M_eOperatorIdInterpret(p_stTree))
|
||
{
|
||
case eOperator_GetVectorX:
|
||
ucXYZflag=1;
|
||
break;
|
||
case eOperator_GetVectorY:
|
||
ucXYZflag=2;
|
||
break;
|
||
case eOperator_GetVectorZ:
|
||
ucXYZflag=3;
|
||
break;
|
||
}
|
||
p_stTree++;
|
||
eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
}
|
||
}
|
||
|
||
|
||
if (eTypeInterpret==E_ti_Operator)
|
||
{
|
||
// traitement des champs et de l'op<6F>rateur "." en <20>criture.
|
||
#if defined(__DEBUG_AI__)
|
||
M_AI_DEBUG_ASSERT((M_eOperatorIdInterpret(p_stTree) == eOperator_Dot), E_uwAIWrongOperatorInLeftAffect);
|
||
#endif // __DEBUG_AI__
|
||
p_stTree++;
|
||
p_stTree=fn_p_stOperatorGetPerso(p_SuperObjPerso,p_stTree,&hSuperObjPerso);
|
||
eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
}
|
||
|
||
// **************************
|
||
// * get field or dsgvarid *
|
||
// **************************
|
||
if (eTypeInterpret==E_ti_Field)
|
||
{
|
||
eFieldId= M_eFieldIdInterpret(p_stTree);
|
||
}
|
||
else if ( (eTypeInterpret==E_ti_DsgVar) || (eTypeInterpret==E_ti_DsgVarRef) )
|
||
{
|
||
ucVarId= (unsigned char) M_ucVarIdInterpret(p_stTree);
|
||
}
|
||
#if defined(__DEBUG_AI__)
|
||
else
|
||
{
|
||
M_AIFatalError(E_uwAIFatalInvalidAccessToFieldOrDsgVar);
|
||
}
|
||
#endif // __DEBUG_AI__
|
||
p_stTree++;
|
||
|
||
// **********************
|
||
// * read parameters *
|
||
// **********************
|
||
if(eOperatorId==eOperator_Affect)
|
||
{
|
||
// Eval right parameter of affect
|
||
M_EvalNextParameter(p_stValue);
|
||
}
|
||
else // PlusAffect,MinusAffect,MulAffect,DivAffect,PlusPlusAffect,MinusMinusAffect
|
||
{
|
||
unsigned char ucIsVector=0;
|
||
// ************************
|
||
// * read field or dsgvar *
|
||
// ************************
|
||
if (eTypeInterpret==E_ti_Field)
|
||
{
|
||
// read field value in stParam2
|
||
fn_vOperatorGetField(eFieldId,hSuperObjPerso,&stParam2);
|
||
}
|
||
else if ( (eTypeInterpret==E_ti_DsgVar) || (eTypeInterpret==E_ti_DsgVarRef) )
|
||
{
|
||
// read dsgvar value in stParam2
|
||
fn_vOperatorGetDsgVar(ucVarId,hSuperObjPerso,&stParam2);
|
||
}
|
||
|
||
// read right parameter in stParam1
|
||
if ( (eOperatorId==eOperator_MinusMinusAffect) || (eOperatorId==eOperator_PlusPlusAffect) )
|
||
{
|
||
if (!ucXYZflag)
|
||
{
|
||
M_Full_GetSetParam_Integer(&stParam1,1);
|
||
}
|
||
else
|
||
{
|
||
MTH3D_tdstVector stVector;
|
||
MTH3D_M_vNullVector(&stVector);
|
||
switch (ucXYZflag)
|
||
{
|
||
case 1:
|
||
MTH3D_M_vSetXofVector(&stVector,MTH_C_ONE);
|
||
break;
|
||
case 2:
|
||
MTH3D_M_vSetYofVector(&stVector,MTH_C_ONE);
|
||
break;
|
||
case 3:
|
||
MTH3D_M_vSetZofVector(&stVector,MTH_C_ONE);
|
||
break;
|
||
}
|
||
M_Full_GetSetParam_p_stVertex(&stParam1,&stVector);
|
||
}
|
||
}
|
||
else // PlusAffect,LessAffect,MulAffect
|
||
{
|
||
// Eval right parameter of affect
|
||
M_EvalNextParameter(&stParam1);
|
||
|
||
if (ucXYZflag)
|
||
{
|
||
MTH3D_tdstVector stVector;
|
||
MTH3D_M_vNullVector(&stVector);
|
||
switch (ucXYZflag)
|
||
{
|
||
case 1:
|
||
MTH3D_M_vSetXofVector(&stVector,M_ReturnParam_xValue(&stParam1));
|
||
break;
|
||
case 2:
|
||
MTH3D_M_vSetYofVector(&stVector,M_ReturnParam_xValue(&stParam1));
|
||
break;
|
||
case 3:
|
||
MTH3D_M_vSetZofVector(&stVector,M_ReturnParam_xValue(&stParam1));
|
||
break;
|
||
}
|
||
M_Full_GetSetParam_p_stVertex(&stParam1,&stVector);
|
||
}
|
||
}
|
||
|
||
// Vector checking
|
||
ucIsVector=(unsigned char) M_IsVectorType(&stParam2);
|
||
if (ucIsVector)
|
||
{
|
||
ucIsVector=2;
|
||
if (!M_IsVectorType(&stParam1))
|
||
{
|
||
if (
|
||
(eOperatorId==eOperator_SetVectorX)
|
||
||(eOperatorId==eOperator_SetVectorY)
|
||
||(eOperatorId==eOperator_SetVectorZ)
|
||
||(eOperatorId==eOperator_MulAffect)
|
||
||(eOperatorId==eOperator_DivAffect)
|
||
||(ucXYZflag)
|
||
)
|
||
{
|
||
ucIsVector=1;
|
||
}
|
||
else
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
M_AIFatalError(E_uwAIFatalInvalidAccessToFieldOrDsgVar);
|
||
#endif
|
||
MTH3D_M_vNullVector(&M_GetSetParam_stVertexValue(&stParam1));
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (M_IsVectorType(&stParam1))
|
||
{
|
||
#if defined(__DEBUG_AI__)
|
||
M_AIFatalError(E_uwAIFatalInvalidAccessToFieldOrDsgVar);
|
||
#endif
|
||
M_Full_GetSetParam_Float(&stParam1,MTH_C_ZERO);
|
||
}
|
||
}
|
||
|
||
// ****************
|
||
// * do operation *
|
||
// ****************
|
||
if (ucIsVector)
|
||
{
|
||
MTH3D_tdstVector *p_stVector1=NULL,*p_stVector2;
|
||
MTH_tdxReal xReal=MTH_C_ZERO;
|
||
MTH3D_tdstVector *p_stVector=&M_GetSetParam_stVertexValue(p_stValue);
|
||
M_GetSetParam_Type(p_stValue)=E_vt_Vector;
|
||
|
||
p_stVector2=&M_GetSetParam_stVertexValue(&stParam2);
|
||
if (ucIsVector==1)
|
||
{
|
||
xReal=M_ReturnParam_xValue(&stParam1);
|
||
MTH3D_M_vCopyVector(p_stVector,p_stVector2);
|
||
}
|
||
else
|
||
{
|
||
p_stVector1=&M_GetSetParam_stVertexValue(&stParam1);
|
||
}
|
||
|
||
switch(eOperatorId)
|
||
{
|
||
case eOperator_SetVectorX :
|
||
MTH3D_M_vSetXofVector(p_stVector,xReal);
|
||
break;
|
||
|
||
case eOperator_SetVectorY :
|
||
MTH3D_M_vSetYofVector(p_stVector,xReal);
|
||
break;
|
||
|
||
case eOperator_SetVectorZ :
|
||
MTH3D_M_vSetZofVector(p_stVector,xReal);
|
||
break;
|
||
|
||
case eOperator_MulAffect:
|
||
if (!ucXYZflag)
|
||
{
|
||
MTH3D_M_vMulScalarVector(p_stVector, xReal, p_stVector2);
|
||
}
|
||
else
|
||
{
|
||
MTH3D_M_vCopyVector(p_stVector,p_stVector2);
|
||
switch (ucXYZflag)
|
||
{
|
||
case 1:
|
||
xReal=MTH3D_M_xGetXofVector(p_stVector1);
|
||
MTH3D_M_vSetXofVector(p_stVector,MTH_M_xMul(MTH3D_M_xGetXofVector(p_stVector2),xReal));
|
||
break;
|
||
case 2:
|
||
xReal=MTH3D_M_xGetYofVector(p_stVector1);
|
||
MTH3D_M_vSetYofVector(p_stVector,MTH_M_xMul(MTH3D_M_xGetYofVector(p_stVector2),xReal));
|
||
break;
|
||
case 3:
|
||
xReal=MTH3D_M_xGetZofVector(p_stVector1);
|
||
MTH3D_M_vSetZofVector(p_stVector,MTH_M_xMul(MTH3D_M_xGetZofVector(p_stVector2),xReal));
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
|
||
case eOperator_DivAffect:
|
||
if (!ucXYZflag)
|
||
{
|
||
MTH3D_M_vDivScalarVector(p_stVector,p_stVector2,xReal);
|
||
}
|
||
else
|
||
{
|
||
MTH3D_M_vCopyVector(p_stVector,p_stVector2);
|
||
switch (ucXYZflag)
|
||
{
|
||
case 1:
|
||
xReal=MTH3D_M_xGetXofVector(p_stVector1);
|
||
MTH3D_M_vSetXofVector(p_stVector,MTH_M_xDiv(MTH3D_M_xGetXofVector(p_stVector2),xReal));
|
||
break;
|
||
case 2:
|
||
xReal=MTH3D_M_xGetYofVector(p_stVector1);
|
||
MTH3D_M_vSetYofVector(p_stVector,MTH_M_xDiv(MTH3D_M_xGetYofVector(p_stVector2),xReal));
|
||
break;
|
||
case 3:
|
||
xReal=MTH3D_M_xGetZofVector(p_stVector1);
|
||
MTH3D_M_vSetZofVector(p_stVector,MTH_M_xDiv(MTH3D_M_xGetZofVector(p_stVector2),xReal));
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
|
||
case eOperator_PlusAffect:
|
||
case eOperator_PlusPlusAffect:
|
||
MTH3D_M_vAddVector(p_stVector,p_stVector2,p_stVector1);
|
||
break;
|
||
|
||
case eOperator_MinusAffect:
|
||
case eOperator_MinusMinusAffect:
|
||
MTH3D_M_vSubVector(p_stVector,p_stVector2,p_stVector1);
|
||
break;
|
||
|
||
default:
|
||
#if defined(__DEBUG_AI__)
|
||
|
||
M_AIFatalError(E_uwAIFatalInvalidAccessToFieldOrDsgVar);
|
||
#endif
|
||
MTH3D_M_vNullVector(p_stVector);
|
||
break;
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
// conversion in float if necessary : simplify the macro M_Operator_Arith
|
||
unsigned char ucIsThereFloat=fn_ucAreThereFloatIfYesConvertThem(&stParam1,&stParam2);
|
||
|
||
M_Full_GetSetParam_Integer(p_stValue,0);
|
||
|
||
switch(eOperatorId)
|
||
{
|
||
case eOperator_PlusAffect:
|
||
case eOperator_PlusPlusAffect:
|
||
M_Operator_Arith(ucIsThereFloat,Add,&stParam2,&stParam1,p_stValue);
|
||
break;
|
||
case eOperator_MinusAffect:
|
||
case eOperator_MinusMinusAffect:
|
||
M_Operator_Arith(ucIsThereFloat,Sub,&stParam2,&stParam1,p_stValue);
|
||
break;
|
||
case eOperator_MulAffect:
|
||
M_Operator_Arith(ucIsThereFloat,Mul,&stParam2,&stParam1,p_stValue);
|
||
break;
|
||
case eOperator_DivAffect:
|
||
if (MTH_M_bDifferentWithEpsilon(M_GetSetParam_xValue(&stParam2),MTH_C_ZERO,MTH_C_EpsilonPlus))
|
||
{
|
||
M_Operator_Arith(ucIsThereFloat,Div,&stParam2,&stParam1,p_stValue);
|
||
}
|
||
#if defined(__DEBUG_AI__)
|
||
else
|
||
{
|
||
M_AIFatalError(E_uwAIDivisionByZero);
|
||
}
|
||
#endif
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
// **************************
|
||
// * affect field or dsgvar *
|
||
// **************************
|
||
if (eTypeInterpret==E_ti_Field)
|
||
{
|
||
// write field value from p_stValue
|
||
fn_vOperatorSetField(eFieldId,hSuperObjPerso,p_stValue);
|
||
}
|
||
else if ( (eTypeInterpret==E_ti_DsgVar) || (eTypeInterpret==E_ti_DsgVarRef) )
|
||
{
|
||
// write dsgvar value from p_stValue
|
||
fn_vOperatorSetDsgVar(ucVarId,hSuperObjPerso,p_stValue);
|
||
}
|
||
|
||
// ********************
|
||
// * return to engine *
|
||
// ********************
|
||
M_Full_GetSetParam_ActionReturn(p_stValue,C_ACTION_ENGINE_CONTINUE);
|
||
return(p_stTree);
|
||
}
|
||
*/
|
||
|
||
|
||
|
||
/*********************************************************************************************************************/
|
||
/* THE ULTRA OPERATOR */
|
||
/*********************************************************************************************************************/
|
||
HIE_tdxHandleToSuperObject g_hCurrentSuperObjPerso=NULL;
|
||
|
||
void fn_vSetUltraOperatorPerso(HIE_tdxHandleToSuperObject hCurrentSuperObjPerso,HIE_tdxHandleToSuperObject hNewCurrentSuperObjPerso)
|
||
{
|
||
if (hCurrentSuperObjPerso==hNewCurrentSuperObjPerso)
|
||
{
|
||
g_hCurrentSuperObjPerso=NULL;
|
||
}
|
||
else
|
||
{
|
||
g_hCurrentSuperObjPerso=hNewCurrentSuperObjPerso;
|
||
}
|
||
}
|
||
|
||
/* When you use this function, you must store returned hNewSuperObjPerso in a local variable : that's why this function doesn't return any value with the return instruction */
|
||
void fn_vGetUltraOperatorPerso(unsigned char bYouHaveRightToUseThisFunction,HIE_tdxHandleToSuperObject hCurrentSuperObjPerso,HIE_tdxHandleToSuperObject *hNewSuperObjPerso)
|
||
{
|
||
if ( g_hCurrentSuperObjPerso /*&& (g_hCurrentSuperObjPerso != hCurrentSuperObjPerso)*/ )
|
||
{
|
||
if (bYouHaveRightToUseThisFunction)
|
||
{
|
||
*hNewSuperObjPerso=g_hCurrentSuperObjPerso;
|
||
g_hCurrentSuperObjPerso=NULL;
|
||
}
|
||
#if defined(__DEBUG_AI__)
|
||
else
|
||
{
|
||
M_AIFatalError(E_uwAIFatalInvalidUseOfUltraOperator);
|
||
}
|
||
#endif
|
||
}
|
||
else
|
||
*hNewSuperObjPerso = hCurrentSuperObjPerso;
|
||
}
|
||
|
||
tdstNodeInterpret *fn_p_stUltraOperator(HIE_tdxHandleToSuperObject hCurrentSuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
HIE_tdxHandleToSuperObject hNewCurrentSuperObjPerso;
|
||
|
||
/* Get new current perso*/
|
||
p_stTree=fn_p_stOperatorGetPerso(hCurrentSuperObjPerso,p_stTree,&hNewCurrentSuperObjPerso);
|
||
|
||
#if defined(__DEBUG_AI__)
|
||
{
|
||
tdeTypeInterpret eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
M_AI_DEBUG_ASSERT(
|
||
(eTypeInterpret==E_ti_Condition) ||
|
||
(eTypeInterpret==E_ti_Function) ||
|
||
(eTypeInterpret==E_ti_Procedure)
|
||
, E_uwAIFatalInvalidUseOfUltraOperator);
|
||
}
|
||
#endif /*__DEBUG_AI__*/
|
||
|
||
/* Store it*/
|
||
fn_vSetUltraOperatorPerso(hCurrentSuperObjPerso,hNewCurrentSuperObjPerso);
|
||
M_EvalOneParameter(hCurrentSuperObjPerso,p_stTree,p_stTree,p_stValue);
|
||
return(p_stTree);
|
||
}
|
||
|
||
|
||
/*********************************************************************************************************************/
|
||
/* THE MODEL CAST OPERATOR */
|
||
/*********************************************************************************************************************/
|
||
tdstNodeInterpret *fn_p_stModelCastOperator(HIE_tdxHandleToSuperObject p_SuperObjPerso, tdstNodeInterpret *p_stTree, tdstGetSetParam *p_stValue)
|
||
{
|
||
HIE_tdxHandleToSuperObject hSuperObjPersoToCast;
|
||
AI_tdstAIModel *p_stCastedModel;
|
||
|
||
M_EvalNextParameter(p_stValue);
|
||
p_stCastedModel=M_GetSetParam_p_stModel(p_stValue);
|
||
|
||
#if defined(__DEBUG_AI__)
|
||
{
|
||
tdeTypeInterpret eTypeInterpret = M_GetTypeInterpret(p_stTree);
|
||
M_VerifyTypeOfParamAction(p_stValue, E_vt_Model);
|
||
M_AI_DEBUG_ASSERT( eTypeInterpret==E_ti_DsgVarRef , E_uwAIFatalInvalidModelCast);
|
||
}
|
||
#endif
|
||
|
||
/* Get perso*/
|
||
p_stTree=fn_p_stOperatorGetPerso(p_SuperObjPerso,p_stTree,&hSuperObjPersoToCast);
|
||
#if defined(__DEBUG_AI__)
|
||
/* check if good model*/
|
||
{
|
||
AI_tdstAIModel *p_stModel=AI_M_p_stGetAIModel(AI_M_stGetMindOfSuperObj(hSuperObjPersoToCast));
|
||
M_AI_DEBUG_ASSERT( (p_stCastedModel!=NULL) && (p_stModel==p_stCastedModel), E_uwAIFatalInvalidModelCast);
|
||
}
|
||
#endif
|
||
M_Full_GetSetParam_Perso(p_stValue,hSuperObjPersoToCast);
|
||
return(p_stTree);
|
||
}
|
||
|
||
/************************************************************************************/
|
||
/* HERE IS THE END */
|
||
/************************************************************************************/
|
||
|
||
/****************************************************************************************/
|
||
/* to call once before anything else related to Operator */
|
||
/****************************************************************************************/
|
||
#if !defined(OPTIMIZED_COMMAND)
|
||
#include "Convert.h"
|
||
#include "ProtOper.h"
|
||
|
||
void fn_vInitOperatorEntries(void)
|
||
{
|
||
/* Init*/
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vInitOperatorTable(fn_p_stDefaultOperator);
|
||
#endif
|
||
|
||
/* Operator definition*/
|
||
#define M_DEFINE_OPERATOR(a,b,c,d,e,f) fn_vDefineOperatorEntry(M_OPERATOR_ENTRY(a,b,c,d,e,f));
|
||
#include "DefOper.h"
|
||
#undef M_DEFINE_OPERATOR
|
||
|
||
/* Check*/
|
||
#if defined(__DEBUG_AI__)
|
||
fn_vCheckOperatorTable(fn_p_stDefaultOperator);
|
||
#endif /* __DEBUG_AI__*/
|
||
}
|
||
#endif /* OPTIMIZED_COMMAND*/
|
||
|