/*========================================================================= * GameEng.cpp : Engine of Game * It is in this file that the SuperObject Tree is explored. * This is a part of the Game project. * * Version 1.0 * Creation date 22/08/96 * Revision date * * That file needs to be compatible for all platforms. * * (c) Ubi Studios 1996 *====d==============================================u======dd======d=========*/ /* *======================================================================= Modifications: New LST_M_??? Macros / Michaël / 070297 *=======================================================================*/ #define D_CineInfo_StructureDefine #include "ToolsCPA.h" /* Oliv' - Portage v14 - ah ah ah... - vous n'avez jamais pensé au #ifdef PC ??*/ #ifndef U64 #include "X:\cpa\tempgrp\GLIGLOU\MULTIDRV\inc\PvObj_st.h" #include "X:\CPA\tempgrp\GLIGLOU\MULTIDRV\inc\linear.h" #endif /* EndOfOliv'*/ #include "input.h" #include "gli.h" #include "tex.h" /* SOUND*/ #include "SND.h" /* SOUND fin*/ #include "Options/LightOpt.h" #include "Macros.h" #include "Structur/Input_s.h" #include "Ai\AiBase\WPEngDsp.h" #include "safe.h" /*BART*/ #include "SCT.h" #include "GAM.h" #include "Main.h" #include "DspFix.h" #include "ToolCam.h" #include "ToolMatr.h" #include "ZdxStuff.h" #include "PhysiCol.h" #include "MainChar.h" #include "Effect.h" #include "AlwAct.h" /*#include "GamExtra.h"*/ /*XB980824*/ #ifndef D_THROW_MGT #include "Mgt.h" #endif /* D_THROW_MGT */ /*End XB*/ #include "DspFix.h" #if defined(U64) #include "rcptask.h" #endif /* U64 */ #include "PRF.h" #if defined(USE_PROFILER) && !defined(PRESS_DEMO) extern void GAM_fn_vPrepareShowRasters (unsigned long); extern void GAM_fn_vShowRasters(); extern void GAM_fn_vSlowDownEngine (unsigned long); extern void GLI_fn_vShowFrameRate( GLD_tdstViewportAttributes *_p_stViewport ); #else #define GLI_fn_vShowFrameRate(V) #endif /* USE_PROFILER && PRESS_DEMO */ #if defined(_DEBUG) /* ANNECY AV DEMO {*/ #ifndef U64 #include "Specif/Demos.h" #endif /* END ANNECY AV }*/ /*--- For displaying Waypoints and Sector infos ---*/ extern unsigned char g_ucWhatDoIDisplay; extern unsigned char g_ucZDCVisible; extern char * g_szZoneTypes[5]; extern char * g_szDisplayTypes[2]; extern unsigned char g_ucDisplayWaypoints; extern unsigned char g_ucSCTDisplaySectors; extern void SECT_vDisplaySectorInfos(void); extern unsigned char g_ucDisplayBoundingVolumes; /* ANNECY CG KEY 4 ACTIVATED GENDOORS 18/06/98 {*/ extern unsigned char g_ucDisplayActivatedGendoors; #if !defined(U64) && defined(_DEBUG) extern unsigned char g_ucDisplayRayTraceSegments; extern MTH3D_tdstVector g_stRayTraceSegmentOrigin[30]; extern MTH3D_tdstVector g_stRayTraceSegmentEnd[30]; extern short g_wRayTraceSegmentLife[30]; unsigned char g_ucSlowDownEngine; unsigned char g_ucSlowDownTime; #endif /* !U64 && _DEBUG */ /* } ENDANNECY CG*/ #endif /*_DEBUG*/ /* Oliv' - 19/05/1999 - I want to see Zdx too */ #if defined(_U64_GLI_BENCH_) extern unsigned char g_ucZDCVisible; extern char * g_szZoneTypes[5]; extern ACP_tdxBool GLIBENCH_g_bWireFrame; #endif /* _U64_GLI_BENCH_ */ /* EndOfOliv' */ #if defined(WIN32) && !defined(RETAIL) && !defined(PRESS_DEMO) int GAM_g_iStepMode = -1 ; #define M_IfCanDoFullStep() if ( GAM_g_iStepMode != 0 ) #define M_FullStepDone() ( ( void ) ( ( GAM_g_iStepMode > 0 ) ? ( -- GAM_g_iStepMode ) : GAM_g_iStepMode ) ) #define M_bIfIsNotStepping() if ( GAM_g_iStepMode == -1 ) #define M_bIfIsStepping() if ( GAM_g_iStepMode != -1 ) #else #define M_IfCanDoFullStep() if ( 1 ) #define M_FullStepDone() #define M_bIfIsNotStepping() if ( 1 ) #define M_bIfIsStepping() if ( 0 ) #endif /* WIN32 && !RETAIL */ #ifndef RETAIL /*--- for displaying choice of level*/ extern char g_cChooseLevel; #endif /* !RETAIL */ extern void GLI_fnv_DrawRectangle( struct GLD_tdstViewportAttributes_ *p_stVpt, MTH3D_tdstVector *p_stFirstPoint, MTH3D_tdstVector *p_stLastPoint, long lColor ); /* XB 05/05/99 */ #ifdef U64 extern void MOR_fn_vUnLockAllMorphTasks(void); extern void fn_vDisplaySky( GLD_tdstViewportAttributes *_p_stViewport); extern void GLI_vPrintGuruError( int Y, char *p_szErrorString ); #include "INO\Specif\u_cont.h" #endif /* U64 */ #ifdef WIN32 extern ACP_tdxBool fn_bDisplaySky( HIE_tdxHandleToSuperObject hSOSector, HIE_tdxHandleToSuperObject hSOCamera, GLD_tdstViewportAttributes *_p_stViewport ); #endif /* End XB 05/05/99 */ /****************************/ /* functions declarations*/ /* See Olivier for details and comments*/ /****************************/ #if !defined(PRESS_DEMO) ACP_tdxBool fn_bEdNOCLIP(HIE_tdxHandleToSuperObject hCharacter); #endif /* PRESS_DEMO */ void fn_vTreatCharactersInSector(HIE_tdxHandleToSuperObject hCharacter); extern void GEO_fn_vMorphAddInMainLoop(); void fn_vUpdateDynamicHierarchy(); /****************************/ /* ANNECY MT - 14/09/98 { to display info on Wnd screen*/ #if defined(USE_PROFILER) && !defined(PRESS_DEMO) extern void DisplayPolices (char * _szText , long _lX , long _lY); #define GLI_vDisplayPolices(Text,X,Y) DisplayPolices((char*)(Text),X,Y) #if !defined(U64) extern void GAM_fn_vRasterDump(); extern void GAM_fn_vRasterDumpUpdate(unsigned long,unsigned long,unsigned long,unsigned long,unsigned long); extern void GAM_fn_vRasterDumpBeginLoop(); extern void GAM_fn_vRasterDumpEndLoop(); #endif #endif /* END ANNECY MT }*/ /****************************/ #ifdef ACTIVE_EDITOR extern void PLA_fn_vUpdateFrameCounterForModules(HIE_tdxHandleToSuperObject p_stSuperObject); #endif /* Oliv' - Enable loading once of all Maps - 08/06/1999 */ // #define TEST_LOAD_ALL_MAPS /* EndOfOliv' */ /****************************/ /* Init the dynam structure for a character*/ /* See Olivier for details and comments*/ /****************************/ void fn_vInitBehaviourOfACharacter( HIE_tdxHandleToSuperObject _hCharacter) { tdstEngineObject * p_stObject = HIE_fn_hGetSuperObjectObject(_hCharacter); /* DYNAM -> CINEINFO MT 26/08/98 { if( p_stObject->h_Dynam ) { fn_vUpdateDynamicsMS(p_stObject); } DYNAM -> CINEINFO } */ if( p_stObject->h_Brain ) { fn_vReinitAI(M_pstGetMindOfBrain(p_stObject->h_Brain)); } if( p_stObject->h_3dData ) { PLA_fn_vInitNewState(_hCharacter,fn_h3dDataGetInitialState(M_GetMSHandle(_hCharacter,3dData))); } } /****************************/ /* Special function to teleport a character on the map*/ /* See Olivier for details and comments*/ /****************************/ #if !defined(PRESS_DEMO) #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */ ACP_tdxBool fn_bMoveCharacterAtPosition( HIE_tdxHandleToSuperObject _hCharacter, MTH_tdxReal _xX,MTH_tdxReal _xY,MTH_tdxReal _xZ) { MTH3D_tdstVector stV; ACP_tdxBool bTmp; HIE_tdxHandleToSuperObject hMainCamera = CAM_fn_hGetActiveCamera(CAM_e_MainViewport); if( _hCharacter == MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()) ) { fn_vReputCharacterSuperObjectAtTheWorld(_hCharacter); fn_vReputCharacterSuperObjectAtTheWorld(hMainCamera); MTH3D_M_vSetVectorElements(&stV,_xX,_xY,_xZ); POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix(_hCharacter),&stV); POS_fn_vMulMatrixMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(_hCharacter),HIE_fn_hGetSuperObjectGlobalMatrix(HIE_fn_hGetSuperObjectFather(_hCharacter)),HIE_fn_hGetSuperObjectMatrix(_hCharacter)); POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix(hMainCamera),&stV); POS_fn_vMulMatrixMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(hMainCamera),HIE_fn_hGetSuperObjectGlobalMatrix(HIE_fn_hGetSuperObjectFather(hMainCamera)),HIE_fn_hGetSuperObjectMatrix(hMainCamera)); bTmp = fn_bEdNOCLIP(_hCharacter); fn_bEdNOCLIP(hMainCamera); } else { fn_vReputCharacterSuperObjectAtTheWorld(_hCharacter); MTH3D_M_vSetVectorElements(&stV,_xX,_xY,_xZ); POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix(_hCharacter),&stV); POS_fn_vMulMatrixMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(_hCharacter),HIE_fn_hGetSuperObjectGlobalMatrix(HIE_fn_hGetSuperObjectFather(_hCharacter)),HIE_fn_hGetSuperObjectMatrix(_hCharacter)); bTmp = fn_bEdNOCLIP(_hCharacter); } return bTmp; } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */ #endif /* PRESS_DEMO */ /****************************/ /* Special function For updating the sector of camera*/ /* See Olivier for details and comments*/ /****************************/ void fn_vUpdateSectorInfoAfterNOCLIP(HIE_tdxHandleToSuperObject hCamera) { MS_tdxHandleToCineinfo hCineinfo = M_GetMSHandle(hCamera,Cineinfo); HIE_tdxHandleToSuperObject hTarget; hTarget = CAM_fn_hCineInfoGetSuperObjectTargeted(hCineinfo->hInit); fn_vSectInfoSetCurrentSector(M_GetMSHandle(hCamera,SectInfo),fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hTarget,SectInfo))); fn_vInsertObjectInSectorList(fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hCamera,SectInfo)),hCamera); fn_vInsertObjectInSectorList(fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hTarget,SectInfo)),hTarget); } /****************************/ /* Special function to move quickly Ed on map*/ /* See Olivier for details and comments*/ /****************************/ #if !defined(PRESS_DEMO) ACP_tdxBool fn_bEdNOCLIP(HIE_tdxHandleToSuperObject hCharacter) { #if !defined(FINAL_VERSION) || defined(FINAL_VERSION_FOR_TESTERS) MTH3D_tdstVector stV,stAdd,stCumul; GLI_tdxValue xAngle,/*xX,xY,xZ,*/xAngle2; /* ANNECY AV {*/ static MTH_tdxReal xSpeed = MTH_C_ONE; /* END ANNECY AV }*/ MTH_tdxReal xCurrentSpeed; MTH_tdxReal xAlpha = MTH_M_xFloatToReal(0.15f); ACP_tdxBool bTmp; bTmp = TRUE; xAngle=fn_xComputeAngleOfPerso(hCharacter); xAngle2=0.0; MTH3D_M_vSetVectorElements(&stCumul,0.0,0.0,0.0); xCurrentSpeed = xSpeed; if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeDoubleSpeed)==IPT_C_TRUE) { xAlpha *= 2.0; xCurrentSpeed = 2.0f*xSpeed; } M_bIfIsStepping() { xCurrentSpeed = MTH_M_xMul(xCurrentSpeed, MTH_M_xFloatToReal(0.1f)) ; xAlpha = MTH_M_xMul(xAlpha, MTH_M_xFloatToReal(0.1f)) ; } if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeForward)==IPT_C_TRUE) { /* Straight away*/ MTH3D_M_vSetVectorElements(&stAdd,0.0,-xCurrentSpeed,0.0); MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul); } if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeBackward)==IPT_C_TRUE) { /* Rear*/ MTH3D_M_vSetVectorElements(&stAdd,0.0,xCurrentSpeed,0.0); MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul); } if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeStrafeLeft)==IPT_C_TRUE) { /* Strafe left*/ MTH3D_M_vSetVectorElements(&stAdd,xCurrentSpeed,0.0,0.0); MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul); } if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeStrafeRight)==IPT_C_TRUE) { /* Strafe right*/ MTH3D_M_vSetVectorElements(&stAdd,-xCurrentSpeed,0.0,0.0); MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul); } if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeLeft)==IPT_C_TRUE) { /* Left*/ xAngle2+=(MTH_tdxReal)xAlpha; } if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeRight)==IPT_C_TRUE) { /* Right*/ xAngle2-=(MTH_tdxReal)xAlpha; } if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeDown)==IPT_C_TRUE) { /* Down*/ MTH3D_M_vSetVectorElements(&stAdd,0.0,0.0,-xCurrentSpeed); MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul); } if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeUp)==IPT_C_TRUE) { /* Up*/ MTH3D_M_vSetVectorElements(&stAdd,0.0,0.0,xCurrentSpeed); MTH3D_M_vAddVector(&stCumul,&stAdd,&stCumul); } /* ANNECY AV {*/ /* if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeSpeedIncrease)==IPT_C_TRUE) { if( xSpeed <= 6.0 ) xSpeed += 0.1f; } if (IPT_fn_bIsValidated(g_st_3DOS_EntryActions.hFlyingModeSpeedDecrease)==IPT_C_TRUE) { if( xSpeed > 0.1 ) xSpeed -= 0.1f; } */ /* END ANNECY AV }*/ fn_vSetRotationMatrixZ(HIE_fn_hGetSuperObjectMatrix(hCharacter),(xAngle+xAngle2-MTH_C_PiBy2)); POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectMatrix(hCharacter),&stV); POS_fn_vMulMatrixVector(&stCumul,HIE_fn_hGetSuperObjectMatrix(hCharacter),&stCumul); MTH3D_M_vAddVector(&stV,&stV,&stCumul); POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix(hCharacter),&stV); POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hCharacter),&stV); /* MEC_vInitTranslation(fn_p_stDynamGetDynamics(M_GetMSHandle(hCharacter,Dynam)),hCharacter,&stV);*/ DNM_M_vDynamicsSetInit ( fn_p_stDynamGetDynamics(M_GetMSHandle(hCharacter,Dynam)), TRUE ); return bTmp; #else /* !defined(FINAL_VERSION) || defined(FINAL_VERSION_FOR_TESTERS) */ return FALSE; #endif /* !defined(FINAL_VERSION) || defined(FINAL_VERSION_FOR_TESTERS) */ } #endif /* PRESS_DEMO */ /****************************/ /* Deal with a character.*/ /* See Olivier for details and comments*/ /* 20/04/98 Carlos Torres call PLA_fn_vOverWriteMatrixWithUCC*/ /* when frmae is skip to update UCC matrix*/ /****************************/ void fn_vTreatCharactersInSector(HIE_tdxHandleToSuperObject hCharacter) { /*tdstEngineObject *p_stEngObj;*/ MTH3D_tdstVector stOldV; MS_tdxHandleToDynam h_Dynam; struct DNM_stDynamics *p_stDynamic; ACP_tdxBool bSectorChange=TRUE; #if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64)) long lDuration; #endif /* equivalent a M_TreatObject */ fn_vStandardGameSetLastTrame(M_GetMSHandle(hCharacter,StandardGame), g_stEngineStructure.stEngineTimer.ulTrameNumber); POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hCharacter),&stOldV); /* fly mode is handled somewhere else, so don't handle main character when in fly mode here */ if ( ( hCharacter != MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()) ) || !g_ucIsEdInGhostMode ) { /*p_stEngObj=(tdstEngineObject *)HIE_fn_hGetSuperObjectObject(hCharacter); M_TreatObject(p_stEngObj);*/ /* ANNECY AV DEMO {*/ #ifndef U64 if(g_DEMO_KeybTest != DEMO_PLAY) { #endif /* END ANNECY AV }*/ MS_tdxHandleTo3dData h_Current3dData; h_Current3dData = M_GetMSHandle(hCharacter,3dData); /* Play anims*/ if (h_Current3dData) { ACP_tdxBool bSkip,bNoDisplay; unsigned long ulCurrentBits; struct tdstState_ *p_stCurrentState; struct tdstAnim3d_ *p_stCurrentAnim; ulCurrentBits = fn_ulStandardGameGetCustomBits(M_GetMSHandle(hCharacter,StandardGame)); p_stCurrentState = fn_h3dDataGetCurrentState(h_Current3dData); p_stCurrentAnim = p_stCurrentState ? fn_p_stGetAnimInState(p_stCurrentState): NULL; /* GAM_C_CustBitNoAnimPlayer => no player*/ /* GAM_C_CustBitUnseenFrozen => nothing if actor not displayed*/ /* GAM_C_CustBitUnseenFrozenAnimPlayer => no player if actor not displayed*/ /* GAM_C_CustBitNoAnimPlayerWhenTooFar => no player if actor too far from Rayman*/ bNoDisplay = (ACP_tdxBool) ( (p_stCurrentAnim == NULL) || ((ulCurrentBits & GAM_C_CustBitNoAnimPlayer) && (HIE_M_lGetNumberOfChildren(hCharacter) > 0)) || ((ulCurrentBits & GAM_C_CustBitOutOfVisibility) && (ulCurrentBits & (GAM_C_CustBitUnseenFrozen|GAM_C_CustBitUnseenFrozenAnimPlayer))) || ((ulCurrentBits & GAM_C_CustBitNoAnimPlayerWhenTooFar) && fn_bStandardGameIsTooFar(M_GetMSHandle(hCharacter,StandardGame))) ); if (!bNoDisplay || ulCurrentBits & GAM_C_CustBitSoundWhenInvisible) { PRF_fn_vStartChrono( PRF_C_ulFctAnimPlayer, hCharacter ); #if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64)) #pragma warning (disable : 4146) lDuration = -TMR_fn_ulFastGetInternalCounter(); #pragma warning (default : 4146) #endif bSkip = PLA_fn_bSkipCurrentFrame(hCharacter); /* ANNECY MT - 07/12/98 {*/ /* if AI changes something which need to do frame, no skip*/ bSkip &= !fn_b3dDataHasAnimMatrixChanged(h_Current3dData); /* END ANNECY MT }*/ /* if current state is finished and next state is NULL, then stop playing the anim, skip it*/ bSkip |= fn_uc3dDataGetFlagEndState(h_Current3dData); if (bSkip) { PRF_fn_lIncIndependantVariable(PRF_C_ulIdpNbSkippedAnims,1); #ifdef ACTIVE_EDITOR /* update modules SO frame number*/ PLA_fn_vUpdateFrameCounterForModules(hCharacter); #endif } /* if anim is not skipped, play it */ if ( ! bSkip ) PLA_fn_bDoAnimPlayerForCharacter ( hCharacter , bNoDisplay , ( ACP_tdxBool ) FALSE ) ; #if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64)) lDuration += TMR_fn_ulFastGetInternalCounter(); if(M_GetMSHandle(hCharacter,StandardGame)) { GAM_fn_vRasterDumpUpdate((unsigned long)fn_otStandardGameGetModelType(M_GetMSHandle(hCharacter,StandardGame)),0,lDuration,0,0); } #endif PRF_fn_vStopChrono( PRF_C_ulFctAnimPlayer, hCharacter ); } else { #ifdef ACTIVE_EDITOR /* update modules SO frame number*/ PLA_fn_vUpdateFrameCounterForModules(hCharacter); #endif bSkip = TRUE; } /* ANNECY MT - 23/10/98 {*/ #if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64)) GAM_fn_vRasterDumpUpdate((unsigned long)fn_otStandardGameGetModelType(M_GetMSHandle(hCharacter,StandardGame)),0,0,0,1); #endif /* END ANNECY MT }*/ /* Do treatment*/ fn_vMakeCharacterReact(hCharacter); /* JO 01/07/97*/ if( !M_GetMSHandle(hCharacter,StandardGame) ) return; /* JO fin*/ } /* ANNECY AV DEMO {*/ #ifndef U64 } else { DEMO_fn_vGetACompleteCharacterPosition(hCharacter); } #ifndef RETAIL if (g_DEMO_KeybTest == DEMO_RECORD && ! CAM_fn_bSuperObjectIsACamera (hCharacter)) DEMO_SaveInfo (hCharacter); #endif /* RETAIL */ #endif /* END ANNECY AV }*/ PRF_fn_vStartChrono( PRF_C_ulFctIADNMPLAMisc, NULL ); /* water streak effect */ fn_vWaterStreakEffect(&g_stEngineStructure.stViewportAttr,hCharacter, g_stEngineStructure.ulDisplayMode); #ifndef D_THROW_PRT /* New particles generation */ fn_vMSPrtSrcSourceGenerateParticles(hCharacter); #endif /* D_THROW_PRT */ /* MR2002*/ #ifdef __3DOSLIGHTS fn_vUpdateLight(hCharacter); #endif /* Deal with changes of sector*/ if( g_ucIsEdInGhostMode && CAM_fn_bSuperObjectIsACamera(hCharacter) ) { fn_vSectInfoSetCurrentSector( M_GetMSHandle(hCharacter,SectInfo), fn_h_SectInfoGetCurrentSector(M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()),SectInfo))); fn_vInsertObjectInSectorList(fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hCharacter,SectInfo)),hCharacter); } else { /* Do not update sector for fix objects and camera without collisions */ if (!( HIE_fn_SO_bIsSuperimposed(hCharacter) || ( CAM_fn_bSuperObjectIsACamera(hCharacter) /* camera without collision */ && (g_stEngineStructure.cCameraMode == 1) && ( M_GetMSHandle(hCharacter,Cineinfo)->hWork->uwDNMFlags & DNM_CAM_C_NoObstacle ) ) )) { h_Dynam = M_GetMSHandle(hCharacter,Dynam); if (h_Dynam) { p_stDynamic = fn_p_stDynamGetDynamics(h_Dynam); if (p_stDynamic) { if ((DNM_M_bDynamicsIsAdvancedSize(p_stDynamic)) && (DNM_M_bDynamicsIsCollide(p_stDynamic))) bSectorChange = (ACP_tdxBool)(DNM_M_cDynamicsGetCollideCounter (p_stDynamic)==0); else bSectorChange = TRUE; } } if (bSectorChange) { GAM_fn_vSectInfoTestChangeSectorForCharacter(hCharacter); } } } PRF_fn_vStopChrono( PRF_C_ulFctIADNMPLAMisc, NULL ); } } /*********************************************************************************************************************/ /****************************/ /* Deal with the Dynamic Hierarchy*/ /* See Olivier for details and comments*/ /* new : update TooFar Flag (MT 11/03/99) */ /****************************/ void fn_vTreatDynamicHierarchy(HIE_tdxHandleToSuperObject hSuperObj, HIE_tdxHandleToSuperObject hMainChar, MTH3D_tdstVector *p_stMainCharTranslation) { HIE_tdxHandleToSuperObject hChild,hNextChild,hPrevChild; tdstEngineObject * p_stObj; long i; unsigned long ulCustomBits; MTH3D_tdstVector stDist; if(HIE_fn_ulGetSuperObjectType(hSuperObj) == HIE_C_ulActor) { /* here we are an actor*/ MS_tdxHandleToStandardGame hStdGame = M_GetMSHandle(hSuperObj, StandardGame); p_stObj = (tdstEngineObject *) HIE_fn_hGetSuperObjectObject(hSuperObj); if( !hStdGame /* if it is a dead always*/ || ( /* or a non-platform that we already handled or which is inactive*/ (fn_ucStandardGameGetPlatFormType(hStdGame) == 0) && (!M_ObjectIsActive(p_stObj) || M_ObjectIsAlreadyTreated(p_stObj)) ) ) { /* do nothing*/ return; } /* here we have either a platform, or a non-handled live normal actor that is not a camera*/ HIE_fn_vPushMatrix(hSuperObj); if ( fn_ucStandardGameGetPlatFormType(hStdGame) == 0 ) /* if a normal actor*/ { /* if the actor is protected from freeze, or the engine is no frozen -> lets do it!*/ if ( !g_stEngineStructure.bEngineFrozen || (fn_ulStandardGameGetCustomBits(hStdGame) & GAM_C_CustBitUnfreezable) ) { /* Update TooFar Flag */ if ( hSuperObj == hMainChar ) { fn_vStandardGameSetTooFar(hStdGame,FALSE); } else { ulCustomBits = fn_ulStandardGameGetCustomBits(hStdGame); if ( ulCustomBits & (GAM_C_CustBitNoAnimPlayerWhenTooFar|GAM_C_CustBitNoAIWhenTooFar|GAM_C_CustBitNoMecaWhenTooFar) ) { MTH3D_M_vSubVector( &stDist, POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj)), p_stMainCharTranslation); if( MTH_M_bLess(MTH3D_M_xNorm1Vector(&stDist) , MTH_M_xLongToReal(fn_ucStandardGameGetTooFarLimit(hStdGame))) ) { fn_vStandardGameSetTooFar(hStdGame,FALSE); } else { fn_vStandardGameSetTooFar(hStdGame,TRUE); } } } fn_vTreatCharactersInSector(hSuperObj); } #ifdef ACTIVE_EDITOR /* { */ else { /* update modules SO frame number*/ PLA_fn_vUpdateFrameCounterForModules(hSuperObj); } #endif /* } */ HIE_fn_vPopMatrix(); HIE_fn_vPushMatrix(hSuperObj); if( hSuperObj == MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()) ) { /* The Main actor can have children, when carrying another one.*/ HIE_M_ForEachMovingChildOf(hSuperObj,hChild,hNextChild,i) { if ((HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor) && !CAM_fn_bSuperObjectIsACamera(hChild)) fn_vTreatDynamicHierarchy(hChild, hMainChar, p_stMainCharTranslation); } } } else { /* hSuperObj is a platform : treat child actors, even if the platform is frozen,*/ /* because the children have to be handled to have valid global matrixes*/ HIE_M_InvForEachMovingChildOf(hSuperObj,hChild,hPrevChild,i) { if ((HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor) && !CAM_fn_bSuperObjectIsACamera(hSuperObj)) { fn_vTreatDynamicHierarchy(hChild, hMainChar, p_stMainCharTranslation); } } } } else /*not an actor*/ { HIE_fn_vPushMatrix(hSuperObj); HIE_M_ForEachMovingChildOf(hSuperObj,hChild,hNextChild,i) { if ( (HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor) && !CAM_fn_bSuperObjectIsACamera(hChild) ) fn_vTreatDynamicHierarchy(hChild, hMainChar, p_stMainCharTranslation); } } HIE_fn_vPopMatrix(); } /*---------------------------------------------------------------------- * The same things, but for PlatForms * new : update TooFar Flag (MT 11/03/99) *----------------------------------------------------------------------*/ void fn_vTreatDynamicHierarchyOfPlatForms(HIE_tdxHandleToSuperObject hSuperObj) { HIE_tdxHandleToSuperObject hChild,hNextChild; MS_tdxHandleToStandardGame hStdGame; tdstEngineObject * p_stObj; long lI; HIE_tdxHandleToSuperObject hMainChar; unsigned long ulCustomBits; MTH3D_tdstVector stDist , *p_stMainCharTranslation; /* get main character*/ hMainChar = MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()); p_stMainCharTranslation = POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hMainChar)); HIE_fn_vPushMatrix(hSuperObj); /* * treat platforms */ HIE_M_ForEachMovingChildOf(hSuperObj,hChild,hNextChild,lI) { /* Add on for editors*/ if ( HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor ) { hStdGame = M_GetMSHandle(hChild, StandardGame); p_stObj = (tdstEngineObject *) HIE_fn_hGetSuperObjectObject(hChild); if( !hStdGame /* if it is a dead always (because a platform can be an always too...)*/ || !M_ObjectIsActive(p_stObj) || (g_stEngineStructure.bEngineFrozen && (fn_ulStandardGameGetCustomBits(hStdGame) ^ GAM_C_CustBitUnfreezable)) /* or an unprotected actor while the engine is frozen*/ ) { /* skip this one and proceed to the next platform*/ #ifdef ACTIVE_EDITOR /* { */ if(g_stEngineStructure.bEngineFrozen && (fn_ulStandardGameGetCustomBits(hStdGame) ^ GAM_C_CustBitUnfreezable)) { /* update modules SO frame number*/ PLA_fn_vUpdateFrameCounterForModules(hChild); } #endif /* } */ continue; } /* Is character a platform ?*/ if ( fn_ucStandardGameGetPlatFormType(hStdGame) != 0 ) { if ( !M_ObjectIsAlreadyTreated(p_stObj) ) { /* JT PLA_fn_vDesInitAllChildOfCharacter(hChild);*/ /* Update TooFar Flag */ if ( hChild == hMainChar ) { fn_vStandardGameSetTooFar(hStdGame,FALSE); } else { ulCustomBits = fn_ulStandardGameGetCustomBits(hStdGame); if ( ulCustomBits & (GAM_C_CustBitNoAnimPlayerWhenTooFar|GAM_C_CustBitNoAIWhenTooFar|GAM_C_CustBitNoMecaWhenTooFar) ) { MTH3D_M_vSubVector( &stDist, POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hChild)), p_stMainCharTranslation); if( MTH_M_bLess(MTH3D_M_xNorm1Vector(&stDist) , MTH_M_xLongToReal(fn_ucStandardGameGetTooFarLimit(hStdGame))) ) { fn_vStandardGameSetTooFar(hStdGame,FALSE); } else { fn_vStandardGameSetTooFar(hStdGame,TRUE); } } } /* */ HIE_fn_vPushMatrix( hChild ); fn_vTreatCharactersInSector( hChild ); HIE_fn_vPopMatrix(); } } else /*the hierarchy is built so that all platforms are before the other actors*/ { break; /* -> when we encounter a non-platform, we know there are no other platform left to process, so break the loop*/ } } } HIE_fn_vPopMatrix(); } /*---------------------------------------------------------------------- * The same things, but for Cameras *----------------------------------------------------------------------*/ void fn_vTreatCameraHierarchy(HIE_tdxHandleToSuperObject hSuperObj, ACP_tdxBool bForcedActivity) { HIE_tdxHandleToSuperObject hChild; tdstEngineObject * p_stObj; ACP_tdxBool bTmp = FALSE; long i; HIE_fn_vPushMatrix(hSuperObj); if( (HIE_fn_ulGetSuperObjectType(hSuperObj) == HIE_C_ulActor) && ( /* if the actor is protected from freezing, orthe engine is not in frozen mode, we can continue*/ !g_stEngineStructure.bEngineFrozen || (fn_ulStandardGameGetCustomBits(M_GetMSHandle(hSuperObj, StandardGame)) & GAM_C_CustBitUnfreezable) ) ) { p_stObj = (tdstEngineObject*) HIE_fn_hGetSuperObjectObject(hSuperObj); if ( bForcedActivity ) { bTmp = TRUE; } if ( M_ObjectIsActivable(p_stObj) && (!M_ObjectIsAlreadyTreated(p_stObj)) ) { HIE_tdxHandleToSuperObject hMainChar; unsigned long ulCustomBits; MTH3D_tdstVector stDist , *p_stMainCharTranslation; MS_tdxHandleToStandardGame hStdGame; /* get main character*/ hMainChar = MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()); p_stMainCharTranslation = POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hMainChar)); /* Update tooFar Flag */ hStdGame = M_GetMSHandle(hSuperObj, StandardGame); if (hStdGame) { ulCustomBits = fn_ulStandardGameGetCustomBits(hStdGame); if ( ulCustomBits & (GAM_C_CustBitNoAnimPlayerWhenTooFar|GAM_C_CustBitNoAIWhenTooFar|GAM_C_CustBitNoMecaWhenTooFar) ) { MTH3D_M_vSubVector( &stDist, POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj)), p_stMainCharTranslation); if( MTH_M_bLess(MTH3D_M_xNorm1Vector(&stDist) , MTH_M_xLongToReal(fn_ucStandardGameGetTooFarLimit(hStdGame))) ) { fn_vStandardGameSetTooFar(hStdGame,FALSE); } else { fn_vStandardGameSetTooFar(hStdGame,TRUE); } } } fn_vTreatCharactersInSector(hSuperObj); bTmp=TRUE; } HIE_fn_vPopMatrix(); HIE_fn_vPushMatrix(hSuperObj); } #ifdef ACTIVE_EDITOR /* { */ else if(g_stEngineStructure.bEngineFrozen && (fn_ulStandardGameGetCustomBits(M_GetMSHandle(hSuperObj, StandardGame)) ^ GAM_C_CustBitUnfreezable)) { /* update modules SO frame number*/ PLA_fn_vUpdateFrameCounterForModules(hSuperObj); } #endif /* } */ HIE_M_ForEachChildOf(hSuperObj,hChild,i) { fn_vTreatCameraHierarchy(hChild,bTmp); } HIE_fn_vPopMatrix(); } /*---------------------------------------------------------------------- *----------------------------------------------------------------------*/ void fn_vSendBackGroundColor(HIE_tdxHandleToSuperObject _hSprObjSector) { ACP_tdxIndex xI; SECT_tdxHandleOfSectorObject hSectorObject; SECT_tdxHandleOfElementLstStaticLights hStaticLightsElement; hSectorObject=(SECT_tdxHandleOfSectorObject)HIE_fn_hGetSuperObjectObject(_hSprObjSector); LST2_M_StaticForEachElementOf ( &(hSectorObject->stListOfStaticLights), hStaticLightsElement, xI ) { if (GLI_lGetLightType(hStaticLightsElement->hStaticLights) == GLI_C_lFogLight) { struct GEO_tdstColor_ stColor; GLI_xGetLightBackgroundColor(hStaticLightsElement->hStaticLights, &stColor); GLD_bSetBackgroundColorForDevice ( /* XB 23/06/99 */ #ifndef U64 fn_hGetGLDDevice(0), #else /* U64 */ NULL, #endif /* U64 */ /* End XB 23/06/99 */ RGB ( (char) (stColor.xR*255), (char) (stColor.xG*255), (char) (stColor.xB*255) ) ); break; } } } /* Oliv' - We NEED the default flag too, - 25/02/1999 'coz sometimes the function SendCharacterToViewport which set or not the CustBitOutOfVisibility is not called (actor is not in a visible sector) */ /*#ifndef U64*/ /* this call is not necessary for U64, because there are no mirrors for them*/ /* -> only one camera at a time can see an actor, which means that no camera can*/ /* override the outofvisisibity flag set by another camera*/ /* EndOfOliv' */ #ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */ void fn_vSetOutOfVisibilityCustomBitOfAllActiveActors() { HIE_tdxHandleToSuperObject hCharacter1, hCharacter2; MS_tdxHandleToStandardGame hStdGame; long i,j; unsigned long ulCustomBits; /* for each actor in the active hierarchy*/ HIE_M_ForEachChildOf(gp_stDynamicWorld, hCharacter1, i) { /* assume it is not out of visibility*/ hStdGame = M_GetMSHandle(hCharacter1, StandardGame); ulCustomBits = fn_ulStandardGameGetCustomBits(hStdGame) | GAM_C_CustBitOutOfVisibility; fn_vStandardGameSetCustomBits(hStdGame, ulCustomBits); /* if it is rayman of a platform, check the children actors*/ if ( (fn_ucStandardGameGetPlatFormType(hStdGame) == C_ucPlatFormType_StandardPlatForm) || (ulCustomBits & GAM_C_CustBitRayman) ) { HIE_M_ForEachChildOf(hCharacter1, hCharacter2, j) { if ( HIE_fn_ulGetSuperObjectType(hCharacter2) == HIE_C_ulActor ) { hStdGame = M_GetMSHandle(hCharacter2, StandardGame); fn_vStandardGameSetCustomBits(hStdGame, fn_ulStandardGameGetCustomBits(hStdGame) | GAM_C_CustBitOutOfVisibility); } } } } } #endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */ /* Oliv' - We NEED the default flag too, - 25/02/1999 */ /* #endif */ /* EndOfOliv' */ /*----------------------------------------------------------------------------- * Description : Game Engine Function *----------------------------------------------------------------------------- * Input : None * Output : *----------------------------------------------------------------------------- * Creation date : 22/08/96 Author : Christophe *----------------------------------------------------------------------------- * Modification date : 13/10/97 Modification Author : Gilles * Modifications : Cleaning *---------------------------------------------------------------------------*/ #ifdef U64 /* FQ LIGHTVIS*/ #ifndef RETAIL extern int g_LightDrawnThisFrame; #endif /* RETAIL*/ //Declare these globals variables in gameeng.c because of overlay // do not erase by default on u64 char gc_EraseBackground=0; //End XB 22/06/99 #else /* u64 */ // erase by default on PC char gc_EraseBackground=1; #endif void fn_vEngine() { /* XB 23/06/99 */ #ifndef U64 GLD_tdhDevice mhDisplayDevice3D=g_stEngineStructure.hGLDDevice; GLD_tdhViewport mhDisplayViewport3D=g_stEngineStructure.hGLDViewport; #else /* U64 */ GLD_tdhDevice mhDisplayDevice3D=NULL; GLD_tdhViewport mhDisplayViewport3D=NULL; #endif /* U64 */ /* End XB 23/06/99 */ BOOL bEnabledWrite ; /* tdxHandleToAlwaysActiveCharacterNode hCharAlwaysActiveNode;*/ /* short i;*/ /* ACP_tdxIndex xIndex, xIndexMax ;*/ #if defined(USE_PROFILER) && !defined(PRESS_DEMO) HIE_tdxHandleToSuperObject hSOCurrentSector; SECT_tdxHandleOfSectorObject hSECTCurrentSector; long ulRasterDuration; #endif /* USE_PROFILER && PRESS_DEMO */ #if defined(ACTIVE_EDITOR) PRF_fn_vStartChrono( PRF_C_ulFctEditor, NULL ); fn_vCheckEditor(); fn_vCheckEnd(); PRF_fn_vStopChrono( PRF_C_ulFctEditor, NULL ); if (g_stEngineStructure.eEngineMode==EM_ModeStoppingProgram) return; #endif /* ACTIVE_EDITOR */ /******************/ /* Miscellaneous */ /******************/ /* sound */ #ifdef U64 PRF_fn_vStartChrono( PRF_C_ulFctSound, PRF_C_pvSoundInit ); #else PRF_fn_vStartChrono( PRF_C_ulFctSoundInit, NULL ); #endif SND_fn_vSynchroSound(); #ifdef U64 PRF_fn_vStopChrono( PRF_C_ulFctSound, PRF_C_pvSoundInit ); #else PRF_fn_vStopChrono( PRF_C_ulFctSoundInit, NULL ); #endif PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL ); #if !defined(PRESS_DEMO) #if (!defined( FINAL_VERSION ) && !defined(RETAIL) ) || defined(FINAL_VERSION_FOR_TESTERS) /* cheat code, ghost mode */ if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hFlyingMode)==IPT_C_TRUE) { /* All these functions must be done either when you enter the ghost mode or when you quit this mode*/ g_ucIsEdInGhostMode=(unsigned char)(1-g_ucIsEdInGhostMode); if (g_ucIsEdInGhostMode) { fn_v3dDataSetDrawMask( M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()),3dData), HIE_fn_lGetSuperObjectDrawMask(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode())) & ~GLI_C_lIsNotWired ); HIE_fn_vSetSuperObjectDrawMask( MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()), HIE_fn_lGetSuperObjectDrawMask(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode())) & ~GLI_C_lIsNotWired ); } else { fn_v3dDataSetDrawMask( M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()),3dData), HIE_fn_lGetSuperObjectDrawMask(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode())) | GLI_C_lIsNotWired ); HIE_fn_vSetSuperObjectDrawMask( MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()), HIE_fn_lGetSuperObjectDrawMask(MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode())) | GLI_C_lIsNotWired ); } fn_vUpdateSectorInfoAfterNOCLIP(CAM_fn_hGetActiveCamera(CAM_e_MainViewport)); CAM_fn_vUpdateTargetPosition(M_GetMSHandle(CAM_fn_hGetActiveCamera(CAM_e_MainViewport),Cineinfo)); fn_vInitBehaviourOfACharacter(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode())); #if !defined( U64 ) fn_vReputCharacterSuperObjectAtTheWorld(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode())); #endif /* U64 */ fn_vTakeControlOfChannel((tdstEngineObject *)HIE_fn_hGetSuperObjectObject(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode())), (unsigned short) -1, FALSE); } #endif /* (!defined( FINAL_VERSION ) && !defined(RETAIL) ) || defined(FINAL_VERSION_FOR_TESTERS) */ #endif /* PRESS_DEMO */ /* ANNECY MT - 25/06/99 { */ #if !defined(U64) && defined(_DEBUG) if ( !g_ucIsEdInGhostMode && g_ucSlowDownEngine ) Sleep(g_ucSlowDownTime); #endif /* END ANNECY MT } */ /* shadow init ??? */ SHW_fn_vInitShadowCounter(); #if (!defined ( RETAIL ) && !defined(PRESS_DEMO)) || defined(FINAL_VERSION_FOR_TESTERS) /* we want to use fly mode even when the engine is stepped! */ if( g_ucIsEdInGhostMode ) { HIE_tdxHandleToSuperObject hCharacter = MC_fn_hGetCharacterInMainCharacterNode ( MC_fn_hGetFirstMainCharNode() ) ; tdstEngineObject * p_stEngObj = (tdstEngineObject *) HIE_fn_hGetSuperObjectObject ( hCharacter ); fn_bEdNOCLIP(hCharacter); M_TreatObject(p_stEngObj); #ifdef __3DOSLIGHTS fn_vUpdateLight(hCharacter); #endif GAM_fn_vSectInfoTestChangeSectorForCharacter(hCharacter); } #endif /* (!defined ( RETAIL ) && !defined(PRESS_DEMO)) || defined(FINAL_VERSION_FOR_TESTERS) */ M_IfCanDoFullStep() { if (!fn_bIsEngineInPause()) { HIE_fn_vInvalidateAllGlobalMatrices(); /* HIE_fn_vValidateGlobalMatrix(gp_stDynamicWorld);*/ #ifdef U64 MOR_fn_vUnLockAllMorphTasks(); #endif /* Trame counter and timer */ /*fn_vActualizeEngineClock();*/ /* Mangement of Changing Main Character.*/ if (MC_fn_hGetNewMainCharacter(MC_fn_hGetFirstMainCharNode()) != NULL) { MC_fn_vSetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode(), MC_fn_hGetNewMainCharacter(MC_fn_hGetFirstMainCharNode()) ); MC_fn_vSetNewMainCharacter(MC_fn_hGetFirstMainCharNode(), NULL); } fn_vUpdateDynamicHierarchy(); #if defined(USE_PROFILER) && !defined(PRESS_DEMO) hSOCurrentSector = fn_h_SectInfoGetCurrentSector(M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()),SectInfo)); hSECTCurrentSector = (SECT_tdxHandleOfSectorObject)HIE_fn_hGetSuperObjectObject(hSOCurrentSector); PRF_fn_vIncreaseVariable( PRF_C_ulVarCurrentSector, PRF_C_pvMainCharCurrentSector, (unsigned long)hSOCurrentSector); #endif /* USE_PROFILER && PRESS_DEMO */ /* ANNECY MT - 01/10/98 {*/ #ifndef U64 if(g_DEMO_KeybTest != DEMO_PLAY) #endif U64 /* END ANNECY MT }*/ fn_vKillAllAlwaysInNonActiveSectors(); #ifndef U64 else fn_vClearUnusedAlwaysInDemoMode(); #endif U64 HIE_fn_vInitMatrixStack(); /*XB980824*/ #ifndef D_THROW_MGT if(bEnabledWrite) MGT_fn_vTreatMagnets(); #endif /* D_THROW_MGT */ /*End XB*/ PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL ); PRF_fn_vStartChrono( PRF_C_ulFctHIE, NULL ); SAF_M_Try /*BART*/ /* ANNECY MT - 03/11/98 {*/ #if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64)) GAM_fn_vRasterDumpBeginLoop(); #endif /* END ANNECY MT }*/ /* ANNECY AV DEMO {*/ #ifndef U64 if(g_DEMO_KeybTest == DEMO_PLAY) { if(DEMO_fn_bUpdateDynamicHierarchy () == FALSE) return; } else #endif U64 /* END ANNECY AV }*/ { HIE_tdxHandleToSuperObject hMainChar = MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()); fn_vTreatDynamicHierarchyOfPlatForms(gp_stDynamicWorld); fn_vTreatDynamicHierarchy(gp_stDynamicWorld, hMainChar, POS_fn_p_stGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(hMainChar))); } CAM_fn_vCameraManagement(); /* Oliv' - Enable loading once of all Maps - 08/06/1999 */ #if defined(TEST_LOAD_ALL_MAPS) { #define TEST_LOAD_TIME 100 static unsigned long s_ulWaitFrame = 0L; static unsigned long s_ulLoadAllLevel = 0L; if( (++s_ulWaitFrame) >= TEST_LOAD_TIME ) { s_ulLoadAllLevel = (s_ulLoadAllLevel + 1) % (unsigned long)g_stEngineStructure.ucNumberOfLevels; GAM_fn_vAskToChangeLevel( g_stEngineStructure.a_szLevelName[ s_ulLoadAllLevel ] , TRUE ); osSyncPrintf( "Change to level %s\n", g_stEngineStructure.a_szLevelName[s_ulLoadAllLevel] ); s_ulWaitFrame = 0L; } } #endif /* TEST_LOAD_ALL_MAPS */ /* EndOfOliv' */ /* ANNECY MT - 03/11/98 {*/ #if (defined(USE_PROFILER) && !defined(PRESS_DEMO) && !defined(U64)) GAM_fn_vRasterDumpEndLoop(); #endif /* END ANNECY MT }*/ SAF_M_Catch /* BART: in case of ça marche pas => stop everything just après !*/ PRF_fn_vReinitAllChrono(); SAF_M_EndCatch /* BART*/ PRF_fn_vStopChrono( PRF_C_ulFctHIE, NULL ); PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL ); /*********************/ /* Special treatment */ /*********************/ /* Real-Time for cycling textures */ GLI_vRefreshAllCyclingTextures( MTH_M_xDiv( MTH_M_xLongToReal(g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime), MTH_M_xMul(M_xGetFrameLength(g_stEngineStructure.stEngineTimer), MTH_M_xFloatToReal(1000.0f)) ) ); #ifndef D_THROW_PRT /* New particles mechanics */ /*fn_vMSPrtSysTreatAllParticlesSystemsForCharacter(g_stEngineStructure.h_WorldCaracter);*/ #endif /* D_THROW_PRT */ } /* !fn_bIsEngineInPause() */ } /* M_IfcanDoFullStep() */ /**************************/ /* Cheat code ! for debug */ /**************************/ #if !defined(PRESS_DEMO) /* Oliv' - 19/05/1999 - I want to see Zdx too */ #if defined(_DEBUG) || defined(_U64_GLI_BENCH_) if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hDisplayZDC)==IPT_C_TRUE) { g_ucZDCVisible = (unsigned char)( (g_ucZDCVisible + 1) % 6); } #endif /* _DEBUG || _U64_GLI_BENCH_ */ #endif /* PRESS_DEMO */ /* EndOfOliv' */ #if !defined(PRESS_DEMO) #if defined(_DEBUG) if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hDisplayOnlyStatic)==IPT_C_TRUE) { unsigned long ulRasterDisplayMode = PRF_fn_lGetIndependantVariable(PRF_C_ulIdpRasterDisplayMode); ulRasterDisplayMode &= ~PRF_C_ulShowAll; /* unset all bits*/ g_ucWhatDoIDisplay = (unsigned char)( (g_ucWhatDoIDisplay + 1) % 3); switch(g_ucWhatDoIDisplay) { case 0: ulRasterDisplayMode |= PRF_C_ulShowAll; break;/* all*/ case 1: ulRasterDisplayMode |= PRF_C_ulShowStatic; break;/* static*/ case 2: ulRasterDisplayMode |= PRF_C_ulShowDynamic; break;/* dynamic*/ } PRF_fn_vSetIndependantVariable( PRF_C_ulIdpRasterDisplayMode , ulRasterDisplayMode ); } if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hDisplayBoundingVolumes)==IPT_C_TRUE) { g_ucDisplayBoundingVolumes =(unsigned char)(1 - g_ucDisplayBoundingVolumes); } #endif /*_DEBUG*/ #endif /* PRESS_DEMO */ PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL ); /**************************/ /* Display */ /**************************/ PRF_fn_vStartChrono( PRF_C_ulFctDisplay, PRF_C_pvRest ); PRF_fn_vStopChrono( PRF_C_ulFctDisplay, PRF_C_pvRest ); PRF_fn_vStartChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvRest ); #if defined(WIN32) WaitForSingleObject(g_stEngineStructure.hDrawSem,INFINITE); #endif /* WIN32 */ PRF_fn_vStopChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvRest ); /* XB 23/06/99 */ #ifndef U64 if (!GLD_bFlipDeviceWithSynchro(g_stEngineStructure.hGLDDevice,C_DefaultSynchro)) #else /* U64 */ if (!GLD_bFlipDeviceWithSynchro(NULL,C_DefaultSynchro)) #endif /* U64 */ /* End XB 23/06/99 */ M_GameFatalError(E_uwGameCantFlipDevice); /* Trame counter and timer, right after the VBL synchro! */ M_bIfIsNotStepping() { fn_vActualizeEngineClock(); } #if defined(USE_PROFILER) && !defined(PRESS_DEMO) { PRF_fn_vStopChrono( PRF_C_ulFctMainLoop, NULL ); ulRasterDuration = PRF_fn_lGetIndependantVariable( PRF_C_ulIdpRasterTime ); #pragma warning (disable : 4146) PRF_fn_vSetIndependantVariable( PRF_C_ulIdpRasterTime, -TMR_fn_ulFastGetInternalCounter() ); #pragma warning (default : 4146) PRF_fn_vComputeAllChrono (); PRF_fn_lIncIndependantVariable( PRF_C_ulIdpRasterTime, TMR_fn_ulFastGetInternalCounter() ); GAM_fn_vSlowDownEngine (PRF_fn_ulTimerCount2Duration( ulRasterDuration )); #pragma warning (disable : 4146) PRF_fn_lIncIndependantVariable( PRF_C_ulIdpRasterTime, -TMR_fn_ulFastGetInternalCounter() ); #pragma warning (default : 4146) GAM_fn_vPrepareShowRasters( PRF_fn_ulTimerCount2Duration( ulRasterDuration ) ); PRF_fn_vResetAllChrono (); PRF_fn_vSetIndependantVariable(PRF_C_ulIdpNbSkippedAnims,0); PRF_fn_lIncIndependantVariable( PRF_C_ulIdpRasterTime, TMR_fn_ulFastGetInternalCounter() ); PRF_fn_vStartChrono( PRF_C_ulFctMainLoop, NULL ); PRF_fn_vStartChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvRest ); } #endif /* USE_PROFILER && PRESS_DEMO */ #ifdef U64 PRF_fn_vStartChrono( PRF_C_ulFctDisplay, PRF_C_pvDisplayClearVP ); #endif /* FQ HIGHRES*/ #ifdef U64 #if defined(_U64_GLI_BENCH_) if(gc_EraseBackground || GLIBENCH_g_bWireFrame) #else if(gc_EraseBackground) #endif /* _U64_GLI_BENCH_ */ { if (!GLD_bClearViewportWithChoice(NULL,g_stEngineStructure.hGLDFixViewport,GLD_C_CLEAR_BACKBUF | GLD_C_CLEAR_ZBUF)) M_GameFatalError(E_uwGameCantClearViewPort); } else { if (!GLD_bClearViewportWithChoice(NULL,g_stEngineStructure.hGLDFixViewport,GLD_C_CLEAR_ZBUF)) M_GameFatalError(E_uwGameCantClearViewPort); } #else /* !U64 */ if(gc_EraseBackground) { if (!GLD_bClearViewportWithChoice(g_stEngineStructure.hGLDDevice,g_stEngineStructure.hGLDFixViewport,GLD_C_CLEAR_BACKBUF | GLD_C_CLEAR_ZBUF)) M_GameFatalError(E_uwGameCantClearViewPort); } else { if (!GLD_bClearViewportWithChoice(g_stEngineStructure.hGLDDevice,g_stEngineStructure.hGLDFixViewport,GLD_C_CLEAR_ZBUF)) M_GameFatalError(E_uwGameCantClearViewPort); } #endif /* U64 */ GLI_xClearViewingList(); #ifdef U64 PRF_fn_vStopChrono( PRF_C_ulFctDisplay, PRF_C_pvDisplayClearVP); #endif #if defined(WIN32) /* GuS : We tell the device we are going to do the rendering. Must be called before any rendering !*/ GLD_bBeginWriteToDevice( mhDisplayDevice3D ); #endif /*WIN32*/ #ifndef U64 GLI_vUpdateEffectData( g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime ); #endif PRF_fn_vStopChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvRest); PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL ); #if !defined(PRESS_DEMO) #if !defined(U64) && defined(USE_PROFILER) && !defined(PRESS_DEMO) if (GetAsyncKeyState ('M') && GetAsyncKeyState (VK_CONTROL) && GetAsyncKeyState (VK_SHIFT)) { MMG_fn_vDumpMemory (); fn_vGameTestMemory(); GAM_fn_vRasterDump(); } #endif #endif /* PRESS_DEMO */ /******************************/ /* Saving Game and Extra Game */ /******************************/ #if !defined(ACTIVE_EDITOR) /*if (g_stSavedGame.bSaveAsked) { fn_bPlayerSaveGameAll(); }*/ /*if (g_stExtrasGame.bSaveAsked) { fn_bSaveCurrentExtrasGame(); }*/ #endif /* ACTIVE_EDITOR */ if (!GLD_bRequestWriteToViewport(mhDisplayDevice3D, mhDisplayViewport3D, &g_stEngineStructure.stViewportAttr, &bEnabledWrite)) M_GameFatalError(E_uwGameCantWriteToViewPort); if (bEnabledWrite) { HIE_tdxHandleToSuperObject hSprObjCamera; MTH3D_tdstVector stAbsolutePositionOfCamera; HIE_tdxHandleToSuperObject hCamCurrentSector; GEO_fn_vMorphAddInMainLoop(); /* Oliv' - 19/05/1999 - I want to see Zdx too */ #if defined(_DEBUG) || defined(_U64_GLI_BENCH_) /* EndOfOliv' */ /* Zones display */ if(g_ucZDCVisible) { HIE_fn_vInitMatrixStack(); HIE_fn_bInitCameraMatrixStack(&g_stEngineStructure.stViewportAttr); ZDX_fn_vDisplayAllZdx(&g_stEngineStructure.stViewportAttr, fn_h_SectInfoGetCurrentSector( M_GetMSHandle(CAM_fn_hGetActiveCamera(CAM_e_MainViewport),SectInfo))); } /* Oliv' - 19/05/1999 - I want to see Zdx too */ #endif /* _DEBUG || _U64_GLI_BENCH_ */ /* EndOfOliv' */ #if defined(_DEBUG) /*ANNECY TQ 11/03/98{*/ if(g_ucDisplayBoundingVolumes) { HIE_fn_vInitMatrixStack(); HIE_fn_bInitCameraMatrixStack(&g_stEngineStructure.stViewportAttr); ZDX_fn_vDisplayAllBoundingVolumes(&g_stEngineStructure.stViewportAttr, fn_h_SectInfoGetCurrentSector( M_GetMSHandle(CAM_fn_hGetActiveCamera(CAM_e_MainViewport),SectInfo))); } /*ENDANNECY TQ}*/ /*ANNECY TQ 27/04/98{*/ #endif /*_DEBUG*/ /*ENDANNECY TQ}*/ PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL ); PRF_fn_vStartChrono( PRF_C_ulFctDisplay, PRF_C_pvMisc ); PRF_fn_vStartChrono( PRF_C_ulFctDisplayCommon, PRF_C_pvSendToViewPort ); /* total display */ #ifdef __3DOSLIGHTS hSprObjCamera = CAM_fn_hGetActiveCamera(CAM_e_MainViewport); /* ANNECY AV DEMO {*/ #ifndef U64 #ifndef RETAIL if (g_DEMO_KeybTest == DEMO_RECORD ) DEMO_SaveInfo (hSprObjCamera); #endif /* RETAIL */ #endif /* END ANNECY AV }*/ POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix ( hSprObjCamera), &stAbsolutePositionOfCamera); hCamCurrentSector = fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hSprObjCamera,SectInfo)); fn_vSendBackGroundColor(hCamCurrentSector); /*FQ : Here we display the Sky... of course ;-)*/ /*/////////////////////////////////////////////*/ #ifdef U64 #ifndef RETAIL /* FQ LIGHTVIS*/ g_LightDrawnThisFrame=0; #endif /* RETAIL*/ fn_vDisplaySky(&g_stEngineStructure.stViewportAttr); #endif /*U64*/ PRF_fn_vIncreaseVariable( PRF_C_ulVarCurrentSector, PRF_C_pvCameraCurrentSector, (unsigned long)hCamCurrentSector); /* Oliv' - We NEED the default flag too, - 25/02/1999 */ /*#ifndef U64*/ /* this call is not necessary for U64, because there are no mirrors for them*/ /* YES WE WANT IT TOO ON U64 !!*/ /* ANNECY MT - 11/03/99 { */ /* fn_vSetOutOfVisibilityCustomBitOfAllActiveActors(); */ /* END ANNECY MT } */ /*#endif*/ /* EndOfOliv' */ /* XB 23/06/99 */ #ifndef U64 SCT_fn_vSendSectorWhereIAmToViewportWithMirror( &stAbsolutePositionOfCamera, g_stEngineStructure.hGLDDevice, g_stEngineStructure.hGLDViewport, &g_stEngineStructure.stViewportAttr, hCamCurrentSector, g_stEngineStructure.ulDisplayMode ); #else /* U64 */ SCT_fn_vSendSectorWhereIAmToViewportWithMirror( &stAbsolutePositionOfCamera, NULL, NULL, &g_stEngineStructure.stViewportAttr, hCamCurrentSector, g_stEngineStructure.ulDisplayMode ); #endif /* U64 */ /* End XB 23/06/99 */ #ifdef WIN32 fn_bDisplaySky(hCamCurrentSector, hSprObjCamera, &g_stEngineStructure.stViewportAttr); #endif #endif /* __3DOSLIGHTS*/ #ifndef D_THROW_PRT /* New particles display */ /*if( g_stEngineStructure.h_WorldCaracter!=NULL ) fn_vMSPrtSysPreDrawAllParticlesSystemsForCharacter(g_stEngineStructure.h_WorldCaracter);*/ #endif /* D_THROW_PRT */ PRF_fn_vStopChrono( PRF_C_ulFctDisplayCommon, PRF_C_pvSendToViewPort ); PRF_fn_vStopChrono( PRF_C_ulFctDisplay, PRF_C_pvMisc ); } else PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL ); M_FullStepDone() ; #if defined(WIN32) && !defined(RETAIL) && !defined(PRESS_DEMO) if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hStartStopStep) == IPT_C_TRUE) { if ( GAM_g_iStepMode >= 0 ) { GAM_g_iStepMode = -1 ; /* fake a 1 VBL frame rate */ fn_vLoadEngineClock ( ) ; #if !defined(U64) && defined(_DEBUG) Sleep ( ( g_ucSlowDownEngine && g_ucSlowDownTime ) ? g_ucSlowDownTime : 16 ) ; #else Sleep ( 16 ) ; #endif fn_vActualizeEngineClock() ; } else { GAM_g_iStepMode = 0 ; /* remember the date when the step mode is engaged */ fn_vSaveEngineClock ( ) ; } } if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hPulseStep) == IPT_C_TRUE) { if ( GAM_g_iStepMode >= 0 ) { GAM_g_iStepMode = 1 ; /* fake a 1 VBL frame rate */ fn_vLoadEngineClock ( ) ; #if !defined(U64) && defined(_DEBUG) Sleep ( ( g_ucSlowDownEngine && g_ucSlowDownTime ) ? g_ucSlowDownTime : 16 ) ; #else Sleep ( 16 ) ; #endif fn_vActualizeEngineClock() ; fn_vSaveEngineClock ( ) ; } } #endif /* WIN32 && !RETAIL && !PRESS_DEMO */ } /*----------------------------------------------------------------------------- * Description : reput the character at root *----------------------------------------------------------------------------- * Input : Super-Object * Output : void *----------------------------------------------------------------------------- * Creation date : 14/10/96 Author : François *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ void fn_vReputCharacterSuperObjectAtTheWorld(HIE_tdxHandleToSuperObject h_SupObject) { HIE_fn_vChangeFather(h_SupObject,gp_stDynamicWorld, fn_ucStandardGameGetPlatFormType(M_GetMSHandle(h_SupObject,StandardGame))); } /*----------------------------------------------------------------------------- * Description : Search all character's super object, and link to the root * recurse function. *----------------------------------------------------------------------------- * Input : void * Output : void *----------------------------------------------------------------------------- * Creation date : 07/06/97 Author : Olivier Jourdan *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ /* void fn_vRecursivePartOfFatherSonLinksDestruction( HIE_tdxHandleToSuperObject _hSuperObj, ACP_tdxBool _bFather) { HIE_tdxHandleToSuperObject hChild, hSon; if( HIE_fn_ulGetSuperObjectType(_hSuperObj)==C_ucCharacter ) { //hChild = _hSuperObj->hFirstElementSta; hChild = HIE_M_hFirstChild(_hSuperObj); while(hChild) { //hSon = hChild->hNextBrotherSta; hSon = HIE_M_hNextChild(hChild); fn_vRecursivePartOfFatherSonLinksDestruction(hChild,TRUE); hChild = hSon; } // if(_hSuperObj->hFatherSta != gp_stDynamicWorld) if(HIE_M_hGetSuperObjectFather(_hSuperObj) != gp_stDynamicWorld) fn_vReputCharacterSuperObjectAtTheWorld(_hSuperObj); } else { //hChild = _hSuperObj->hFirstElementSta; hChild = HIE_M_hFirstChild(_hSuperObj); while(hChild) { //hSon = hChild->hNextBrotherSta; hSon = HIE_M_hNextChild(hChild); fn_vRecursivePartOfFatherSonLinksDestruction(hChild,FALSE); hChild = hSon; } } } */ void fn_vRecurseDestructChildLink(HIE_tdxHandleToSuperObject _hSuperObjRoot) { HIE_tdxHandleToSuperObject hChild,hNextChild,hPlatformChild,hPlatformNextChild; long xI, xJ; HIE_M_ForEachMovingChildOf(_hSuperObjRoot,hChild,hNextChild,xI) { if( HIE_fn_ulGetSuperObjectType(hChild)==HIE_C_ulActor ) { if( fn_ucStandardGameGetPlatFormType(M_GetMSHandle(hChild,StandardGame))!=0 ) { /* Destruct child Links*/ HIE_M_ForEachMovingChildOf(hChild,hPlatformChild,hPlatformNextChild,xJ) { if( HIE_fn_ulGetSuperObjectType(hPlatformChild)==HIE_C_ulActor ) { /*since we handle the children of a platform, they cannot be platform themselves!*/ HIE_fn_vChangeFather(hPlatformChild,_hSuperObjRoot, FALSE); } } } else { break; } } } } void fn_vDestructAllFatherSonLinks(void) { HIE_tdxHandleToSuperObject hChild,hNextChild,hMainCharacter; long xI; hMainCharacter = MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()); HIE_M_ForEachMovingChildOf(hMainCharacter,hChild,hNextChild,xI) { if( HIE_fn_ulGetSuperObjectType(hChild)==HIE_C_ulActor ) { HIE_fn_vChangeFather(hChild,gp_stDynamicWorld, fn_ucStandardGameGetPlatFormType(M_GetMSHandle(hChild,StandardGame))); } } /*fn_vRecursivePartOfFatherSonLinksDestruction(gp_stDynamicWorld,FALSE);*/ fn_vRecurseDestructChildLink(gp_stDynamicWorld); fn_vRecurseDestructChildLink(gp_stInactiveDynamicWorld); } /*ANNECY CG DISPLAY ACTIVATED GENDOORS 16/06/98 {*/ #ifndef U64 static GEO_tdstGeometricObject * p_stGeoModel4Gendoors; static GEO_tdstGeometricObject * p_stGeoCurr4Gendoors; /*static*/ unsigned char ucIsInitDone4Gendoors = 0; BOOL bDisplayCenterInitIsDone = FALSE; /***********************************************************************************************/ /* Name : InitGeoModel4Gendoors*/ /* Description : Loads the Geo Obj used to display the Gendoors from .mod file*/ /* Author : Christophe Giraud*/ /* Date : 18/06/98*/ /***********************************************************************************************/ GEO_tdstGeometricObject * InitGeoModel4Gendoors() { GEO_tdstGeometricObject * p_stLoaded; p_stLoaded = (GEO_tdstGeometricObject *) SCR_M_ul_RdL0_ExtractLongValue( SCR_fnp_st_RdL0_AnalyseSection( "GameData\\World\\Graphics\\Objects\\Banks\\KeyGendoor\\KeyGendoor.mod^Geometric:KeyGendoor", SCR_CDF_uw_Anl_ForceAnalyse ), 0 ); /* p_stLoaded = (GEO_tdstGeometricObject *) SCR_M_ul_RdL0_ExtractLongValue( SCR_fnp_st_RdL0_AnalyseSection( "GameData\\World\\Graphics\\Objects\\Banks\\Waypoints\\wp.mod^Geometric:Box01", SCR_CDF_uw_Anl_ForceAnalyse ), 0 ); */ return p_stLoaded; } /***********************************************************************************************/ /* Name : fn_vDisplayActivatedGendoors*/ /* Description : Displays Activated Gendoors*/ /* Author : Christophe Giraud*/ /* Date : 18/06/98*/ /***********************************************************************************************/ #if !defined(PRESS_DEMO) #ifndef RETAIL void fn_vDisplayActivatedGendoors( GLD_tdstViewportAttributes * p_stViewport, unsigned long ulDrawMask ) { tdxHandleToObjectsTablesList hObjetTable; ACP_tdxIndex xNbVertices; MTH3D_tdstVector stVector; HIE_tdxHandleToSuperObject hCurrentSector, hPersoPrincipal, hCharacterSO; SECT_tdxHandleOfElementLstCharacter hCharacterElement; char szText[255]; int i; /****** ONLY FOR DEBUG ****************************/ /**/ char *cName; /**/ MS_tdxHandleToBrain hBrain; /****** ONLY FOR DEBUG ****************************/ /*--- First time we are here ??? ---*/ if( !ucIsInitDone4Gendoors ) { /*--- Loading Geo Objs from file ---*/ p_stGeoModel4Gendoors = InitGeoModel4Gendoors(); p_stGeoCurr4Gendoors = InitGeoModel4Gendoors(); ucIsInitDone4Gendoors = 1; GLI_vEndofGeometricLoad(); } sprintf( szText, "[G] Display Gendoors" ); GLI_vDisplayPolices( (unsigned char *)szText, 450, 435 ); /* Point to the current sector where is the character*/ hPersoPrincipal = MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode()); hCurrentSector = fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hPersoPrincipal, SectInfo)); /* Find all characters in the current sector of the list*/ SECT_M_ForEachCharListInSector(hCurrentSector, hCharacterElement, i) { /* Get character in the list*/ hCharacterSO = SECT_GetCharacterInList( hCharacterElement ); hObjetTable = fn_vGetDefaultObjectsTableOfFamily( fn_h3dDataGetFamily(M_GetMSHandle(hCharacterSO,3dData)) ); /****** ONLY FOR DEBUG ****************************/ /**/ hBrain = M_GetMSHandle(hCharacterSO,Brain); /**/ if (hBrain) /**/ cName = AI_M_szGetPersoName(AI_M_stGetMindOfSuperObj(hCharacterSO)); /****** ONLY FOR DEBUG ****************************/ if ( hObjetTable== NULL ) { /* Coordinates of the character*/ POS_fn_vGetTranslationVector( HIE_fn_hGetSuperObjectGlobalMatrix( hCharacterSO ), &stVector ); for(xNbVertices=0; xNbVerticesxNbPoints ; xNbVertices++) { /*--- Translates the current object at the waypoint position*/ MTH3D_M_vAddVector( &(p_stGeoCurr4Gendoors->d_stListOfPoints[ xNbVertices ]), &(p_stGeoModel4Gendoors->d_stListOfPoints[ xNbVertices ]), &stVector ); } /*--- Translates the current object bounding sphere center at the gendoor position*/ MTH3D_M_vAddVector( &(p_stGeoCurr4Gendoors->xBoudingSphereCenter),&(p_stGeoModel4Gendoors->xBoudingSphereCenter),&stVector); /*--- Sends the object to the Display Routines*/ GLI_xSendObjectToViewportWithLights( p_stViewport, p_stGeoCurr4Gendoors, ulDrawMask ); } } } #endif /*RETAI*/ #endif /* PRESS_DEMO */ #ifndef RETAIL void fn_vDisplayCenterOfPersos( GLD_tdstViewportAttributes *p_stViewport, unsigned long ulDrawMask ) { static ACP_tdxHandleOfMaterial hCenterMaterial; ACP_tdxHandleOfTexture pCenterTexture; HIE_tdxHandleToSuperObject hCurrentSector, hPersoPrincipal, hCharacterSO; SECT_tdxHandleOfElementLstCharacter hCharacterElement; GEO_tdxHandleToMatrix hGlobalMatrix; GLI_tdstSpecificAttributesFor3D *p_st3DAtributes; POS_tdstCompletePosition matrix; GLI_tdstAligned2DVector a2_st2DVertex; GLI_tdstAligned3DVector a2_stVertex; MTH3D_tdstVector p; register int i; register float near1; /**** First time ****/ if(!bDisplayCenterInitIsDone) { GLI_xCreateMaterial(&hCenterMaterial); GLI_xLoadTexture(&pCenterTexture, NULL, "center.bmp", 0, 0); if (pCenterTexture) { TEX_vSetTextureQualityLevel(pCenterTexture,(char)TEX_C_QHIGH); } GLI_vEndofGeometricLoad(); GLI_xSetMaterialTexture(hCenterMaterial,pCenterTexture); bDisplayCenterInitIsDone = TRUE; } /* Point to the current sector where is the character*/ hCurrentSector = fn_h_SectInfoGetCurrentSector( M_GetMSHandle( MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode() ), SectInfo ) ); hPersoPrincipal = MC_fn_hGetCharacterInMainCharacterNode(MC_fn_hGetFirstMainCharNode() ); /* Find all characters in the current sector of the list*/ SECT_M_ForEachCharListInSector(hCurrentSector, hCharacterElement, i) { /* Get character in the list*/ hCharacterSO = SECT_GetCharacterInList( hCharacterElement ); hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(hCharacterSO); POS_fn_vGetTranslationVector(hGlobalMatrix, &p); p_st3DAtributes = (GLI_tdstSpecificAttributesFor3D*)(p_stViewport->p_vSpecificToXD); GLI_xGetCameraMatrix(p_st3DAtributes->p_stCam, &matrix); GLI_xSerialLinearOp(1, &p, &a2_stVertex, &matrix); GLI_xSerialProjection(p_st3DAtributes->p_stCam, 1, &a2_stVertex, &a2_st2DVertex); near1 = (float)p_st3DAtributes->p_stCam->xNear; p_st3DAtributes->p_stCam->xNear += 0.01f; GLI_vDraw2DSprite(p_stViewport, a2_st2DVertex.xX-5, a2_st2DVertex.xX + 5, a2_st2DVertex.xY-5, a2_st2DVertex.xY + 5, hCenterMaterial); p_st3DAtributes->p_stCam->xNear = near1; } } #endif /* RETAIL */ #endif /* }ENDANNECY CG*/ /*----------------------------------------------------------------------------- * Description : Display All Objects in Main Viewport *----------------------------------------------------------------------------- * Input : none * Output : none *----------------------------------------------------------------------------- * Creation date : 26/08/96 Author : Christophe *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ #ifdef U64 extern int SCREEN_HT; #endif void fn_vDisplayAll() { PRF_fn_vStartChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvSendToList ); #ifdef U64 PRF_fn_vStartChrono( PRF_C_ulFctDisplay, PRF_C_pvDisplaySendToList ); #endif #if !defined(PRESS_DEMO) #if !defined(U64) && defined(_DEBUG) if (g_ucSlowDownEngine) { char szText[255]; sprintf( szText, "[A] Slowdown engine : %d" , g_ucSlowDownTime); DisplayPolices( (char *)szText, 280, 450 ); } #endif #if defined(_DEBUG) /*--- Displaying Waypoints ---*/ if( g_ucDisplayWaypoints == 1 ) WP_SendWaypointsToViewport( &g_stEngineStructure.stViewportAttr, g_stEngineStructure.ulDisplayMode ); /*ANNECY CG DISPLAY ACTIVATED GENDOORS 16/06/98 {*/ /*--- Displaying Activated Gendoors ---*/ #ifndef RETAIL if(g_ucDisplayActivatedGendoors) { fn_vDisplayActivatedGendoors( &g_stEngineStructure.stViewportAttr, g_stEngineStructure.ulDisplayMode ); } #endif /* } ENDANNECY CG 16/06/98*/ /*--- Display center of perso ---*/ #ifndef RETAIL if(g_ucDisplayCenters) { fn_vDisplayCenterOfPersos( &g_stEngineStructure.stViewportAttr, g_stEngineStructure.ulDisplayMode ); } #endif #endif /*_DEBUG*/ #endif /* PRESS_DEMO */ GLI_xSendListToViewport(&g_stEngineStructure.stViewportAttr); #ifndef U64 if (!GLD_bWriteToViewportFinished(g_stEngineStructure.hGLDDevice, g_stEngineStructure.hGLDViewport)) M_GameFatalError(E_uwGameCantWriteToViewPortFinished); #endif #if !defined(PRESS_DEMO) #if !defined(U64) && defined(_DEBUG) if ( g_ucDisplayRayTraceSegments ) { int i; /* push the camera matrix*/ POS_tdstCompletePosition stMatrix; GLI_xGetCameraMatrix(((GLI_tdstSpecificAttributesFor3D*)(g_stEngineStructure.stViewportAttr.p_vSpecificToXD))->p_stCam,&stMatrix); GLI_xLoadMatrix(&stMatrix); /*loop over the recorded segments and draw them, then clear the segment list!*/ for ( i = 0; i < 30; i ++ ) if ( g_wRayTraceSegmentLife[i] ) { g_wRayTraceSegmentLife[i] --; GLI_xDraw3DLine16( &g_stEngineStructure.stViewportAttr, &g_stRayTraceSegmentOrigin[i], &g_stRayTraceSegmentEnd[i], 0xFFFFFFFF ); } GLI_xPopMatrix(); GLI_vDisplayPolices( "[H] Display Raytrace", 450, 420 ); } #endif /* !U64 && _DEBUG */ #endif /* PRESS_DEMO */ fn_vDisplayFix(); #if !defined(PRESS_DEMO) #ifdef WIN32 #ifndef RETAIL { static MTH3D_tdstVector stTopLeft = { 0.0685f, 0.125f, 0 };/* = { 0.067f, 0.067f, 0 };*/ static MTH3D_tdstVector stBottomRight = { 1.0f-0.0684f, 1.0f-0.0625f, 0 };/*= { 0.934f, 0.937f, 0 };*/ static char cDisplayRectangle = 0; static char cColor = 0; static unsigned long aul_Color[5] = { 0xFFFFFFFF , 0xFF0000, 0xFF00, 0xFF, 0 }; if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hDisplayTextOverScanLimit)==IPT_C_TRUE) { if (IPT_fn_bIsJustValidated(g_st_3DOS_EntryActions.hAltDisplayTextOverScanLimit)==IPT_C_TRUE) cColor = (char) ((cColor + 1) % 5); else cDisplayRectangle = (char) ~cDisplayRectangle; } if (cDisplayRectangle) GLI_fnv_DrawRectangle( &g_stEngineStructure.stViewportAttr, &stTopLeft, &stBottomRight, aul_Color[cColor] ); } #endif /* RETAIL */ #endif /* WIN32 */ #endif /* PRESS_DEMO */ #if defined(U64) && ( (defined(USE_PROFILER) && !defined(PRESS_DEMO)) || defined(_U64_GLI_BENCH_) ) GLD_bDisplayRastersForDeviceWithNoLock(&g_stEngineStructure.stViewportAttr, /*g_stEngineStructure.hGLDDevice*/NULL); #endif /*--- Infos display ---*/ #if !defined(PRESS_DEMO) CAM_vDisplayInfo(); PRF_fn_vStopChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvSendToList ); PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL ); #endif /* PRESS_DEMO */ #if !defined(RETAIL) || defined(FINAL_VERSION_FOR_TESTERS) if ( g_cChooseLevel > -1 ) { char szString[100]; sprintf( szString, "Change To Map : %s", g_stEngineStructure.a_szLevelName[ g_cChooseLevel ] ); #if !defined(U64) #ifndef RETAIL GLI_vDisplayPolices( (unsigned char *) szString, 0, 0 ); #endif #else GLI_vPrintGuruError( SCREEN_HT-40 ,(unsigned char *)szString ); #endif /* U64 */ } #endif /* !defined(RETAIL) || defined(FINAL_VERSION_FOR_TESTERS) */ /* Oliv' - 01/07/1998 - Who moved this ???? Arrrggg !!!*/ #if defined(U64) PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL ); if (!GLD_bWriteToViewportFinished(NULL,NULL)) M_GameFatalError(E_uwGameCantWriteToViewPortFinished); PRF_fn_vStartChrono( PRF_C_ulFctMainMisc, NULL ); #endif /* U64 */ /* EndOfOliv'*/ /* Oliv' - 19/05/1999 - I want to see Zdx too */ #if defined(_U64_GLI_BENCH_) if( g_ucZDCVisible ) GLI_vPrintGuruError( SCREEN_HT-60, (unsigned char *) g_szZoneTypes[g_ucZDCVisible-1] ); #endif /* _U64_GLI_BENCH_ */ /* EndOfOliv'*/ #if !defined(PRESS_DEMO) #if defined(_DEBUG) #ifndef RETAIL if( g_ucZDCVisible ) GLI_vDisplayPolices( (unsigned char *) g_szZoneTypes[g_ucZDCVisible-1], 560, 10); #endif /*RETAIL*/ /* if( g_ucWhatDoIDisplay ) GLI_vDisplayPolices( (unsigned char *) g_szDisplayTypes[g_ucWhatDoIDisplay-1], 260, 10); */ #ifndef RETAIL if( g_ucSCTDisplaySectors ) { SECT_vDisplaySectorInfos(); #if defined(GAM_USE_SCRIPT) if( g_ucSCTDisplaySectors == 3 ) { unsigned int Pos = 0; struct tdstEngineObject_ *Pointer; long j = 0; char szInfos[ 255 ]; while(Pos < g_st3DOSLinkTable.stCharacter.stLinkArray.uiNumValues) { if(g_st3DOSLinkTable.stCharacter.stLinkArray.d_stDynArray[Pos].eState != SCR_EDAS_DyAr_Free) { Pointer = (struct tdstEngineObject_ *) ((SCR_tdst_Link_Value *)(g_st3DOSLinkTable.stCharacter.stLinkArray.d_stDynArray[Pos].d_vElement))->ulValue; if(Pointer->h_StandardGame) { if(/*M_ObjectIsActive(Pointer) || */M_ObjectIsAlreadyTreated(Pointer)) { sprintf( szInfos, "[%i] %s", j+1, 1+strrchr( ((SCR_tdst_Link_Value *) (g_st3DOSLinkTable.stCharacter.stLinkArray.d_stDynArray[Pos].d_vElement))->p_szKey ,':')); GLI_vDisplayPolices( (unsigned char *) szInfos, 150, 50 + 20*j); j++; } } } (Pos)++; } } #endif } #endif /* RETAIL */ #endif /*_DEBUG*/ PRF_fn_vStopChrono( PRF_C_ulFctMainMisc, NULL ); PRF_fn_vStartChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvSendToList ); #endif /* PRESS_DEMO */ #if defined(WIN32) GLI_fn_vShowFrameRate( &g_stEngineStructure.stViewportAttr ); ReleaseSemaphore(g_stEngineStructure.hDrawSem,1,NULL); GLD_bEndWriteToDevice( g_stEngineStructure.hGLDDevice ); #endif ./* WIN32 */ PRF_fn_vStopChrono( PRF_C_ulFctDisplaySpecific, PRF_C_pvSendToList ); } /*----------------------------------------------------------------------------- * Description : get nb perso activable in the sector *----------------------------------------------------------------------------- * Input : Sector * Output : Nb Perso Activable *----------------------------------------------------------------------------- * Creation date : 04/03/98 Author : Carlos Torres *---------------------------------------------------------------------------*/ long GAM_fn_lGetNbPersoActivableInSector(HIE_tdxHandleToSuperObject hSector) { long lNbPerso=0; SECT_tdxHandleOfElementLstCharacter hCharacterList; int i; /* Look in character list*/ SECT_M_ForEachCharListInSector(hSector,hCharacterList,i) { if( M_ObjectIsActivable((struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(SECT_GetCharacterInList(hCharacterList))) ) lNbPerso++; } return lNbPerso; } /*----------------------------------------------------------------------------- * Description : get nb perso active * a Perso is active if it is in an active(or associated) sector and * if it is activable *----------------------------------------------------------------------------- * Output : Nb Perso Active *----------------------------------------------------------------------------- * Creation date : 04/03/98 Author : Carlos Torres *---------------------------------------------------------------------------*/ long GAM_fn_lGetNbPersoActive() { long lNbPerso; HIE_tdxHandleToSuperObject hActiveSector; SECT_tdxHandleOfElementLstActivityInteraction hActivityList; int i; /* Get Active Sector*/ hActiveSector=fn_h_SectInfoGetCurrentSector(M_GetMSHandle(MC_fn_hGetCharacterInMainCharacterNode( MC_fn_hGetFirstMainCharNode()),SectInfo)); /* get nb perso in active sector*/ lNbPerso = GAM_fn_lGetNbPersoActivableInSector(hActiveSector); /* get nb perso in associated sector*/ SECT_M_ForEachActivityNodeInActivityInteractionList(hActiveSector,hActivityList,i) { lNbPerso += GAM_fn_lGetNbPersoActivableInSector(SECT_GetSectorInActivityList(hActivityList)); } return lNbPerso; } /*----------------------------------------------------------------------------- * Description : check if a character is active * a Perso is active if it is active or already treated *----------------------------------------------------------------------------- * Output : Boolean *----------------------------------------------------------------------------- * Creation date : 04/03/98 Author : Carlos Torres *---------------------------------------------------------------------------*/ unsigned char GAM_fn_bIsCharacterActive(HIE_tdxHandleToSuperObject hSuperObj) { /*return (unsigned char)(M_ObjectIsActive(M_GetEngineObject(hSuperObj)) || M_ObjectIsAlreadyTreated(M_GetEngineObject(hSuperObj)));*/ return (unsigned char) ( ((HIE_fn_hGetSuperObjectFather(hSuperObj)==gp_stDynamicWorld) || (HIE_fn_hGetSuperObjectFather(HIE_fn_hGetSuperObjectFather(hSuperObj))==gp_stDynamicWorld)) && M_ObjectIsActive(M_GetEngineObject(hSuperObj)) ); } /*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------- * Description : * *----------------------------------------------------------------------------- * Output : *----------------------------------------------------------------------------- * Creation date : 04/03/98 Author : *---------------------------------------------------------------------------*/ void fn_vClearDynamicHierarchy(HIE_tdxHandleToSuperObject _hSOCurrentSector) { HIE_tdxHandleToSuperObject hCharacter,hNextCharacter; HIE_tdxHandleToSuperObject hChildSector; SECT_tdxHandleOfElementLstActivityInteraction hActivityList; long i; char cCounter; HIE_M_ForEachMovingChildOf(gp_stDynamicWorld,hCharacter,hNextCharacter,i) { if( ( HIE_fn_ulGetSuperObjectType(hCharacter)==HIE_C_ulActor ) && !CAM_fn_bSuperObjectIsACamera(hCharacter) ) { HIE_fn_vIsolate(hCharacter); if( fn_ucStandardGameGetPlatFormType(M_GetMSHandle(hCharacter,StandardGame))!=0 ) { HIE_fn_vSuperObjectAddHead(gp_stInactiveDynamicWorld,hCharacter); } else { HIE_fn_vSuperObjectAddTail(gp_stInactiveDynamicWorld,hCharacter); } /*M_UnactivateObject((struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hCharacter));*/ } } /**/ if(_hSOCurrentSector) { cCounter = (char)g_stEngineStructure.stEngineTimer.ulTrameNumber; SECT_vSetCounterInSector( _hSOCurrentSector , cCounter ); /**/ SECT_M_ForEachActivityNodeInActivityInteractionList(_hSOCurrentSector,hActivityList,i) { hChildSector = SECT_GetSectorInActivityList(hActivityList); SECT_vSetCounterInSector( hChildSector , cCounter ); } } } /*----------------------------------------------------------------------------- * Description : * *----------------------------------------------------------------------------- * Output : *----------------------------------------------------------------------------- * Creation date : 04/03/98 Author : * Modif 19/11/98 : stop sound when perso is desactivated - Carlos Torres *---------------------------------------------------------------------------*/ void fn_vDesinitInactivePerso() { HIE_tdxHandleToSuperObject hCharacter,hChild; long i,j; HIE_M_ForEachChildOf(gp_stInactiveDynamicWorld,hCharacter,i) { if (M_ObjectIsActive((struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hCharacter))) { if( fn_ucStandardGameGetPlatFormType(M_GetMSHandle(hCharacter,StandardGame))!=0 ) { HIE_M_ForEachChildOf(hCharacter,hChild,j) { if (HIE_fn_ulGetSuperObjectType(hChild) == HIE_C_ulActor) { PLA_fn_vDesInitAllChildOfCharacter(hChild,(struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hChild)); M_UnactivateObject((struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hChild)); SND_fn_vKillObjectSound2((long)hChild,g_lSoundObjectTypeAnim); } } } PLA_fn_vDesInitAllChildOfCharacter(hCharacter,(struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hCharacter)); M_UnactivateObject((struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hCharacter)); SND_fn_vKillObjectSound2((long)hCharacter,g_lSoundObjectTypeAnim); } } } /*----------------------------------------------------------------------------- * Description : * *----------------------------------------------------------------------------- * Output : *----------------------------------------------------------------------------- * Creation date : 04/03/98 Author : *---------------------------------------------------------------------------*/ void fn_vInsertActorInDynamicHierarchy(HIE_tdxHandleToSuperObject _hCharacter, ACP_tdxBool _bNewInsert) { /*unsigned long ulCurrentBits;*/ struct tdstEngineObject_* p_stObject; p_stObject = (struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(_hCharacter); /* ANNECY MT - 18/09/98 {*/ if( M_ObjectIsActivable(p_stObject) && ( ( _bNewInsert /* sector becomes active*/ && ( !fn_bf1StandardGameGetIsDesactivateAtAll(p_stObject->h_StandardGame) /* actor alive*/ || (fn_eStandardGameGetInitFlagWhenDeadOrTaken(p_stObject->h_StandardGame) < OI_WhenPlayerIsDead) /* reinit 'always' or 'OutOfzone'*/ ) ) || /* sector already active*/ ( !fn_bf1StandardGameGetIsDesactivateAtAll(p_stObject->h_StandardGame) /* actor alive*/ ) ) ) /* END ANNECY MT }*/ { if( HIE_fn_hGetSuperObjectFather(_hCharacter) == gp_stInactiveDynamicWorld ) { if( fn_ucStandardGameGetPlatFormType(M_GetMSHandle(_hCharacter,StandardGame))!=0 ) { HIE_fn_vSuperObjectAddHead(gp_stDynamicWorld,_hCharacter); } else { HIE_fn_vSuperObjectAddTail(gp_stDynamicWorld,_hCharacter); } M_ActivateObject(p_stObject); if( _bNewInsert ) { MS_tdxHandleToStandardGame hStdGame = M_GetMSHandle(_hCharacter,StandardGame); /* ANNECY MT - 11/03/99 { */ /* fn_vStandardGameSetCustomBits(hStdGame, fn_ulStandardGameGetCustomBits(hStdGame) & ~GAM_C_CustBitOutOfVisibility); */ fn_vStandardGameSetCustomBits(hStdGame, fn_ulStandardGameGetCustomBits(hStdGame) | GAM_C_CustBitOutOfVisibility); /* END ANNECY MT } */ } } } } /*----------------------------------------------------------------------------- * Description : * *----------------------------------------------------------------------------- * Output : *----------------------------------------------------------------------------- * Creation date : 04/03/98 Author : *---------------------------------------------------------------------------*/ void fn_vFillDynamicHierarchy(HIE_tdxHandleToSuperObject _hSOCurrentSector, ACP_tdxBool _bInit) { long i,j; SECT_tdxHandleOfElementLstCharacter hCharacterList; SECT_tdxHandleOfElementLstActivityInteraction hActivityList; HIE_tdxHandleToSuperObject hCharacter; HIE_tdxHandleToSuperObject hChildSector; tdxHandleToAlwaysActiveCharacterNode hCharAlwaysActiveNode; HIE_tdxHandleToSuperObject *p_hGenerator; HIE_tdxHandleToSuperObject *p_hLastGenerator; ACP_tdxIndex xIndex , xIndexMax; char cCounter; ACP_tdxBool bNewSector; cCounter = (char)g_stEngineStructure.stEngineTimer.ulTrameNumber; /* add actors on actived sectors*/ bNewSector = (ACP_tdxBool) (_bInit || ( SECT_cGetCounterInSector(_hSOCurrentSector) != cCounter )); SECT_M_ForEachCharListInSector(_hSOCurrentSector,hCharacterList,i) { hCharacter = SECT_GetCharacterInList(hCharacterList); fn_vInsertActorInDynamicHierarchy(hCharacter , bNewSector); } /* treat actived sectors*/ SECT_M_ForEachActivityNodeInActivityInteractionList(_hSOCurrentSector,hActivityList,i) { hChildSector = SECT_GetSectorInActivityList(hActivityList); bNewSector = (ACP_tdxBool) (_bInit || ( SECT_cGetCounterInSector(hChildSector) != cCounter )); SECT_M_ForEachCharListInSector(hChildSector,hCharacterList,j) { hCharacter = SECT_GetCharacterInList(hCharacterList); fn_vInsertActorInDynamicHierarchy(hCharacter , bNewSector); } } /* add always actived actors*/ M_ForEachAlwaysActiveCharacterNode(hCharAlwaysActiveNode,i) { hCharacter = fn_hGetCharacterInAlwaysActiveCharacterNode(hCharAlwaysActiveNode); fn_vInsertActorInDynamicHierarchy(hCharacter , _bInit); } /* add always*/ hCharacter = g_stAlways.d_stAlwaysSuperObject; p_hGenerator = g_stAlways.d_hAlwaysGenerator; p_hLastGenerator = p_hGenerator + g_stAlways.ulMaxNumberOfAlways; for( ; p_hGenerator < p_hLastGenerator; hCharacter++, p_hGenerator++ ) { if( M_GetMSHandle(hCharacter, StandardGame) ) { bNewSector = (ACP_tdxBool) (_bInit || ( M_GetMSHandle(hCharacter,SectInfo) && fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hCharacter,SectInfo)) && (SECT_cGetCounterInSector(fn_h_SectInfoGetCurrentSector(M_GetMSHandle(hCharacter,SectInfo))) != cCounter) )); fn_vInsertActorInDynamicHierarchy(hCharacter , bNewSector); } } /* add fix*/ xIndexMax = HIE_fn_xGetNumberOfElementInFixViewport () ; for ( xIndex=0 ; xIndex