// Implementation for the class of Editor Actors Models /////////////////////////////////////////////////////// #include "StdAfx.h" // Shaitan FastC { ///////////////////////////////////////////////////// //////// !!!!!!!!!!!! DANGER !!!!!!!!!!! //////////// ///////////////////////////////////////////////////// #define _ED_CAR_MUST_DEFINE_STRUCT_ #include "EdAllAct.hpp" ///////////////////////////////////////////////////// //////// !!!!!!!!!!!! End DANGER !!!!!!!!!!! //////// ///////////////////////////////////////////////////// //End Shaitan FastC } //ANNECY CHRISTOPHE MODIFICATIONS #define D_ZdxStuff_StructureDefine //ANNECY END CHRISTOPHE MODIFICATIONS #include "EDACModl.hpp" #include "EDACDef.hpp" #include "_Ainterf.hpp" #include "Defines.hpp" #include "EDACDgIf.hpp" #include "EDACStrg.hpp" //External Modules #include "ErO.h" #include "TFa.h" //End of External Modules //-----------------IR------------------------- #include "EdIRBeEn.hpp" #include "EDACQuer.hpp" //-------------------------------------------- #undef CPA_WANTS_IMPORT #undef CPA_EXPORT #define CPA_WANTS_EXPORT //-----------------IR------------------------- #include "EdIRIRD.hpp" // Shaitan FastC { #include "EdIRStrg.hpp" //End Shaitan FastC } //-------------------------------------------- #include "_Actors.hpp" #undef CPA_WANTS_EXPORT #define CPA_WANTS_IMPORT #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // Shaitan FastC { #define M_SAVEENTRY1PARM(a,b) SCR_M_SvL0_SaveEntry(p_tdstFile, \ M_MAKECHAR(a), \ SCR_CC_C_Cfg_NoChar); \ SCR_fn_v_SvL0_SaveParameters_MP(p_tdstFile, \ SCR_EF_SvL0_Normal, \ 1, \ M_MAKECHAR(b)); //End Shaitan FastC } //**************************************************************** EdActors_EditorActorModel::EdActors_EditorActorModel(CPA_Family *pclFamily, CPA_Actor *pclActor) :EdActors_EditorActor(EDCAR_ACTOR_TYPE_MODEL) { //Creates a new 'motor actor' for the model //This is an editor data ! CAR_EDIT_TDSTACTOR *p_tdstMotorActor = (CAR_EDIT_TDSTACTOR *)malloc(sizeof(CAR_EDIT_TDSTACTOR)); m_fn_vSetMotorActor(p_tdstMotorActor); m_fn_vSetMSPointersToNULL(); //Creates datas m_fn_vCreateActorMSDataList(); if ( pclFamily->fn_bIsAvailable() ) { m_fn_vMinimalAllocation(); //Sets Initial and Current States CPA_Action *pclInitialAction = pclFamily->mfn_p_oGetInitialAction(); CString csMsg = "Family '"; csMsg += pclFamily->GetName(); csMsg += "' has no initial Action. Check if your family directory is empty !"; ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Creation of an Editor Model", "EdActors_EditorActorModel::EdActors_EditorActorModel(...)", E_ERROR_GRAVITY_FATAL, csMsg); ERROR_CHECK( pclInitialAction != NULL ); tdxHandleToState hInitialState = (tdxHandleToState)pclInitialAction->mfn_p_oGetDefaultState()->GetData(); fn_v3dDataSetInitialState(p_tdstMotorActor->h_3dData, hInitialState); fn_v3dDataSetCurrentState(p_tdstMotorActor->h_3dData, hInitialState); } m_pclActor = pclActor; //-----------------IR------------------------- m_pclBrain=EDAC_fn_pclGetNewBrain(pclActor); //-------------------------------------------- } //**************************************************************** //"Empty" Constructor (for loading) EdActors_EditorActorModel::EdActors_EditorActorModel(CPA_Actor *pclActor) :EdActors_EditorActor(EDCAR_ACTOR_TYPE_MODEL) { //Creates a new 'motor actor' for the model //This is an editor data ! CAR_EDIT_TDSTACTOR *p_tdstMotorActor = (CAR_EDIT_TDSTACTOR *)malloc(sizeof(CAR_EDIT_TDSTACTOR)); m_fn_vSetMotorActor(p_tdstMotorActor); m_fn_vSetMSPointersToNULL(); //Creates datas m_fn_vCreateActorMSDataList(); /////////////////////////////////////////// // Do not call m_fn_vMinimalAllocation() // /////////////////////////////////////////// m_pclActor = pclActor; //-----------------IR------------------------- m_pclBrain=EDAC_fn_pclGetNewBrain(pclActor); //-------------------------------------------- } //**************************************************************** //Copy constructor EdActors_EditorActorModel::EdActors_EditorActorModel(EdActors_EditorActorModel *_pclSourceModel, CPA_Actor *_pclActor) : EdActors_EditorActor(EDCAR_ACTOR_TYPE_MODEL) { m_pclActor = _pclActor; _pclActor->m_fn_vSetEditorActor(this); m_csBitmapName = _pclSourceModel->m_csBitmapName; //Creates a new 'motor actor' CAR_EDIT_TDSTACTOR *p_tdstMotorActor = (CAR_EDIT_TDSTACTOR *)malloc(sizeof(CAR_EDIT_TDSTACTOR)); m_fn_vSetMotorActor(p_tdstMotorActor); m_fn_vSetMSPointersToNULL(); //Allocates MS if the corresponding MS in the Model is allocated m_fn_vAllocateMSAsInModel(_pclSourceModel); //Creates datas m_fn_vCreateActorMSDataList(); //Updates datas with model's ones (including 'model link' state) m_fn_vUpdateDatas(_pclSourceModel, TRUE, CTL_UPDATE_REASON__USE_USER_DEFINED_REASON, OAC_E_ur_InstanciatedFromModel); //-----------------IR------------------------- m_pclBrain=EDAC_fn_pclGetNewCopyOfBrain(_pclActor,_pclSourceModel->m_pclBrain); //-------------------------------------------- } //**************************************************************** EdActors_EditorActorModel::~EdActors_EditorActorModel() { //Deletes all MS and their Datas m_fn_vDeleteAllMS(); //Deletes motor (structure) actor (this is merely an editor Data !!) free(m_fn_ptdstGetMotorActor()); //-----------------IR------------------------- EDAC_fn_vDeleteBrain(m_pclBrain); //-------------------------------------------- } //**************************************************************** //Updates all instances of this model because "pclSourceData" has changed void EdActors_EditorActorModel::m_fn_vUpdateAllInstances( CTL_Editor_Data *_pclSourceData, CTL_tdeUpdateReason _eReason, long _lUserDefinedReason /*= 0*/) { // ERROR_ASSERT( _pclSourceData->m_pub_fn_bIsLinked() ); unsigned char ucModelListIndex = m_fn_ucGetCurrentMSListIndex(); EdActors_EditorActorInstance *pclCurrentInstance; POSITION InstancesPos = m_clInstancesList.GetHeadPosition(); while ( InstancesPos != NULL ) { pclCurrentInstance = m_clInstancesList.GetNext(InstancesPos); ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Updating All Instances of a Model, because a Data has changed", "EdActors_EditorActorModel::m_fn_vUpdateAllInstances(...)", E_ERROR_GRAVITY_WARNING, "The Model and one of its Instances do no have the same number of AMS"); ERROR_ASSERT( pclCurrentInstance->m_clListOfAMSLists.m_fn_pclGetListFromIndex(ucModelListIndex)->GetCount() == m_clListOfAMSLists.m_fn_pclGetListFromIndex(ucModelListIndex)->GetCount() ); ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Updating All Instances of a Model, because a Data has changed", "EdActors_EditorActorModel::m_fn_vUpdateAllInstances(...)", E_ERROR_GRAVITY_WARNING, "The Data to be updated has not been found in the lists"); ERROR_VERIFY( !m_fn_bUpdateList(pclCurrentInstance->m_clListOfAMSLists.m_fn_pclGetListFromIndex(ucModelListIndex), m_clListOfAMSLists.m_fn_pclGetListFromIndex(ucModelListIndex), _pclSourceData, _eReason, _lUserDefinedReason) ); } } //**************************************************************** //Updates all instances of this model because "pclSourceData" has changed // returns TRUE if Data has not been found, i.e. search must continue in another list BOOL EdActors_EditorActorModel::m_fn_bUpdateList(EdActors_ActorMiniStructureList *_pclDestList, EdActors_ActorMiniStructureList *_pclSourceList, CTL_Editor_Data *_pclSourceData, CTL_tdeUpdateReason _eReason, //CPA2 Stegaru Cristian 98/06/24 long _lUserDefinedReason /*= 0*/, BOOL bUsePropagate/* = FALSE*/) //End CPA2 Stegaru Cristian 98/06/24 { //Gets the MS in which "pclSourceData" is long lMSIndex = 0; long lDataIndex; BOOL bFound = FALSE; POSITION DataPos; POSITION MSPos = _pclSourceList->GetHeadPosition(); while ( (MSPos != NULL) && (!bFound) ) { //Gets the Data list CTL_Editor_DataList *pclDataList = (_pclSourceList->GetNext(MSPos))->m_pclDataList; lDataIndex = 0; DataPos = pclDataList->GetHeadPosition(); while ( ( DataPos != NULL ) && ( !bFound ) ) { bFound = (pclDataList->GetNext(DataPos) == _pclSourceData); if ( !bFound ) lDataIndex ++; } if ( !bFound ) lMSIndex ++; } //Sets the data for the current instance if ( bFound ) { //Gets the data ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Updating a Data of an Instance because the corresponding Data has changed in its Model", "EdActors_EditorActorModel::m_fn_bUpdateList(...)", E_ERROR_GRAVITY_WARNING, "The Data can't be found"); ERROR_ASSERT( lMSIndex < _pclDestList->GetCount() ); MSPos = _pclDestList->FindIndex(lMSIndex); ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Updating a Data of an Instance because the corresponding Data has changed in its Model", "EdActors_EditorActorModel::m_fn_bUpdateList(...)", E_ERROR_GRAVITY_WARNING, "The Data can't be found"); ERROR_ASSERT( MSPos != NULL ); EdActors_ActorMiniStructure *pclMS = _pclDestList->GetAt(MSPos); ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Updating a Data of an Instance because the corresponding Data has changed in its Model", "EdActors_EditorActorModel::m_fn_bUpdateList(...)", E_ERROR_GRAVITY_WARNING, "The Data can't be found"); ERROR_ASSERT(lDataIndex < pclMS->m_pclDataList->GetCount()); DataPos = pclMS->m_pclDataList->FindIndex(lDataIndex); ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Updating a Data of an Instance because the corresponding Data has changed in its Model", "EdActors_EditorActorModel::m_fn_bUpdateList(...)", E_ERROR_GRAVITY_WARNING, "The Data can't be found"); ERROR_ASSERT( DataPos != NULL ); CTL_Editor_Data *pclInstanceData = pclMS->m_pclDataList->GetAt(DataPos); //CPA2 Stegaru Cristian 98/06/24 if (bUsePropagate) { if (pclMS->m_fn_bIsAllocated()) { if (OAC_fn_bLinkAllowPropagation (pclInstanceData)) pclInstanceData->m_fn_vUpdateData(_pclSourceData, _eReason, _lUserDefinedReason); } else { MessageBox(NULL, "The mini-structure is not allocated in the instance, \nthe modification cannot be propagated", "Propagation of a modification - WARNING !", MB_OK); } } else if ( OAC_fn_bIsLinked(pclInstanceData) ) //Updates it... pclInstanceData->m_fn_vUpdateData(_pclSourceData, _eReason, _lUserDefinedReason); //End CPA2 Stegaru Cristian 98/06/24 } return ( !bFound && (_pclSourceData->m_pub_fn_csGetDataName() != "FastC_Index") && (_pclSourceData->m_pub_fn_csGetDataName() != "FastC_Run")); } //**************************************************************** //Allocates MS and all corresponding MS in existing Instances BOOL EdActors_EditorActorModel::m_fn_bAllocateMS( EdActors_ActorMiniStructure *pclAMS) { ERROR_ASSERT ( !(pclAMS->m_fn_bIsAllocated()) ); return pclAMS->m_fn_bAllocate(TRUE); } //**************************************************************** //Unallocates MS and all corresponding MS in existing Instances BOOL EdActors_EditorActorModel::m_fn_bUnallocateMS(EdActors_ActorMiniStructure *pclAMS) { ERROR_ASSERT ( pclAMS->m_fn_bIsAllocated() ); return pclAMS->m_fn_bUnallocate(); } //**************************************************************** void EdActors_EditorActorModel::m_fn_vAllocateMSInInstances(EdActors_ActorMiniStructure *pclAMS) { //Searches for the right list of MS EdActors_ActorMiniStructureList *m_pclActorMSList = NULL; char cGroupIndex = m_clListOfAMSLists.m_fn_cGetIndexFromAMS(pclAMS); ERROR_ASSERT( cGroupIndex != -1 ); m_pclActorMSList = m_clListOfAMSLists.m_fn_pclGetListFromIndex(cGroupIndex); //Searches for MS Index BOOL bFound = FALSE; long lModelMSIndex = 0; POSITION ModelMSPos = m_pclActorMSList->GetHeadPosition(); while ( (ModelMSPos != NULL) && (!bFound) ) { bFound = ( m_pclActorMSList->GetNext(ModelMSPos) == pclAMS ); if ( !bFound ) lModelMSIndex ++; } ERROR_ASSERT(bFound); //Allocates in Instances long lInstanceMSIndex; POSITION InstanceMSPos; EdActors_ActorMiniStructure *pclInstAMS; EdActors_EditorActorInstance *pclInstance; POSITION InstancesPos = m_clInstancesList.GetHeadPosition(); while ( InstancesPos != NULL ) { pclInstance = m_clInstancesList.GetNext(InstancesPos); pclInstance->m_fn_vSetCurrentMSListIndex(m_fn_ucGetCurrentMSListIndex()); lInstanceMSIndex = 0; InstanceMSPos = pclInstance->m_pclActorCurrentMSList->GetHeadPosition(); while ( lInstanceMSIndex <= lModelMSIndex ) { ERROR_ASSERT(InstanceMSPos != NULL); pclInstAMS = pclInstance->m_pclActorCurrentMSList->GetNext(InstanceMSPos); lInstanceMSIndex ++; } if ( !pclInstAMS->m_fn_bIsAllocated() ) { if ( !pclInstAMS->m_bIsReallyAllocated ) pclInstAMS->m_fn_bAllocate(); else pclInstAMS->m_fn_vUnrealAllocate(); //Notifies pclInstance->m_pclActor->fn_vNotifySave(); } } } //**************************************************************** void EdActors_EditorActorModel::m_fn_vUnallocateMSInInstances(EdActors_ActorMiniStructure *pclAMS) { //Searches for the right list of MS EdActors_ActorMiniStructureList *m_pclActorMSList = NULL; char cGroupIndex = m_clListOfAMSLists.m_fn_cGetIndexFromAMS(pclAMS); ERROR_ASSERT( cGroupIndex != -1 ); m_pclActorMSList = m_clListOfAMSLists.m_fn_pclGetListFromIndex(cGroupIndex); //Searches for MS Index BOOL bFound = FALSE; long lModelMSIndex = 0; POSITION ModelMSPos = m_pclActorMSList->GetHeadPosition(); while ( (ModelMSPos != NULL) && (!bFound) ) { bFound = ( m_pclActorMSList->GetNext(ModelMSPos) == pclAMS ); if ( !bFound ) lModelMSIndex ++; } ERROR_ASSERT(bFound); //Allocates in Instances long lInstanceMSIndex; POSITION InstanceMSPos; EdActors_ActorMiniStructure *pclInstAMS; EdActors_EditorActorInstance *pclInstance; POSITION InstancesPos = m_clInstancesList.GetHeadPosition(); while ( InstancesPos != NULL ) { pclInstance = m_clInstancesList.GetNext(InstancesPos); pclInstance->m_fn_vSetCurrentMSListIndex(m_fn_ucGetCurrentMSListIndex()); lInstanceMSIndex = 0; InstanceMSPos = pclInstance->m_pclActorCurrentMSList->GetHeadPosition(); while ( lInstanceMSIndex <= lModelMSIndex ) { ERROR_ASSERT(InstanceMSPos != NULL); pclInstAMS = pclInstance->m_pclActorCurrentMSList->GetNext(InstanceMSPos); lInstanceMSIndex ++; } if ( (pclInstAMS->m_fn_bIsAllocated()) && (pclInstAMS->m_fn_bCanBeUnallocated()) ) { pclInstAMS->m_fn_bUnallocate(); //Notifies pclInstance->m_pclActor->fn_vNotifySave(); } } } //**************************************************************** //Links the Data to Instances void EdActors_EditorActorModel::m_pri_fn_vLinkData(CTL_Editor_Data *pclData) { //Searches for the Data BOOL bFound = FALSE; long lModelMSIndex = 0; long lDataIndex; EdActors_ActorMiniStructure *pclAMS; POSITION DataPos; POSITION ModelMSPos = m_pclActorCurrentMSList->GetHeadPosition(); while ( (ModelMSPos != NULL) && (!bFound) ) { pclAMS = m_pclActorCurrentMSList->GetNext(ModelMSPos); lDataIndex = 0; DataPos = pclAMS->m_pclDataList->GetHeadPosition(); while ( (DataPos != NULL) && (!bFound) ) { bFound = ( pclAMS->m_pclDataList->GetNext(DataPos) == pclData); if ( !bFound ) lDataIndex ++; } if ( !bFound ) lModelMSIndex ++; } ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Linking data in Instances according to Model", "EdActors_EditorActorModel::m_fn_vLinkData(...)", E_ERROR_GRAVITY_INSTABLE, "The given Data can't be found in Model's data list"); ERROR_ASSERT(bFound); if ( bFound ) { //Updates link state of Model data // pclData->m_fn_bSetLink(eNot(pclData->m_fn_eGetLink())); //Links in all existing Instances long lInstanceMSIndex; POSITION InstanceMSPos; long lInstanceDataIndex; POSITION InstanceDataPos; EdActors_ActorMiniStructure *pclInstAMS; EdActors_EditorActorInstance *pclInstance; CTL_Editor_Data *pclCurrentData; POSITION InstancesPos = m_clInstancesList.GetHeadPosition(); while ( InstancesPos != NULL ) { pclInstance = m_clInstancesList.GetNext(InstancesPos); char cOldListIndex = pclInstance->m_fn_ucGetCurrentMSListIndex(); pclInstance->m_fn_vSetCurrentMSListIndex(m_fn_ucGetCurrentMSListIndex()); lInstanceMSIndex = 0; InstanceMSPos = pclInstance->m_pclActorCurrentMSList->GetHeadPosition(); while ( lInstanceMSIndex <= lModelMSIndex ) { ERROR_ASSERT(InstanceMSPos != NULL); pclInstAMS = pclInstance->m_pclActorCurrentMSList->GetNext(InstanceMSPos); lInstanceMSIndex ++; } InstanceDataPos = pclInstAMS->m_pclDataList->GetHeadPosition(); lInstanceDataIndex = 0; while ( lInstanceDataIndex <= lDataIndex ) { ERROR_ASSERT(InstanceDataPos != NULL); pclCurrentData = pclInstAMS->m_pclDataList->GetNext(InstanceDataPos); lInstanceDataIndex ++; } //Sets link in Instance Data // pclCurrentData->m_fn_bSetLink(pclData->m_fn_eGetLink()); //Immediatly updates Instance Data value with Model's one pclCurrentData->m_fn_vUpdateData(pclData); //Restores old List for Instance pclInstance->m_fn_vSetCurrentMSListIndex(cOldListIndex); } } } //**************************************************************** CString EdActors_EditorActorModel::m_fn_csGetBitmapName() { return m_csBitmapName; } //**************************************************************** void EdActors_EditorActorModel::m_fn_vSetBitmapName(CString csNewBitmapName) { m_csBitmapName = csNewBitmapName; } //**************************************************************** short EdActors_EditorActorModel::m_fn_wGetRelatedInstancesCount() { return m_clInstancesList.GetCount(); } //**************************************************************** //This function allocates the MS which must always be Allocated void EdActors_EditorActorModel::m_fn_vMinimalAllocation() { EdActors_ActorMiniStructureList *pclCurrentAMSList; EdActors_MiniStructureList *pclCurrentMSList; POSITION AMSpos = m_clListOfAMSLists.GetHeadPosition(); POSITION MSpos = g_pclInterface->m_clDocument.m_clListOfMSLists.GetHeadPosition(); EdActors_ActorMiniStructure *pclAMS; EdActors_MiniStructure *pclMS; POSITION AMSSubPos; POSITION MSSubPos; unsigned long c_lI = 0; while ( AMSpos != NULL ) { ERROR_ASSERT( MSpos != NULL ); pclCurrentAMSList = m_clListOfAMSLists.GetNext(AMSpos); pclCurrentMSList = g_pclInterface->m_clDocument.m_clListOfMSLists.GetNext(MSpos); AMSSubPos = pclCurrentAMSList->GetHeadPosition(); MSSubPos = pclCurrentMSList->GetHeadPosition(); while ( AMSSubPos != NULL ) { ERROR_ASSERT( MSSubPos != NULL ); pclAMS = pclCurrentAMSList->GetNext(AMSSubPos); pclMS = pclCurrentMSList->GetNext(MSSubPos); if ( !(pclMS->m_fn_bCanBeUnallocated()) ) pclAMS->m_fn_bAllocate(); } c_lI ++; } } //************************************************************************* void EdActors_EditorActorModel::m_fn_vRemoveFromInstancesList(EdActors_EditorActorInstance *pclInstanceToRemove) { EdActors_EditorActorInstance *pclCurrentInstance; BOOL bFound = FALSE; POSITION pos = m_clInstancesList.GetHeadPosition(); POSITION KeepPos; while ( (pos != NULL) && (!bFound) ) { KeepPos = pos; pclCurrentInstance = m_clInstancesList.GetNext(pos); bFound = ( pclCurrentInstance == pclInstanceToRemove ); } ERROR_ASSERT( bFound ); m_clInstancesList.RemoveAt(KeepPos); } //************************************************************************* void EdActors_EditorActorModel::m_fn_vAddToInstancesList(EdActors_EditorActorInstance *pclInstanceToAdd) { m_clInstancesList.AddTail(pclInstanceToAdd); } //************************************************************************* //Returns TRUE only if Data exists and belongs to an allocated MS BOOL EdActors_EditorActorModel::m_fn_bDataBelongsToAnAllocatedMS(CString csDataName) { BOOL bReturn = FALSE; CTL_Editor_Data *pclBaseData = m_fn_p_oFindDataByName(csDataName); if ( pclBaseData != NULL ) bReturn = OAC_fn_pclGetParentAMSOfData(pclBaseData)->m_fn_bIsAllocated(); //else //Data has not been found, so returns FALSE return bReturn; } //************************************************************************* //Updates all linked Data in given Instance, according to Model void EdActors_EditorActorModel::m_pub_fn_vUpdateLinkedDataInInstance(CPA_Actor *_pclInstanceToUpdate) { ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Updating Instance linked data according to Model", "EdActors_EditorActorModel::m_pub_fn_vUpdateLinkedDataInInstance(...)", E_ERROR_GRAVITY_INSTABLE, "The given Actor is not an Instance"); ERROR_ASSERT( _pclInstanceToUpdate->m_fn_bIsAnInstance() ); _pclInstanceToUpdate->m_fn_pclGetEditorActor()->m_fn_vUpdateDatas(this, FALSE, CTL_UPDATE_REASON__USE_USER_DEFINED_REASON, OAC_E_ur_InstanciatedFromModel); } #if defined ( D_DoNotInstanciateIncompleteModels ) //**************************************************************** //checks that all datae handling object lists have a valid name list specified BOOL EdActors_EditorActorModel::m_bAllListsAreSpecified() { short wMSIndex; for (//scan all lists of ministructures wMSIndex = 0; wMSIndex < sizeof(m_a_poMSLists) / sizeof(void *); wMSIndex ++ ) { EdActors_ActorMiniStructureList *p_oMSList = m_a_poMSLists[wMSIndex]; POSITION xMSPos = p_oMSList->GetHeadPosition(); while ( xMSPos ) //for each ministructure in the list { EdActors_ActorMiniStructure *p_oMS = p_oMSList->GetNext(xMSPos); CTL_Editor_DataList *p_oDataList = &p_oMS->m_clDataList; POSITION xDataPos = p_oDataList->GetHeadPosition(); while (xDataPos) //check each data ofthe current list { CTL_Editor_Data *p_oData = p_oDataList->GetNext(xDataPos); if ( p_oData->m_tdeDataType == EDITOR_DATA_TYPE_OBJECTLIST ) { //we care only about object lists CPA_Editor_ObjectListData &r_oObjectListData = (CPA_Editor_ObjectListData &) *p_oData; // if no name list exists in this data, we tell it... if ( !r_oObjectListData.m_p_oNameList ) return FALSE; } } } } return TRUE; } #endif /* D_DoNotInstanciateIncompleteModels */ //**************************************************************** void EdActors_EditorActorModel::m_pub_fn_vSetLink(CTL_Editor_Data *_pclSourceData, BOOL _bMustLink) { m_pri_fn_vLinkData(_pclSourceData); } ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : mfn_vUpdateInstances // Date : 98/06/22 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Stegaru Cristian - CPA ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// void EdActors_EditorActorModel::mfn_vUpdateInstances (CTL_Editor_Data *_pclSourceData, int nReason/* = REASON_ALL_INSTANCES*/, CStringList *pInstanceNames/* = NULL*/) { unsigned char ucModelListIndex = m_fn_ucGetCurrentMSListIndex(); EdActors_EditorActorInstance *pclCurrentInstance; POSITION InstancesPos = m_clInstancesList.GetHeadPosition(); while (InstancesPos != NULL) { pclCurrentInstance = m_clInstancesList.GetNext(InstancesPos); ASSERT (pclCurrentInstance); if (REASON_INSTANCES_IN_THE_LIST == nReason) { ASSERT (pInstanceNames); CString csInstanceName = pclCurrentInstance->m_pclActor->GetName (); BOOL bInstanceIsInTheList = FALSE; POSITION pos = pInstanceNames->GetHeadPosition (); while (pos) { const CString csName = pInstanceNames->GetNext (pos); if (csName == csInstanceName) { bInstanceIsInTheList = TRUE; break; } } if (!bInstanceIsInTheList) continue; } //treat all instances for REASON_ALL_INSTANCES == nReason ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Updating Instances of a Model, because the user propagate a value", "EdActors_EditorActorModel::mfn_vUpdateInstances(...)", E_ERROR_GRAVITY_WARNING, "The Model and one of its Instances do no have the same number of AMS"); ERROR_ASSERT( pclCurrentInstance->m_clListOfAMSLists.m_fn_pclGetListFromIndex(ucModelListIndex)->GetCount() == m_clListOfAMSLists.m_fn_pclGetListFromIndex(ucModelListIndex)->GetCount()); ERROR_PREPARE_M(g_c_csActorModuleNameForErrors, "Updating Instances of a Model, because the user propagate a value", "EdActors_EditorActorModel::mfn_vUpdateInstances(...)", E_ERROR_GRAVITY_WARNING, "The Data to be updated has not been found in the lists"); ERROR_VERIFY( !m_fn_bUpdateList(pclCurrentInstance->m_clListOfAMSLists.m_fn_pclGetListFromIndex(ucModelListIndex), m_clListOfAMSLists.m_fn_pclGetListFromIndex(ucModelListIndex), _pclSourceData, CTL_UPDATE_REASON__DATA_MODIFIED_BY_USER, 0, TRUE)); } } ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : mfn_vGetStandardInstances // Date : 98/06/24 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Stegaru Cristian - CPA ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// void EdActors_EditorActorModel::mfn_vGetStandardInstances (CTL_Editor_Data *pSourceData, CTL_Editor_Data *pModifiedData, CStringList &rlstStandardInstances) { if (!pSourceData || !pModifiedData) return; EdActors_EditorActorInstance *pclCurrentInstance; POSITION InstancesPos = m_clInstancesList.GetHeadPosition(); while (InstancesPos != NULL) { pclCurrentInstance = m_clInstancesList.GetNext(InstancesPos); ASSERT (pclCurrentInstance); if (mfn_bIsAStandardInstance (pclCurrentInstance, pSourceData, pModifiedData)) rlstStandardInstances.AddTail (pclCurrentInstance->m_pclActor->GetName ()); } } ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : mfn_bIsAStandardInstance // Date : 98/06/24 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Stegaru Cristian - CPA ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// BOOL EdActors_EditorActorModel::mfn_bIsAStandardInstance (EdActors_EditorActorInstance *pclInstance, CTL_Editor_Data *pSourceData, CTL_Editor_Data *pModifiedData) { ASSERT (pclInstance); ASSERT (pModifiedData); unsigned char ucModelListIndex = m_fn_ucGetCurrentMSListIndex(); EdActors_ActorMiniStructureList *pInstanceMSList = pclInstance->m_clListOfAMSLists.m_fn_pclGetListFromIndex(ucModelListIndex); EdActors_ActorMiniStructureList *pModelMSList = m_clListOfAMSLists.m_fn_pclGetListFromIndex(ucModelListIndex); if (!pInstanceMSList || !pModelMSList) return FALSE; //Gets the MS in which "pclSourceData" is long lMSIndex = 0; long lDataIndex; BOOL bFound = FALSE; POSITION DataPos; POSITION MSPos = pModelMSList->GetHeadPosition(); while ( (MSPos != NULL) && (!bFound) ) { //Gets the Data list CTL_Editor_DataList *pclDataList = (pModelMSList->GetNext(MSPos))->m_pclDataList; lDataIndex = 0; DataPos = pclDataList->GetHeadPosition(); while ( ( DataPos != NULL ) && ( !bFound ) ) { bFound = (pclDataList->GetNext(DataPos) == pSourceData); if ( !bFound ) lDataIndex ++; } if ( !bFound ) lMSIndex ++; } //Sets the data for the current instance if ( bFound ) { //Gets the data ASSERT (lMSIndex < pInstanceMSList->GetCount()); MSPos = pInstanceMSList->FindIndex (lMSIndex); ASSERT (MSPos != NULL); EdActors_ActorMiniStructure *pclMS = pInstanceMSList->GetAt (MSPos); ASSERT (lDataIndex < pclMS->m_pclDataList->GetCount()); DataPos = pclMS->m_pclDataList->FindIndex(lDataIndex); ASSERT( DataPos != NULL ); CTL_Editor_Data *pclInstanceData = pclMS->m_pclDataList->GetAt(DataPos); ASSERT (pclInstanceData); if (OAC_fn_bLinkAllowPropagation (pclInstanceData) && pclInstanceData->mfn_bEqualsModifiedDataOldValue (pModifiedData)) return TRUE; } return FALSE; } ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : mfn_vGetAllInstances // Date : 98/06/25 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Stegaru Cristian - CPA ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// void EdActors_EditorActorModel::mfn_vGetAllInstances (CStringList &rlstAllInstances) { EdActors_EditorActorInstance *pclCurrentInstance; POSITION InstancesPos = m_clInstancesList.GetHeadPosition(); while (InstancesPos != NULL) { pclCurrentInstance = m_clInstancesList.GetNext(InstancesPos); ASSERT (pclCurrentInstance); rlstAllInstances.AddTail (pclCurrentInstance->m_pclActor->GetName ()); } } // Shaitan FastC { //**************************************************************** void EdActors_EditorActorModel::m_pub_fn_vNotifyBrain (void) { // at loading time, do not notify ! if (m_pclActor->GetEditor()->GetInterface()->fn_bIsLoadingWorld()) return; CString csFamilyName = m_pclActor->m_pub_fn_pclGetFamily()->GetName(); CString csModelName = m_pclActor->GetName(); CString csPathName = fn_szGetFamiliesDataPath(); csPathName += "\\" + csFamilyName + "\\"+ csModelName + "\\" + csModelName + ".ai"; SCR_fn_v_SvL1_RegisterNotify((char *) (LPCSTR) csPathName, EdActors_EditorActorModel::m_fn_vSaveEngineAI, this, SCR_EA_Ntfy_RebuildSection); } /**********************************************************************************/ void EdActors_EditorActorModel::m_fn_vSaveEngineAI(SCR_tdst_File_Description *p_tdstFile, char *p_szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction) { EdActors_EditorActorModel *pModel = (EdActors_EditorActorModel *)p_vData; CPA_EdIR_Brain *pclBrain=pModel->m_pclBrain; CPA_Actor *pclActor=pModel->m_pclActor; CString csFamilyName=pclActor->m_pub_fn_pclGetFamily()->GetName(); CString csModelName=pclActor->GetName(); long CFast_bIsC ; SCR_M_SvL0_SaveScriptFileHeader(p_tdstFile); //Saves version number SCR_M_SvL0_SaveComment(p_tdstFile,C_VERSION); SCR_M_SvL0_SaveBlankLine(p_tdstFile); //Computes date SYSTEMTIME stSystemTime; ::GetLocalTime(&stSystemTime); CTime cTime(stSystemTime); CString csDate=cTime.Format("%A,%B,%d,%Y,%Hh%Mm"); CString csLine="Save date:"+csDate; SCR_M_SvL0_SaveComment(p_tdstFile,M_MAKECHAR(csLine)); SCR_M_SvL0_SaveBlankLine(p_tdstFile); SCR_M_SvL0_SaveBeginSection(p_tdstFile, M_MAKECHAR(g_c_csAISectionName+":"), SCR_CC_C_Cfg_EOL); M_SAVEENTRY1PARM(g_c_csAIDecSectionName, csFamilyName+"\\"+csModelName+"\\"+csModelName+g_c_csAIDecFileExtension); M_SAVEENTRY1PARM(g_c_csAIRulSectionName, csFamilyName+"\\"+csModelName+"\\"+csModelName+g_c_csAIRulFileExtension); M_SAVEENTRY1PARM(g_c_csAIRfxSectionName, csFamilyName+"\\"+csModelName+"\\"+csModelName+g_c_csAIRfxFileExtension); if (!pclBrain->m_clListOfSubrs.IsEmpty ()) { M_SAVEENTRY1PARM(g_c_csAISubrSectionName, csFamilyName+"\\"+csModelName+"\\"+csModelName+g_c_csAISubrFileExtension); } CFast_bIsC = pModel->m_fn_ptdstGetMotorActor()->h_Brain->p_stMind->p_stAIModel->CFast_bIsC ; if ( CFast_bIsC ) { M_SAVEENTRY1PARM(g_c_csAICrrSectionName, csFamilyName+"\\"+csModelName+"\\"+csModelName+g_c_csAICrrFileExtension); M_SAVEENTRY1PARM( g_c_csAINodeSectionName, csFamilyName+"\\"+csModelName+"\\"+csModelName+g_c_csAINodeFileExtension ); } CString csFast_IsC; CString csFast_FunctionIndex; csFast_IsC.Format("%ld", CFast_bIsC); M_SAVEENTRY1PARM(g_c_csAIFastIsC_SectionName, csFast_IsC); csFast_FunctionIndex.Format("%ld", pModel->m_fn_ptdstGetMotorActor()->h_Brain->p_stMind->p_stAIModel->CFast_lFunction); M_SAVEENTRY1PARM(g_c_csAIFastFId_SectionName, csFast_FunctionIndex); SCRIPT_vSaveEndSection(p_tdstFile); } //End Shaitan FastC }