/*========================================================================= * LoadFml.cpp : This module contain all functions used to load * a family type, this states, and all over * This is a part of the Game project. * * Version 1.0 * Creation date 28/08/96 * Revision date * * That file needs to be compatible for all platforms. * * (c) Ubi Studios 1996 *=======================================================================*/ #if defined (WIN32) #include #endif /* WIN32 */ #define D_State_Define #define D_ObjsTbls_Define #include "ToolsCPA.h" #include "structur\ObjsTbls.h" #include "Options/Options.h" #include "Macros.h" #include "Actions/AllActs.h" #include "Structur/3DOSLkTb.h" #include "Structur/Objects.h" #include "Structur/ErrGame.h" #include "Structur/GameScpt.h" #include "Structur/MemGame.h" #include "Structur/StdObjSt.h" #include "Structur/EngMode.h" #include "PlayAnim/PLA_dbg.h" #include "Structur/State.h" #include "Structur/Anim_s.h" #include "LoadLvl.h" #include "Basic.h" #include "Family.h" #include "LoadAni.h" #include "LoadFml.h" #include "ObjType.h" #include "ZeMem.h" /* AR 971006 */ extern ACP_tdxBool g_xA3bOff; #include "Structur/ObjsTbls.h" #include "TBLLoad.h" #include "CHLLoad.h" #include "ChanList.h" /* anim interpolated*/ #include "PlayAnim/Interpol/a3x_mem.h" #include "PlayAnim/Interpol/a3x_intn.h" #include "PlayAnim/Interpol/a3x_load.h" #define _USE_BINARY_ANIM_BUFFER #define MAX_FAMILY_ELEMENT_SIZE 128*1024 #define C_szConvertA3dToA3i "MakeAnim" /*----------------------------------------------------------------------------- * Description : Callback script function *----------------------------------------------------------------------------- * Input : family type * Output : void *----------------------------------------------------------------------------- * Creation date : 16/10/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : 26/05/97 Modification Author : Sebastien DAVID (Gizmo) * Modifications : *---------------------------------------------------------------------------*/ void fn_vLoadFamily(struct tdstFamilyList_ *p_stFamily) { char szFileName[_MAX_PATH]; tdxHandleToState h_State; // Shaitan => state list in the level /* tdxHandleToTransition h_Transition; tdxHandleToProhibit h_Prohibit; char szSectionPreName[_MAX_PATH]; */ // End Shaitan => state list in the level char szSectionName[_MAX_PATH]; SCR_tdst_Link_Value * _p_stLinkValue; long i,j; SCR_tdst_Cxt_Values *p_stVal; tdxHandleToObjectsTablesList hObjectsTable; /* MR1508*/ /*// load of the default Objects table for this family sprintf(szFileName,"%s\\%s.tbl",fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType),fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); if (SCR_fn_c_RdL0_IsSectionExists(szFileName)) { strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szFileName); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&TBL_g_stLinkTable,szSectionName); if(_p_stLinkValue == NULL) { p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal); p_stFamily->h_DefaultObjectsTable = (tdxHandleToObjectsTablesList) SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); fn_vAddAnObjectsTablesInList( p_stFamily,p_stFamily->h_DefaultObjectsTable); } else { p_stFamily->h_DefaultObjectsTable = (tdxHandleToObjectsTablesList) SCR_M_ul_Link_GetValue(_p_stLinkValue); } } else { //M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadTargetState); }*/ /* load of the channel references for this family*/ sprintf(szFileName,"%s\\%s.chl",fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType),fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); if (SCR_fn_c_RdL0_IsSectionExists(szFileName)) { SCR_M_RdL0_SetContextLong(C_GrandChildContext, 0, (long)p_stFamily); SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal); } else { /*M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadTargetState);*/ } /* Begin AR971211 (Modifications to use compressed animations)*/ /* Load the bloc of positions if it exists*/ /* End AR971211*/ // Shaitan => state list in the level /**** try to load level states ****/ sprintf(szFileName,"%s\\%s\\Families\\%s\\%s.stl^%s", fn_szGetLevelsDataPath(), fn_p_szGetLevelName(), fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType), fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType), C_SectionCreateListOfState); if (SCR_fn_c_RdL0_IsSectionExists(szFileName)) { SCR_M_RdL0_SetContextLong(C_GrandChildContext, 0, (long)p_stFamily); SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal); } /**** load all states ****/ else { sprintf(szFileName,"%s\\%s.sta",fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType),fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); if (SCR_fn_c_RdL0_IsSectionExists(szFileName)) { SCR_M_RdL0_SetContextLong(C_GrandChildContext, 0, (long)p_stFamily); SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal); } } fn_vInitStateList(p_stFamily); /* // **** Load All states **** // sprintf(szFileName,"%s\\%s.sta",fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType),fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); if (SCR_fn_c_RdL0_IsSectionExists(szFileName)) { SCR_M_RdL0_SetContextLong(C_GrandChildContext, 0, (long)p_stFamily); SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal); LST2_M_StaticForEachElementOf(&p_stFamily->hForStateArray,h_State,i) { // * Init handle to NextState *********** // SCR_fn_v_RdL0_ComputeSectionName(szSectionPreName,szFileName,C_SectionCreateNewState,(char *)(h_State->h_NextState)); strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szSectionPreName); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&g_st3DOSLinkTable.stState,szSectionName); if(_p_stLinkValue != NULL) { MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); TMP_M_Free(h_State->h_NextState); h_State->h_NextState = (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue); } else { if( !strcmpi(C_szNoState,(char *)(h_State->h_NextState)) ) { MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); TMP_M_Free(h_State->h_NextState); h_State->h_NextState = NULL; /* NoState_EndOfAction* / } else { M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadNextState); } } /* ************************************ / /* Init All handles To Transitions **** / LST2_M_StaticForEachElementOf(&h_State->hForTransitionArray,h_Transition,j) { /* Target State* / SCR_fn_v_RdL0_ComputeSectionName(szSectionPreName,szFileName,C_SectionCreateNewState,(char *)(h_Transition->h_TargetState)); strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szSectionPreName); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&g_st3DOSLinkTable.stState,szSectionName); MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); TMP_M_Free(h_Transition->h_TargetState); if(_p_stLinkValue != NULL) { h_Transition->h_TargetState = (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue); } else { M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadTargetState); } /* State To Go* / SCR_fn_v_RdL0_ComputeSectionName(szSectionPreName,szFileName,C_SectionCreateNewState,(char *)(h_Transition->h_StateToGo)); strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szSectionPreName); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&g_st3DOSLinkTable.stState,szSectionName); MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); TMP_M_Free(h_Transition->h_StateToGo); if(_p_stLinkValue != NULL) { h_Transition->h_StateToGo = (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue); } else { M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadStateToGo); } } /* ************************************ / /* Init All handles To Prohibited States **** / LST2_M_StaticForEachElementOf(&h_State->hForProhibitArray,h_Prohibit,j) { /* Prohibited State* / SCR_fn_v_RdL0_ComputeSectionName(szSectionPreName,szFileName,C_SectionCreateNewState,(char *)(h_Prohibit->h_ProhibitedState)); strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szSectionPreName); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&g_st3DOSLinkTable.stState,szSectionName); MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); TMP_M_Free(h_Prohibit->h_ProhibitedState); if(_p_stLinkValue != NULL) { h_Prohibit->h_ProhibitedState = (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue); } else { M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadTargetState); } } } } */ // End Shaitan => state list in the level // Shaitan => module list in the level /* load of the module list of the family */ sprintf(szFileName,"%s\\%s\\Families\\%s\\%s.otl^%s", fn_szGetLevelsDataPath(), fn_p_szGetLevelName(), fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType), fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType), C_SectionCreateListOfPOs); if (SCR_fn_c_RdL0_IsSectionExists(szFileName)) { SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal); p_stFamily->ucOptimized = 1; } else { p_stFamily->ucOptimized = 0; } // End Shaitan => module list in the level /* load of the default Objects table for this family*/ sprintf(szFileName,"%s\\%s.tbl",fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType),fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); if (SCR_fn_c_RdL0_IsSectionExists(szFileName)) { strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szFileName); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&TBL_g_stLinkTable,szSectionName); if(_p_stLinkValue == NULL) { // Shaitan => module list in the level SCR_M_RdL0_SetContextLong(C_GrandChildContext, 1, (long)p_stFamily); // End Shaitan => module list in the level p_stVal = SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal); p_stFamily->h_DefaultObjectsTable = (tdxHandleToObjectsTablesList) SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0); fn_vAddAnObjectsTablesInList( p_stFamily,p_stFamily->h_DefaultObjectsTable); } else { p_stFamily->h_DefaultObjectsTable = (tdxHandleToObjectsTablesList) SCR_M_ul_Link_GetValue(_p_stLinkValue); } } else { /*M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadTargetState);*/ } /* init event of anim with TBL */ LST2_M_StaticForEachElementOf(&p_stFamily->hForStateArray,h_State,i) { if (fn_p_stGetAnimInState(h_State)) GAM_fn_vUpdateEventArrayOfAnimation(fn_p_stGetAnimInState(h_State),p_stFamily->h_DefaultObjectsTable); } /* CGHT 14/05/97*/ /**** Load Bounding Volume ****/ sprintf(szFileName,"%s\\%s.bdv",fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType),fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); if (SCR_fn_c_RdL0_IsSectionExists(szFileName)) { SCR_M_RdL0_SetContextLong(C_GrandChildContext, 0, (long)p_stFamily); SCR_fnp_st_RdL0_AnalyseSection(szFileName, SCR_CDF_uw_Anl_Normal); } /* MR1508*/ LST2_M_StaticForEachElementOf(&p_stFamily->hForObjectsTablesList,hObjectsTable,i) { for (j=0;jwNumberOfElement;j++) { char szFamily[255],*szChannel; SCR_tdst_Link_Value * _p_stLinkValue; if ( ( (hObjectsTable->d_stObjectsTable[j].wTypeOfTarget==C_wTdO_PhysicalObject) || (hObjectsTable->d_stObjectsTable[j].wTypeOfTarget==C_wTdO_Mirror) ) && (hObjectsTable->d_stObjectsTable[j].uwChannelNumber!=255) ) { szChannel=(char *)(hObjectsTable->d_stObjectsTable[j].uwChannelNumber); strcpy(szFamily,fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); strcat(szFamily,"-"); strcat(szFamily,szChannel); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&CHL_g_stLinkTable,szFamily); if(_p_stLinkValue) { hObjectsTable->d_stObjectsTable[j].uwChannelNumber = (unsigned long)SCR_M_ul_Link_GetValue(_p_stLinkValue); } else { hObjectsTable->d_stObjectsTable[j].uwChannelNumber = (unsigned short)C_ucUnknownChannel; } MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeTBLElement , hObjectsTable ); TMP_M_Free(szChannel); } } } /* End MR1508*/ } // Shaitan => state list in the level /*----------------------------------------------------------------------------- * Description : init state list *----------------------------------------------------------------------------- * Input : family type * Output : void *-----------------------------------------------------------------------------*/ void fn_vInitStateList (struct tdstFamilyList_ *p_stFamily) { char szFileName[_MAX_PATH]; tdxHandleToState h_State; tdxHandleToTransition h_Transition; tdxHandleToProhibit h_Prohibit; char szSectionName[_MAX_PATH]; char szSectionPreName[_MAX_PATH]; SCR_tdst_Link_Value * _p_stLinkValue; long i,j; sprintf(szFileName,"%s\\%s.sta",fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType),fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); LST2_M_StaticForEachElementOf(&p_stFamily->hForStateArray,h_State,i) { /* Init handle to NextState ***********/ char szStateName[_MAX_PATH]; char *p_szStateName; if (h_State->h_NextState) { strcpy(szStateName, (char *)(h_State->h_NextState)); #ifdef _DEBUG_STRING_FOR_PLA_ p_szStateName = strstr(szStateName," - "); if (p_szStateName) strcpy(szStateName, p_szStateName + 3); #endif SCR_fn_v_RdL0_ComputeSectionName(szSectionPreName,szFileName,C_SectionCreateNewState,szStateName); strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szSectionPreName); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&g_st3DOSLinkTable.stState,szSectionName); if(_p_stLinkValue != NULL) { if (h_State->h_NextState != (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue)) { MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); TMP_M_Free(h_State->h_NextState); h_State->h_NextState = (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue); } } else { if( !strcmpi(C_szNoState,szStateName) ) { MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); TMP_M_Free(h_State->h_NextState); h_State->h_NextState = NULL; /* NoState_EndOfAction*/ } else { /* TMP_M_Free(h_State->h_NextState);*/ M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadNextState); } } } /* ************************************/ /* Init All handles To Transitions ****/ LST2_M_StaticForEachElementOf(&h_State->hForTransitionArray,h_Transition,j) { char szTargetName[_MAX_PATH]; char *p_szTargetName; /* Target State*/ strcpy(szTargetName, (char *)(h_Transition->h_TargetState)); #ifdef _DEBUG_STRING_FOR_PLA_ p_szTargetName = strstr(szTargetName," - "); if (p_szTargetName) strcpy(szTargetName, p_szTargetName + 3); #endif SCR_fn_v_RdL0_ComputeSectionName(szSectionPreName,szFileName,C_SectionCreateNewState,szTargetName); strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szSectionPreName); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&g_st3DOSLinkTable.stState,szSectionName); if(_p_stLinkValue != NULL) { if (h_Transition->h_TargetState != (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue)) { MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); TMP_M_Free(h_Transition->h_TargetState); h_Transition->h_TargetState = (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue); } } else { // Shaitan => state list in the level // TMP_M_Free(h_Transition->h_TargetState); // h_Transition->h_TargetState = NULL; // M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadTargetState); // End Shaitan => state list in the level } /* State To Go*/ strcpy(szTargetName, (char *)(h_Transition->h_StateToGo)); #ifdef _DEBUG_STRING_FOR_PLA_ p_szTargetName = strstr(szTargetName," - "); if (p_szTargetName) strcpy(szTargetName, p_szTargetName + 3); #endif SCR_fn_v_RdL0_ComputeSectionName(szSectionPreName,szFileName,C_SectionCreateNewState,szTargetName); strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szSectionPreName); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&g_st3DOSLinkTable.stState,szSectionName); if(_p_stLinkValue != NULL) { if (h_Transition->h_StateToGo != (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue)) { MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); TMP_M_Free(h_Transition->h_StateToGo); h_Transition->h_StateToGo = (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue); } } else { // Shaitan => state list in the level // TMP_M_Free(h_Transition->h_StateToGo); // h_Transition->h_StateToGo = NULL; // M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadStateToGo); // End Shaitan => state list in the level } } /* ************************************/ /* Init All handles To Prohibited States ****/ LST2_M_StaticForEachElementOf(&h_State->hForProhibitArray,h_Prohibit,j) { char szTargetName[_MAX_PATH]; char *p_szTargetName; strcpy(szTargetName, (char *)(h_Prohibit->h_ProhibitedState)); #ifdef _DEBUG_STRING_FOR_PLA_ p_szTargetName = strstr(szTargetName," - "); if (p_szTargetName) strcpy(szTargetName, p_szTargetName + 3); #endif /* Prohibited State*/ SCR_fn_v_RdL0_ComputeSectionName(szSectionPreName,szFileName,C_SectionCreateNewState,szTargetName); strcpy(szSectionName,fn_szGetFamiliesDataPath()); strcat(szSectionName,"\\"); strcat(szSectionName,szSectionPreName); _p_stLinkValue = SCR_fnp_st_Link_SearchKey(&g_st3DOSLinkTable.stState,szSectionName); if(_p_stLinkValue != NULL) { if (h_Prohibit->h_ProhibitedState != (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue)) { MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); TMP_M_Free(h_Prohibit->h_ProhibitedState); h_Prohibit->h_ProhibitedState = (tdxHandleToState)SCR_M_ul_Link_GetValue(_p_stLinkValue); } } else { // Shaitan => state list in the level // M_GameFatalError(E_uwGameScriptCallBackCreateNewStateBadTargetState); // Shaitan => state list in the level } } } } // End Shaitan => state list in the level // Shaitan => module list in the level /*----------------------------------------------------------------------------- * Description : find indexes used in the animations *----------------------------------------------------------------------------- * Input : * Output : *-----------------------------------------------------------------------------*/ void fn_vFindUsedIndexes(short *wArrayOfIndexes, short wMaxElements, struct tdstAnim3d_ *p_stAnim, MS_tdxHandleTo3dData h_3dData) { struct tdstFrame3d_ *p_stCurrentFrame3d; struct tdstElement3d_ *p_stCurrentElement3d; unsigned short uwCurrentFrame; unsigned char ucElement; // check each frame of the animation for (uwCurrentFrame=0; uwCurrentFrameuwNumberOfFrames; uwCurrentFrame++) { // get current frame p_stCurrentFrame3d = fn_p_st3dDataGetCurrentFrame(h_3dData); fn_vAllocArrayOfElts3d (h_3dData , p_stAnim->ucMaxNumberOfElements); p_stCurrentFrame3d->p_stAnim = NULL; fn_vUpdateFrame(NULL,p_stCurrentFrame3d, p_stAnim, uwCurrentFrame); // check each element for (ucElement=0; ucElementucMaxNumberOfElements; ucElement++) { p_stCurrentElement3d = &(p_stCurrentFrame3d->p_stArrayOfElts3d[ucElement]); if (p_stCurrentElement3d && p_stCurrentElement3d->wElement < wMaxElements) wArrayOfIndexes[p_stCurrentElement3d->wElement] = 1; } fn_vFreeArrayOfElts3d (h_3dData); } } // End Shaitan => module list in the level void fn_vCheckObjectsTables(struct tdstEngineObject_ *p_stEngineObject) { #ifdef _DEBUG struct tdstFamilyList_ *p_stFamily = fn_h3dDataGetFamily(p_stEngineObject->h_3dData); char *p_szFileName; tdxHandleToState h_State; long i; FILE *p_stFile; struct tdstAnim3d_ *p_stCurrentAnim; struct tdstFrame3d_ *p_stCurrentFrame3d; struct tdstElement3d_ *p_stCurrentElement3d; unsigned short uwCurrentFrame; LST2_M_StaticForEachElementOf(&p_stFamily->hForStateArray,h_State,i) { static unsigned long ulFakeFrame= 5000; unsigned char ucElement; p_stCurrentAnim = h_State->p_stAnim; if(p_stCurrentAnim == NULL) continue; for(uwCurrentFrame=0;uwCurrentFrameuwNumberOfFrames;uwCurrentFrame++) { p_stCurrentFrame3d = fn_p_st3dDataGetCurrentFrame(p_stEngineObject->h_3dData); /* ANNECY MT - 22/09/98 {*/ /* if (p_stCurrentFrame3d->p_stArrayOfElts3d) { MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeAnimation , p_stEngineObject->h_3dData->h_Family); TMP_M_Free(p_stCurrentFrame3d->p_stArrayOfElts3d); p_stCurrentFrame3d->p_stArrayOfElts3d = NULL; } MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeAnimation , p_stEngineObject->h_3dData->h_Family); p_stCurrentFrame3d->p_stArrayOfElts3d = (tdstElement3d*)TMP_M_p_Malloc(sizeof(tdstElement3d) * p_stCurrentAnim->ucMaxNumberOfElements); memset(p_stCurrentFrame3d->p_stArrayOfElts3d,0,sizeof(tdstElement3d) * p_stCurrentAnim->ucMaxNumberOfElements); */ fn_vAllocArrayOfElts3d (p_stEngineObject -> h_3dData , p_stCurrentAnim->ucMaxNumberOfElements); /* END ANNECY MT }*/ p_stCurrentFrame3d->p_stAnim = NULL; fn_vUpdateFrame(NULL,p_stCurrentFrame3d,p_stCurrentAnim,uwCurrentFrame); /* p_stCurrentFrame3d = fn_p_GetFramesAddress(p_stCurrentAnim, uwCurrentFrame,ulFakeFrame++,NULL);*/ for(ucElement=0;ucElementucMaxNumberOfElements;ucElement++) { p_stCurrentElement3d = &(p_stCurrentFrame3d->p_stArrayOfElts3d[ucElement]); if(p_stCurrentElement3d==NULL) break; if(p_stCurrentElement3d->wElement>=fn_h3dDataGetCurrentObjectsTable(p_stEngineObject->h_3dData)->wNumberOfElement) continue; fn_h3dDataGetCurrentObjectsTable(p_stEngineObject->h_3dData)->d_stObjectsTable[p_stCurrentElement3d->wElement].wCounter++; } } /* ANNECY MT - 22/09/98 {*/ /* if (p_stCurrentFrame3d->p_stArrayOfElts3d) { MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeAnimation , p_stEngineObject->h_3dData->h_Family); TMP_M_Free(p_stCurrentFrame3d->p_stArrayOfElts3d); p_stCurrentFrame3d->p_stArrayOfElts3d = NULL; } */ fn_vFreeArrayOfElts3d (p_stEngineObject -> h_3dData); /* END ANNECY MT }*/ } if ((p_stFile = fopen("CHECKTBL.LOG","at"))!=NULL) { SCR_tdst_Link_Value *p_stLinkValue; int flag; p_stLinkValue=SCR_fnp_st_Link_SearchValue(&TBL_g_stLinkTable,(unsigned long)fn_h3dDataGetCurrentObjectsTable(p_stEngineObject->h_3dData)); if (p_stLinkValue!=NULL&&SCR_M_e_Link_GetState(p_stLinkValue)==SCR_ELS_Link_Initialized) { p_szFileName = (char *)SCR_M_p_sz_Link_GetKey(p_stLinkValue); flag = 0; if(fn_h3dDataGetCurrentObjectsTable(p_stEngineObject->h_3dData)) { unsigned short uwElement; for(uwElement=0;uwElementh_3dData)->wNumberOfElement;uwElement++) { if(fn_h3dDataGetCurrentObjectsTable(p_stEngineObject->h_3dData)->d_stObjectsTable[uwElement].h_Target!=NULL) { if(fn_h3dDataGetCurrentObjectsTable(p_stEngineObject->h_3dData)->d_stObjectsTable[uwElement].wCounter==0) { if(flag==0) fprintf(p_stFile,"%s\n",p_szFileName); fprintf(p_stFile,"Indice : %d inutilisé\n",uwElement+1); flag=1; } } } if(flag==1) fprintf(p_stFile,"\n\n"); } } fclose(p_stFile); } #endif } /*----------------------------------------------------------------------------- * Description : check a script version of the binary anim *----------------------------------------------------------------------------- * Output : boolean *----------------------------------------------------------------------------- * Creation date : 20/08/98 Author : Carlos Torres *---------------------------------------------------------------------------*/ int fn_bNoScriptVersion(char * szBinFileName) { char szScriptFileName[256]; strcpy(szScriptFileName,szBinFileName); szScriptFileName[strlen(szBinFileName)-1] = 'd'; return !FIL_fn_bIsFileExist(szScriptFileName); } /*----------------------------------------------------------------------------- * Description : Load an animation *----------------------------------------------------------------------------- * Input : ... * Output : void *----------------------------------------------------------------------------- * Creation date : 27/05/98 Author : Carlos Torres * Modif 30/07/98 : change general function's algo * and use a second data Directory - Carlos Torres * Modif 19/08/98 : Use of a third directory (jesus have play with our dir) - Carlos Torres * Modif 20/08/98 : rebuild A3i if a script file exist and not the bin File - Carlos Torres * Modif 26/08/98 : just take anim in Dir1 - Carlos Torres * Modif 28/08/98 : Check A3i File Version - Carlos Torres * Modif 01/09/98 : Hide the command window of makeAnim - Carlos Torres * Modif 07/09/98 : Change functiuon prototype - Carlos Torres *---------------------------------------------------------------------------*/ tdstAnim3d * fn_p_stLoadAnimationFile(char * szFileName,struct tdstFamilyList_ *p_stFamily) { char szInterpolAnimFileName[256]; FILE *p_xFile; /*char szCompleteScriptFileName[256];*/ /*FILETIME xScriptModifyTime;*/ /*DWORD dwScriptSize;*/ /*HANDLE hScriptFile;*/ unsigned long ulBinaryFileLength; char* p_cBinaryAnimBuffer; tdstAnim3d * p_stAnim; unsigned char bConversionDone=FALSE; char szInterpolAnimFileName1[256]; char * szTmp; HANDLE hScriptFile; unsigned long ulHigh; /* Build script file name */ /*strcpy(szCompleteScriptFileName,fn_szGetAnimDataPath()); strcat(szCompleteScriptFileName,"\\"); strcat(szCompleteScriptFileName,szFileName); strcat(szCompleteScriptFileName,".a3d");*/ /* then get the informations about the script file */ /*hScriptFile=CreateFile(szCompleteScriptFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hScriptFile!= INVALID_HANDLE_VALUE) { GetFileTime(hScriptFile,NULL,NULL,&xScriptModifyTime); dwScriptSize=GetFileSize(hScriptFile,NULL); CloseHandle(hScriptFile); } else { xScriptModifyTime.dwLowDateTime=0; xScriptModifyTime.dwHighDateTime=0; dwScriptSize=0; }*/ /*if (g_xA3bOff==FALSE) {*/ /* -----------------------------------------------------------------------*/ /* Search anim in link table*/ /* -----------------------------------------------------------------------*/ /* Build path 0*/ sprintf(szInterpolAnimFileName,"%s\\%s.a3i",fn_szGetAnimDataPath(),szFileName); /* Build path 1*/ szTmp = strchr(szInterpolAnimFileName,'\\'); sprintf(szInterpolAnimFileName1,"%s%s",gsz_Version,szTmp); p_stAnim=fn_p_stGetAnimIntoA3bLinkTable(szInterpolAnimFileName); /* anim not found in link table*/ if (!p_stAnim) { do { /* -----------------------------------------------------------------------*/ /* Open Anim File*/ /* -----------------------------------------------------------------------*/ p_xFile=fopen(szInterpolAnimFileName1,"rb"); /* file found in Path 1*/ if (p_xFile!=NULL) { #if !defined(U64) unsigned short uwVersion; fread(&uwVersion,2,1,p_xFile); /* Check A3i Version*/ if (uwVersion == A3i_Version) break; else { fclose(p_xFile); p_xFile = NULL; if (bConversionDone) { char szMessage[50]; sprintf(szMessage,"The Current version of MakeAnim(V%d.%02d%c) not correspond with the engine\nYou must have V%d.%02d%c\n", (uwVersion&0xF000)>>12,(uwVersion&0x0FF0)>>4,(uwVersion&0x000F)?'a'+(uwVersion&0x000F)-1:' ', (A3i_Version&0xF000)>>12,(A3i_Version&0x0FF0)>>4,(A3i_Version&0x000F)?'a'+(A3i_Version&0x000F)-1:' '); Erm_M_UpdateLastError( Game, C_ucErmDefaultChannel, E_uwGameErrorWhileLoadingAnimation, C_lErmNoDebugData,C_ucErmOpenInfoWindow, C_ucAllowStopForDebug,szMessage ); return NULL; } } #else break; #endif } /* -----------------------------------------------------------------------*/ /* Convert A3D File To A3i*/ /* -----------------------------------------------------------------------*/ if (!bConversionDone) { SCR_tdst_Link_Table* p_stAnimationLinkTable=NULL; SCR_tdst_Link_Value* p_stAnimationLinkTableValue=NULL; char szSystemCommand[256]; char *szTmp; szTmp = strrchr( szFileName, '\\' ); *(szTmp) = 0; sprintf(szSystemCommand,"%s %s",C_szConvertA3dToA3i,szFileName); *(szTmp) = '\\'; /* execute command hiding the window proccess*/ { STARTUPINFO stStartup; PROCESS_INFORMATION stProcessInfo; DWORD dwExitCode; /* set flags to hide the window*/ memset( &stStartup, 0, sizeof( STARTUPINFO ) ); stStartup.cb = sizeof( STARTUPINFO ); stStartup.dwFlags = STARTF_USESHOWWINDOW; stStartup.wShowWindow = SW_HIDE; if ( CreateProcess( NULL,szSystemCommand, NULL,NULL,FALSE,0,NULL,NULL,&stStartup,&stProcessInfo) ) { /* wait for the end of process*/ while ( 1 ) { if ( GetExitCodeProcess( stProcessInfo.hProcess, &dwExitCode ) == 0) break; if ( dwExitCode != STILL_ACTIVE ) break; Sleep(500); } } /* cretaion preocess Fail - try to launch a sytem command*/ else system(szSystemCommand); } /* set flag conversion done*/ bConversionDone = TRUE; } /* -----------------------------------------------------------------------*/ /* Conversion should fail*/ /* -----------------------------------------------------------------------*/ else { char szMessage[50]; sprintf(szMessage,"Anim [...]%s wasn't found in any Data Dir",szTmp); Erm_M_UpdateLastError( Game, C_ucErmDefaultChannel, E_uwGameErrorWhileLoadingAnimation, C_lErmNoDebugData,C_ucErmOpenInfoWindow, C_ucAllowStopForDebug,szMessage ); return NULL; } } while (!p_xFile); /* -----------------------------------------------------------------------*/ /* Load Binary Anim File - A3i Format*/ /* -----------------------------------------------------------------------*/ hScriptFile=CreateFile(szInterpolAnimFileName1, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hScriptFile!= INVALID_HANDLE_VALUE) { /* size without version*/ ulBinaryFileLength=GetFileSize(hScriptFile,&ulHigh) - 2; CloseHandle(hScriptFile); MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeBinAnim , p_stFamily ); p_cBinaryAnimBuffer=TMP_M_p_Malloc(ulBinaryFileLength); fread(p_cBinaryAnimBuffer,ulBinaryFileLength,1,p_xFile); fclose(p_xFile); /* Alloc Anim struct*/ MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeAnimation , p_stFamily ); p_stAnim =(tdstAnim3d *)M_p_GameMallocInHLM(sizeof(tdstAnim3d)); /* Load animation*/ p_stAnim->uwNumOfA3dGENERAL=fn_uw_LoadAnimV6(p_cBinaryAnimBuffer); /* update structure*/ fn_v_CalculateGeneral(p_stAnim,0); /* Calculate A3dGENERAL informations*/ /*GAM_fn_vUpdateEventArrayOfAnimation(p_stAnim,p_stFamily->h_DefaultObjectsTable);*/ /* Finally add the animation pointer into the link table*/ fn_vAddAnimIntoA3bLinkTable(p_stAnim,szInterpolAnimFileName); MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeBinAnim , p_stFamily ); TMP_M_Free(p_cBinaryAnimBuffer); } else { char szMessage[50]; sprintf(szMessage,"Cannot get size of Anim [...]%s to allocate memory",szTmp); Erm_M_UpdateLastError( Game, C_ucErmDefaultChannel, E_uwGameErrorWhileLoadingAnimation, C_lErmNoDebugData,C_ucErmOpenInfoWindow, C_ucAllowStopForDebug,szMessage ); return NULL; } } /* -----------------------------------------------------------------------*/ /* Update Anim and State*/ /* -----------------------------------------------------------------------*/ #ifdef _DEBUG_STRING_FOR_PLA_ strcpy(p_stAnim->szAnimName,szFileName); #endif return p_stAnim; } // Shaitan => state list in the level /*----------------------------------------------------------------------------- * Description : Callback script function *----------------------------------------------------------------------------- * Input : ... * Output : void *---------------------------------------------------------------------------*/ SCR_tde_Anl_ReturnValue fn_eScriptCallBackCreateListOfState(SCR_tdst_File_Description *_p_stFile,char *_p_szName,char *_ap_szParams[],SCR_tde_Anl_Action _eAction) { SCR_tde_Anl_ReturnValue eReturnValue = SCR_ERV_Anl_NormalReturn; SCR_tdst_Cxt_Values *p_stVal; if (M_IsEntry) { if (M_ActionIs(C_Entry_State)) { if (SCR_fn_c_RdL0_IsSectionExists(_ap_szParams[0])) { p_stVal = SCR_fnp_st_RdL0_AnalyseSection(_ap_szParams[0], SCR_CDF_uw_Anl_Normal); } } } return(eReturnValue); } // End Shaitan => state list in the level // Shaitan => state list in the level /*----------------------------------------------------------------------------- * Description : Callback script function *----------------------------------------------------------------------------- * Input : ... * Output : void *---------------------------------------------------------------------------*/ SCR_tde_Anl_ReturnValue fn_eScriptCallBackCreateListOfPOs(SCR_tdst_File_Description *_p_stFile,char *_p_szName,char *_ap_szParams[],SCR_tde_Anl_Action _eAction) { SCR_tde_Anl_ReturnValue eReturnValue = SCR_ERV_Anl_NormalReturn; SCR_tdst_Cxt_Values *p_stVal; if (M_IsEntry) { if (M_ActionIs(C_Entry_LoadPO)) { if (SCR_fn_c_RdL0_IsSectionExists(_ap_szParams[0])) { p_stVal = SCR_fnp_st_RdL0_AnalyseSection(_ap_szParams[0], SCR_CDF_uw_Anl_Normal); } } } return(eReturnValue); } // End Shaitan => state list in the level /*----------------------------------------------------------------------------- * Description : Callback script function *----------------------------------------------------------------------------- * Input : ... * Output : void *----------------------------------------------------------------------------- * Creation date : 22/10/96 Author : Francois *----------------------------------------------------------------------------- * Modification date : 26/05/97 Modification Author : David Sebastien (Gizmo) * Modifications : load animation * Modif 07/09/98 : new prototype for load animation - Carlos Torres *---------------------------------------------------------------------------*/ SCR_tde_Anl_ReturnValue fn_eScriptCallBackCreateNewState(SCR_tdst_File_Description *_p_stFile,char *_p_szName,char *_ap_szParams[],SCR_tde_Anl_Action _eAction) { SCR_tde_Anl_ReturnValue eReturnValue = SCR_ERV_Anl_NormalReturn; DNM_tdeMechanicsID eKindOfMechanics = DNM_eMIC_Error; struct tdstFamilyList_ *p_stFamily; tdxHandleToState h_State,h_NextState; char szSectionName[_MAX_PATH]; tdxHandleToTransition h_Transition; tdxHandleToProhibit h_Prohibit; SCR_M_RdL0_GetSectionLong(C_ThisSection,0,tdxHandleToState,h_State); if (M_IsTitle) { VIG_fn_vAddToProgressBar(1); SCR_M_RdL0_GetContextLong(C_ThisContext,0,struct tdstFamilyList_ *,p_stFamily); MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily ); h_State = fn_h_StateAlloc(); LST2_M_StaticAddTail(&p_stFamily->hForStateArray, h_State); #ifdef _DEBUG_STRING_FOR_PLA_ strcpy(h_State->szStateName,fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); strcat(h_State->szStateName," - "); strcat(h_State->szStateName,_p_szName); #endif SCR_M_RdL0_ComputeOpenSectionNameR(0,szSectionName); SCR_M_v_Link_SetAdditionalLong(SCR_fnp_st_Link_SetValue(&g_st3DOSLinkTable.stState,szSectionName,(unsigned long)h_State),1,strlen(szSectionName)-strlen(SCR_M_RdL0_GetCompleteSectionNameR(0))); SCR_M_RdL0_SetSectionLong(C_ThisSection,0,h_State); } else if (M_IsEntry) { if (M_ActionIs(C_Entry_Animation)) { SCR_M_RdL0_GetContextLong(C_ThisContext,0,struct tdstFamilyList_ *,p_stFamily); /**** load the animation file ****/ strcpy(szSectionName,fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType)); strcat(szSectionName,"\\"); strcat(szSectionName,_ap_szParams[0]); fn_vSetAnimInState(h_State,fn_p_stLoadAnimationFile(szSectionName,p_stFamily)); } else if (M_ActionIs(C_Entry_NextState)) { SCR_M_RdL0_GetContextLong(C_ThisContext,0,struct tdstFamilyList_ *,p_stFamily); MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); h_NextState = (tdxHandleToState) TMP_M_p_Malloc(strlen(_ap_szParams[0])+1); strcpy((char *)h_NextState,_ap_szParams[0]); fn_vSetNextStateInState(h_State,h_NextState); } else if (M_ActionIs(C_Entry_Speed)) { fn_vSetSpeedInState(h_State,(signed char)fn_lAToI(_ap_szParams[0])); } else if (M_ActionIs(C_Entry_Repeat)) { fn_vSetRepeatAnimationInState(h_State,(unsigned char)(fn_lAToI(_ap_szParams[0])-1)); } else if (M_ActionIs(C_Entry_TransitionStatusFlag)) { if(!strcmpi(_ap_szParams[0],C_Value_TransitionAllowedByDefault)) { fn_vSetTransitionStatusFlagInState(h_State,0); } else { fn_vSetTransitionStatusFlagInState(h_State,1); } } else if (M_ActionIs(C_Entry_AddTargetState)) { SCR_M_RdL0_GetContextLong(C_ThisContext,0,struct tdstFamilyList_ *,p_stFamily); MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeTransition , p_stFamily ); h_Transition = fn_h_TransitionAlloc(); LST2_M_StaticInitElement(h_Transition); MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); h_Transition->h_TargetState = (tdxHandleToState) TMP_M_p_Malloc(strlen(_ap_szParams[0])+1); strcpy((char *)h_Transition->h_TargetState,_ap_szParams[0]); MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeState , p_stFamily); h_Transition->h_StateToGo = (tdxHandleToState) TMP_M_p_Malloc(strlen(_ap_szParams[1])+1); strcpy((char *)h_Transition->h_StateToGo,_ap_szParams[1]); if(SCR_fn_uc_RdL0_GetNumberOfParameters(_ap_szParams)>2) fn_vSetLinkingTypeInTransition(h_Transition,(unsigned char)fn_lAToI(_ap_szParams[2])); else fn_vSetLinkingTypeInTransition(h_Transition,C_ucStandardLink); LST2_M_StaticAddTail(&h_State->hForTransitionArray, h_Transition); } else if (M_ActionIs(C_Entry_ProhibitedTargetState)) { SCR_M_RdL0_GetContextLong(C_ThisContext,0,struct tdstFamilyList_ *,p_stFamily); MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeProhibit , p_stFamily ); h_Prohibit = fn_h_ProhibitAlloc(); LST2_M_StaticInitElement(h_Prohibit); h_Prohibit->h_ProhibitedState = (tdxHandleToState) TMP_M_p_Malloc(strlen(_ap_szParams[0])+1); strcpy((char *)h_Prohibit->h_ProhibitedState,_ap_szParams[0]); LST2_M_StaticAddTail(&h_State->hForProhibitArray, h_Prohibit); } else if (M_ActionIs(C_Entry_LinkMechanics)) { M_CheckScriptParamNumber(1); SCR_fnp_st_RdL0_AnalyseSection(_ap_szParams[0], SCR_CDF_uw_Anl_Normal); SCR_M_RdL0_GetSectionLong(C_ChildSection,0,DNM_tdxHandleToMecIdentityCard,(h_State->h_LinkedMechanicsIdCard)); } /* ANNECY MT - 24/11/98 {*/ else if (M_ActionIs(C_Entry_CustomBits)) { M_CheckScriptParamNumber(1); fn_vSetStateCustomBits(h_State,(unsigned char)fn_lAToI(_ap_szParams[0])); } /* END ANNECY MT }*/ } if(M_IsEnd) { SCR_M_RdL0_GetSectionLong(C_ThisSection,0,tdxHandleToState,h_State); if ((h_State->scSpeedAnim<=1)&&h_State->p_stAnim) h_State->scSpeedAnim=h_State->p_stAnim->ucFrameRate; } return(eReturnValue); } /*----------------------------------------------------------------------------- * Description : Callback script function *----------------------------------------------------------------------------- * Input : ... * Output : void *----------------------------------------------------------------------------- * Creation date : 14/05/97 Author : Christophe Garrigues (CGHT) *----------------------------------------------------------------------------- * Modification date : Modification Author : * Modifications : *---------------------------------------------------------------------------*/ SCR_tde_Anl_ReturnValue fn_eScriptCallBackSetBoundingVolume(SCR_tdst_File_Description *_p_stFile,char *_p_szName,char *_ap_szParams[],SCR_tde_Anl_Action _eAction) { SCR_tde_Anl_ReturnValue eReturnValue = SCR_ERV_Anl_NormalReturn; struct tdstFamilyList_ * p_stFamily; MTH3D_tdstVector stCenter; MTH_tdxReal xRadius; ACP_tdxHandleOfObject hGeometricSphere; if(M_IsTitle) { VIG_fn_vAddToProgressBar(1); } if(M_IsEntry) { if (M_ActionIs(C_Entry_Geometric)) { hGeometricSphere = (ACP_tdxHandleOfObject)GLI_pLoadGeometricInFile(_ap_szParams[0]); SCR_M_RdL0_SetSectionLong(C_ThisSection,0,(long)hGeometricSphere); } } if(M_IsEnd) { SCR_M_RdL0_GetContextLong(C_ThisContext,0,struct tdstFamilyList_ *,p_stFamily); SCR_M_RdL0_GetSectionLong(C_ThisSection,0,ACP_tdxHandleOfObject,hGeometricSphere); GEO_fn_vGetInfoFromGeometricSphere(&stCenter, &xRadius, hGeometricSphere); GEO_fn_vCreateBoundingSphere(&p_stFamily->hBoundingSphere); GEO_fn_vSetBoundingSphere(p_stFamily->hBoundingSphere, &stCenter, xRadius); #if defined (ACTIVE_EDITOR) p_stFamily->hGeometricSphere = hGeometricSphere; #else GEO_vDeleteGeometricObject (&hGeometricSphere); #endif /* ! ACTIVE_EDITOR*/ } return( eReturnValue ); } void fn_vRegisterAllBdVolumeScriptSections () { SCR_fn_v_RdL0_RegisterCallback(C_SectionSetBoundingVolume, fn_eScriptCallBackSetBoundingVolume,SCR_CRC_c_RdL0_ForSection); }