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

561 lines
19 KiB
C++

//#################################################################################
//
// BASE CLASS OF YOUR DLL interface
//
//#################################################################################
#include "stdafx.h"
#include "ACP_Base.h"
#include "DPT.h"
#include "TAC.h"
#include "TAN.h"
#include "TFA.h"
#include "ITF.h"
#include "FAinterf.hpp"
#include "DlgLoad.hpp"
#include "x:\cpa\main\inc\_editid.h"
// infos
static CString g_csTFAName = "Family";
static CString g_csTFAAuthor = "Marc Trabucato";
static CString g_csTFAVersion = "V 6.0.1 30/03/98";
static CString g_csTFAFrenchHelpFile = "";
static CString g_csTFAEnglishHelpFile = "";
/*=============================================================================
* constants
=============================================================================*/
#define C_uiTFAPopupLoad 10
#define C_uiTFAPopupPreLoad 11
/*=============================================================================
* macros
=============================================================================*/
#define M_TFAStatusBar(szText) M_GetMainWnd()->UpdateStatus(szText, C_STATUSPANE_INFOS, C_STATUS_WARNING)
#define M_TFAMessage(szText) M_GetMainWnd()->UpdateStatus(szText, C_STATUSPANE_INFOS, C_STATUS_NORMAL)
/*=============================================================================
* the DLL global definition
=============================================================================*/
tdstDLLIdentity g_stTFamilyIdentity;
static CPA_EditorBase *gs_p_oActionDLL;
static CPA_EditorBase *gs_p_oAnimationDLL;
/*=============================================================================
*
* TFamily_Interface implementation
*
=============================================================================*/
/*-----------------------------------------------------------------------------
* Constructor
*---------------------------------------------------------------------------*/
TFamily_Interface::TFamily_Interface(void)
{
// ************************** private internal
m_p_stDLLIdentity = &g_stTFamilyIdentity;
// Does your DLL can output in main game view ?
m_stBaseDLLDefinition.bCanOutputIn3DView = FALSE;
// Does your DLL can be refresh by engine ?
m_stBaseDLLDefinition.bCanBeRefreshedByEngine = FALSE;
// Editor Info
SetEditorInfo(g_csTFAName, g_csTFAAuthor, g_csTFAVersion, g_csTFAFrenchHelpFile, g_csTFAEnglishHelpFile);
//
m_lNbUnloadedFamilies = 0;
m_bLevelLoad = FALSE;
m_bCompleteLoad = FALSE;
}
/******************************************************************************
* ACP MEssages Functions overload
******************************************************************************/
void TFamily_Interface::fn_vJustAfterRegistered(void)
{
CString a_csType[] = { C_szFamilyTypeName, C_szChannelTypeName};
fn_vRegisterObjectsType ( a_csType , 2 ) ;
CPA_Family::Init();
// register section for SCRIPT analysis
SCR_fn_v_RdL0_RegisterCallback( "BaseFamily", CPA_Family::mfn_CallbackLoadBaseFamilySection, SCR_CRC_c_RdL0_ForSection );
// load preferences on .ini
mfn_vLoadPreferences();
}
/*-----------------------------------------------------------------------------
* Construct
*---------------------------------------------------------------------------*/
void TFamily_Interface::fn_vConstruct(void)
{
CPA_Family::InitStatic( GetMainWorld() );
gs_p_oActionDLL = GetMainWorld()->GetToolDLLWithName( C_szDLLActionName );
gs_p_oAnimationDLL = GetMainWorld()->GetToolDLLWithName( C_szDLLAnimationName );
}
/*-----------------------------------------------------------------------------
* load editor families once
*---------------------------------------------------------------------------*/
void TFamily_Interface::fn_vLevelChanges(void)
{
m_bLevelLoad = TRUE;
// create objects for loaded families
mfn_vCreateLoadedFamilies();
// create objects for unloaded families if needed
if( m_bCompleteLoad )
mfn_vCreateUnloadedFamilies();
m_bLevelLoad = FALSE;
}
/*-----------------------------------------------------------------------------
* load given object
*---------------------------------------------------------------------------*/
BOOL TFamily_Interface::fn_bLoadBaseObject(CPA_BaseObject *p_oObject)
{
if( ! p_oObject -> fn_bIsAvailable() )
{
CPA_Family *p_oFamily = (CPA_Family*)p_oObject;
p_oFamily -> mfn_vLoad();
if( p_oFamily -> fn_bIsAvailable() )
{
m_lNbUnloadedFamilies--;
if (gs_p_oActionDLL!= NULL)
gs_p_oActionDLL -> OnQueryAction(this , C_uiUpdateFamiliesList, (LPARAM) 0);
// update actor editor
CPA_EditorBase *pActorDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLActorName);
if (pActorDLL)
{
pActorDLL->OnQueryAction(NULL, C_uiActor_LoadFamilyModels, (LPARAM)p_oFamily);
pActorDLL->OnQueryAction (this, C_uiActor_UpdateTreeView, (LPARAM)0);
}
}
if( ! m_bLevelLoad )
{
// update mechanics
}
return TRUE;
}
return FALSE;
}
/******************************************************************************
* tool dll functions overload
******************************************************************************/
/*-----------------------------------------------------------------------------
* OnQueryAction
*---------------------------------------------------------------------------*/
long TFamily_Interface::OnQueryAction(CPA_EditorBase *p_oSender, WPARAM _wParam, LPARAM _lParam)
{
char *szFamilyName;
CPA_Family *p_oFamily = NULL;
switch( _wParam )
{
case C_uiSaveFamilies:
ASSERT(0);
break;
case C_uiLoadAFamily:
szFamilyName = (char*)_lParam;
p_oFamily = (CPA_Family*)GetBaseObject( CString(szFamilyName), C_szFamilyTypeName );
if( p_oFamily )
{
// load family
fn_bLoadBaseObject( p_oFamily );
}
return (long)p_oFamily;
break;
case C_uiGetUnLoadedFamiliesList:
ASSERT(0);
break;
case C_uiSetCompleteLoadModeTFA:
m_bCompleteLoad = (BOOL) _lParam;
mfn_vSavePreferences();
break;
case C_uiUpdateFamilies:
mfn_vCreateUnloadedFamilies();
break;
case C_uiGetChannel:
return mfn_lGetChannel( (tdstChannelInfoSearch*)_lParam );
break;
}
return 0;
}
/*-----------------------------------------------------------------------------
* OnQueryInfo
*---------------------------------------------------------------------------*/
long TFamily_Interface::OnQueryInfos(CPA_EditorBase *p_oSender, WPARAM _wParam, LPARAM _lParam)
{
switch( _wParam )
{
case C_uiGetCompleteLoadModeTFA:
return (long)m_bCompleteLoad;
break;
}
return 0;
}
/*=============================================================================
* Menus methods
=============================================================================*/
/*-----------------------------------------------------------------------------
* Description : Add entry in editor menu
*---------------------------------------------------------------------------*/
BOOL TFamily_Interface::fn_bDefineSubMenu(EDT_SubMenu *_p_oEDTSubMenu)
{
//ANNECY Shaitan NewInterface 24/03/98 {
if (_p_oEDTSubMenu->GetSubMenuType() == C_SubMenuLoad)
//ENDANNECY Shaitan NewInterface }
{
_p_oEDTSubMenu->AddAnEntry(this, "Load Some Families", C_uiTFAPopupLoad, FALSE, m_lNbUnloadedFamilies > 0 );
_p_oEDTSubMenu->AddAnEntry(this, "PreLoad All Families", C_uiTFAPopupPreLoad );
return TRUE;
}
return FALSE;
}
/*-----------------------------------------------------------------------------
* Description : Manage choice of Action entry in editor menu
*---------------------------------------------------------------------------*/
void TFamily_Interface::_OnSubMenuCommand(EDT_SubMenu *_p_oEDTSubMenu,UINT uiMsgID)
{
//ANNECY Shaitan NewInterface 24/03/98 {
if( _p_oEDTSubMenu->GetSubMenuType() == C_SubMenuLoad )
//ENDANNECY Shaitan NewInterface }
{
switch( uiMsgID )
{
case C_uiTFAPopupLoad:
mfn_vLoadFamilies();
break;
case C_uiTFAPopupPreLoad:
mfn_vCreateUnloadedFamilies();
break;
}
}
}
/*-----------------------------------------------------------------------------
* Description : Open Unloaded families DialogList and load selected families
*---------------------------------------------------------------------------*/
void TFamily_Interface::mfn_vLoadFamilies(void)
{
HINSTANCE hOldInst = AfxGetResourceHandle();
AfxSetResourceHandle( m_p_stDLLIdentity->hModule );
CDlgLoad *pDlg = new CDlgLoad();
//CPA2 Stegaru Cristian 98-06
CPA_EditorBase *pActorDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLActorName);
if (pDlg)
pDlg->mfn_vSetActorDLL (pActorDLL);
//End CPA2 Stegaru Cristian 98-06
pDlg -> fn_vSetFamilyList( GetBaseObjectList( C_szFamilyTypeName ) );
if( pDlg -> DoModal() == IDOK )
{
CPA_List<CPA_BaseObject> *p_oListOfSelectedFamilies = pDlg -> fn_p_oGetListOfSelectedFamilies();
POSITION xPos = p_oListOfSelectedFamilies -> GetHeadPosition();
while( xPos )
{
// load family
CPA_BaseObject *p_oFamily = (CPA_Family*)p_oListOfSelectedFamilies -> GetNext( xPos );
if( p_oFamily )
{
// load family
fn_bLoadBaseObject( p_oFamily );
}
}
if( p_oListOfSelectedFamilies -> GetCount() )
{
CPA_DLLBase *p_oActionDLL = GetMainWorld()->GetToolDLLWithName( C_szDLLActionName );
if (p_oActionDLL != NULL)
p_oActionDLL->OnQueryAction(this , C_uiUpdateFamiliesList, (LPARAM) 0);
//CPA2 Stegaru Cristian 98-06
if (pActorDLL)
pActorDLL->OnQueryAction (this, C_uiActor_UpdateTreeView, (LPARAM)0);
//End CPA2 Stegaru Cristian 98-06
}
}
delete pDlg;
AfxSetResourceHandle( hOldInst );
}
/*-----------------------------------------------------------------------------
* Description : search index channel with given datas
*---------------------------------------------------------------------------*/
long TFamily_Interface::mfn_lGetChannel(tdstChannelInfoSearch *_p_stChannelInfo)
{
/*
// search on given family
if( _p_stChannelInfo -> p_oFamily )
{
POSITION xPos = _p_stChannelInfo -> p_oFamily -> m_oListOfChannelsName . GetHeadPosition();
long lIndex = 0;
while ( xPos )
{
CString csChannelName = _p_stChannelInfo -> p_oFamily -> m_oListOfChannelsName . GetNext( xPos );
if( ! csChannelName . CompareNoCase( _p_stChannelInfo -> szChannel ) )
{
// find channel
_p_stChannelInfo -> lIndexOfChannel = lIndex;
return 1;
}
lIndex++;
}
}
// search channel on all families
long lFounded = 0;
_p_stChannelInfo -> p_oFamily = NULL;
CPA_BaseObjectList *p_oListOfFamilies = GetBaseObjectList( C_szFamilyTypeName );
Position xPosFA = p_oListOfFamilies -> GetHeadPosition();
while ( xPosFA )
{
CPA_Family *p_oFamily = (CPA_Family*)p_oListOfFamilies -> GetNext( xPosFA );
// search channel on current family
POSITION xPos = p_oFamily -> m_oListOfChannelsName . GetHeadPosition();
long lIndex = 0;
while ( xPos )
{
CString csChannelName = p_oFamily -> m_oListOfChannelsName . GetNext( xPos );
if( ! csChannelName . CompareNoCase( _p_stChannelInfo -> szChannel ) )
{
// find channel, update '_p_stChannelInfo'
_p_stChannelInfo -> p_oFamily = p_oFamily;
_p_stChannelInfo -> lIndexOfChannel = lIndex;
lFounded++;
if( lFounded == 2 )
{
// too many channel founded, error
_p_stChannelInfo -> p_oFamily = NULL;
_p_stChannelInfo -> lIndexOfChannel = 0;
return lFounded;
}
}
lIndex++;
}
}
return lFounded;
*/
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
CPA_List<CPA_BaseObject> oList;
long lNbFound;
if( _p_stChannelInfo -> p_oFamily )
{
// search on given family
lNbFound = fn_lFindObjects( &oList, _p_stChannelInfo -> szChannel, C_szChannelTypeName, _p_stChannelInfo -> p_oFamily );
if( lNbFound == 1 )
{
_p_stChannelInfo -> p_oChannel = (CPA_Channel*)oList . GetHead();
_p_stChannelInfo -> lIndexOfChannel = (long)_p_stChannelInfo -> p_oChannel -> GetData();
return 1;
}
}
else
{
// search on all families
lNbFound = fn_lFindObjects( &oList, _p_stChannelInfo -> szChannel, C_szChannelTypeName );
if( lNbFound == 1 )
{
_p_stChannelInfo -> p_oChannel = (CPA_Channel*)oList . GetHead();
_p_stChannelInfo -> p_oFamily = (CPA_Family*)_p_stChannelInfo -> p_oChannel -> GetOwner();
_p_stChannelInfo -> lIndexOfChannel = (long)_p_stChannelInfo -> p_oChannel -> GetData();
return 1;
}
}
// no channel found or too much channels ofund
_p_stChannelInfo -> p_oChannel = NULL;
_p_stChannelInfo -> p_oFamily = NULL;
_p_stChannelInfo -> lIndexOfChannel = 0;
return lNbFound;
}
/* -----------------02/10/97 17:42-------------------
* create editor objects for loaded families
* --------------------------------------------------*/
void TFamily_Interface::mfn_vCreateLoadedFamilies()
{
tdObjectType otType = 0;
char* szFamilyName = fn_szFindFamilyTypeNameOfFamilyType( otType++ );
char szMessage[255];
char* szBeginFamily;
CPA_Family *p_oFamily;
CPA_List<CPA_Family> oListOfFamilies;
POSITION xPos;
BOOL bPreviousLoadingWorld = GetInterface() -> fn_bIsLoadingWorld();
// no prefix
GetInterface() -> SetLoadingWorld( TRUE );
strcpy( szMessage, "PreLoad All Families" );
g_oBaseFrame.mfnv_UpdateTitle(szMessage);
// M_TFAMessage( szMessage );
while ( szFamilyName )
{
// create editor object
p_oFamily = new CPA_Family( this, NULL, szFamilyName );
oListOfFamilies . AddTail( p_oFamily );
// get next family name
szFamilyName = fn_szFindFamilyTypeNameOfFamilyType( otType++ );
}
// update StatusBar
// strcat( szMessage, " >>> 100% Completed" );
// M_TFAMessage( szMessage );
// load all animations
if( gs_p_oAnimationDLL )
gs_p_oAnimationDLL -> OnQueryAction( this, C_cLoadAllAnimations, 0 );
// load families
strcpy( szMessage, "Load Family : " );
szBeginFamily = szMessage + strlen( szMessage );
xPos = oListOfFamilies . GetHeadPosition();
while( xPos )
{
p_oFamily = oListOfFamilies . GetNext( xPos );
// update StatusBar
strcpy( szBeginFamily, p_oFamily -> fn_p_szGetName() );
g_oBaseFrame.mfnv_UpdateTitle(szMessage);
// M_TFAMessage( szMessage );
// link with engine object
p_oFamily -> mfn_vLoad();
p_oFamily -> mfn_vSetOnLevel( TRUE );
// update StatusBar
// strcat( szMessage, " >>> 100% Completed" );
// M_TFAMessage( szMessage );
}
oListOfFamilies . RemoveAll();
// restore prefix use
GetInterface() -> SetLoadingWorld( bPreviousLoadingWorld );
// M_TFAMessage( "" );
}
/* -----------------02/10/97 17:58-------------------
* create editor objects for unloaded families
* --------------------------------------------------*/
void TFamily_Interface::mfn_vCreateUnloadedFamilies()
{
WIN32_FIND_DATA stWFD; // structure for searching file
HANDLE hFD; // handle for searching file
char szSearchName[MAX_PATH]; // name of searched file (including relative path to family dir)
CPA_Family *p_oFamily; // created family
char szMessage[255];
char* szBeginFamily;
BOOL bPreviousLoadingWorld = GetInterface() -> fn_bIsLoadingWorld();
strcpy( szMessage, "Load Family : " );
szBeginFamily = szMessage + strlen( szMessage );
// no prefix
GetInterface() -> SetLoadingWorld( TRUE );
// initialize searching loop (search all file in family directory)
strcpy( szSearchName, fn_szGetFamiliesDataPath() );
strcat( szSearchName, "\\*");
hFD = FindFirstFile( szSearchName, &stWFD );
m_lNbUnloadedFamilies = 0;
// stop load if no file found or if an error occurs
if ( hFD == INVALID_HANDLE_VALUE )
return;
do
{
if ((stWFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (stWFD.cFileName[0] != '.') )
{
// current founded file is a directory and isn't current('.') or parent ('..') dir
// it correspond to a family which name is the same as the directory name
// existing family ???
p_oFamily = (CPA_Family*)GetBaseObject( CString(stWFD.cFileName), C_szFamilyTypeName );
if( p_oFamily == NULL )
{
// new family
// update StatusBar
strcpy( szBeginFamily, stWFD.cFileName );
M_TFAMessage( szMessage );
p_oFamily = new CPA_Family( this, NULL, stWFD.cFileName );
// family not loaded and not on current level
p_oFamily -> mfn_vSetOnLevel( FALSE );
m_lNbUnloadedFamilies++;
// update StatusBar
strcat( szMessage, " >>> 100% Completed" );
M_TFAMessage( szMessage );
}
else if( ! p_oFamily -> fn_bIsAvailable() )
{
m_lNbUnloadedFamilies++;
}
}
} while (FindNextFile( hFD, &stWFD) );
// clear StatusBar
M_TFAMessage( "" );
// close FindData handle
FindClose(hFD);
// restore prefix use
GetInterface() -> SetLoadingWorld( bPreviousLoadingWorld );
//
if( gs_p_oActionDLL )
gs_p_oActionDLL -> OnQueryAction( this, C_uiUpdateFamiliesList, 0 );
}
/* -----------------02/10/97 18:16-------------------
* save preferneces on .ini
* --------------------------------------------------*/
void TFamily_Interface::mfn_vSavePreferences()
{
CString csFileName;
CString csDimension;
csFileName = M_GetMainApp()->m_csEditorDataPath + "Tools\\Family\\Family.ini";
char *p_szFileName = (char*)(LPCSTR)csFileName;
// CompleteLoad mode
WritePrivateProfileString( "Preference", "Complete Load", m_bCompleteLoad ? "YES" : "NO" , p_szFileName );
// write on file
WritePrivateProfileString( NULL, NULL, NULL , p_szFileName );
}
/* -----------------02/10/97 18:16-------------------
* load preferneces on .ini
* --------------------------------------------------*/
void TFamily_Interface::mfn_vLoadPreferences()
{
CString csFileName;
char szText[256];
csFileName = M_GetMainApp()->m_csEditorDataPath + "Tools\\Family\\Family.ini";
char *p_szFileName = (char*)(LPCSTR)csFileName;
// CompleteLoad mode
GetPrivateProfileString ("Preference", "Complete Load", "YES", szText, 256, p_szFileName);
m_bCompleteLoad = !strcmpi( szText, "YES" );
}