reman3/Rayman_X/cpa/tempgrp/TFa/src/CPAFAMIL.cpp

497 lines
19 KiB
C++

/*=============================================================================
*
* Filename: CPAFamil.cpp
* Version: 1.0
* Date: 30/12/96
* Author: Marc Trabucato & Vincent Lhullier
*
* Description: implementation of CPA_Family class
* that contains description of a family (name, anims, actions )
*
*===========================================================================*/
#ifdef ACTIVE_EDITOR
#include "stdafx.h"
// ALX
#include "ACP_Base.h"
#include "TAC.h"
#include "OZO.h"
#include "DPT.h"
// End ALX
#include "TFA.h"
#include "x:\cpa\main\inc\_editid.h"
#include "FAInterf.hpp"
#define M_Char(string) (char*)(LPCTSTR)(string)
#define M_FileExists(szFileName) ( ! _access( szFileName, 0 ) )
//
static CPA_EditorBase *gs_p_oAnimationDLL;
static CPA_EditorBase *gs_p_oMecaDLL;
static CPA_EditorBase *gs_p_oTGMDLL;
static CPA_EditorBase *gs_p_oActionDLL;
static CPA_EditorBase *gs_p_oActorDLL;
static CPA_EditorBase *gs_p_oObjectTableDLL;
static CPA_EditorBase *gs_p_oZDxDLL;
/*=============================================================================
* class CPA_Family
=============================================================================*/
void del(tdxHandleToFamilyList h)
{
}
DeclareTemplateStatic(tdxHandleToFamilyList);
void CPA_Family::Init()
{
// register section for SCRIPT analysis
// SCR_fn_v_RdL0_RegisterCallback( "A3dChannelNames", CPA_Family::fn_CallBackChannelsSection, SCR_CRC_c_RdL0_ForSection );
CPA_EdMot<tdxHandleToFamilyList>::Init(NULL,NULL,del);
}
void CPA_Family::InitStatic(CPA_MainWorld *_p_oMainWorld)
{
gs_p_oAnimationDLL = _p_oMainWorld -> GetToolDLLWithName(C_szDLLAnimationName);
gs_p_oMecaDLL = _p_oMainWorld -> GetToolDLLWithName(C_szDLLMecaName);
gs_p_oTGMDLL = _p_oMainWorld -> GetToolDLLWithName(C_szDLLMaterialName);
gs_p_oActionDLL = _p_oMainWorld -> GetToolDLLWithName(C_szDLLActionName);
gs_p_oActorDLL = _p_oMainWorld -> GetObjectDLLWithName(C_szDLLActorName);
gs_p_oObjectTableDLL = _p_oMainWorld -> GetToolDLLWithName(C_szDLLObjectTableName);
gs_p_oZDxDLL = _p_oMainWorld -> GetObjectDLLWithName(C_szDLLZDxName);
}
/*-----------------------------------------------------------------------------
* Description : constructor (call CPA_ReachableObject constructor)
*---------------------------------------------------------------------------*/
CPA_Family::CPA_Family(CPA_EditorBase *_p_oEditor, tdxHandleToFamilyList _hEngineFamily, char *_szFamilyName /*=NULL*/)
:CPA_SaveObject(_p_oEditor, C_szFamilyTypeName, E_ss_Responsible, NULL, FALSE, fn_szGetFamiliesDataPath(), CPA_Family::mfn_vCallBackSave),
CPA_EdMot<tdxHandleToFamilyList>(_hEngineFamily)
{
// Section init & File Section Init
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
char szCompleteFileName[SCR_CV_ui_Cfg_MaxLenName];
char szReferencedSectionName[SCR_CV_ui_Cfg_MaxLenName];
strcpy( szFileName, _szFamilyName );
strcat( szFileName, "\\" );
strcat( szFileName, _szFamilyName );
strcat( szFileName, ".bdv" );
SCR_fn_v_RdL0_ComputeSectionName( szReferencedSectionName, szFileName, "SetBoundingVolume", NULL);
SetReferencedSectionName( szReferencedSectionName );
SetSectionData( this );
// Shaitan Correction {
// get complete file name (including datapath)
strcpy(szCompleteFileName, fn_szGetFamiliesDataPath());
strcat(szCompleteFileName, "\\");
strcat(szCompleteFileName, szFileName);
// check existence
if( ! M_FileExists( szCompleteFileName ) )
//End Shaitan Correction }
SetExistingSection( FALSE );
else
SetExistingSection( SCR_fn_c_RdL0_IsSectionExists( (char*)(LPCTSTR)GetCompleteSectionName() ) );
// Name
if( fn_eRename( _szFamilyName ? _szFamilyName : "" ) != E_mc_None )
SetDefaultValidName();
// fn_vUpdateSectionName();
// reset content of all list
m_oListOfActions . RemoveAll () ;
// Shaitan => state list in the level
m_oListOfUsedActions . RemoveAll () ;
// End Shaitan => state list in the level
m_oListOfAnimations . RemoveAll () ;
m_oListOfObjectTables.RemoveAll ();
// Shaitan => module list in the level
m_oListOfUsedPOs . RemoveAll () ;
m_oListOfUsedObjectTables . RemoveAll () ;
// End Shaitan => module list in the level
//
m_oListOfStates . SetEngineAnchor ( GetStruct() ? & GetStruct() -> hForStateArray : NULL ) ;
m_p_oInitialAction = NULL;
m_p_oZDxBoundingVolume = NULL;
//
m_bIsABaseFamily = FALSE;
// Shaitan => optimisation lists in the level
m_bMustUpdateStateList = FALSE;
m_bMustUpdatePOList = FALSE;
// End Shaitan => optimisation list in the level
}
/*-----------------------------------------------------------------------------
* Description : destructor
*---------------------------------------------------------------------------*/
CPA_Family::~CPA_Family()
{
}
/*-----------------------------------------------------------------------------
* Description : set engine struct
*---------------------------------------------------------------------------*/
void CPA_Family::SetStruct( tdxHandleToFamilyList _hFamily)
{
CPA_EdMot<tdxHandleToFamilyList>::SetStruct( _hFamily );
m_oListOfStates . SetEngineAnchor ( GetStruct() ? & GetStruct() -> hForStateArray : NULL ) ;
}
// ----------------------------------------------------------------------------
// Description : load family
// ----------------------------------------------------------------------------
void CPA_Family::mfn_vLoad(void)
{
if( ! fn_bIsAvailable() )
{
char *szFamilyName = fn_p_szGetName();
char szName[SCR_CV_ui_Cfg_MaxLenName];
CPA_Interface *p_oInterface = GetMainWorld() -> GetInterface();
BOOL bPreviousLoadingWorld = p_oInterface -> fn_bIsLoadingWorld();
tdObjectType otFamily = fn_otFindOrAddFamilyTypeOfFamilyTypeName( szFamilyName );
tdxHandleToFamilyList hFamily = fn_hFindOrAddFAmily(otFamily);
fn_vUpdateData( hFamily );
SetStruct( hFamily );
p_oInterface -> SetLoadingWorld( TRUE );
// update mechanics & GameMaterial (when load new Family)
if( ! ((TFamily_Interface*)GetEditor()) -> m_bLevelLoad )
{
// Load animations
if (gs_p_oAnimationDLL != NULL)
gs_p_oAnimationDLL->OnQueryAction(GetEditor() , C_cLoadAllAnimsAction, (LPARAM) this);
// send message to TME
if (gs_p_oMecaDLL != NULL)
gs_p_oMecaDLL->OnQueryAction(GetEditor() , Cw_TME_Query_updateAfterLoading, (LPARAM) 0);
// send Textures to 3D Card
GLI_vEndofGeometricLoad();
// send message to TGM (GameMaterial Tool)
if( gs_p_oTGMDLL )
gs_p_oTGMDLL -> OnQueryAction( (CPA_DLLBase*)this, (WPARAM)C_cCreateNewGameMaterial, 0);
}
// Load Actions
if (gs_p_oActionDLL != NULL)
gs_p_oActionDLL->OnQueryAction(GetEditor() , C_uiLoadAllActions, (LPARAM) this);
// Load all the lists of names of the family
if (gs_p_oActorDLL != NULL)
gs_p_oActorDLL->OnQueryAction(GetEditor() , C_uiActor_LoadNamesList , (LPARAM) this);
// Update All ZAList
if (gs_p_oActionDLL != NULL)
gs_p_oActionDLL->OnQueryAction(GetEditor() , C_uiUpdateZAList, (LPARAM) this);
// Load all table object of the family
if (gs_p_oObjectTableDLL != NULL)
gs_p_oObjectTableDLL->OnQueryAction(GetEditor() , C_uiLoadFamilyObjectTables, (LPARAM) this);
// get Bounding volume
if( GetStruct() )
{
ACP_tdxHandleOfObject hBdVl = fn_vGetGeometricSphereOfFamily( GetStruct() );
SCR_tdst_Link_Table *p_LinkTable = GLI_p_stGetLinkTableOfGeometric();
SCR_tdst_Link_Value *p_LinkValue = hBdVl ? SCR_fnp_st_Link_SearchValue(p_LinkTable,(unsigned long)hBdVl) : NULL;
char *szLinkName = p_LinkValue ? SCR_M_p_sz_Link_GetKey( p_LinkValue ) : NULL;
if( hBdVl && gs_p_oZDxDLL && szLinkName )
{
tdstCreateZoneMess stZoneMess;
SCR_fn_v_RdL0_SplitSectionName( szLinkName , NULL, NULL, szName );
stZoneMess . csTypeName = C_szBoundingVolumeName;
stZoneMess . hEngineZone = hBdVl;
stZoneMess . csName = szName;
stZoneMess . pOwner = this;
stZoneMess . szDataPath = GetDataPath();
stZoneMess . csReferenceSectionName = szLinkName + strlen( stZoneMess . szDataPath ) + 1;
m_p_oZDxBoundingVolume = (CPA_BaseObject*)gs_p_oZDxDLL -> OnQueryAction( GetEditor(), C_uiQueryCreateZDxObject, (LPARAM) & stZoneMess );
}
}
// load Channels Names
mfn_vFillChannelNamesList();
// ACZ file
mfn_vInitACZFile();
p_oInterface -> SetLoadingWorld( bPreviousLoadingWorld );
}
SetAvailable( TRUE );
}
// ----------------------------------------------------------------------------
// Description : return animation of given name
// ----------------------------------------------------------------------------
CPA_Animation* CPA_Family::mfn_p_oGetAnimation( CString _csAnimName )
{
CPA_Animation *p_oResult = NULL;
POSITION stPos = m_oListOfAnimations . GetHeadPosition();
while( stPos )
{
CPA_Animation *p_oAnimation = m_oListOfAnimations . GetNext ( stPos ) ;
if( ! _csAnimName . CompareNoCase( p_oAnimation -> GetName() ) )
{
p_oResult = p_oAnimation;
break;
}
}
return p_oResult;
}
// ----------------------------------------------------------------------------
// Description : return action of given name
// ----------------------------------------------------------------------------
CPA_Action* CPA_Family::mfn_p_oGetAction( CString _csActionName )
{
CPA_Action *p_oResult = NULL;
POSITION stPos = m_oListOfActions . GetHeadPosition();
while( stPos )
{
CPA_Action *p_oAction = m_oListOfActions . GetNext ( stPos ) ;
if( ! p_oAction -> GetName() . CompareNoCase( _csActionName ) )
{
p_oResult = p_oAction;
break;
}
}
return p_oResult;
}
// ----------------------------------------------------------------------------
// Description : return state of given name
// ----------------------------------------------------------------------------
CPA_State* CPA_Family::mfn_p_oGetState( CString _csStateName )
{
CPA_State *p_oResult = NULL;
POSITION stPos = m_oListOfStates . GetHeadPosition();
while( stPos )
{
CPA_State *p_oState = m_oListOfStates . GetNext ( stPos ) ;
if( ! p_oState -> GetName() . CompareNoCase ( _csStateName ) )
{
p_oResult = p_oState;
break;
}
}
return p_oResult;
}
// ----------------------------------------------------------------------------
// Description : return objecttable of given name
// ----------------------------------------------------------------------------
EditorObjectTable* CPA_Family::mfn_p_oGetObjectTable( CString _csObjectTableName )
{
EditorObjectTable *p_oResult = NULL;
POSITION stPos = m_oListOfObjectTables . GetHeadPosition();
while( stPos )
{
EditorObjectTable *p_oObjectTable = m_oListOfObjectTables . GetNext ( stPos ) ;
if( ! p_oObjectTable -> GetName() . CompareNoCase( _csObjectTableName ) )
{
p_oResult = p_oObjectTable;
break;
}
}
return p_oResult;
}
/*-----------------------------------------------------------------------------
* Description : save Bounding Volume on SCRIPT File .bdv
*---------------------------------------------------------------------------*/
void CPA_Family::mfn_vCallBackSave( SCR_tdst_File_Description *_p_stFile, char *_p_szSectionName,
void *_p_vData, SCR_tde_Ntfy_Action _eAction)
{
CPA_Family *p_oFamily = (CPA_Family*)_p_vData;
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
switch ( _eAction )
{
case SCR_EA_Ntfy_AddSection:
case SCR_EA_Ntfy_RebuildSection:
if( p_oFamily -> m_p_oZDxBoundingVolume != NULL )
{
SCR_fn_v_RdL0_SplitSectionName( _p_szSectionName, NULL, szActionName, NULL );
// compute Section name
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, NULL );
// save begin section
SCR_M_SvL0_SaveBeginSection( _p_stFile, szSectionName, SCR_CC_C_Cfg_EOL );
// save entry
SCR_M_SvL0_SaveEntry( _p_stFile, "BoundingVolume", SCR_CC_C_Cfg_NoChar );
SCR_fn_v_RdL0_ComputeSectionName( szSectionName, "*" , "Geometric", p_oFamily -> m_p_oZDxBoundingVolume -> fn_p_szGetName() );
SCR_fn_v_SvL0_SaveParameters_MP( _p_stFile, SCR_EF_SvL0_Normal, 1, szSectionName );
// End Section
SCR_M_SvL0_SaveEndSection( _p_stFile, SCR_CC_C_Cfg_EOL ) ;
SCR_M_SvL0_SaveBlankLine( _p_stFile ) ;
// update existing section
p_oFamily -> fn_vSectionSaved();
}
break;
case SCR_EA_Ntfy_DeleteSection:
p_oFamily -> fn_vSectionDeleted();
break;
}
}
/*-----------------------------------------------------------------------------
* Description : load callback for "BaseFamily" section in .ACE file
*---------------------------------------------------------------------------*/
SCR_tde_Anl_ReturnValue CPA_Family::mfn_CallbackLoadBaseFamilySection
( SCR_tdst_File_Description *_p_stFile, char *_p_szName, char *_ap_szParams[], SCR_tde_Anl_Action _eAction )
{
CPA_Family * p_oFamily;
SCR_M_RdL0_GetContextLong(0, 0, CPA_Family*, p_oFamily);
switch (_eAction)
{
case SCR_EA_Anl_BeginSection: if (_p_szName && stricmp (_p_szName , "TRUE" ) == 0) p_oFamily -> m_bIsABaseFamily = TRUE;
else
if (_p_szName && stricmp (_p_szName , "FALSE") == 0) p_oFamily -> m_bIsABaseFamily = FALSE;
else ASSERT (0);
break;
}
return SCR_ERV_Anl_NormalReturn;
}
/*-----------------------------------------------------------------------------
* Description :
*---------------------------------------------------------------------------*/
void CPA_Family::mfn_vFillChannelNamesList(void)
{
unsigned int uiPos;
unsigned int uiChannelNumber;
SCR_tdst_Link_Value *p_stValue;
char szEntry[SCR_CV_ui_Cfg_MaxLenName];
char *p_cChannel;
char *p_cCurrentFamilyName = fn_p_szGetName();
m_oListOfChannelsName . RemoveAll();
uiPos = 0;
uiChannelNumber = 0;
SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, p_stValue, SCR_M_st_Link_GetDynamicArray( & CHL_g_stLinkTable ) );
while ( p_stValue )
{
if( SCR_M_e_Link_GetState( p_stValue ) == SCR_ELS_Link_Initialized)
{
strcpy( szEntry, SCR_M_p_sz_Link_GetKey( p_stValue ) );
p_cChannel = strchr( szEntry, '-' );
if ( p_cChannel )
{
*p_cChannel = 0;
p_cChannel++;
if( ! strcmpi( szEntry, p_cCurrentFamilyName ) )
{
CPA_Channel *p_oChannel = new CPA_Channel( GetEditor(), this, p_cChannel, SCR_M_ul_Link_GetValue( p_stValue ) );
m_oListOfChannelsName . AddTail( CString( p_cChannel ) );
}
}
}
uiPos++;
SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, p_stValue, SCR_M_st_Link_GetDynamicArray( & CHL_g_stLinkTable ) );
}
}
/*-----------------------------------------------------------------------------
* Description :
*---------------------------------------------------------------------------*/
void CPA_Family::mfn_vInitACZFile()
{
BOOL bACZFileExists = FALSE;
BOOL bZASectionExists = FALSE;
BOOL bZAListSectionExists = FALSE;
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
char szZASectionName[SCR_CV_ui_Cfg_MaxLenName];
char szZAListSectionName[SCR_CV_ui_Cfg_MaxLenName];
if (gs_p_oActionDLL != NULL)
{
CPA_BaseObjectList *p_oList = NULL;
Position lPos;
// search ZA
p_oList = gs_p_oActionDLL -> GetBaseObjectList( C_szZATypeName );
lPos = p_oList -> GetHeadPosition();
while( lPos )
{
if( p_oList -> GetNext( lPos ) -> GetOwner() -> GetOwner() == (CPA_BaseObject*)this )
{
bZASectionExists = TRUE;
break;
}
}
// search ZAList
p_oList = gs_p_oActionDLL -> GetBaseObjectList( C_szZAListTypeName );
lPos = p_oList -> GetHeadPosition();
while( lPos )
{
if( p_oList -> GetNext( lPos ) -> GetOwner() -> GetOwner() == (CPA_BaseObject*)this )
{
bZAListSectionExists = TRUE;
break;
}
}
bACZFileExists = ( bZASectionExists || bZASectionExists );
}
//
sprintf( szFileName, "%s\\%s\\%s.acz", fn_szGetFamiliesDataPath(), fn_p_szGetName(), fn_p_szGetName() );
SCR_fn_v_RdL0_ComputeSectionName( szZASectionName, szFileName, "ActivationZone", NULL);
SCR_fn_v_RdL0_ComputeSectionName( szZAListSectionName, szFileName, "ArrayOfZoneSet", NULL);
//
if( bACZFileExists || M_FileExists( szFileName ) )
{
// ZA section
if( ! bZASectionExists && ! SCR_fn_c_RdL0_IsSectionExists( szZASectionName ) )
{
// add section
SCR_fn_v_SvL1_RegisterNotify( szZASectionName, mfn_vCallBackSaveEmptySection, this, SCR_EA_Ntfy_AddSection );
}
// ZAList section
if( ! bZAListSectionExists && ! SCR_fn_c_RdL0_IsSectionExists( szZAListSectionName ) )
{
// add section
SCR_fn_v_SvL1_RegisterNotify( szZAListSectionName, mfn_vCallBackSaveEmptySection, this, SCR_EA_Ntfy_AddSection );
}
}
else
{
// add ZA section
SCR_fn_v_SvL1_RegisterNotify( szZASectionName, mfn_vCallBackSaveEmptySection, this, SCR_EA_Ntfy_AddSection );
// add ZAList section
SCR_fn_v_SvL1_RegisterNotify( szZAListSectionName, mfn_vCallBackSaveEmptySection, this, SCR_EA_Ntfy_AddSection );
}
}
/*-----------------------------------------------------------------------------
* Description : create empty section
*---------------------------------------------------------------------------*/
void CPA_Family::mfn_vCallBackSaveEmptySection( SCR_tdst_File_Description *_p_stFile, char *_p_szSectionName,
void *_p_vData, SCR_tde_Ntfy_Action _eAction )
{
CPA_Family *p_oFamily = (CPA_Family*)_p_vData;
char szSection[SCR_CV_ui_Cfg_MaxLenName];
char szAction[SCR_CV_ui_Cfg_MaxLenName];
char szId[SCR_CV_ui_Cfg_MaxLenName];
unsigned int uiLastIndent = SCR_g_ui_SvL0_IndentationLevel;
SCR_g_ui_SvL0_IndentationLevel = 0;
if( _eAction == SCR_EA_Ntfy_AddSection )
{
SCR_fn_v_RdL0_SplitSectionName( _p_szSectionName, NULL, szAction, szId);
SCR_fn_v_RdL0_ComputeSectionName( szSection, NULL, szAction, szId);
SCR_M_SvL0_SaveBeginSection(_p_stFile, szSection, SCR_CC_C_Cfg_EOL );
SCR_M_SvL0_SaveEndSection(_p_stFile, SCR_CC_C_Cfg_EOL );
SCR_M_SvL0_SaveBlankLine( _p_stFile );
}
SCR_g_ui_SvL0_IndentationLevel = uiLastIndent;
}
#endif //ACTIVE_EDITOR