reman3/Rayman_X/cpa/tempgrp/TAn/src/ANinterf.cpp

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 );
}