/* (c) Ubi Studios 1996*/ /* See Vincent Greco for any comment or question*/ #include "ACP_base.h" #include "GEO.h" #include "GLI.h" #include "LST.h" #include "SPO/HieMtStk.h" #include "SPO/HieConst.h" /*constants*/ #define __HIE_GLOBALS #include "SPO/HieSpObj.h" /*structures and access macros*/ #include "SPO/HieHand.h" /*handle definitions*/ #include "SPO/HieExt.h" #include "SPO/HieDef.h" /*macros for the macros ...*/ extern HIE_tdxHandleToSuperObject gd_hFixSPO[HIE_C_MaxNumberOfSPOInTheFix] ; extern HIE_tdxHandleToSuperObject gd_hFixSPOSave[HIE_C_MaxNumberOfSPOInTheFix] ; extern ACP_tdxIndex g_xFixIndex; extern ACP_tdxIndex g_xFixIndexSave; unsigned char gd_ucContextOfSPOSave[HIE_C_MaxNumberOfSPOInTheFix] ; unsigned char g_ucContext = 0 ; /*function accessors definition*/ ACP_tdxBool HIE_fn_bIsSuperObjectValid(HIE_tdxHandleToSuperObject hSuperObject) { return (hSuperObject)!=HIE_C_InvalidSuperObject; } void HIE_fn_vSetSuperObjectObjectAndType(HIE_tdxHandleToSuperObject _hSprObj, HIE_tdxHandleToVoid _hObj, unsigned long _ulType) { if(_hObj==NULL) _ulType=HIE_C_ulSuperObject;/* if the linked object does not exist do not try to process it*/ HIE_M_vSetSuperObjectMember(_hSprObj, ulTypeOfLinkedObject, _ulType); HIE_M_vSetSuperObjectMember(_hSprObj, hLinkedObject.p_Void, _hObj); } /***************************************************************************************************** * superimposed *****************************************************************************************************/ void SPO_ReinitSuperimposedArray(void) { ACP_tdxIndex xIndex ; for ( xIndex = 0 ; xIndex < g_xFixIndex ; xIndex ++ ) { gd_hFixSPO[xIndex]->ulFlags &= ~(HIE_C_Flag_ulSuperimposed | HIE_C_Flag_ulNotPickable ); } g_xFixIndex = 0 ; g_ucContext = 0 ; g_xFixIndexSave = 0 ; } HIE_tdxHandleToSuperObject HIE_fn_hGetElementFormFixViewport ( ACP_tdxIndex xIndex ) { if ( xIndex < g_xFixIndex ) { return ( gd_hFixSPO[xIndex] ) ; } else return NULL ; } void HIE_fn_SO_vSetSuperimposedFlag (HIE_tdxHandleToSuperObject _hSO) { if ( (_hSO->ulFlags & HIE_C_Flag_ulSuperimposed ) == HIE_C_Flag_ulSuperimposed ) return ; /* * set the flag for this SPO */ _hSO->ulFlags |= (HIE_C_Flag_ulSuperimposed | HIE_C_Flag_ulNotPickable ); /* * register the SPO */ if ( g_xFixIndex < HIE_C_MaxNumberOfSPOInTheFix ) { gd_hFixSPO[g_xFixIndex] = _hSO ; g_xFixIndex ++ ; } } void HIE_fn_SO_vClearSuperimposedFlag(HIE_tdxHandleToSuperObject _hSO) { ACP_tdxIndex xIndex; if ( (_hSO->ulFlags & HIE_C_Flag_ulSuperimposed ) != HIE_C_Flag_ulSuperimposed ) return ; /* * clear the flag for this SPO */ _hSO->ulFlags &= ~(HIE_C_Flag_ulSuperimposed | HIE_C_Flag_ulNotPickable ); if (g_xFixIndex == 0) return; /* * unregister the SPO */ for ( xIndex = 0; xIndex < HIE_C_MaxNumberOfSPOInTheFix; xIndex ++ ) { if ( gd_hFixSPO[xIndex] == _hSO ) /* scan until we find it*/ { /* fill the gap by moving the last SO in the array into the hole we just create*/ g_xFixIndex --; if (g_xFixIndex != 0) gd_hFixSPO[xIndex] = gd_hFixSPO[g_xFixIndex]; gd_hFixSPO[g_xFixIndex] = NULL; break; } } } /*AR9902 Bug corrected : must test gd_ucContextOfSPOSave[g_xFixIndexSave-1] instead of gd_ucContextOfSPOSave[g_xFixIndexSave]*/ void HIE_fn_SO_SwitchSuperImposedTab (long lParam) { int i ; if ( lParam ) { /* lparam = 1 -> show menu */ if ( g_xFixIndex ) { for ( i=0 ; i show normal fix viewport */ unsigned char fn_ucStdGameCheckValidity(HIE_tdxHandleToSuperObject _h_SprObj) ; g_ucContext -- ; if ( g_xFixIndexSave ) { g_xFixIndex = 0 ; for ( ; (g_xFixIndexSave>0) && (gd_ucContextOfSPOSave[g_xFixIndexSave-1] == g_ucContext) ; g_xFixIndexSave-- ) { if ( fn_ucStdGameCheckValidity(gd_hFixSPOSave[g_xFixIndexSave-1])) { gd_hFixSPO[g_xFixIndex++] = gd_hFixSPOSave[g_xFixIndexSave-1] ; } } } } } /******************************************************************************************************/ void HIE_fn_vSetSuperObjectExcluLight(HIE_tdxHandleToSuperObject _hSprObj,unsigned char _bExcluLight) { if( _bExcluLight ) _hSprObj->ulFlags |= HIE_C_Flag_ExcluLight; else _hSprObj->ulFlags &= ~HIE_C_Flag_ExcluLight; } /*---------------------------------------------------------------*/ /*for Francois DO NOT USE THESEe FUNCTIONS*/ void HIE_fn_vIsolate(HIE_tdxHandleToSuperObject _hSprObj) { HIE_M_vIsolate(_hSprObj); } /*---------------------------------------------------------------*/ void HIE_fn_vPseudoIsolate(HIE_tdxHandleToSuperObject _hSprObj) { HIE_tdxHandleToSuperObject hNext; hNext = LST2_M_DynamicGetNextElement(_hSprObj); HIE_M_vIsolate(_hSprObj); LST2_M_DynamicSetNextElement(_hSprObj,hNext); } #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ void HIE_fn_vInitParent(HIE_tdxHandleToSuperObject _hSprObj) { LST2_M_DynamicInitAnchor(_hSprObj); } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ /*--------------------------------------------------------------------------------------*/ /* Name : HIE_fn_vGetParallelBoxFromBoundingVolume*/ /* Author : Thierry QUERE*/ /* Date : 16/02/98*/ /* Description :*/ /* Optimized ? : No*/ /*--------------------------------------------------------------------------------------*/ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ void HIE_fn_vGetParallelBoxFromBoundingVolume(MTH3D_tdstVector * _p_stMaxBoxPoint, MTH3D_tdstVector * _p_stMinBoxPoint, ACP_tdxHandleOfObject _hBoundingVolume) { _p_stMaxBoxPoint = GEO_fn_pGetMaxPointOfParallelBox ((GEO_tdstParallelBox*) _hBoundingVolume); _p_stMinBoxPoint = GEO_fn_pGetMinPointOfParallelBox ((GEO_tdstParallelBox*) _hBoundingVolume); } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ HIE_tdxHandleToSuperObject HIE_fn_hCreateSuperObject(void) { HIE_tdxHandleToSuperObject hNewSuperObject; MMG_fn_vAddMemoryInfo( MMG_C_lTypeSuperObject , MMG_C_lSubTypeSuperObject , 0 ); GEO_M_CPAMalloc( hNewSuperObject, HIE_tdxHandleToSuperObject, sizeof(struct HIE_tdstSuperObject_), E_uwGEONotEnoughtMemory); LST2_M_DynamicInitAnchor(hNewSuperObject); LST2_M_DynamicInitElement(hNewSuperObject); HIE_fn_vSetSuperObjectObjectAndType(hNewSuperObject,NULL,HIE_C_ulSuperObject); HIE_fn_vSetSuperObjectBoundingVolume(hNewSuperObject, NULL); HIE_fn_vSetSuperObjectDrawMask(hNewSuperObject, GLI_C_lAllIsEnable/*&(~GLI_C_lIsNotDrawCollideInformation)*/); HIE_M_vSetSuperObjectMember(hNewSuperObject,hGlobalMatrix,GEO_fn_hCreateMatrix()); POS_fn_vSetIdentityMatrix(HIE_M_xGetSuperObjectMember(hNewSuperObject,hGlobalMatrix)); HIE_fn_vInvalidateOneGlobalMatrix(hNewSuperObject); HIE_M_vSetSuperObjectMember( hNewSuperObject,fTransparenceLevel,255.0f ); HIE_fn_vSetSuperObjectExcluLight ( hNewSuperObject,0); return hNewSuperObject; } #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ void HIE_fn_vCopySuperObject(HIE_tdxHandleToSuperObject _hDst,HIE_tdxHandleToSuperObject _hSrc) { HIE_fn_vSetSuperObjectObjectAndType (_hDst, HIE_fn_hGetSuperObjectObject(_hSrc), HIE_fn_ulGetSuperObjectType(_hSrc)); HIE_fn_vSetSuperObjectDrawMask(_hDst, HIE_fn_lGetSuperObjectDrawMask(_hSrc)); HIE_fn_vSetSuperObjectMatrix(_hDst, HIE_fn_hGetSuperObjectMatrix(_hSrc)); GEO_M_vCopyMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(_hDst),HIE_fn_hGetSuperObjectGlobalMatrix(_hSrc)); } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ #ifndef _FIRE_DEADCODE_U64_ HIE_tdxHandleToSuperObject HIE_fn_hDuplicateSuperObject(HIE_tdxHandleToSuperObject _hSuperObject) { HIE_tdxHandleToSuperObject hNewSuperObject; hNewSuperObject=HIE_fn_hCreateSuperObject(); HIE_fn_vCopySuperObject(hNewSuperObject,_hSuperObject); return hNewSuperObject; } #endif /* _FIRE_DEADCODE_U64_ */ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ void HIE_fn_vDestroySuperObject(HIE_tdxHandleToSuperObject hOldSuperObject) { GEO_fn_vDestroyMatrix(HIE_M_xGetSuperObjectMember(hOldSuperObject,hGlobalMatrix)); GEO_M_CPAFree(hOldSuperObject); } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ /*!!! no DestroySuperObjectTab !*/ HIE_tdxHandleToSuperObjectTab HIE_fn_p_stCreateSuperObjectTab(long lSize) { struct HIE_tdstSuperObject_* hNewSuperObjectTab; struct HIE_tdstSuperObject_* hNewSuperObject; long lIndex; MMG_fn_vAddMemoryInfo( MMG_C_lTypeSuperObject , MMG_C_lSubTypeSuperObjectTable , 0 ); GEO_M_CPAMalloc(hNewSuperObjectTab, HIE_tdxHandleToSuperObject, sizeof(struct HIE_tdstSuperObject_)*lSize, E_uwGEONotEnoughtMemory); for(hNewSuperObject=hNewSuperObjectTab,lIndex=0;lIndexulFlags |= HIE_C_Flag_MagnetModification; else _hSprObj->ulFlags &= ~HIE_C_Flag_MagnetModification; } ACP_tdxBool HIE_fn_bGetMagnetModification(HIE_tdxHandleToSuperObject _hSprObj) { return ((_hSprObj->ulFlags & HIE_C_Flag_MagnetModification) ? TRUE : FALSE); } /* END ANNECY MT }*/ #endif /* _FIRE_DEADCODE_U64_ */ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ MTH3D_tdstVector *HIE_fn_xGetSemiLookAtVector (HIE_tdxHandleToSuperObject _hSprObj) { return ((MTH3D_tdstVector *)&(HIE_M_xGetSuperObjectMember(_hSprObj, stSemiLookAtVector))) ; } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */