1925 lines
74 KiB
C++
1925 lines
74 KiB
C++
//#################################################################################
|
||
//
|
||
// BASE CLASS OF YOUR DLL interface
|
||
//
|
||
//#################################################################################
|
||
|
||
#ifdef ACTIVE_EDITOR
|
||
|
||
#include "stdafx.h"
|
||
#include "ACP_Base.h"
|
||
#include "itf.h"
|
||
#include "gmt.h"
|
||
#include "incgam.h"
|
||
#include "dpt.h"
|
||
#include "ogd.h"
|
||
#include "scr.h"
|
||
#include "gli.h"
|
||
#include "po.h"
|
||
#include "_interf.hpp"
|
||
#include "DiaMeca.hpp"
|
||
#include "DiaSound.hpp"
|
||
#include "DiaCol.hpp"
|
||
#include "DiaView.hpp"
|
||
#include "DiaMain.hpp"
|
||
#include "DiaText.hpp"
|
||
#include "DiaList.hpp"
|
||
#include "MatList.hpp"
|
||
#include "GMatObj.hpp"
|
||
#include "VMatObj.hpp"
|
||
#include "MMatObj.hpp"
|
||
#include "CMatObj.hpp"
|
||
#include "TexObj.hpp"
|
||
#include "TextureDlg.h"
|
||
#include "TGMdef.hpp"
|
||
#include "x:\cpa\main\inc\_editid.h"
|
||
|
||
//Mircea Dunka 9.11.98
|
||
/* SHA_TEMP
|
||
#define __MSC__
|
||
#include <glide.h>
|
||
//end Mircea Dunka
|
||
*/
|
||
|
||
// infos
|
||
static CString g_csTGMName = "Material";
|
||
static CString g_csTGMAuthor = "Y. Le Tensorer & B. Germain";
|
||
static CString g_csTGMVersion = "V 2.0.3 01/04/98";
|
||
static CString g_csTGMFrenchHelpFile = "Materiau.hlp";
|
||
static CString g_csTGMEnglishHelpFile = "";
|
||
|
||
BOOL g_bTipFirstTime = TRUE;
|
||
|
||
tdstDLLIdentity g_stMaterialIdentity;
|
||
extern Material_Interface *gs_p_oMaterialInterface;
|
||
|
||
// the Keyboard configuration
|
||
#define KA_TGM_EDITPICKEDMATERIALMODE 1
|
||
#define KA_TGM_SPLITTARGETONDROPMODE 2
|
||
static tdstKeyboardActionDef gs_a_stAppKeys[] =
|
||
{
|
||
{"Select material under cursor", KA_TGM_EDITPICKEDMATERIALMODE},
|
||
//CPA2 Corneliu Babiuc 27-05-98
|
||
// {"Split target on drop", KA_TGM_SPLITTARGETONDROPMODE},
|
||
{"Drop material", KA_TGM_SPLITTARGETONDROPMODE},
|
||
//END CPA2 Corneliu Babiuc 27-05-98
|
||
{NULL, 0},
|
||
};
|
||
|
||
FILE *g_xLogFile = NULL;
|
||
|
||
static long gs_lNbPreviousMaterialsInLinkTable = 0;
|
||
static long gs_lNbPreviousGeomobjInLinkTable = 0;
|
||
|
||
#define C_uiSubMenuOpen 1
|
||
#define C_uiSubMenuSavePrefs 2
|
||
#define C_uiSubMenuDeactivateWarnings 3
|
||
#define C_uiSubMenuShowMaterial 4
|
||
|
||
//left splitter
|
||
#define C_wMainPaneId 0
|
||
#define C_wCollidePaneId 1
|
||
#define C_wMechanicsPaneId 2
|
||
#define C_wSoundPaneId 3
|
||
#define C_wVisualPaneId 4
|
||
|
||
//bottom splitter
|
||
#define C_wTexturePaneId 0
|
||
#define C_wListPaneId 1
|
||
|
||
//ANNECY Shaitan DisableFunctions (16/04/98) {
|
||
BOOL g_bMasterEditor = FALSE;
|
||
//ENDANNECY Shaitan DisableFunctions }
|
||
|
||
//================================================================================
|
||
// CONSTRUCTOR.
|
||
// You must put here all your DLL interface definitions.
|
||
//================================================================================
|
||
Material_Interface::Material_Interface(void)
|
||
{
|
||
// ************************** private internal
|
||
m_p_stDLLIdentity = &g_stMaterialIdentity;
|
||
|
||
// Does your DLL can output in main game view ?
|
||
m_stBaseDLLDefinition.bCanOutputIn3DView = TRUE;
|
||
|
||
// Does your DLL can be refresh by engine ?
|
||
m_stBaseDLLDefinition.bCanBeRefreshedByEngine = TRUE;
|
||
|
||
SetEditorInfo(g_csTGMName, g_csTGMAuthor, g_csTGMVersion, g_csTGMFrenchHelpFile, g_csTGMEnglishHelpFile);
|
||
//m_bIsActivated = FALSE;
|
||
//m_bIsSelected = FALSE;
|
||
m_eRefreshListsMode = E_rlm_DoNothing;
|
||
m_bModeIsMaterialSelect = FALSE;
|
||
m_bModeIsIndexedTriangleSplit = FALSE;
|
||
m_p_oLeftSplitFrame = NULL;
|
||
m_p_oBottomSplitFrame = NULL;
|
||
m_p_oMaterialListView = NULL;
|
||
m_p_oMaterialView = NULL;
|
||
m_p_oMaterialMeca = NULL;
|
||
m_p_oMaterialMain = NULL;
|
||
m_p_oTextureDialog = NULL;
|
||
m_p_oWorldRoot = NULL;
|
||
m_p_oTextureDlg = NULL;
|
||
m_bEnteredEditorAtLeastOnce = FALSE;
|
||
GMT_fn_vInvalidate(&m_hQueriedDefaultGameMaterial);
|
||
m_bCanSaveModifs = TRUE;
|
||
m_bTexturesLoaded = FALSE;
|
||
m_p_oKeyConfiguration = NULL;
|
||
m_eLoadWarningsActivation = E_am_Never;
|
||
m_bDisplayMaterialUnderCursor = TRUE;
|
||
|
||
m_oTextureList.m_fn_vCreate(
|
||
C_cFixedSize, //all images will have the same size
|
||
C_wTextureSize, //this width
|
||
C_wTextureSize, //this height
|
||
TRUE, //load only optimized textures
|
||
TRUE //create small copies if necessary
|
||
);
|
||
|
||
g_xLogFile = fopen("TGM.log", "w");
|
||
if ( g_xLogFile )
|
||
{
|
||
fprintf(g_xLogFile, "DLL compiled on " __DATE__ " " __TIME__ "\n");
|
||
fflush(g_xLogFile);
|
||
}
|
||
|
||
//Mircea Dunka 12.11.1997
|
||
m_bGetGlidePixel = FALSE;
|
||
//end Mircea Dunka
|
||
}
|
||
|
||
|
||
Material_Interface::~Material_Interface(void)
|
||
{
|
||
ASSERT(m_oHighlightList.IsEmpty());
|
||
|
||
if ( m_p_oLeftSplitFrame )
|
||
delete m_p_oLeftSplitFrame;
|
||
|
||
if ( m_p_oBottomSplitFrame )
|
||
delete m_p_oBottomSplitFrame;
|
||
|
||
if ( m_p_oMaterialListView )
|
||
delete m_p_oMaterialListView;
|
||
|
||
if ( m_p_oMaterialView )
|
||
delete m_p_oMaterialView;
|
||
|
||
if ( m_p_oMaterialMeca )
|
||
delete m_p_oMaterialMeca;
|
||
|
||
if ( m_p_oMaterialMain )
|
||
delete m_p_oMaterialMain;
|
||
|
||
if ( m_p_oTextureDlg )
|
||
delete m_p_oTextureDlg;
|
||
|
||
if ( m_p_oKeyConfiguration )
|
||
delete m_p_oKeyConfiguration;
|
||
}
|
||
|
||
//**************************************************************************************
|
||
//Begin Mircea Dunka 31 Aug 1998 - DialogBar interface
|
||
void Material_Interface::fn_vDefineDlgBarBtnIcon (tde_DlgBarCategory wCategory, tds_DlgBarBtn *_pDlgBarBtn)
|
||
{
|
||
if(wCategory == C_DlgBarCategoryEditor)
|
||
{
|
||
_pDlgBarBtn->hIcon = ::LoadIcon((HINSTANCE)(GetDLLIdentity()->hModule), MAKEINTRESOURCE(IDI_TGM_DLGBAR_ICON));
|
||
CString oCst;
|
||
oCst = "Material";
|
||
if( (M_GetMainApp()) && (M_GetMainApp()->mp_oAppKeyboard) )
|
||
{
|
||
oCst += " (";
|
||
oCst += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate Material Editor"));
|
||
oCst += ")";
|
||
}
|
||
strcpy(_pDlgBarBtn->szToolTip, (char*)(LPCTSTR)oCst);
|
||
_pDlgBarBtn->uID = (UINT)this;
|
||
}
|
||
}
|
||
//end Mircea Dunka 31 Aug 1998
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
BOOL Material_Interface::fn_bDefineSubMenu(EDT_SubMenu *_p_oEDTSubMenu)
|
||
{
|
||
if ( _p_oEDTSubMenu -> GetSubMenuType() == C_SubMenuEditor )
|
||
{
|
||
CString csEntry;
|
||
csEntry = "Material";
|
||
csEntry += "\t";
|
||
csEntry += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate Material Editor"));;
|
||
_p_oEDTSubMenu -> AddAnEntry( this, (char *)LPCTSTR(csEntry), C_uiSubMenuOpen, fn_bIsCurrentEditor());
|
||
return TRUE;
|
||
}
|
||
else if ( _p_oEDTSubMenu->GetSubMenuType() == C_SubMenuSpecific ) //only sent to current editor
|
||
{
|
||
// submenu "Specific"
|
||
CString csMenuString("Current Load Warnings: ");
|
||
switch ( m_eLoadWarningsActivation )
|
||
{
|
||
case E_am_Never:
|
||
csMenuString += C_szActivationModeNever;
|
||
break;
|
||
|
||
case E_am_Once:
|
||
csMenuString += C_szActivationModeOnce;
|
||
break;
|
||
|
||
case E_am_Always:
|
||
csMenuString += C_szActivationModeAlways;
|
||
break;
|
||
}
|
||
_p_oEDTSubMenu->AddAnEntry(this, (char *) LPCTSTR(csMenuString), C_uiSubMenuDeactivateWarnings);
|
||
_p_oEDTSubMenu->AddAnEntry(this, "Show Material under cursor", C_uiSubMenuShowMaterial, m_bDisplayMaterialUnderCursor);
|
||
_p_oEDTSubMenu->AddASeparator();
|
||
_p_oEDTSubMenu->AddAnEntry(this, "Save Dialogs Dimensions", C_uiSubMenuSavePrefs);
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::_OnSubMenuCommand(EDT_SubMenu * /*_p_oEDTSubMenu*/,UINT uiMsgID)
|
||
{
|
||
if( uiMsgID == C_uiSubMenuOpen )
|
||
{
|
||
if (fn_bIsCurrentEditor())
|
||
GetMainWorld()-> fn_bCloseEditor ( this );
|
||
else
|
||
GetMainWorld()-> fn_bActivateEditor (this, NULL );
|
||
// envoie la commande onactivate...
|
||
//M_GetMainWnd() -> MessageBox("MATERIAL","OPEN",MB_OK);
|
||
}
|
||
else if ( uiMsgID == C_uiSubMenuSavePrefs )
|
||
{
|
||
m_vSavePreferences();
|
||
}
|
||
else if ( uiMsgID == C_uiSubMenuDeactivateWarnings )
|
||
{
|
||
//swap the activation of the load warnings
|
||
CString csOptionString;
|
||
switch ( m_eLoadWarningsActivation )
|
||
{
|
||
case E_am_Never:
|
||
m_eLoadWarningsActivation = E_am_Once;
|
||
csOptionString = C_szActivationModeOnce;
|
||
break;
|
||
|
||
case E_am_Once:
|
||
m_eLoadWarningsActivation = E_am_Always;
|
||
csOptionString = C_szActivationModeAlways;
|
||
break;
|
||
|
||
case E_am_Always:
|
||
m_eLoadWarningsActivation = E_am_Never;
|
||
csOptionString = C_szActivationModeNever;
|
||
break;
|
||
}
|
||
//get the config file name
|
||
CString csFileName = M_GetMainApp()->m_csEditorDataPath + "Tools\\Material\\Material.ini";
|
||
char *p_szFileName = (char*)(LPCSTR)csFileName;
|
||
//and update the corresponding entry
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection,
|
||
C_szLoadWarningsActivationProfileString,
|
||
csOptionString,
|
||
p_szFileName
|
||
);
|
||
//flush file write queue
|
||
WritePrivateProfileString (NULL, NULL, NULL, p_szFileName);
|
||
}
|
||
else if ( uiMsgID == C_uiSubMenuShowMaterial )
|
||
{
|
||
m_bDisplayMaterialUnderCursor = ! m_bDisplayMaterialUnderCursor;
|
||
}
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::m_vSetEditedMaterial(tdoEditorGameMaterial *_p_oMaterial)
|
||
{
|
||
if ( /*_p_oMaterial &&*/ _p_oMaterial != m_p_oGetEditedMaterial() )
|
||
m_p_oGetMaterialListView()->m_fn_vSelectMaterial(_p_oMaterial);
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
tdoEditorGameMaterial *Material_Interface::m_p_oGetEditedMaterial()
|
||
{
|
||
long lSelectecIndex = m_p_oGetMaterialListView()->m_fn_lGetSelectedItem();
|
||
return (tdoEditorGameMaterial *)
|
||
((lSelectecIndex >= 0) ? m_p_oGetMaterialListView()->m_fn_lGetContent(lSelectecIndex) : NULL);
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::fn_vJustAfterRegistered(void)
|
||
{
|
||
//----------------------------------------- declare the type name
|
||
CString apszName[] =
|
||
{
|
||
C_szGameMaterialTypeName,
|
||
C_szVisualMaterialTypeName,
|
||
C_szMechanicsMaterialTypeName,
|
||
C_szCollideMaterialTypeName,
|
||
C_szTextureTypeName,
|
||
C_szMaterialColName
|
||
};
|
||
fn_vRegisterObjectsType(apszName,6);
|
||
|
||
/* scrpit register */
|
||
m_p_oGetCollView()->m_fn_vInitLoad(); // collision names
|
||
m_p_oGetMecaView()->m_fn_vInitLoad(); // mecanic default values
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::fn_vConstruct(void)
|
||
{
|
||
#ifndef __INACTIVE_INTERFACE__
|
||
CString csFileName = M_GetMainApp()->m_csEditorDataPath + "Tools\\Material\\Material.ini";
|
||
char *p_szFileName = (char*)(LPCSTR)csFileName;
|
||
char sz20ProfileDimension[20];
|
||
|
||
HINSTANCE hOldInst = AfxGetResourceHandle();
|
||
AfxSetResourceHandle(m_p_stDLLIdentity->hModule);
|
||
|
||
//ANNECY Shaitan DisableFunctions (16/04/98) {
|
||
GetPrivateProfileString ("Status", "MasterEditor", "No", sz20ProfileDimension, 20, p_szFileName);
|
||
g_bMasterEditor = !stricmp(sz20ProfileDimension,"Yes");
|
||
//ENDANNECY Shaitan DisableFunctions }
|
||
|
||
m_p_oLeftSplitFrame = new CSplitFrame();
|
||
m_p_oLeftSplitFrame->CreateBase( "Edition", 1, 2, M_GetMainWorld());
|
||
m_p_oLeftSplitFrame->CreateSplitter(C_cVerticalSplitter, 5);
|
||
|
||
// set Display Material Under cursor options
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szDisplayMaterialUnderCursorProfileString, "TRUE", sz20ProfileDimension, 20, p_szFileName);
|
||
m_bDisplayMaterialUnderCursor = !stricmp(sz20ProfileDimension,"TRUE");
|
||
// create views into the 4 splitters
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szVisualPaneHeightProfileString, C_szDefaultVisualPaneHeight, sz20ProfileDimension, 20, p_szFileName);
|
||
m_p_oLeftSplitFrame->CreateView(C_wVisualPaneId, RUNTIME_CLASS(DiaView), "Visual", atoi(sz20ProfileDimension));
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szMechanicsPaneHeightProfileString, C_szDefaultMechanicsPaneHeight, sz20ProfileDimension, 20, p_szFileName);
|
||
m_p_oLeftSplitFrame->CreateView(C_wMechanicsPaneId, RUNTIME_CLASS(DiaMeca), "Mechanics", atoi(sz20ProfileDimension));
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szSoundPaneHeightProfileString, C_szDefaultSoundPaneHeight, sz20ProfileDimension, 20, p_szFileName);
|
||
m_p_oLeftSplitFrame->CreateView(C_wSoundPaneId, RUNTIME_CLASS(DiaSound), "Sound", atoi(sz20ProfileDimension));
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szCollidePaneHeightProfileString, C_szDefaultCollidePaneHeight, sz20ProfileDimension, 20, p_szFileName);
|
||
m_p_oLeftSplitFrame->CreateView(C_wCollidePaneId, RUNTIME_CLASS(DiaCol), "Collision", atoi(sz20ProfileDimension));
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szMainPaneHeightProfileString, C_szDefaultMainPaneHeight, sz20ProfileDimension, 20, p_szFileName);
|
||
m_p_oLeftSplitFrame->CreateView(C_wMainPaneId, RUNTIME_CLASS(DiaMain), "Main", atoi(sz20ProfileDimension));
|
||
//set the width of the frame
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szLeftPaneWidthProfileString, C_szDefaultLeftPaneWidth, sz20ProfileDimension, 20, p_szFileName);
|
||
m_p_oLeftSplitFrame->m_iInitWidth = atoi(sz20ProfileDimension);
|
||
//init other stuff
|
||
m_p_oLeftSplitFrame->m_iInitHeight = 0;
|
||
m_p_oLeftSplitFrame->mfn_vEnableCaption(FALSE);
|
||
m_p_oLeftSplitFrame->m_stWinTop.cLinkSame = FRM_C_MoveRight;
|
||
|
||
m_p_oBottomSplitFrame = new CSplitFrame();
|
||
m_p_oBottomSplitFrame->CreateBase("Material List", 2, 3, M_GetMainWorld());
|
||
m_p_oBottomSplitFrame->CreateSplitter(C_cHorizontalSplitter, 2);
|
||
|
||
//create views into the 2 splitters
|
||
//M_FRMAssociateView(m_p_oBottomSplitFrame, CMaterialListView);
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szTexturePaneWidthProfileString, C_szDefaultTexturePaneWidth, sz20ProfileDimension, 20, p_szFileName);
|
||
m_p_oBottomSplitFrame->CreateView(C_wTexturePaneId, RUNTIME_CLASS(DiaText), "Texture", atoi(sz20ProfileDimension));
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szListPaneWidthProfileString, C_szDefaultListPaneWidth, sz20ProfileDimension, 20, p_szFileName);
|
||
m_p_oBottomSplitFrame->CreateView(C_wListPaneId, RUNTIME_CLASS(CMaterialListView), "Materials", atoi(sz20ProfileDimension));
|
||
//set the initial height of the pane
|
||
m_p_oBottomSplitFrame->mfn_vEnableCaption(FALSE);
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szMaterialListHeightProfileString, C_szDefaultMaterialListHeight, sz20ProfileDimension, 20, p_szFileName);
|
||
m_p_oBottomSplitFrame->m_iInitHeight = atoi(sz20ProfileDimension);
|
||
|
||
// gets pointers to the dialog boxes
|
||
m_p_oMaterialMeca = (DiaMeca *) m_p_oLeftSplitFrame->m_fn_p_oGetPane(C_wMechanicsPaneId);
|
||
m_p_oMaterialSound = (DiaSound *) m_p_oLeftSplitFrame->m_fn_p_oGetPane(C_wSoundPaneId);
|
||
m_p_oMaterialCol = (DiaCol *) m_p_oLeftSplitFrame->m_fn_p_oGetPane(C_wCollidePaneId);
|
||
m_p_oMaterialView = (DiaView *) m_p_oLeftSplitFrame->m_fn_p_oGetPane(C_wVisualPaneId);
|
||
m_p_oMaterialMain = (DiaMain *) m_p_oLeftSplitFrame->m_fn_p_oGetPane(C_wMainPaneId);
|
||
m_p_oMaterialListView = ((CMaterialListView *) m_p_oBottomSplitFrame->m_fn_p_oGetPane(C_wListPaneId))/*->m_p_oMaterialListView*/;
|
||
m_p_oTextureDialog = (DiaText *) m_p_oBottomSplitFrame->m_fn_p_oGetPane(C_wTexturePaneId);
|
||
|
||
//build the dialog to choose a texture, and share the bitmap list with the other view
|
||
m_p_oTextureDlg = new CTextureDlg;
|
||
m_p_oMaterialListView->m_fn_vSetBitmapList(&m_oTextureList);
|
||
|
||
// Setup Keyboard Preferences
|
||
m_p_oKeyConfiguration = new CPA_KeyActionConfiguration("Material\\Material.ini", gs_a_stAppKeys);
|
||
m_p_oKeyConfiguration->mfn_vSetObjectName("Material Editor");
|
||
|
||
//load the warning config preference
|
||
GetPrivateProfileString(C_szPreferencesProfileSection, C_szLoadWarningsActivationProfileString, C_szDefaultLoadWarningsActivation, sz20ProfileDimension, 20, p_szFileName);
|
||
if ( !strcmp(sz20ProfileDimension, C_szActivationModeNever) )
|
||
m_eLoadWarningsActivation = E_am_Never;
|
||
else if ( !strcmp(sz20ProfileDimension, C_szActivationModeOnce) )
|
||
m_eLoadWarningsActivation = E_am_Once;
|
||
else if ( !strcmp(sz20ProfileDimension, C_szActivationModeAlways) )
|
||
m_eLoadWarningsActivation = E_am_Always;
|
||
else
|
||
m_eLoadWarningsActivation = E_am_InvalidMode;
|
||
AfxSetResourceHandle( hOldInst );
|
||
#endif /* !__INACTIVE_INTERFACE__ */
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::fn_vOnActivateEditor(CPA_List<CPA_BaseObject> * /*pParams*/, BOOL /*bBackActivated*//*=FALSE*/)
|
||
{
|
||
/*
|
||
int iSwapBuf;
|
||
iSwapBuf = g_oFrameGest.ma_iOrder[1][2];
|
||
g_oFrameGest.ma_iOrder[1][2] = g_oFrameGest.ma_iOrder[2][3];
|
||
g_oFrameGest.ma_iOrder[2][3] = iSwapBuf;
|
||
*/
|
||
if ( !m_bEnteredEditorAtLeastOnce )
|
||
{
|
||
m_bEnteredEditorAtLeastOnce = TRUE;
|
||
if ( m_eRefreshListsMode != E_rlm_DoNothing )
|
||
m_vDoRefreshLists(0, m_eRefreshListsMode, TRUE);
|
||
|
||
CString csLevelName(fn_p_szGetLevelName());
|
||
csLevelName += tdoEditorGameMaterial::m_csGetScriptExtension();
|
||
short wIndex = ((CComboBox *) m_p_oGetMainView()->GetDlgItem(IDC_COMBO_FILE))->FindStringExact(CB_ERR, csLevelName);
|
||
if ( wIndex != CB_ERR )
|
||
{
|
||
((CComboBox *) m_p_oGetMainView()->GetDlgItem(IDC_COMBO_FILE))->SetCurSel(wIndex);
|
||
m_p_oGetMainView()->m_vReflectFileSelectionChange();
|
||
}
|
||
}
|
||
//m_bIsSelected = TRUE;
|
||
m_vShowEditor();
|
||
|
||
// display Tip of the Day
|
||
GetInterface()->fn_vDisplayTipOfDay("Materials", "TGM", g_bTipFirstTime);
|
||
g_bTipFirstTime = FALSE;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::fn_vOnCloseEditor(void)
|
||
{
|
||
/*
|
||
int iSwapBuf;
|
||
iSwapBuf = g_oFrameGest.ma_iOrder[1][2];
|
||
g_oFrameGest.ma_iOrder[1][2] = g_oFrameGest.ma_iOrder[2][3];
|
||
g_oFrameGest.ma_iOrder[2][3] = iSwapBuf;
|
||
*/
|
||
//m_bIsSelected = FALSE;
|
||
m_vHideEditor();
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::m_fn_vShowMaterialAll(tdoEditorGameMaterial *_p_oMaterial /*= NULL*/)
|
||
{
|
||
tdoEditorGameMaterial *p_oMaterial = _p_oMaterial ? _p_oMaterial : m_p_oGetEditedMaterial();
|
||
GMT_tdxHandleToGameMaterial hMaterial;
|
||
|
||
if ( p_oMaterial )
|
||
{
|
||
m_vSetEditedMaterial(p_oMaterial);
|
||
hMaterial = p_oMaterial->m_hGetEngineMaterial();
|
||
}
|
||
else
|
||
GMT_fn_vInvalidate(&hMaterial);
|
||
|
||
m_p_oGetVisualView()->m_fn_vShowMaterial(hMaterial);
|
||
m_p_oGetMecaView()->m_fn_vShowMaterial(hMaterial);
|
||
m_p_oGetSoundView()->m_fn_vShowMaterial(hMaterial);
|
||
m_p_oGetCollView()->m_fn_vShowMaterial(hMaterial);
|
||
m_p_oGetMainView()->m_fn_vShowMaterial(hMaterial);
|
||
//do not call the texture view display method, because the visual material view has taken care of that
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::m_vShowEditor()
|
||
{
|
||
//update links in the coherence manager
|
||
m_vRefreshMaterialSuperObjectLinks();
|
||
//make the listview display the materials currently used by the engine
|
||
m_p_oGetMaterialListView()->m_vRefreshDisplayedMaterialList(
|
||
m_p_oGetMaterialListView()->m_bAllMaterialsDisplayed()
|
||
);
|
||
//refresh lists if necessary (no action override)
|
||
//m_vDoRefreshLists(0, E_rlm_DoNothing, !m_bTexturesLoaded);
|
||
|
||
// activate the frames of the editor
|
||
HWND WindowWithFocus = GetFocus ();
|
||
|
||
if ( m_p_oLeftSplitFrame )
|
||
g_oFrameGest.mfn_vActivateWindow(m_p_oLeftSplitFrame);
|
||
|
||
if ( m_p_oBottomSplitFrame )
|
||
g_oFrameGest.mfn_vActivateWindow(m_p_oBottomSplitFrame);
|
||
|
||
SetFocus(WindowWithFocus);
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::m_vHideEditor()
|
||
{
|
||
if ( m_p_oLeftSplitFrame != NULL )
|
||
g_oFrameGest.mfn_vDisactivateWindow(m_p_oLeftSplitFrame);
|
||
|
||
if ( m_p_oBottomSplitFrame != NULL )
|
||
g_oFrameGest.mfn_vDisactivateWindow(m_p_oBottomSplitFrame);
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::fn_vBeforeEngine(void)
|
||
{
|
||
if ( fn_bIsCurrentEditor() )
|
||
m_vHideEditor();
|
||
|
||
//copy the current value of each game material back in its initial value
|
||
/*
|
||
CPA_BaseObjectList *p_oGameMaterialList = GetBaseObjectList(C_szGameMaterialTypeName);
|
||
Position xPos = p_oGameMaterialList->GetHeadPosition();
|
||
while ( xPos ) //for each game material
|
||
{
|
||
tdoEditorGameMaterial *p_oGameMaterial = (tdoEditorGameMaterial *) p_oGameMaterialList->GetNext(xPos);
|
||
if ( p_oGameMaterial->fn_bIsAvailable() )
|
||
GMT_fn_vSetGameMaterialInitialValues(p_oGameMaterial->m_hGetEngineMaterial());
|
||
}
|
||
*/
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::fn_vBeforeEditor(void)
|
||
{
|
||
//since the materials may change in the engine, restore the initial values
|
||
CPA_BaseObjectList *p_oGameMaterialList = GetBaseObjectList(C_szGameMaterialTypeName);
|
||
Position xPos = p_oGameMaterialList->GetHeadPosition();
|
||
/* while ( xPos ) //for each game material
|
||
{
|
||
tdoEditorGameMaterial *p_oGameMaterial = (tdoEditorGameMaterial *) p_oGameMaterialList->GetNext(xPos);
|
||
if ( p_oGameMaterial->fn_bIsAvailable() )
|
||
GMT_fn_vReInitializeGameMaterial(p_oGameMaterial->m_hGetEngineMaterial());
|
||
}
|
||
*/ //now we can show the editor if relevant
|
||
if ( fn_bIsCurrentEditor() )
|
||
m_vShowEditor();
|
||
}
|
||
|
||
//================================================================================
|
||
//called before the world is sent to the list, if we want to change anything
|
||
//================================================================================
|
||
/*virtual*/ void Material_Interface::fn_vBeforeDrawingWorld(GLD_tdstViewportAttributes *p1, GLI_tdxHandleToLight p2, DEV_ViewPort* p3)
|
||
{
|
||
ASSERT(m_oHighlightList.IsEmpty());
|
||
//get the list of game materials
|
||
CPA_BaseObjectList *p_oGameMaterialList = GetBaseObjectList(C_szGameMaterialTypeName);
|
||
Position xPos = p_oGameMaterialList->GetHeadPosition();
|
||
while ( xPos ) //for each game material
|
||
{
|
||
tdoEditorGameMaterial *p_oGameMaterial = (tdoEditorGameMaterial *) p_oGameMaterialList->GetNext(xPos);
|
||
if ( p_oGameMaterial->fn_bIsAvailable() )
|
||
{
|
||
//get its associated engine collide and mechanics materials
|
||
GMT_tdxHandleToGameMaterial hGameMaterial = p_oGameMaterial->m_hGetEngineMaterial();
|
||
DNM_tdxHandleToMecMatCharacteristics hMaterialMechanics = GMT_fn_hGetMechanicsMaterial(hGameMaterial);
|
||
GMT_tdxHandleToCollideMaterial hMaterialCollide = GMT_fn_hGetCollideMaterial(hGameMaterial);
|
||
//get the associated editor submaterials
|
||
tdoEditorCollideMaterial *p_oCollideMaterial = (tdoEditorCollideMaterial *) m_p_oGetEditorObjectForEngine(hMaterialCollide);
|
||
tdoEditorMechanicsMaterial *p_oMechanicsMaterial = (tdoEditorMechanicsMaterial *) m_p_oGetEditorObjectForEngine(hMaterialMechanics);
|
||
//get their highlight color, if relevant
|
||
short wDoHighlight = 0;
|
||
GEO_tdstColor stMecaColor = { 0.0, 0.0, 0.0, 0.0 } , stCollideColor = { 0.0, 0.0, 0.0, 0.0 };
|
||
if ( p_oCollideMaterial && p_oCollideMaterial->m_bGetHighlightColor(&stCollideColor) )
|
||
wDoHighlight ++;
|
||
if ( p_oMechanicsMaterial && p_oMechanicsMaterial->m_bGetHighlightColor(&stMecaColor) )
|
||
wDoHighlight ++;
|
||
//at least one is highlighted
|
||
if ( wDoHighlight )
|
||
{
|
||
//create a highlight item
|
||
tdstHighlightItem *p_stItem = new tdstHighlightItem;
|
||
//remember for which game material
|
||
p_stItem->hGameMaterial = hGameMaterial;
|
||
//remember its original visual material
|
||
p_stItem->hOriginalVisualMaterial = GMT_fn_hGetVisualMaterial(hGameMaterial);
|
||
//build a new visual material for highlighting (its a copy)
|
||
GLI_xDuplicateMaterial(&p_stItem->hHighlightVisualMaterial, p_stItem->hOriginalVisualMaterial);
|
||
//compute the average highlight color
|
||
stMecaColor.xR = (stMecaColor.xR + stCollideColor.xR) / wDoHighlight;
|
||
stMecaColor.xG = (stMecaColor.xG + stCollideColor.xG) / wDoHighlight;
|
||
stMecaColor.xB = (stMecaColor.xB + stCollideColor.xB) / wDoHighlight;
|
||
//and set it in the highlight visual material for all colors, so that we see it...
|
||
unsigned long xType;
|
||
GLI_xGetMaterialType(p_stItem->hHighlightVisualMaterial, &xType);
|
||
if ( xType & GLI_C_lIsTextured )
|
||
{
|
||
//make the engine not display the texture
|
||
xType &= ~GLI_C_lIsTextured;
|
||
xType &= ~GLI_C_lIsNotForceColorMaterial;
|
||
//make the engine use the color attributes
|
||
GLI_xSetMaterialType(p_stItem->hHighlightVisualMaterial, xType);
|
||
//GLI_xSetMaterialTexture(p_stItem->hHighlightVisualMaterial, NULL);
|
||
}
|
||
GLI_xSetMaterialAmbientCoef(p_stItem->hHighlightVisualMaterial, &stMecaColor);
|
||
GLI_xSetMaterialDiffuseCoef(p_stItem->hHighlightVisualMaterial, &stMecaColor);
|
||
GLI_xSetMaterialSpecularCoef(p_stItem->hHighlightVisualMaterial, 1, &stMecaColor);
|
||
//remove the texture so that we see it even better, especially for some faces whose aspect wont change if we dont...
|
||
//give the temporary visual material to the game material
|
||
GMT_fn_vSetVisualMaterial(p_stItem->hGameMaterial, p_stItem->hHighlightVisualMaterial);
|
||
//then add it to the list, so that we can restore the visual material once the display is updated
|
||
m_oHighlightList.AddTail(p_stItem);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//================================================================================
|
||
//called after the list is sent to the viewport
|
||
//-> changes will not affect display, but we can add thing in the list if we want
|
||
//================================================================================
|
||
/*virtual*/ void Material_Interface::fn_vAddObjectsToDraw(GLD_tdstViewportAttributes *p1, GLI_tdxHandleToLight p2, DEV_ViewPort* p3)
|
||
{
|
||
while ( !m_oHighlightList.IsEmpty() )
|
||
{
|
||
tdstHighlightItem *p_stItem = m_oHighlightList.RemoveHead();
|
||
GMT_fn_vSetVisualMaterial(p_stItem->hGameMaterial, p_stItem->hOriginalVisualMaterial);
|
||
GLI_xDeleteMaterial(p_stItem->hHighlightVisualMaterial);
|
||
delete p_stItem;
|
||
}
|
||
}
|
||
|
||
//================================================================================
|
||
//called after the list is displayed -> the screen has changed when we receive this
|
||
//================================================================================
|
||
/*virtual*/ void Material_Interface::fn_vAddObjectsToDraw2(GLD_tdstViewportAttributes *p1, GLI_tdxHandleToLight p2)
|
||
{
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
BOOL Material_Interface::fn_bDefinePopupMenu
|
||
(
|
||
EDT_PopUpMenu *pPopup,
|
||
CPA_List<CPA_SuperObject> * /*pSelection*/,
|
||
BOOL bAsCurrentEditor
|
||
)
|
||
{
|
||
if ( bAsCurrentEditor )
|
||
{
|
||
pPopup->AddAnEntry(this, "Exit Material editor", 0);
|
||
tdoEditorGameMaterial *p_oCurrentMaterial = m_p_oGetEditedMaterial();
|
||
if ( m_p_oGetCurrentFileObject() && p_oCurrentMaterial )
|
||
pPopup->AddAnEntry(this, (char*)LPCTSTR(CString("Drop material '") + p_oCurrentMaterial->GetName() + "' under cursor"), 1);
|
||
CPoint oScreenPos;
|
||
GetCursorPos(&oScreenPos);
|
||
m_vFindMaterialUnderCursor(oScreenPos, FALSE);
|
||
if ( m_p_oMaterialUnderCursor )
|
||
pPopup->AddAnEntry(this, (char*)LPCTSTR(CString("Edit material '") + m_p_oMaterialUnderCursor->GetName() + "'"), 2);
|
||
|
||
/* SHA_TEMP
|
||
//Mircea Dunka 03.11.1998
|
||
if(m_bGetGlidePixel)
|
||
pPopup->AddAnEntry(this, "Stop Pixel Capture", 3);
|
||
else
|
||
pPopup->AddAnEntry(this, "Start Pixel Capture", 3);
|
||
//end Mircea Dunka
|
||
*/
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::_OnPopUpMenuCommand(UINT _IDCmdMsg)
|
||
{
|
||
switch ( _IDCmdMsg )
|
||
{
|
||
case 0: //exit material editor
|
||
/*m_bIsSelected = !*/GetMainWorld()->fn_bCloseEditor(this);
|
||
break;
|
||
|
||
case 1: //drop the current material on the object under the cursor when the popup menu was opened
|
||
m_p_oGetMaterialListView()->m_vApplyCurrentMaterialToObjectUnderCursor((HIE_tdstPickInfo *) m_a_stPickInfo);
|
||
break;
|
||
|
||
case 2: //make the editor select the material under the cursor when the popup menu was opened
|
||
m_bEditPickedMaterial((HIE_tdstPickInfo *) m_a_stPickInfo);
|
||
break;
|
||
/* SHA_TEMP
|
||
//Mircea Dunka 03.11.1998
|
||
case 3:
|
||
m_bGetGlidePixel = !m_bGetGlidePixel ;
|
||
break;
|
||
//end Mircea Dunka
|
||
*/
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
BOOL Material_Interface::_OnKeyDown(UINT _nChar, UINT /*nRepCnt*/, UINT /*nFlags*/)
|
||
{
|
||
if ( fn_bIsCurrentEditor() )
|
||
{
|
||
switch ( m_p_oKeyConfiguration->mfn_uwKeyToAction(_nChar) )
|
||
{
|
||
case KA_TGM_EDITPICKEDMATERIALMODE:
|
||
if ( !m_bModeIsMaterialSelect )
|
||
{
|
||
m_bModeIsMaterialSelect = TRUE;
|
||
fn_vGiveProgressInfo("pick an object to select its material", -1);
|
||
}
|
||
return TRUE;
|
||
|
||
case KA_TGM_SPLITTARGETONDROPMODE:
|
||
if ( !m_bModeIsIndexedTriangleSplit )
|
||
{
|
||
m_bModeIsIndexedTriangleSplit = TRUE;
|
||
fn_vGiveProgressInfo("drop the dragged material on one face only", -1);
|
||
}
|
||
return TRUE;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
BOOL Material_Interface::_OnKeyUp(UINT _nChar, UINT /*nRepCnt*/, UINT /*nFlags*/)
|
||
{
|
||
if ( fn_bIsCurrentEditor() )
|
||
{
|
||
switch ( m_p_oKeyConfiguration->mfn_uwKeyToAction(_nChar) )
|
||
{
|
||
case KA_TGM_EDITPICKEDMATERIALMODE:
|
||
m_bModeIsMaterialSelect = FALSE;
|
||
fn_vGiveProgressInfo("", -1);
|
||
return TRUE;
|
||
|
||
case KA_TGM_SPLITTARGETONDROPMODE:
|
||
m_bModeIsIndexedTriangleSplit = FALSE;
|
||
fn_vGiveProgressInfo("", -1);
|
||
return TRUE;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::m_vFindMaterialUnderCursor(CPoint _oPoint, BOOL _bVerbose /*= FALSE*/)
|
||
{
|
||
m_p_oMaterialUnderCursor = NULL;
|
||
if ( xGetPickInfoUnderPoint(&m_a_stPickInfo, _oPoint) )
|
||
{
|
||
Geometry3D *p_oGeometry = (Geometry3D*) GetMainWorld()
|
||
->fn_p_oFindObjectWithEngine(
|
||
m_a_stPickInfo[0].hGeoObject,
|
||
C_szGeometricObjectTypeName
|
||
);
|
||
if ( p_oGeometry && m_bDisplayMaterialUnderCursor )
|
||
{
|
||
ACP_tdxIndex xPickedElement = m_a_stPickInfo[0].stPickedObject.aDEF_stDataOfElement[0].xElements;
|
||
m_p_oMaterialUnderCursor = (tdoEditorGameMaterial *) p_oGeometry->fn_p_oGetGameMaterial(xPickedElement, 0);
|
||
if ( _bVerbose )
|
||
{
|
||
if ( m_p_oMaterialUnderCursor )
|
||
{
|
||
CString csMessageStart(m_bModeIsMaterialSelect ? "Edit material '" : "Material under cursor is '");
|
||
csMessageStart += m_p_oMaterialUnderCursor->GetName()
|
||
+ "' from file " + ((CPA_FileObject *) m_p_oMaterialUnderCursor->GetOwner())->GetReferencedName(this, C_szFileReferencedNameKey)
|
||
+ " of object '" + p_oGeometry->GetName() + "'";
|
||
fn_vGiveProgressInfo(csMessageStart, -1);
|
||
}
|
||
else
|
||
fn_vGiveProgressInfo(CString("Object ") + p_oGeometry->GetName() + " has no associated material", -1, C_STATUS_WARNING);
|
||
}
|
||
}
|
||
else if ( _bVerbose && m_bDisplayMaterialUnderCursor)
|
||
fn_vGiveProgressInfo("there is no object under the cursor", -1, C_STATUS_WARNING);
|
||
else
|
||
fn_vGiveProgressInfo("", -1);
|
||
}
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
BOOL Material_Interface::_OnMouseMove(UINT /*nFlags*/, tdstMousePos *p_stPos, MTH3D_tdstVector * /*p_stVect*/)
|
||
{
|
||
if ( fn_bIsCurrentEditor() )
|
||
{
|
||
m_vFindMaterialUnderCursor(p_stPos->stPos, TRUE);
|
||
//Mircea Dunka 5.11.1998
|
||
if(m_bGetGlidePixel)
|
||
m_vFindColorUnderCursor(p_stPos->stPos, TRUE);
|
||
//end Mircea Dunka
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
//Mircea Dunka 5.11.1998
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::m_vFindColorUnderCursor(CPoint _oPoint, BOOL _bVerbose)
|
||
{
|
||
/* SHA_TEMP
|
||
HWND hWndUnder = ::WindowFromPoint(_oPoint);
|
||
|
||
DEV_ViewPort3D *p_o3dViewPort = (DEV_ViewPort3D *) gs_p_oMaterialInterface->GetInterface()->GetMultiDevice3D()->GetFocusDevice()->GetViewPort();
|
||
if ( hWndUnder == p_o3dViewPort->GetSafeHwnd() )
|
||
{
|
||
tdstMousePos stMousePos;
|
||
|
||
//in screen pixel coordinates
|
||
stMousePos.stPos = _oPoint;
|
||
//in viewport pixel coordinates
|
||
::ScreenToClient(hWndUnder, &_oPoint);
|
||
|
||
//correct for voodooo if necessary
|
||
//CPoint oScreenPoint(stScreenPos);
|
||
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
|
||
p_o3dViewPort->ClientToVoodoo(_oPoint);
|
||
|
||
#define BYTESPERPIXEL 2
|
||
|
||
FxU16 pix;
|
||
GrLfbInfo_t info;
|
||
FxU32* rptr;
|
||
|
||
info.size = sizeof( GrLfbInfo_t );
|
||
|
||
if(grLfbLock( GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER, GR_LFBWRITEMODE_565,
|
||
GR_ORIGIN_UPPER_LEFT, FXFALSE, &info))
|
||
{
|
||
rptr = (FxU32*) info.lfbPtr;
|
||
rptr += ((info.strideInBytes * _oPoint.y) + _oPoint.x * BYTESPERPIXEL)>>2;
|
||
|
||
if(_oPoint.x%2) //see glidepgm.doc for this :)
|
||
pix = (FxU16)(*rptr >> 16);
|
||
else
|
||
pix = (FxU16)(*rptr & 0xFFFF);
|
||
|
||
m_p_oTextureDialog->m_nRPixelColor = (BYTE)((pix & 0xF800)>>8);
|
||
m_p_oTextureDialog->m_nGPixelColor = (BYTE)((pix & 0x07E0)>>3);
|
||
m_p_oTextureDialog->m_nBPixelColor = (BYTE)((pix & 0x001F)<<3);
|
||
m_p_oTextureDialog->GetDlgItem(IDC_BUTTON_PIXELCOLOR) -> InvalidateRect(NULL);
|
||
|
||
grLfbUnlock( GR_LFB_READ_ONLY, GR_BUFFER_FRONTBUFFER );
|
||
}
|
||
}
|
||
*/
|
||
return;
|
||
}
|
||
//end Mircea Dunka
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
BOOL Material_Interface::m_bEditPickedMaterial(HIE_tdstPickInfo *_p_stPickInfo)
|
||
{
|
||
if ( _p_stPickInfo )
|
||
{
|
||
tdoEditorGameMaterial *p_oMaterial;
|
||
ACP_tdxIndex xPickedElement;
|
||
|
||
Geometry3D *p_oGeometry = (Geometry3D*) GetMainWorld()
|
||
->fn_p_oFindObjectWithEngine(
|
||
_p_stPickInfo->hGeoObject,
|
||
C_szGeometricObjectTypeName
|
||
);
|
||
if ( p_oGeometry )
|
||
{
|
||
//find the material used by the picked element of the object
|
||
xPickedElement = _p_stPickInfo->stPickedObject.aDEF_stDataOfElement[0].xElements;
|
||
p_oMaterial = (tdoEditorGameMaterial *) p_oGeometry->fn_p_oGetGameMaterial(xPickedElement, 0);
|
||
if ( p_oMaterial )
|
||
{
|
||
//make the list display the materials of the file that contains the selected material
|
||
m_p_oGetMainView()->m_vSelectFileOfMaterial(p_oMaterial);
|
||
//make us display it
|
||
m_fn_vShowMaterialAll(p_oMaterial);
|
||
}
|
||
else
|
||
fn_vGiveProgressInfo(p_oGeometry->GetName() + " has no associated game material!", -1, C_STATUS_ERROR);
|
||
//we handled the mouse event
|
||
return TRUE;
|
||
}
|
||
}
|
||
//we did not handle the mouse event
|
||
return FALSE;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
BOOL Material_Interface::_OnLButtonDown(UINT /*nFlags*/, tdstMousePos * /*p_stPos*/, ACP_tdxIndex /*xIndex*/, HIE_tdstPickInfo *p_stPickInfo)
|
||
{
|
||
if ( fn_bIsCurrentEditor() && m_bModeIsMaterialSelect )
|
||
{
|
||
return m_bEditPickedMaterial(p_stPickInfo);
|
||
}
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::m_vRefreshMaterialSuperObjectLinks(void)
|
||
{
|
||
CPA_BaseObjectList *p_oObjectList = GetMainWorld()->fn_p_oGetOriginalObjectList(C_szGameMaterialTypeName);
|
||
if ( p_oObjectList )
|
||
{
|
||
Position xPos = p_oObjectList->GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
//first of all, remove all links where a game material is a child
|
||
tdoEditorGameMaterial *p_oGameMaterial = (tdoEditorGameMaterial *) p_oObjectList->GetNext(xPos);
|
||
g_oCoherenceManager.m_fn_vRemoveAllLinks(p_oGameMaterial, C_cLinkedAsChild);
|
||
//but do not forget to reestablish the link with its father fileobject
|
||
g_oCoherenceManager.m_fn_vAddALink(p_oGameMaterial->GetOwner(), p_oGameMaterial);
|
||
}
|
||
}
|
||
|
||
//now find all geometric objects, and mark them as fathers of the correponding game materials
|
||
p_oObjectList = GetMainWorld()->fn_p_oGetOriginalObjectList(C_szGeometricObjectTypeName);
|
||
if ( p_oObjectList )
|
||
{
|
||
Position xPos;
|
||
xPos = p_oObjectList->GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
Geometry3D *p_oFather = (Geometry3D *) p_oObjectList->GetNext(xPos);
|
||
//if we did not create links for this object already
|
||
GEO_tdstGeometricObject *p_stGeomObj = (GEO_tdstGeometricObject *) p_oFather->GetData();
|
||
//for all elements in the object
|
||
for (ACP_tdxIndex xElement = 0; xElement < p_stGeomObj->xNbElements; xElement ++)
|
||
{
|
||
//get the type of the element
|
||
ACP_tdxIndex xElementType = p_stGeomObj->d_xListOfElementsTypes[xElement];
|
||
switch ( xElementType )
|
||
{
|
||
//these have one material for all the indexed elements they contain
|
||
case GEO_C_xElementIndexedTriangles:
|
||
case GEO_C_xElementPoints:
|
||
{
|
||
//get the material
|
||
CPA_BaseObject *p_oGameMaterial = p_oFather->fn_p_oGetGameMaterial(xElement);
|
||
//if the link is not yet established, register the link
|
||
if ( p_oGameMaterial )
|
||
g_oCoherenceManager.m_fn_vAddALink(p_oFather, p_oGameMaterial);
|
||
}
|
||
break;
|
||
|
||
//these have one material per indexed element
|
||
case GEO_C_xElementLines:
|
||
case GEO_C_xElementSpheres:
|
||
case GEO_C_xElementAlignedBoxes:
|
||
case GEO_C_xElementCones:
|
||
case GEO_C_xElementFaceMapDescriptors:
|
||
{
|
||
ACP_tdxIndex xNbIndexedElements = p_oFather->fn_xGetNbIndexedElements(xElement);
|
||
//loop through all indexed elements
|
||
for( int iElementIndex = 0; iElementIndex < xNbIndexedElements; iElementIndex ++ )
|
||
{
|
||
//get the material
|
||
CPA_BaseObject *p_oGameMaterial = p_oFather->fn_p_oGetGameMaterial(xElement, iElementIndex);
|
||
//and register the link
|
||
if ( p_oGameMaterial )
|
||
g_oCoherenceManager.m_fn_vAddALink(p_oFather, p_oGameMaterial);
|
||
}
|
||
}
|
||
break;
|
||
|
||
//these are not defined yet
|
||
case GEO_C_xElementSprites:
|
||
case GEO_C_xElementTMeshes:
|
||
{
|
||
ACP_tdxIndex xNbIndexedElements = 0;
|
||
}
|
||
break;
|
||
} /* act according to the element's type */
|
||
} /* for each element of the object */
|
||
} /* for each object in the list */
|
||
} /* if there is a geometric object list */
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
/*virtual*/ BOOL Material_Interface::fn_bAcceptToSave()
|
||
{
|
||
if ( !m_bCanSaveModifs )
|
||
fn_vGiveProgressInfo("", -1, C_STATUS_ERROR);
|
||
return m_bCanSaveModifs;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
/*virtual*/ void Material_Interface::fn_vBeforeSaveAll(void)
|
||
{
|
||
//get fileobjects that are marked for purge, notify all unreferenced texture sections for deletion
|
||
CPA_List<CPA_FileObject> oFileList;
|
||
m_p_oGetMainView()->m_vGetListOfFilesToPurge(&oFileList);
|
||
POSITION xPos = oFileList.GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
CPA_FileObject *p_oFile = oFileList.GetNext(xPos);
|
||
//for each gmt file, get the associated tex file
|
||
CString csTextureFileName = p_oFile->GetReferencedName(this, C_szFileReferencedNameKey);
|
||
csTextureFileName = csTextureFileName.Left(csTextureFileName.ReverseFind('.')) + tdoEditorTexture::m_csGetScriptExtension();
|
||
p_oFile = p_oGetFileObjectForReferencedPath(csTextureFileName, C_szFileReferencedNameKey);
|
||
//now get all texture objects of this file
|
||
CPA_List<CPA_BaseObject> oFoundTextures;
|
||
GetMainWorld()->fn_lFindObjects(
|
||
&oFoundTextures,
|
||
"", // obj name
|
||
C_szTextureTypeName, //type
|
||
p_oFile // owner
|
||
);
|
||
POSITION xTexPos = oFoundTextures.GetHeadPosition();
|
||
while ( xTexPos )
|
||
{
|
||
tdoEditorTexture *p_oTexture = (tdoEditorTexture *) oFoundTextures.GetNext(xTexPos);
|
||
//if the texture is not referenced by any visual material, notify that the section is to be deleted
|
||
if ( !p_oTexture->m_bIsReferenced() )
|
||
p_oTexture->fn_vNotifyUnSave();
|
||
}
|
||
}
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
/*virtual*/ void Material_Interface::fn_vAfterSaveAll(void)
|
||
{
|
||
char *a_szMaterialTypes[] =
|
||
{
|
||
C_szCollideMaterialTypeName,
|
||
C_szMechanicsMaterialTypeName,
|
||
C_szVisualMaterialTypeName,
|
||
C_szGameMaterialTypeName,
|
||
C_szTextureTypeName
|
||
};
|
||
for (int i = 0; i < sizeof(a_szMaterialTypes) / sizeof(char *); i ++ )
|
||
{
|
||
CPA_List<CPA_BaseObject> oFoundMaterials;
|
||
|
||
GetMainWorld()->fn_lFindObjects(
|
||
&oFoundMaterials,
|
||
"", // obj name
|
||
a_szMaterialTypes[i], //type
|
||
NO_CRITERIA // owner
|
||
);
|
||
POSITION xPos = oFoundMaterials.GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
CPA_SaveObject *p_oMaterial = (CPA_SaveObject *) oFoundMaterials.GetNext(xPos);
|
||
if ( !p_oMaterial->fn_bSectionExists() ) //if the object has no section
|
||
{
|
||
//destroy it (it will handle cohemngr links removal itself)
|
||
delete p_oMaterial;
|
||
}
|
||
}
|
||
//empty the list before we go for the next type
|
||
oFoundMaterials.RemoveAll();
|
||
}
|
||
|
||
//update the highlight info in the init file
|
||
m_vSaveHighlightInfo();
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::m_vLoadHighlightInfo()
|
||
{
|
||
CString csFileName = M_GetMainApp()->m_csEditorDataPath + "Tools\\Material\\Material.ini";
|
||
char *p_szFileName = (char*)(LPCSTR)csFileName;
|
||
CPA_BaseObjectList *p_oMaterialList;
|
||
Position xPos;
|
||
|
||
//for each mechanics material, read its highlight information, if relevant
|
||
p_oMaterialList = GetBaseObjectList(C_szMechanicsMaterialTypeName);
|
||
xPos = p_oMaterialList->GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
char sz40ColorString[40];
|
||
tdoEditorMechanicsMaterial *p_oMechanicsMaterial = (tdoEditorMechanicsMaterial *) p_oMaterialList->GetNext(xPos);
|
||
GetPrivateProfileString(C_szMechanicsHighlightProfileSection, p_oMechanicsMaterial->fn_p_szGetName(), "", sz40ColorString, 40, p_szFileName);
|
||
if ( strlen(sz40ColorString) ) //the material has a highlight color
|
||
{
|
||
GEO_tdstColor stColor;
|
||
float fR, fG, fB;
|
||
sscanf(sz40ColorString, "%f,%f,%f", &fR, &fG, &fB);
|
||
stColor.xR = (GEO_tdxColorValue) fR;
|
||
stColor.xG = (GEO_tdxColorValue) fG;
|
||
stColor.xB = (GEO_tdxColorValue) fB;
|
||
p_oMechanicsMaterial->m_vEnableHighlight(TRUE);
|
||
p_oMechanicsMaterial->m_vSetHighlightColor(stColor);
|
||
}
|
||
}
|
||
|
||
//for each collide material, read its highlight information, if relevant
|
||
p_oMaterialList = GetBaseObjectList(C_szCollideMaterialTypeName);
|
||
xPos = p_oMaterialList->GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
char sz40ColorString[40];
|
||
tdoEditorCollideMaterial *p_oCollideMaterial = (tdoEditorCollideMaterial *) p_oMaterialList->GetNext(xPos);
|
||
GetPrivateProfileString(C_szCollideHighlightProfileSection, p_oCollideMaterial->fn_p_szGetName(), "", sz40ColorString, 40, p_szFileName);
|
||
if ( strlen(sz40ColorString) ) //the material has a highlight color
|
||
{
|
||
GEO_tdstColor stColor;
|
||
float fR, fG, fB;
|
||
sscanf(sz40ColorString, "%f,%f,%f", &fR, &fG, &fB);
|
||
stColor.xR = (GEO_tdxColorValue) fR;
|
||
stColor.xG = (GEO_tdxColorValue) fG;
|
||
stColor.xB = (GEO_tdxColorValue) fB;
|
||
p_oCollideMaterial->m_vEnableHighlight(TRUE);
|
||
p_oCollideMaterial->m_vSetHighlightColor(stColor);
|
||
}
|
||
}
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::m_vSaveHighlightInfo()
|
||
{
|
||
CString csFileName = M_GetMainApp()->m_csEditorDataPath + "Tools\\Material\\Material.ini";
|
||
char *p_szFileName = (char*)(LPCSTR)csFileName;
|
||
CPA_BaseObjectList *p_oMaterialList;
|
||
Position xPos;
|
||
|
||
//empty the sections
|
||
WritePrivateProfileString(C_szCollideHighlightProfileSection, NULL, NULL, p_szFileName);
|
||
WritePrivateProfileString(C_szMechanicsHighlightProfileSection, NULL, NULL, p_szFileName);
|
||
|
||
//for each mechanics material, write its highlight information, if relevant
|
||
p_oMaterialList = GetBaseObjectList(C_szMechanicsMaterialTypeName);
|
||
xPos = p_oMaterialList->GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
GEO_tdstColor stColor;
|
||
CString csColorString;
|
||
char *pszColorString;
|
||
tdoEditorMechanicsMaterial *p_oMechanicsMaterial = (tdoEditorMechanicsMaterial *) p_oMaterialList->GetNext(xPos);
|
||
//if it has highlighting enabled
|
||
if ( p_oMechanicsMaterial->m_bGetHighlightColor(&stColor) )
|
||
{
|
||
//format the highlight color information
|
||
csColorString.Format("%f,%f,%f", (float) stColor.xR, (float) stColor.xG, (float) stColor.xB);
|
||
pszColorString = (char *)LPCTSTR(csColorString);
|
||
}
|
||
else
|
||
//else clear the highlight entry
|
||
pszColorString = NULL;
|
||
//update the entry in the section
|
||
WritePrivateProfileString(C_szMechanicsHighlightProfileSection, p_oMechanicsMaterial->fn_p_szGetName(), pszColorString, p_szFileName);
|
||
}
|
||
|
||
//for each collide material, write its highlight information, if relevant
|
||
p_oMaterialList = GetBaseObjectList(C_szCollideMaterialTypeName);
|
||
xPos = p_oMaterialList->GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
GEO_tdstColor stColor;
|
||
CString csColorString;
|
||
char *pszColorString;
|
||
tdoEditorCollideMaterial *p_oCollideMaterial = (tdoEditorCollideMaterial *) p_oMaterialList->GetNext(xPos);
|
||
//if it has highlighting enabled
|
||
if ( p_oCollideMaterial->m_bGetHighlightColor(&stColor) )
|
||
{
|
||
//format the highlight color information
|
||
csColorString.Format("%f,%f,%f", (float) stColor.xR, (float) stColor.xG, (float) stColor.xB);
|
||
pszColorString = (char *)LPCTSTR(csColorString);
|
||
}
|
||
else
|
||
//else clear the highlight entry
|
||
pszColorString = NULL;
|
||
//update the entry in the section
|
||
WritePrivateProfileString(C_szCollideHighlightProfileSection, p_oCollideMaterial->fn_p_szGetName(), pszColorString, p_szFileName);
|
||
}
|
||
|
||
// write on file
|
||
WritePrivateProfileString (NULL, NULL, NULL, p_szFileName);
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
BOOL Material_Interface::m_bLoadWarningsAreEnabled()
|
||
{
|
||
static BOOL s_bToldOnce = FALSE;
|
||
switch ( m_eLoadWarningsActivation )
|
||
{
|
||
case E_am_Never: //no warning
|
||
return FALSE;
|
||
|
||
case E_am_Once: //warn only once
|
||
if ( s_bToldOnce )
|
||
return FALSE;
|
||
else
|
||
{
|
||
s_bToldOnce = TRUE;
|
||
return TRUE;
|
||
}
|
||
|
||
case E_am_Always: //always warn
|
||
return TRUE;
|
||
|
||
default: //this should not happen, but correct it anyway
|
||
m_eLoadWarningsActivation = E_am_Always;
|
||
return TRUE;
|
||
}
|
||
}
|
||
//================================================================================
|
||
//================================================================================
|
||
const char *fn_pszBaseName0(const char *_pszName)
|
||
{
|
||
char *pszBase = NULL;
|
||
if ( _pszName )
|
||
pszBase = (char *) max(strrchr(_pszName, '\\'), strrchr(_pszName, '/')) ;
|
||
return pszBase ? pszBase + 1 : _pszName;
|
||
}
|
||
|
||
|
||
const char *fn_pszBaseName1(const char *_pszName)
|
||
{
|
||
char *pszBase = (char *) max(strrchr(_pszName, '\\'), strrchr(_pszName, '/'));
|
||
if ( pszBase )
|
||
{
|
||
char *pszPos = pszBase;
|
||
char cSlash = *pszPos;
|
||
*pszPos = '_';
|
||
pszBase = (char *) fn_pszBaseName0(_pszName);
|
||
*pszPos = cSlash;
|
||
}
|
||
else
|
||
pszBase = (char *) _pszName;
|
||
|
||
return pszBase;
|
||
}
|
||
|
||
void Material_Interface::m_vRefreshFileObjectList()
|
||
{
|
||
//now we can rebuild all file objects from the script's file list
|
||
unsigned int uiFilePos = 0;
|
||
SCR_tdst_File_Open *p_stFileEntry;
|
||
SCR_M_DyAr_GetNextElement(
|
||
SCR_tdst_File_Open,
|
||
uiFilePos,
|
||
p_stFileEntry,
|
||
SCR_g_st_File_ArrayOpen
|
||
);
|
||
while ( p_stFileEntry )
|
||
{
|
||
BOOL bIsAGmtFile;
|
||
const char *pszName = p_stFileEntry->stFile.a_szOpenFileName;
|
||
const char *pszNameExtension = strrchr(pszName, '.');
|
||
if
|
||
( //if this is a game, visual material or texture file
|
||
pszNameExtension
|
||
&&
|
||
(
|
||
(bIsAGmtFile = !tdoEditorGameMaterial::m_csGetScriptExtension().CompareNoCase(pszNameExtension))
|
||
|| !tdoEditorVisualMaterial::m_csGetScriptExtension().CompareNoCase(pszNameExtension)
|
||
|| !tdoEditorTexture::m_csGetScriptExtension().CompareNoCase(pszNameExtension)
|
||
)
|
||
)
|
||
{
|
||
//make the interface create the file object
|
||
CPA_FileObject *p_ofileObject = p_oGetFileObjectForCompletePath(pszName);
|
||
//this is the name under which the section was referenced -> should be the short name
|
||
p_ofileObject->fn_bSetReferencedName(this, C_szFileReferencedNameKey, p_stFileEntry->stFile.a_szFileName);
|
||
//register the shortest name too, because this is the only part that can be used to check
|
||
//that a gmt file has an equivalent vmt file...
|
||
p_ofileObject->fn_bSetReferencedName(this, C_szFileMinimalNameKey, fn_pszBaseName0(pszName));
|
||
//add the file to the list
|
||
if ( bIsAGmtFile )
|
||
m_p_oGetMainView()->m_vAddFile(p_ofileObject);
|
||
}
|
||
uiFilePos ++;
|
||
SCR_M_DyAr_GetNextElement(
|
||
SCR_tdst_File_Open,
|
||
uiFilePos,
|
||
p_stFileEntry,
|
||
SCR_g_st_File_ArrayOpen
|
||
);
|
||
}
|
||
|
||
CPA_BaseObjectList *p_oFileList = gs_p_oMaterialInterface->GetMainWorld()->fn_p_oGetOriginalObjectList(C_szFileTypeName);
|
||
Position xPos = p_oFileList->GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
CString csFileName;
|
||
CPA_FileObject *p_oGameMaterialFileObject = (CPA_FileObject *) p_oFileList->GetNext(xPos);
|
||
csFileName = p_oGameMaterialFileObject->GetReferencedName(this, C_szFileMinimalNameKey); //get the minimal name
|
||
short wFoundExtensionDot = (short) csFileName.ReverseFind('.');
|
||
//if this is a game material file object
|
||
if ( wFoundExtensionDot != -1 && !csFileName.Mid(wFoundExtensionDot).CompareNoCase(tdoEditorGameMaterial::m_csGetScriptExtension()) )
|
||
{
|
||
//replace the game material extension with the visual material extension in the string
|
||
csFileName = csFileName.Left(wFoundExtensionDot) + tdoEditorVisualMaterial::m_csGetScriptExtension();
|
||
//and make sure the associated vmt file object was created in the above loop
|
||
CPA_FileObject *p_oVisualMaterialFileObject = p_oGetFileObjectForReferencedPath(csFileName, C_szFileMinimalNameKey);
|
||
//check that for a game material file the corresponding visual material file exists, and link them together
|
||
if ( !p_oVisualMaterialFileObject )
|
||
{
|
||
m_bCanSaveModifs = FALSE; //we dont want to save our modifs
|
||
AfxMessageBox(
|
||
p_oGameMaterialFileObject->GetName() + " has no equivalent " + csFileName + " in the game datae\n"
|
||
"Because of this, the material editor forbids to save your modifications..."
|
||
);
|
||
}
|
||
/*else
|
||
g_oCoherenceManager.m_fn_vAddALink(p_oGameMaterialFileObject, p_oVisualMaterialFileObject);*/
|
||
|
||
//for the texture file, create a file object if it is not done yet, because we might need it
|
||
csFileName = csFileName.Left(wFoundExtensionDot) + tdoEditorTexture::m_csGetScriptExtension();
|
||
CPA_FileObject *p_oTextureFileObject = p_oGetFileObjectForReferencedPath(csFileName, C_szFileMinimalNameKey);
|
||
if ( !p_oTextureFileObject )
|
||
{
|
||
//build its complete name from the visual material's file name, because the texture files are with the vmt files
|
||
CString csFullFileName = p_oVisualMaterialFileObject->GetCompleteName();
|
||
short wFoundExtensionDot = (short) csFullFileName.ReverseFind('.');
|
||
csFullFileName = csFullFileName.Left(wFoundExtensionDot) + tdoEditorTexture::m_csGetScriptExtension();
|
||
//make the interface create the file object
|
||
CPA_FileObject *p_oTextureFileObject = p_oGetFileObjectForCompletePath(csFullFileName);
|
||
//now compute the referenced name
|
||
csFullFileName = p_oVisualMaterialFileObject->GetReferencedName(this, C_szFileReferencedNameKey);
|
||
wFoundExtensionDot = (short) csFullFileName.ReverseFind('.');
|
||
csFullFileName = csFullFileName.Left(wFoundExtensionDot) + tdoEditorTexture::m_csGetScriptExtension();
|
||
p_oTextureFileObject->fn_bSetReferencedName(this, C_szFileReferencedNameKey, csFullFileName);
|
||
//register the shortest name too, because this is the only part that can be used to check
|
||
//that a gmt file has an equivalent vmt file...
|
||
p_oTextureFileObject->fn_bSetReferencedName(this, C_szFileMinimalNameKey, fn_pszBaseName0(LPCTSTR(csFullFileName)));
|
||
//g_oCoherenceManager.m_fn_vAddALink(p_oGameMaterialFileObject, p_oTextureFileObject);
|
||
}
|
||
}
|
||
}
|
||
|
||
CString csFullFileName, csBaseName;
|
||
CPA_FileObject *p_oFileObject;
|
||
//since there are only one file for all mechanics and collide materials, create the file objects outside the loop
|
||
csBaseName = CString("ED") + tdoEditorMechanicsMaterial::m_csGetScriptExtension();
|
||
csFullFileName = CString(fn_szGetMechanicsMaterialDataPath()) + "\\" + csBaseName;
|
||
p_oFileObject = p_oGetFileObjectForCompletePath(csFullFileName);
|
||
p_oFileObject->fn_bSetReferencedName(this, C_szFileReferencedNameKey, csBaseName);
|
||
p_oFileObject->fn_bSetReferencedName(this, C_szFileMinimalNameKey, csBaseName);
|
||
|
||
csBaseName = CString("ED") + tdoEditorCollideMaterial::m_csGetScriptExtension();
|
||
csFullFileName = CString(fn_szGetCollideMaterialDataPath()) + "\\" + csBaseName;
|
||
p_oFileObject = p_oGetFileObjectForCompletePath(csFullFileName);
|
||
p_oFileObject->fn_bSetReferencedName(this, C_szFileReferencedNameKey, csBaseName);
|
||
p_oFileObject->fn_bSetReferencedName(this, C_szFileMinimalNameKey, csBaseName);
|
||
}
|
||
|
||
//================================================================================
|
||
// f**ing M$ templates dont work, so create our own system !
|
||
//================================================================================
|
||
#define D_tdoMaterialClass tdoEditorGameMaterial
|
||
#define D_tdxEngineMaterialHandle GMT_tdxHandleToGameMaterial
|
||
#include "templates.cxx"
|
||
|
||
#define D_tdoMaterialClass tdoEditorVisualMaterial
|
||
#include "templates.cxx"
|
||
|
||
#define D_tdoMaterialClass tdoEditorTexture
|
||
#define D_tdxEngineMaterialHandle GLI_tdstTexture *
|
||
#include "templates.cxx"
|
||
|
||
#define D_tdoMaterialClass tdoEditorCollideMaterial
|
||
#define D_tdxEngineMaterialHandle GMT_tdxHandleToCollideMaterial
|
||
#include "templates.cxx"
|
||
|
||
#define D_tdoMaterialClass tdoEditorMechanicsMaterial
|
||
#define D_tdxEngineMaterialHandle DNM_tdxHandleToMecMatCharacteristics
|
||
#include "templates.cxx"
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::m_vDoRefreshLists(
|
||
long _lStartInLinkTable /*= 0*/,
|
||
tdeRefreshListsMode _eOverrideMode /*= E_rlm_DoNothing*/,
|
||
BOOL _bLoadTextures /*= TRUE*/
|
||
)
|
||
{
|
||
g_oBaseFrame.mfnv_UpdateTitle("Prepare materials");
|
||
|
||
//override the mode if specified
|
||
if ( _eOverrideMode != E_rlm_DoNothing )
|
||
m_eRefreshListsMode = _eOverrideMode;
|
||
|
||
if ( m_eRefreshListsMode != E_rlm_DoNothing )
|
||
{
|
||
//get the root of the world
|
||
//m_p_oWorldRoot = M_GetWorld()->GetRoot();
|
||
|
||
if ( m_eRefreshListsMode == E_rlm_DestroyAndRebuild )
|
||
{
|
||
//rescan the game material linktable from the beginning if the materials were destroyed
|
||
_lStartInLinkTable = 0;
|
||
//start by destroying all file objects:
|
||
CPA_List<CPA_BaseObject> oFileObjectList;
|
||
GetMainWorld()->fn_lFindObjects(
|
||
&oFileObjectList,
|
||
"", C_szFileTypeName,
|
||
NO_CRITERIA /* owner */
|
||
);
|
||
POSITION xPos = oFileObjectList.GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
CPA_FileObject *p_oFileObject = (CPA_FileObject *) oFileObjectList.GetNext(xPos);
|
||
const char *pszFileName = p_oFileObject->fn_p_szGetName();
|
||
const char *pszNameExtension = strrchr(pszFileName, '.');
|
||
if
|
||
( //if this is a material related file
|
||
pszNameExtension
|
||
&&
|
||
(
|
||
!tdoEditorGameMaterial::m_csGetScriptExtension().CompareNoCase(pszNameExtension)
|
||
|| !tdoEditorVisualMaterial::m_csGetScriptExtension().CompareNoCase(pszNameExtension)
|
||
|| !tdoEditorMechanicsMaterial::m_csGetScriptExtension().CompareNoCase(pszNameExtension)
|
||
|| !tdoEditorCollideMaterial::m_csGetScriptExtension().CompareNoCase(pszNameExtension)
|
||
|| !tdoEditorTexture::m_csGetScriptExtension().CompareNoCase(pszNameExtension)
|
||
)
|
||
)
|
||
{
|
||
//remove the file from the list
|
||
m_p_oGetMainView()->m_vRemoveFile(p_oFileObject);
|
||
//remove all coherence mamanger links for this file
|
||
g_oCoherenceManager.m_fn_vRemoveAllLinks(p_oFileObject, C_cLinkedAsChildAndFather);
|
||
//and destroy the file
|
||
delete p_oFileObject;
|
||
}
|
||
}
|
||
|
||
//empty the current list of editor materials, but without destroying
|
||
//their associated materials, since the handles are not valid, because Level Has Changed!!!
|
||
//this is fine, since the editor objects' destructors dont care about the associated engine materials
|
||
vKillMaterialList((tdoEditorGameMaterial *) NULL, NULL);
|
||
vKillMaterialList((tdoEditorVisualMaterial *) NULL, NULL);
|
||
vKillMaterialList((tdoEditorTexture *) NULL, NULL);
|
||
vKillMaterialList((tdoEditorMechanicsMaterial *) NULL, m_p_oMaterialMeca->m_p_oMaterialCombo);
|
||
vKillMaterialList((tdoEditorCollideMaterial *) NULL, m_p_oMaterialCol->m_p_oMaterialCombo);
|
||
}
|
||
|
||
//prevent object name prefixing, because all the objects that will be created now
|
||
//will get their names from existing sections
|
||
BOOL bPrevLoadingWorld = GetInterface()->fn_bIsLoadingWorld();
|
||
GetInterface()->SetLoadingWorld(TRUE);
|
||
m_vRefreshFileObjectList();
|
||
vRefreshMaterialList(0, (tdoEditorTexture *) NULL, FALSE, NULL);
|
||
vRefreshMaterialList(_lStartInLinkTable, (tdoEditorGameMaterial *) NULL, FALSE, NULL);
|
||
//second args tells that the sections were analyzed with the full name instead of the referenced name
|
||
vRefreshMaterialList(0, (tdoEditorMechanicsMaterial *) NULL, TRUE, m_p_oMaterialMeca->m_p_oMaterialCombo);
|
||
vRefreshMaterialList(0, (tdoEditorCollideMaterial *) NULL, FALSE, m_p_oMaterialCol->m_p_oMaterialCombo);
|
||
//restore prefixing mode (for new objects that we could create)
|
||
GetInterface()->SetLoadingWorld(bPrevLoadingWorld);
|
||
|
||
//no refresh is necessary now
|
||
m_eRefreshListsMode = E_rlm_DoNothing;
|
||
|
||
fn_vGiveProgressInfo("", -1);
|
||
}
|
||
|
||
if ( _bLoadTextures )
|
||
{
|
||
m_p_oTextureDlg->m_fn_vRefreshTextureList(TRUE, TRUE);
|
||
m_bTexturesLoaded = TRUE;
|
||
}
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
void Material_Interface::fn_vLevelHasChanged(void)
|
||
{
|
||
|
||
// Christophe modifications 08/12/98 {
|
||
CString csFileName = M_GetMainApp()->m_csEditorDataPath + "Tools\\Material\\Material.ini";
|
||
char *p_szFileName = (char*)(LPCSTR)csFileName,
|
||
sz255GMTFileName[255],
|
||
sz8FileToLoadSection[8],
|
||
sz3FileNumber[3];
|
||
unsigned char FileNumber = 1;
|
||
do
|
||
{
|
||
strcpy(sz8FileToLoadSection, "File");
|
||
strcat(sz8FileToLoadSection, itoa(FileNumber++, sz3FileNumber, 10) );
|
||
GetPrivateProfileString("Preload", sz8FileToLoadSection, "", sz255GMTFileName, 255, p_szFileName);
|
||
if(sz255GMTFileName[0])
|
||
{
|
||
SCR_fnp_st_RdL0_AnalyseSection(sz255GMTFileName, SCR_CDF_uw_Anl_Normal);
|
||
}
|
||
} while(sz255GMTFileName[0]);
|
||
// } End Christophe modifications
|
||
|
||
//we want to rescan all linktables from the beginning
|
||
gs_lNbPreviousMaterialsInLinkTable = 0;
|
||
gs_lNbPreviousGeomobjInLinkTable = 0;
|
||
//all existent editor materials must be destroyed before the new ones are linked to the engine materials
|
||
m_vDoRefreshLists(0, E_rlm_DestroyAndRebuild, TRUE/*FALSE*/);
|
||
//read the highlight information from the ini file.
|
||
m_vLoadHighlightInfo();
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CString Material_Interface::m_csGetIdPartOfSectionName(CString _csSectionName)
|
||
{
|
||
char szId[SCR_CV_ui_Cfg_MaxLenName];
|
||
SCR_fn_v_RdL0_SplitSectionName((char *)LPCTSTR(_csSectionName), NULL, NULL, szId);
|
||
return szId;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CString Material_Interface::m_csGetActionPartOfSectionName(CString _csSectionName)
|
||
{
|
||
char szAction[SCR_CV_ui_Cfg_MaxLenName];
|
||
SCR_fn_v_RdL0_SplitSectionName((char *)LPCTSTR(_csSectionName), NULL, szAction, NULL);
|
||
return szAction;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CString Material_Interface::m_csGetFilePartOfSectionName(CString _csSectionName)
|
||
{
|
||
char szFile[SCR_CV_ui_Cfg_MaxLenName];
|
||
SCR_fn_v_RdL0_SplitSectionName((char *)LPCTSTR(_csSectionName), szFile, NULL, NULL);
|
||
return szFile;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CPA_SaveObject *Material_Interface::m_p_oGetEditorObjectForEngine(ACP_tdxHandleOfMaterial _hVisualMaterial)
|
||
{
|
||
if ( _hVisualMaterial )
|
||
return (CPA_SaveObject *) GetBaseObject(_hVisualMaterial, C_szVisualMaterialTypeName);
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CPA_SaveObject *Material_Interface::m_p_oGetEditorObjectForEngine(DNM_tdxHandleToMecMatCharacteristics _hMechanicsMaterial)
|
||
{
|
||
if ( DNM_fn_bIsMatCharacteristicsValid(_hMechanicsMaterial) )
|
||
return (CPA_SaveObject *) GetBaseObject(_hMechanicsMaterial, C_szMechanicsMaterialTypeName);
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CPA_SaveObject *Material_Interface::m_p_oGetEditorObjectForEngine(GMT_tdxHandleToCollideMaterial _hCollideMaterial)
|
||
{
|
||
if ( _hCollideMaterial != GMT_C_InvalidCollideMaterial )
|
||
return (CPA_SaveObject *) GetBaseObject(_hCollideMaterial, C_szCollideMaterialTypeName);
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CPA_SaveObject *Material_Interface::m_p_oGetEditorObjectForEngine(GMT_tdxHandleToGameMaterial _hGameMaterial)
|
||
{
|
||
if ( GMT_fn_b_ulIsValid(_hGameMaterial) )
|
||
return (CPA_SaveObject *) GetBaseObject(_hGameMaterial, C_szGameMaterialTypeName);
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CPA_SaveObject *Material_Interface::m_p_oGetEditorObjectForEngine(GLI_tdstTexture *_hTexture)
|
||
{
|
||
if ( _hTexture )
|
||
return (CPA_SaveObject *) GetBaseObject(_hTexture, C_szTextureTypeName);
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CPA_FileObject *Material_Interface::m_p_oGetCurrentFileObject()
|
||
{
|
||
return m_p_oGetMainView()->m_p_oGetCurrentFileObject();
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
/*virtual*/ BOOL Material_Interface::fn_bLoadBaseObject (CPA_BaseObject *p_oObject)
|
||
{
|
||
if ( p_oObject && p_oObject->fn_bIsOfType(C_szGameMaterialTypeName) )
|
||
{
|
||
((tdoEditorGameMaterial *) p_oObject)->m_vLoadAssociatedEngineMaterial();
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
long Material_Interface::OnQueryAction(CPA_EditorBase* /*p_oSender*/, WPARAM wParam, LPARAM /*lParam*/)
|
||
{
|
||
switch( wParam )
|
||
{
|
||
case C_cCreateNewGameMaterial:
|
||
//the update is not necessary unless the world is known
|
||
if ( m_bEnteredEditorAtLeastOnce && m_p_oGetWorldSuperObject() )
|
||
{
|
||
long lNewNbMaterialInLinkTable = SCR_M_st_Link_GetDynamicArray(tdoEditorGameMaterial::m_p_stGetAssociatedLinkTable()).uiNumValues;
|
||
long lNewNbGeomobjInLinkTable = SCR_M_st_Link_GetDynamicArray(GLI_p_stGetLinkTableOfGeometric()).uiNumValues;
|
||
if
|
||
(
|
||
gs_lNbPreviousMaterialsInLinkTable != lNewNbMaterialInLinkTable
|
||
|| gs_lNbPreviousGeomobjInLinkTable != lNewNbGeomobjInLinkTable
|
||
)
|
||
{
|
||
//update the lists, but do not delete existent editor materials, and do not load textures
|
||
m_vDoRefreshLists(gs_lNbPreviousMaterialsInLinkTable, E_rlm_UpdateWithoutDestruction, TRUE);
|
||
//remember the number of materials in the linktable
|
||
gs_lNbPreviousMaterialsInLinkTable = lNewNbMaterialInLinkTable;
|
||
gs_lNbPreviousGeomobjInLinkTable = lNewNbGeomobjInLinkTable;
|
||
}
|
||
}
|
||
else
|
||
m_eRefreshListsMode = E_rlm_UpdateWithoutDestruction;
|
||
break;
|
||
|
||
case C_cGetDefaultGameMaterial:
|
||
if ( !GMT_fn_b_ulIsValid(m_hQueriedDefaultGameMaterial) )
|
||
{
|
||
/*//find the material with the default name found in the file containing common materials
|
||
tdoEditorGameMaterial *p_oMaterial = (tdoEditorGameMaterial *) GetMainWorld()->fn_p_oFindObject(
|
||
C_szNameOfDefaultMaterial,
|
||
C_szGameMaterialTypeName,
|
||
p_oGetFileObjectForReferencedPath(C_szFileNameForDefaultMaterial)
|
||
);
|
||
if ( p_oMaterial )
|
||
m_hQueriedDefaultGameMaterial = p_oMaterial->m_hGetEngineMaterial();
|
||
else*/
|
||
{
|
||
char szDefaultGMTFile[256];
|
||
char szDefaultGMTName[256];
|
||
|
||
strcpy(szDefaultGMTFile, fn_szGetGameMaterialDataPath() );
|
||
strcat(szDefaultGMTFile, "\\" );
|
||
strcat(szDefaultGMTFile, C_szFileNameForDefaultMaterial );
|
||
SCR_fn_v_RdL0_ComputeSectionName( szDefaultGMTName, szDefaultGMTFile,C_szGameMaterialTypeName ,C_szNameOfDefaultMaterial);
|
||
//if we did not create the editor materials yet, find an engine material with the default name in the link table
|
||
SCR_tdst_Link_Table *p_stGameLinkTable = GMT_fn_p_stGetLinkTable();
|
||
SCR_tdst_Link_Value *p_stEntry = SCR_fnp_st_Link_SearchKey (p_stGameLinkTable , szDefaultGMTName);
|
||
|
||
//if we found it, return it, else return the first material we got
|
||
if ( p_stEntry )
|
||
m_hQueriedDefaultGameMaterial = (GMT_tdxHandleToGameMaterial) SCR_M_ul_Link_GetValue(p_stEntry);
|
||
else
|
||
{
|
||
unsigned int uiPos = 0;
|
||
SCR_tdst_Link_Value *p_stFirstEntry;
|
||
SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, p_stFirstEntry, p_stGameLinkTable->stLinkArray );
|
||
|
||
if ( p_stFirstEntry )
|
||
m_hQueriedDefaultGameMaterial = (GMT_tdxHandleToGameMaterial) SCR_M_ul_Link_GetValue(p_stFirstEntry);
|
||
else
|
||
GMT_fn_vInvalidate(&m_hQueriedDefaultGameMaterial);
|
||
}
|
||
}
|
||
}
|
||
return (long) m_hQueriedDefaultGameMaterial;
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Save Preferences
|
||
// ----------------------------------------------------------------------------
|
||
void Material_Interface::m_vSavePreferences(void)
|
||
{
|
||
CString csFileName = M_GetMainApp()->m_csEditorDataPath + "Tools\\Material\\Material.ini";
|
||
char *p_szFileName = (char*)(LPCSTR)csFileName;
|
||
CString csDimension;
|
||
|
||
// Open MODE
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection, C_szDisplayModeProfileString,
|
||
m_p_oGetMaterialListView()->m_bAllMaterialsDisplayed() ? "All" : "Used" , p_szFileName
|
||
);
|
||
|
||
// Display Materiau under cursor mode
|
||
WritePrivateProfileString( C_szPreferencesProfileSection, C_szDisplayMaterialUnderCursorProfileString,
|
||
m_bDisplayMaterialUnderCursor ? "TRUE" : "FALSE", p_szFileName
|
||
);
|
||
|
||
//////////////////
|
||
// PANEL SIZES //
|
||
//////////////////
|
||
|
||
//left pane width
|
||
csDimension.Format("%ld", m_p_oLeftSplitFrame->m_oCurPos.right - m_p_oLeftSplitFrame->m_oCurPos.left);
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection, C_szLeftPaneWidthProfileString,
|
||
(char*)(LPCSTR)csDimension, p_szFileName
|
||
);
|
||
|
||
//visual view height
|
||
csDimension.Format("%ld", m_p_oLeftSplitFrame->GetPaneSize(C_wVisualPaneId));
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection, C_szVisualPaneHeightProfileString,
|
||
(char*)(LPCSTR)csDimension, p_szFileName
|
||
);
|
||
//mechanics view height
|
||
csDimension.Format("%ld", m_p_oLeftSplitFrame->GetPaneSize(C_wMechanicsPaneId));
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection, C_szMechanicsPaneHeightProfileString,
|
||
(char*)(LPCSTR)csDimension, p_szFileName
|
||
);
|
||
//collide view height
|
||
csDimension.Format("%ld", m_p_oLeftSplitFrame->GetPaneSize(C_wCollidePaneId));
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection, C_szCollidePaneHeightProfileString,
|
||
(char*)(LPCSTR)csDimension, p_szFileName
|
||
);
|
||
//sound view height
|
||
csDimension.Format("%ld", m_p_oLeftSplitFrame->GetPaneSize(C_wSoundPaneId));
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection, C_szSoundPaneHeightProfileString,
|
||
(char*)(LPCSTR)csDimension, p_szFileName
|
||
);
|
||
|
||
//sound view height
|
||
csDimension.Format("%ld", m_p_oLeftSplitFrame->GetPaneSize(C_wMainPaneId));
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection, C_szMainPaneHeightProfileString,
|
||
(char*)(LPCSTR)csDimension, p_szFileName
|
||
);
|
||
|
||
//texture view width
|
||
csDimension.Format("%ld", m_p_oBottomSplitFrame->GetPaneSize(C_wTexturePaneId));
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection, C_szTexturePaneWidthProfileString,
|
||
(char*)(LPCSTR)csDimension, p_szFileName
|
||
);
|
||
|
||
//list pane width
|
||
csDimension.Format("%ld", m_p_oBottomSplitFrame->GetPaneSize(C_wListPaneId));
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection, C_szListPaneWidthProfileString,
|
||
(char*)(LPCSTR)csDimension, p_szFileName
|
||
);
|
||
|
||
//bottom splitter frame height
|
||
csDimension.Format("%ld", m_p_oBottomSplitFrame->m_oCurPos.bottom - m_p_oBottomSplitFrame->m_oCurPos.top);
|
||
WritePrivateProfileString(
|
||
C_szPreferencesProfileSection, C_szMaterialListHeightProfileString,
|
||
(char*)(LPCSTR)csDimension, p_szFileName
|
||
);
|
||
|
||
// write on file
|
||
WritePrivateProfileString (NULL , NULL, NULL, p_szFileName);
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
/*virtual*/ BOOL Material_Interface::fn_bOnInvalidateLink(CPA_BaseObject * /*pOwner*/, CPA_BaseObject * /*pReferencedObject*/, BOOL /*bDestroyed*/)
|
||
{
|
||
AfxMessageBox("uh oh...");
|
||
return FALSE;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
/*virtual*/ void Material_Interface::fn_vOnRestoreLink(CPA_BaseObject * /*pOwner*/, CPA_BaseObject * /*pReferencedObject*/)
|
||
{
|
||
AfxMessageBox("uh oh...");
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
/*virtual*/ void Material_Interface::fn_vOnModifyChild(CPA_BaseObject *pOwner, CPA_BaseObject * /*pReferencedObject*/, unsigned long /*_ulData*/)
|
||
{
|
||
AfxMessageBox("uh oh...");
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
ACP_tdxIndex xGetPickInfoUnderPoint(HIE_aDEF_stTabOfPickInfo *_p_xRetrievedPickInfo, CPoint _oScreenCursor)
|
||
{
|
||
ACP_tdxIndex xNbPicked = 0;
|
||
HWND hWndUnder = ::WindowFromPoint(_oScreenCursor);
|
||
|
||
DEV_ViewPort3D *p_o3dViewPort = (DEV_ViewPort3D *) gs_p_oMaterialInterface->GetInterface()->GetMultiDevice3D()->GetFocusDevice()->GetViewPort();
|
||
if ( hWndUnder == p_o3dViewPort->GetSafeHwnd() )
|
||
{
|
||
HIE_tdxHandleToSuperObject hEngineSupObject;
|
||
tdstMousePos stMousePos;
|
||
|
||
//in screen pixel coordinates
|
||
stMousePos.stPos = _oScreenCursor;
|
||
//in viewport pixel coordinates
|
||
::ScreenToClient(hWndUnder, &_oScreenCursor);
|
||
|
||
//correct for voodooo if necessary
|
||
//CPoint oScreenPoint(stScreenPos);
|
||
if (GLI_lWhatIsGLI() == GLI_C_VersionGlide)
|
||
p_o3dViewPort->ClientToVoodoo(_oScreenCursor);
|
||
|
||
stMousePos.stPos2D.xX = GLI_M_LongToValue(_oScreenCursor.x);
|
||
stMousePos.stPos2D.xY = GLI_M_LongToValue(_oScreenCursor.y);
|
||
|
||
xNbPicked = 0;
|
||
//try to pick an object
|
||
hEngineSupObject = gs_p_oMaterialInterface->m_p_oGetWorldSuperObject()->GetStruct();
|
||
//Must be changed but how?
|
||
|
||
if ( hEngineSupObject == NULL )
|
||
return 0;
|
||
|
||
//fill the supplied pickinfo array with what we find under the cursor
|
||
xNbPicked = HIE_xIsSuperObjectPick(GLI_C_ModePickingFace,
|
||
p_o3dViewPort->m_hDisplayDevice,
|
||
p_o3dViewPort->m_hDisplayViewport,
|
||
&stMousePos.stPos2D, hEngineSupObject, (HIE_tdstPickInfo *) _p_xRetrievedPickInfo
|
||
);
|
||
}
|
||
return xNbPicked;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CPA_FileObject *p_oGetFileObjectForCompletePath(CString _csPath)
|
||
{
|
||
return gs_p_oMaterialInterface->GetInterface()->GetFileObject(_csPath);
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
CPA_FileObject *p_oGetFileObjectForReferencedPath(CString _csPath, CString _csKey /*= C_szFileReferencedNameKey*/)
|
||
{
|
||
BOOL bTestAgainstCompleteName = _csKey.IsEmpty();
|
||
CPA_BaseObjectList *p_oFileList = gs_p_oMaterialInterface->GetMainWorld()->fn_p_oGetOriginalObjectList(C_szFileTypeName);
|
||
Position xPos = p_oFileList->GetHeadPosition();
|
||
while ( xPos )
|
||
{
|
||
CPA_FileObject *p_oFileObject = (CPA_FileObject *) p_oFileList->GetNext(xPos);
|
||
if ( bTestAgainstCompleteName )
|
||
{
|
||
if ( !p_oFileObject->GetCompleteName().CompareNoCase(_csPath) )
|
||
return p_oFileObject;
|
||
}
|
||
else
|
||
{
|
||
if ( !p_oFileObject->GetReferencedName(gs_p_oMaterialInterface, _csKey).CompareNoCase(_csPath) )
|
||
return p_oFileObject;
|
||
}
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
//================================================================================
|
||
//================================================================================
|
||
// Only displays message in the status bar if 'cPercentage = -1'
|
||
void fn_vGiveProgressInfo(CString csMessage, long lTruePercentage, short _wHighLight /*= C_STATUS_NORMAL*/)
|
||
{
|
||
long lScaledPercentage = lTruePercentage;
|
||
static long s_lLastPercentage = 98765432; //some value that is unlikely to be passed
|
||
CString csTrueMessage;
|
||
if ( lScaledPercentage < 0 )
|
||
csTrueMessage = csMessage;
|
||
else if ( lScaledPercentage >= 0 )
|
||
{
|
||
if ( lScaledPercentage > 100 )
|
||
lScaledPercentage = 100;
|
||
|
||
lScaledPercentage /= 2;
|
||
if ( lScaledPercentage != s_lLastPercentage )
|
||
{
|
||
csTrueMessage.Format(
|
||
"%s %.*s%.*s", LPCTSTR(csMessage),
|
||
lScaledPercentage, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
|
||
50 - lScaledPercentage, "--------------------------------------------------"
|
||
);
|
||
}
|
||
}
|
||
|
||
//display only if the window is available and the percentage changed
|
||
if ( lScaledPercentage != s_lLastPercentage )
|
||
{
|
||
FRMBaseMenu *p_oWnd = (FRMBaseMenu *) g_oFrameGest.ma_p_oOccupyArray[2][2];
|
||
if ( !p_oWnd )
|
||
p_oWnd = M_GetMainWnd();
|
||
if ( p_oWnd )
|
||
p_oWnd->UpdateStatus(
|
||
(char *)LPCTSTR(csTrueMessage),
|
||
C_STATUSPANE_INFOS,
|
||
_wHighLight
|
||
);
|
||
s_lLastPercentage = (lScaledPercentage < 0) ? 98765432 : lScaledPercentage;
|
||
}
|
||
}
|
||
|
||
#endif //ACTIVE_EDITOR
|