527 lines
16 KiB
C++
527 lines
16 KiB
C++
//#################################################################################
|
|
//
|
|
// BASE CLASS OF YOUR DLL interface
|
|
//
|
|
//#################################################################################
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "ACP_Base.h"
|
|
#include "ITF.h"
|
|
#include "SCR.h"
|
|
#include "DPT.h"
|
|
|
|
#define D_State_Define
|
|
#define D_ObjsTbls_Define
|
|
#define D_ZdxStuff_StructureDefine
|
|
//#include "DNM.h"
|
|
#include "incGAM.h"
|
|
#undef D_ZdxStuff_StructureDefine
|
|
#undef D_ObjsTbls_Define
|
|
#undef D_State_Define
|
|
|
|
|
|
#include "TFA.h"
|
|
#include "TAN.h"
|
|
|
|
#include "ANinterf.hpp"
|
|
//#include "AnimView.h"
|
|
#include "x:\cpa\main\inc\_EditID.h"
|
|
|
|
|
|
// infos
|
|
static CString g_csTANName = "Animation";
|
|
static CString g_csTANAuthor = "Vincent Lhullier & Chantal Oury";
|
|
static CString g_csTANVersion = "V 6.0.1 18/03/98";
|
|
static CString g_csTANFrenchHelpFile = "Animview.hlp";
|
|
static CString g_csTANEnglishHelpFile = "";
|
|
|
|
/*
|
|
*=============================================================================
|
|
* the DLL global definition
|
|
*=============================================================================
|
|
*/
|
|
tdstDLLIdentity g_stTAnimIdentity;
|
|
|
|
static CPA_EditorBase *gs_p_oFamilyDLL;
|
|
static CPA_EditorBase *gs_p_oActionDLL;
|
|
|
|
#define C_uiTANPopupPreLoad 10
|
|
/*
|
|
*=============================================================================
|
|
*
|
|
* TAnim_Interface implementation
|
|
*
|
|
*=============================================================================
|
|
*/
|
|
|
|
/*
|
|
*-----------------------------------------------------------------------------
|
|
* Constructor
|
|
*-----------------------------------------------------------------------------
|
|
*/
|
|
TAnim_Interface::TAnim_Interface(void)
|
|
{
|
|
// ************************** private internal
|
|
m_p_stDLLIdentity = &g_stTAnimIdentity;
|
|
|
|
// 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;
|
|
|
|
SetEditorInfo(g_csTANName, g_csTANAuthor, g_csTANVersion, g_csTANFrenchHelpFile, g_csTANEnglishHelpFile);
|
|
|
|
m_bCompleteLoad = FALSE;
|
|
}
|
|
|
|
/*
|
|
*-----------------------------------------------------------------------------
|
|
* fn_vJustAfterRegistered
|
|
*-----------------------------------------------------------------------------
|
|
*/
|
|
void TAnim_Interface::fn_vJustAfterRegistered()
|
|
{
|
|
CString a_csType[] = { C_szAnimationTypeName };
|
|
fn_vRegisterObjectsType ( a_csType , 1 ) ;
|
|
|
|
mfn_vLoadPreferences();
|
|
gs_p_oFamilyDLL = GetMainWorld()->GetToolDLLWithName( C_szDLLFamilyName );
|
|
gs_p_oActionDLL = GetMainWorld()->GetToolDLLWithName( C_szDLLActionName );
|
|
}
|
|
|
|
/*
|
|
*===========================================================================
|
|
* General Purpose
|
|
*===========================================================================
|
|
*/
|
|
|
|
BOOL TAnim_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, "PreLoad All Animations", C_uiTANPopupPreLoad );
|
|
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void TAnim_Interface::_OnSubMenuCommand (EDT_SubMenu *_p_oEDTSubMenu,UINT uiMsgID)
|
|
{
|
|
BOOL bLastCompleteLoad;
|
|
|
|
//ANNECY Shaitan NewInterface 24/03/98 {
|
|
if( _p_oEDTSubMenu->GetSubMenuType() == C_SubMenuLoad )
|
|
//ENDANNECY Shaitan NewInterface }
|
|
{
|
|
switch( uiMsgID )
|
|
{
|
|
case C_uiTANPopupPreLoad:
|
|
bLastCompleteLoad = m_bCompleteLoad;
|
|
m_bCompleteLoad = TRUE;
|
|
mfn_vLoadAllAnimations();
|
|
m_bCompleteLoad = bLastCompleteLoad;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
*-----------------------------------------------------------------------------
|
|
* OnQueryAction
|
|
*-----------------------------------------------------------------------------
|
|
*/
|
|
long TAnim_Interface::OnQueryAction (CPA_EditorBase *p_oSender, WPARAM wAction, LPARAM lParam)
|
|
{
|
|
BOOL bLastCompleteLoad;
|
|
switch( wAction )
|
|
{
|
|
case C_cLoadAllAnimsAction: // load animations of a family using m_bCompleteLoad
|
|
mfn_vLoadAnims( (CPA_Family *) lParam );
|
|
break;
|
|
case C_cPreLoadAllAnimation: // load animations of a family forcing m_bCompleteLoad
|
|
bLastCompleteLoad = m_bCompleteLoad;
|
|
m_bCompleteLoad = TRUE;
|
|
mfn_vLoadAnims( (CPA_Family *) lParam );
|
|
m_bCompleteLoad = bLastCompleteLoad;
|
|
break;
|
|
case C_cLoadAllAnimations: // load animations of all families
|
|
mfn_vLoadAllAnimations();
|
|
break;
|
|
case C_cSetCompleteLoadModeTAN:
|
|
m_bCompleteLoad = (BOOL) lParam;
|
|
mfn_vSavePreferences();
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
*-----------------------------------------------------------------------------
|
|
* OnQueryInfo
|
|
*-----------------------------------------------------------------------------
|
|
*/
|
|
long TAnim_Interface::OnQueryInfos (CPA_EditorBase *p_oSender, WPARAM wAction, LPARAM lParam)
|
|
{
|
|
switch( wAction )
|
|
{
|
|
case C_cGetCompleteLoadModeTAN:
|
|
return (long)m_bCompleteLoad;
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
*-----------------------------------------------------------------------------
|
|
* description : load animation
|
|
*-----------------------------------------------------------------------------
|
|
*/
|
|
BOOL TAnim_Interface::fn_bLoadBaseObject(CPA_BaseObject *p_oObject)
|
|
{
|
|
//ANNECY CT 20/02/98{
|
|
//if( ! p_oObject -> fn_bIsAvailable() )
|
|
//{
|
|
//ENDANNECY CT}
|
|
|
|
CPA_Animation *p_oAnim = (CPA_Animation*)p_oObject;
|
|
|
|
p_oAnim -> mfn_vLoad();
|
|
return TRUE;
|
|
|
|
//ANNECY CT 20/02/98{
|
|
//}
|
|
//return FALSE;
|
|
//ENDANNECY CT}
|
|
}
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Specific functions
|
|
*===========================================================================
|
|
*/
|
|
|
|
void TAnim_Interface::mfn_vLoadAllAnimations()
|
|
{
|
|
if( m_bCompleteLoad )
|
|
{
|
|
CPA_BaseObjectList *p_oFamilyList = gs_p_oFamilyDLL -> GetBaseObjectList( C_szFamilyTypeName );
|
|
Position xPos = p_oFamilyList -> GetHeadPosition();
|
|
|
|
while( xPos )
|
|
{
|
|
CPA_Family *p_oFamily = (CPA_Family*)p_oFamilyList -> GetNext( xPos );
|
|
mfn_vLoadAnims( p_oFamily );
|
|
}
|
|
}
|
|
else
|
|
mfn_vCreateAllLoadedAnimations();
|
|
}
|
|
|
|
/*
|
|
*-----------------------------------------------------------------------------
|
|
* description : load anims for a given family. Parameters is the family
|
|
*-----------------------------------------------------------------------------
|
|
*/
|
|
void TAnim_Interface::mfn_vLoadAnims( CPA_Family *_p_oFamily )
|
|
{
|
|
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)
|
|
char *p_szName;
|
|
char szAnimName[MAX_PATH];
|
|
char *p_cPoint;
|
|
CPA_Animation *p_oAnim; // pointer for animation creation
|
|
SCR_tdst_Link_Table *p_stLK = fnp_stGetAnimationLinkTable();
|
|
SCR_tdst_Link_Value *p_xLVa;
|
|
BOOL bPreviousLoadingWorld;
|
|
|
|
// initialize searching loop (search all file in family directory)
|
|
p_szName = szSearchName + sprintf( szSearchName, "%s\\%s\\", fn_szGetAnimDataPath(), _p_oFamily->fn_p_szGetName() );
|
|
strcpy( p_szName, "*.a3D" );
|
|
hFD = FindFirstFile( szSearchName, &stWFD );
|
|
|
|
// stop load if no file found or if an error occurs
|
|
if ( hFD != INVALID_HANDLE_VALUE )
|
|
{
|
|
// save Loading World Mode
|
|
bPreviousLoadingWorld = GetInterface() -> fn_bIsLoadingWorld();
|
|
// no prefix added
|
|
GetInterface() -> SetLoadingWorld( TRUE );
|
|
|
|
do
|
|
{
|
|
strcpy( p_szName, stWFD.cFileName );
|
|
// remove ".a3d" from name
|
|
strcpy( szAnimName, stWFD.cFileName );
|
|
if ( (p_cPoint = strrchr( szAnimName, '.' )) != NULL)
|
|
*p_cPoint = 0;
|
|
|
|
// get editor object
|
|
p_oAnim = (CPA_Animation*)GetBaseObject( CString(szAnimName), C_szAnimationTypeName, _p_oFamily );
|
|
// get engine object
|
|
p_xLVa = SCR_fnp_st_Link_SearchKey( p_stLK, szSearchName );
|
|
|
|
if( p_xLVa )
|
|
{
|
|
// engine exists, must have editor
|
|
if( p_oAnim == NULL )
|
|
{
|
|
// editor object doesn't exist, create it
|
|
p_oAnim = new CPA_Animation(this, _p_oFamily , szAnimName) ;
|
|
// add animation to family
|
|
_p_oFamily->mfn_vAddAnimation( p_oAnim );
|
|
}
|
|
// update engine
|
|
if( ((struct tdstAnim3d_ *)p_oAnim -> GetData()) != ((struct tdstAnim3d_ *)SCR_M_ul_Link_GetValue( p_xLVa )) )
|
|
{
|
|
p_oAnim -> SetData( (struct tdstAnim3d_ *) SCR_M_ul_Link_GetValue( p_xLVa ) );
|
|
p_oAnim -> SetAvailable( TRUE );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// engine doesn't exist
|
|
// create editor object only if complete load mode and doesn't already exist
|
|
if( m_bCompleteLoad && ( p_oAnim == NULL ) )
|
|
{
|
|
// create editor animation
|
|
|
|
p_oAnim = new CPA_Animation(this, _p_oFamily , szAnimName) ;
|
|
// add animation in family
|
|
_p_oFamily->mfn_vAddAnimation( p_oAnim );
|
|
p_oAnim -> SetData( NULL );
|
|
p_oAnim -> SetAvailable( FALSE );
|
|
}
|
|
}
|
|
} while (FindNextFile( hFD, &stWFD) );
|
|
|
|
// restore Loading World Mode
|
|
GetInterface() -> SetLoadingWorld( bPreviousLoadingWorld );
|
|
// close FindData handle
|
|
FindClose(hFD);
|
|
}
|
|
|
|
// Shaitan Correction Anims Specifiques
|
|
char szVersion[255];
|
|
char szPath[255];
|
|
char szRealName[255];
|
|
FILE *hIni;
|
|
|
|
// get info from ini file
|
|
hIni = fopen("version.ini", "rt");
|
|
if(hIni == NULL)
|
|
hIni = fopen("x:\\cpa\\exe\\main\\version.ini", "rt");
|
|
if(hIni)
|
|
{
|
|
fgets(szVersion, 49, hIni);
|
|
while(!isalnum(szVersion[strlen(szVersion) - 1]))
|
|
szVersion[strlen(szVersion) - 1] = '\0';
|
|
fclose(hIni);
|
|
}
|
|
// if no specific version, no more search
|
|
else
|
|
{
|
|
if( gs_p_oActionDLL )
|
|
gs_p_oActionDLL -> OnQueryAction( this, C_uiUpdateAnimList, 0 );
|
|
return;
|
|
}
|
|
|
|
char szVersion1[255];
|
|
char szVersion2[255];
|
|
char *szCut;
|
|
int iNumVersion, iNbVersions = 1;
|
|
|
|
strcpy(szVersion1, szVersion);
|
|
szCut = strchr(szVersion1, ',');
|
|
if (szCut)
|
|
{
|
|
strcpy(szVersion2, szCut+1 );
|
|
strcpy(szCut, "\0");
|
|
iNbVersions = 2;
|
|
}
|
|
|
|
for (iNumVersion = 0; iNumVersion < iNbVersions; iNumVersion++)
|
|
{
|
|
// build specific path
|
|
strcpy(szPath, iNumVersion ? szVersion2 : szVersion1);
|
|
strcat(szPath, strchr(fn_szGetAnimDataPath(), '\\'));
|
|
|
|
// initialize searching loop (search all file in family directory)
|
|
p_szName = szSearchName + sprintf( szSearchName, "%s\\%s\\", szPath, _p_oFamily->fn_p_szGetName() );
|
|
strcpy( p_szName, "*.a3D" );
|
|
hFD = FindFirstFile( szSearchName, &stWFD );
|
|
|
|
// stop load if no file found or if an error occurs
|
|
if ( hFD != INVALID_HANDLE_VALUE )
|
|
{
|
|
// save Loading World Mode
|
|
bPreviousLoadingWorld = GetInterface() -> fn_bIsLoadingWorld();
|
|
// no prefix added
|
|
GetInterface() -> SetLoadingWorld( TRUE );
|
|
|
|
do
|
|
{
|
|
strcpy( p_szName, stWFD.cFileName );
|
|
// remove ".a3d" from name
|
|
strcpy( szAnimName, stWFD.cFileName );
|
|
if ( (p_cPoint = strrchr( szAnimName, '.' )) != NULL)
|
|
*p_cPoint = 0;
|
|
|
|
// get editor object
|
|
p_oAnim = (CPA_Animation*)GetBaseObject( CString(szAnimName), C_szAnimationTypeName, _p_oFamily );
|
|
// get engine object
|
|
strcpy(szRealName, fn_szGetAnimDataPath());
|
|
strcat(szRealName, szSearchName + strlen(szPath));
|
|
p_xLVa = SCR_fnp_st_Link_SearchKey(p_stLK, szRealName);
|
|
|
|
if (p_xLVa)
|
|
{
|
|
// engine exists, must have editor
|
|
if( p_oAnim == NULL )
|
|
{
|
|
// editor object doesn't exist, create it
|
|
p_oAnim = new CPA_Animation(this, _p_oFamily , szAnimName) ;
|
|
// add animation to family
|
|
_p_oFamily->mfn_vAddAnimation( p_oAnim );
|
|
}
|
|
// update engine
|
|
if( ((struct tdstAnim3d_ *)p_oAnim -> GetData()) != ((struct tdstAnim3d_ *)SCR_M_ul_Link_GetValue( p_xLVa )) )
|
|
{
|
|
p_oAnim -> SetData( (struct tdstAnim3d_ *) SCR_M_ul_Link_GetValue( p_xLVa ) );
|
|
p_oAnim -> SetAvailable( TRUE );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// engine doesn't exist
|
|
// create editor object only if complete load mode and doesn't already exist
|
|
if( m_bCompleteLoad && ( p_oAnim == NULL ) )
|
|
{
|
|
// create editor animation
|
|
|
|
p_oAnim = new CPA_Animation(this, _p_oFamily , szAnimName) ;
|
|
// add animation in family
|
|
_p_oFamily->mfn_vAddAnimation( p_oAnim );
|
|
p_oAnim -> SetData( NULL );
|
|
p_oAnim -> SetAvailable( FALSE );
|
|
}
|
|
}
|
|
} while (FindNextFile( hFD, &stWFD) );
|
|
|
|
// restore Loading World Mode
|
|
GetInterface() -> SetLoadingWorld( bPreviousLoadingWorld );
|
|
// close FindData handle
|
|
FindClose(hFD);
|
|
}
|
|
}
|
|
//End Shaitan Correction Anims Specifiques }
|
|
|
|
//
|
|
if( gs_p_oActionDLL )
|
|
gs_p_oActionDLL -> OnQueryAction( this, C_uiUpdateAnimList, 0 );
|
|
}
|
|
|
|
/*
|
|
*-----------------------------------------------------------------------------
|
|
* description : create all animations using link table
|
|
*-----------------------------------------------------------------------------
|
|
*/
|
|
void TAnim_Interface::mfn_vCreateAllLoadedAnimations()
|
|
{
|
|
SCR_tdst_Link_Table *p_stLK = fnp_stGetAnimationLinkTable();
|
|
SCR_tdst_Link_Value *p_xLVa;
|
|
unsigned int uiPos;
|
|
char szSectionName[MAX_PATH];
|
|
char *szAnimName;
|
|
char *szFamilyName;
|
|
char *p_cPoint;
|
|
unsigned int iAnimDataPathLength = strlen( fn_szGetAnimDataPath() ) + 1;
|
|
CPA_Family *p_oFamily = NULL;
|
|
CPA_Animation *p_oAnim;
|
|
BOOL bPreviousLoadingWorld;
|
|
|
|
// save Loading World Mode
|
|
bPreviousLoadingWorld = GetInterface() -> fn_bIsLoadingWorld();
|
|
// no prefix added
|
|
GetInterface() -> SetLoadingWorld( TRUE );
|
|
//
|
|
uiPos = 0;
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_Link_Value, uiPos, p_xLVa, SCR_M_st_Link_GetDynamicArray(p_stLK));
|
|
while(p_xLVa)
|
|
{
|
|
strcpy( szSectionName, SCR_M_p_sz_Link_GetKey( p_xLVa ) );
|
|
// get family name
|
|
szFamilyName = szSectionName + iAnimDataPathLength;
|
|
// get anim name
|
|
szAnimName = strchr( szFamilyName, '\\' );
|
|
*szAnimName = 0;
|
|
szAnimName++;
|
|
if ( (p_cPoint = strrchr( szAnimName, '.' )) != NULL)
|
|
*p_cPoint = 0;
|
|
|
|
// search family
|
|
if( ( p_oFamily == NULL ) || ( strcmp(szFamilyName, p_oFamily -> fn_p_szGetName() ) ) )
|
|
p_oFamily = (CPA_Family*)gs_p_oFamilyDLL -> GetBaseObject( CString(szFamilyName), C_szFamilyTypeName );
|
|
|
|
ASSERT( p_oFamily );
|
|
|
|
// create animation
|
|
p_oAnim = new CPA_Animation(this, p_oFamily , szAnimName) ;
|
|
// add animation in family
|
|
p_oFamily->mfn_vAddAnimation( p_oAnim );
|
|
// set engine pointer
|
|
p_oAnim -> SetData( (struct tdstAnim3d_ *) SCR_M_ul_Link_GetValue( p_xLVa ) );
|
|
p_oAnim -> SetAvailable( TRUE );
|
|
|
|
// next
|
|
uiPos++;
|
|
SCR_M_DyAr_GetNextElement(SCR_tdst_Link_Value, uiPos, p_xLVa, SCR_M_st_Link_GetDynamicArray(p_stLK));
|
|
}
|
|
// restore Loading World Mode
|
|
GetInterface() -> SetLoadingWorld( bPreviousLoadingWorld );
|
|
}
|
|
|
|
/*
|
|
*-----------------------------------------------------------------------------
|
|
* description : load preferences from .ini
|
|
*-----------------------------------------------------------------------------
|
|
*/
|
|
void TAnim_Interface::mfn_vLoadPreferences()
|
|
{
|
|
CString csFileName;
|
|
char szText[256];
|
|
|
|
csFileName = M_GetMainApp()->m_csEditorDataPath + "Tools\\Anim\\Anim.ini";
|
|
char *p_szFileName = (char*)(LPCSTR)csFileName;
|
|
|
|
// CompleteLoad mode
|
|
GetPrivateProfileString ("Preference", "Complete Load", "YES", szText, 256, p_szFileName);
|
|
m_bCompleteLoad = !strcmpi( szText, "YES" );
|
|
}
|
|
|
|
/*
|
|
*-----------------------------------------------------------------------------
|
|
* description : save preferences on .ini
|
|
*-----------------------------------------------------------------------------
|
|
*/
|
|
void TAnim_Interface::mfn_vSavePreferences()
|
|
{
|
|
CString csFileName;
|
|
CString csDimension;
|
|
|
|
csFileName = M_GetMainApp()->m_csEditorDataPath + "Tools\\Anim\\Anim.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 );
|
|
}
|
|
|