836 lines
24 KiB
C++
836 lines
24 KiB
C++
// CPACMNDg.cpp : implementation file
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
#include "StdAfx.h"
|
|
|
|
#include "ACP_Base.h"
|
|
#include "ITF.h"
|
|
#include "TAc.h"
|
|
#include "TFa.h"
|
|
#include "IncMEC.h"
|
|
#define D_State_Define
|
|
#include "IncGAM.h"
|
|
#undef D_State_Define
|
|
#include "GLI.h"
|
|
|
|
#include "EDACDgMC.hpp"
|
|
|
|
#include "EDACDgIf.hpp"
|
|
#include "EDACDgMg.hpp"
|
|
#include "EDACModl.hpp"
|
|
#include "EDACStrg.hpp"
|
|
#include "EDACGlob.hpp"
|
|
#include "_Ainterf.hpp"
|
|
|
|
//External Modules
|
|
#include "ErO.h"
|
|
#include "IncTUT.h"
|
|
//End of External Modules
|
|
|
|
#undef CPA_WANTS_IMPORT
|
|
#undef CPA_EXPORT
|
|
#define CPA_WANTS_EXPORT
|
|
#include "_Actors.hpp"
|
|
#undef CPA_WANTS_EXPORT
|
|
#define CPA_WANTS_IMPORT
|
|
|
|
#define EdActors_C_COLOR_FOR_LOADED_FAMILIES (RGB(255,0,0))
|
|
#define EdActors_C_INVERSE_COLOR_FOR_LOADED_FAMILIES (RGB(255,150,150))
|
|
#define EdActors_C_COLOR_FOR_SELECTED_LOADED_FAMILIES (RGB(150,100,100))
|
|
|
|
#define EdActors_C_COLOR_FOR_UNLOADED_FAMILIES (RGB(96,96,96))
|
|
#define EdActors_C_INVERSE_COLOR_FOR_UNLOADED_FAMILIES (RGB(255,255,255))
|
|
#define EdActors_C_COLOR_FOR_SELECTED_UNLOADED_FAMILIES (RGB(96,96,255))
|
|
|
|
#define EdActors_C_szGenDoorsDescriptor "[GenDoor] "
|
|
#define EdActors_C_szNormalDescriptor "[Normal] "
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// EdActors_ModelCreationDialog dialog
|
|
BEGIN_MESSAGE_MAP(EdActors_ModelCreationDialog, CDialog)
|
|
//{{AFX_MSG_MAP(EdActors_ModelCreationDialog)
|
|
ON_LBN_DBLCLK(IDC_LIST_FAMILIES, OnDblclkListFamilies)
|
|
ON_LBN_SELCHANGE(IDC_LIST_FAMILIES, OnSelchangeListFamilies)
|
|
ON_LBN_SELCHANGE(IDC_LIST_BITMAPS, OnSelchangeListBitmaps)
|
|
ON_BN_CLICKED(IDC_RADIO_ALL_FAMILIES, OnRadioAllFamilies)
|
|
ON_BN_CLICKED(IDC_RADIO_LOADED_FAMILIES, OnRadioLoadedFamilies)
|
|
ON_BN_CLICKED(IDC_RADIO_UNLOADED_FAMILIES, OnRadioUnloadedFamilies)
|
|
ON_WM_DRAWITEM()
|
|
ON_BN_CLICKED(IDC_CHECK_GEN_DOOR, OnCheckGenDoor)
|
|
ON_EN_CHANGE(IDC_EDIT_CONTAINING, OnChangeEditContaining)
|
|
ON_EN_CHANGE(IDC_EDIT_START_WITH, OnChangeEditStartWith)
|
|
ON_BN_CLICKED(IDC_CHECK_ASPECT, OnCheckAspect)
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
//**************************************************************************
|
|
EdActors_ModelCreationDialog::EdActors_ModelCreationDialog(CWnd* pParent)
|
|
: CDialog(EdActors_ModelCreationDialog::IDD,
|
|
&g_oBaseFrame)
|
|
{
|
|
hOldInstance = AfxGetResourceHandle();
|
|
AfxSetResourceHandle(g_stActorEditorIdentity.hModule);
|
|
|
|
//{{AFX_DATA_INIT(EdActors_ModelCreationDialog)
|
|
m_bQuickView = TRUE;
|
|
m_iFilterChoice = 0;
|
|
m_bIsAGenDoor = FALSE;
|
|
m_csStartWith = _T("");
|
|
m_csContaining = _T("");
|
|
//}}AFX_DATA_INIT
|
|
|
|
//Gets the current Family List
|
|
m_pclFamilyList = g_pclInterface->GetMainWorld()->fn_p_oGetOriginalObjectList(C_szFamilyTypeName);
|
|
|
|
m_hBitmap = NULL;
|
|
m_hNoBitmap = NULL;
|
|
|
|
m_pclCreatedModel = NULL;
|
|
m_pclSelectedFamily = NULL;
|
|
}
|
|
|
|
//**************************************************************************
|
|
EdActors_ModelCreationDialog::~EdActors_ModelCreationDialog()
|
|
{
|
|
//Deletes all bitmap descriptions
|
|
POSITION pos = m_clListOfBitmapsForActors.GetHeadPosition();
|
|
while ( pos != NULL )
|
|
delete (m_clListOfBitmapsForActors.GetNext(pos));
|
|
|
|
pos = m_clListOfBitmapsForGenDoors.GetHeadPosition();
|
|
while ( pos != NULL )
|
|
delete (m_clListOfBitmapsForGenDoors.GetNext(pos));
|
|
|
|
pos = m_clListOfFamilies.GetHeadPosition();
|
|
while ( pos != NULL )
|
|
delete (m_clListOfFamilies.GetNext(pos));
|
|
|
|
AfxSetResourceHandle(hOldInstance);
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(EdActors_ModelCreationDialog)
|
|
DDX_Text(pDX, IDC_EDIT_FOR_NAME, m_csNewModelName);
|
|
DDX_Check(pDX, IDC_CHECK_ASPECT, m_bQuickView);
|
|
DDX_Radio(pDX, IDC_RADIO_ALL_FAMILIES, m_iFilterChoice);
|
|
DDX_Check(pDX, IDC_CHECK_GEN_DOOR, m_bIsAGenDoor);
|
|
DDX_Text(pDX, IDC_EDIT_START_WITH, m_csStartWith);
|
|
DDX_Text(pDX, IDC_EDIT_CONTAINING, m_csContaining);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// EdActors_ModelCreationDialog message handlers
|
|
|
|
//**************************************************************************
|
|
BOOL EdActors_ModelCreationDialog::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
//Computes BackGround Color
|
|
m_colrefBackGroundColor = ::GetSysColor(COLOR_MENU);
|
|
|
|
//Builds the internal list of Families
|
|
CPA_Family *pclCurrentFamily;
|
|
struct m_stFamilyDescription *p_stDescriptor;
|
|
Position pos = m_pclFamilyList->GetHeadPosition();
|
|
while ( pos != 0 )
|
|
{
|
|
pclCurrentFamily = (CPA_Family *)m_pclFamilyList->GetNext(pos);
|
|
|
|
//Adds a descriptor
|
|
p_stDescriptor = new struct m_stFamilyDescription;
|
|
p_stDescriptor->pclFamily = pclCurrentFamily;
|
|
p_stDescriptor->bIsAGenDoorFamily = m_pri_fn_bIsAGenDoorFamily(pclCurrentFamily);
|
|
|
|
m_clListOfFamilies.AddTail(p_stDescriptor);
|
|
}
|
|
|
|
//Fills the list box with Families
|
|
m_fn_vDisplayFilteredFamilies();
|
|
|
|
//Fills the second ListBox with Bitmaps Names
|
|
CString csBitmapsNames = g_pclInterface->m_clDocument.m_csModelsBitmapsCompletePath
|
|
+ "*.bmp";
|
|
CString csFileName;
|
|
HANDLE hFileHandle;
|
|
WIN32_FIND_DATA FindData;
|
|
hFileHandle = FindFirstFile(LPCTSTR(csBitmapsNames), &FindData);
|
|
BOOL bMustGoOn = ( hFileHandle != INVALID_HANDLE_VALUE );
|
|
struct m_stBitmapDescription *p_stBMDesc;
|
|
|
|
while ( bMustGoOn )
|
|
{
|
|
csFileName = FindData.cFileName;
|
|
|
|
//Adds to internal list
|
|
p_stBMDesc = new struct m_stBitmapDescription;
|
|
p_stBMDesc->csFileName = csFileName;
|
|
p_stBMDesc->hBitmap = NULL;
|
|
p_stBMDesc->bLoaded = FALSE;
|
|
|
|
m_clListOfBitmapsForActors.AddTail(p_stBMDesc);
|
|
|
|
bMustGoOn = FindNextFile(hFileHandle, &FindData);
|
|
}
|
|
|
|
FindClose(hFileHandle);
|
|
|
|
//Gets the Bitmaps for GenDoors
|
|
csBitmapsNames = g_pclInterface->m_clDocument.m_csModelsBitmapsCompletePathForGenDoors
|
|
+ "*.bmp";
|
|
BOOL bModFound;
|
|
CString csModFileName;
|
|
CFile cfModFile;
|
|
hFileHandle = FindFirstFile(LPCTSTR(csBitmapsNames), &FindData);
|
|
bMustGoOn = ( hFileHandle != INVALID_HANDLE_VALUE );
|
|
|
|
while ( bMustGoOn )
|
|
{
|
|
csFileName = FindData.cFileName;
|
|
|
|
//Searches for the corresponding ".MOD"
|
|
csModFileName = csFileName.Left(csFileName.GetLength() - 3) + "mod";
|
|
csModFileName = g_pclInterface->m_clDocument.m_csModelsBitmapsCompletePathForGenDoors + csModFileName;
|
|
bModFound = cfModFile.Open(csModFileName, CFile::modeRead);
|
|
|
|
if ( bModFound )
|
|
{
|
|
cfModFile.Close();
|
|
|
|
//Adds to internal list
|
|
p_stBMDesc = new struct m_stBitmapDescription;
|
|
p_stBMDesc->csFileName = csFileName;
|
|
p_stBMDesc->hBitmap = NULL;
|
|
p_stBMDesc->bLoaded = FALSE;
|
|
|
|
m_clListOfBitmapsForGenDoors.AddTail(p_stBMDesc);
|
|
}
|
|
|
|
bMustGoOn = FindNextFile(hFileHandle, &FindData);
|
|
}
|
|
|
|
FindClose(hFileHandle);
|
|
|
|
//Initial setting is "Actors mode"
|
|
CButton *pclGenDoorButton = (CButton *)GetDlgItem(IDC_CHECK_GEN_DOOR);
|
|
pclGenDoorButton->SetCheck(TRUE); //Init
|
|
m_fn_vFillListBoxWithBitmapNames(&m_clListOfBitmapsForActors);
|
|
|
|
//////////////
|
|
//////////////
|
|
//Registers for TUT Module
|
|
TUT_M_vGetTutDll();
|
|
|
|
TUT_M_vRegisterControlID(IDC_LIST_FAMILIES, "OAc_ModelCreationDialog_FamiliesListBox", TUT_e_ListBox);
|
|
TUT_M_vRegisterControlID(IDC_LIST_BITMAPS, "OAc_ModelCreationDialog_BitmpasListBox", TUT_e_ListBox);
|
|
TUT_M_vRegisterControlID(IDC_EDIT_FOR_NAME, "OAc_ModelCreationDialog_ModelNameEdit", TUT_e_TextEdit);
|
|
TUT_M_vRegisterControlID(IDC_RADIO_ALL_FAMILIES, "OAc_ModelCreationDialog_AllFamiliesButton", TUT_e_Button);
|
|
TUT_M_vRegisterControlID(IDC_RADIO_LOADED_FAMILIES, "OAc_ModelCreationDialog_LoadedFamiliesButton", TUT_e_Button);
|
|
TUT_M_vRegisterControlID(IDC_RADIO_UNLOADED_FAMILIES, "OAc_ModelCreationDialog_UnloadedFamiliesButton", TUT_e_Button);
|
|
TUT_M_vRegisterControlID(IDC_EDIT_START_WITH, "OAc_ModelCreationDialog_StartWithEdit", TUT_e_TextEdit);
|
|
TUT_M_vRegisterControlID(IDC_EDIT_CONTAINING, "OAc_ModelCreationDialog_ContainingEdit", TUT_e_TextEdit);
|
|
TUT_M_vRegisterControlID(IDC_CHECK_ASPECT, "OAc_ModelCreationDialog_QuickViewButton", TUT_e_Button);
|
|
TUT_M_vRegisterControlID(IDOK, "OAc_ModelCreationDialog_OKButton", TUT_e_Button);
|
|
TUT_M_vRegisterControlID(IDCANCEL, "OAc_ModelCreationDialog_CancelButton", TUT_e_Button);
|
|
|
|
//End of Registers for TUT Module
|
|
//////////////
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnDestroy()
|
|
{
|
|
//////////////
|
|
//////////////
|
|
//UnRegisters for TUT Module
|
|
TUT_M_vGetTutDll();
|
|
|
|
TUT_M_vUnregisterControlID(IDC_LIST_FAMILIES);
|
|
TUT_M_vUnregisterControlID(IDC_LIST_BITMAPS);
|
|
TUT_M_vUnregisterControlID(IDC_EDIT_FOR_NAME);
|
|
TUT_M_vUnregisterControlID(IDC_RADIO_ALL_FAMILIES);
|
|
TUT_M_vUnregisterControlID(IDC_RADIO_LOADED_FAMILIES);
|
|
TUT_M_vUnregisterControlID(IDC_RADIO_UNLOADED_FAMILIES);
|
|
TUT_M_vUnregisterControlID(IDC_EDIT_START_WITH);
|
|
TUT_M_vUnregisterControlID(IDC_EDIT_CONTAINING);
|
|
TUT_M_vUnregisterControlID(IDC_CHECK_ASPECT);
|
|
TUT_M_vUnregisterControlID(IDOK);
|
|
TUT_M_vUnregisterControlID(IDCANCEL);
|
|
|
|
//End of UnRegisters for TUT Module
|
|
//////////////
|
|
|
|
CDialog::OnDestroy();
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnOK()
|
|
{
|
|
AfxGetApp()->DoWaitCursor(1);
|
|
|
|
UpdateData(TRUE);
|
|
|
|
BOOL bMustContinue = TRUE;
|
|
|
|
//Checks if Family has an animation
|
|
if ( m_pclSelectedFamily == NULL )
|
|
{
|
|
CString csMessage = "You must choose a family for the Model\nor 'Cancel' !!";
|
|
EdActors_InformationDialog dial(&g_oBaseFrame, csMessage);
|
|
dial.DoModal();
|
|
|
|
bMustContinue = FALSE;
|
|
}
|
|
|
|
//Checks Name
|
|
if ( bMustContinue )
|
|
{
|
|
if ( m_csNewModelName.IsEmpty() )
|
|
{
|
|
if ( MessageBox("You did not give any name to your new Model !\nIf you chose 'OK', a default name will be given.",
|
|
"Model Creation - WARNING !",
|
|
MB_OKCANCEL | MB_ICONEXCLAMATION) == IDCANCEL )
|
|
bMustContinue = FALSE;
|
|
}
|
|
else
|
|
fn_vCheckAndChangeName(m_csNewModelName);
|
|
}
|
|
|
|
if ( bMustContinue )
|
|
{
|
|
//Loads Family if necessary
|
|
if ( !m_pclSelectedFamily->fn_bIsAvailable() )
|
|
{
|
|
CPA_DLLBase *p_clFamilyDll = g_pclInterface->GetMainWorld()->GetDLLWithTypeName(C_szDLLFamilyName);
|
|
|
|
ERROR_ASSERT( p_clFamilyDll != NULL );
|
|
|
|
//Displays message window
|
|
CString csMessageString = "Loading Family '" + m_pclSelectedFamily->GetName() + "'... Please wait !";
|
|
EdActors_Dialog_Message MessageDial(csMessageString);
|
|
MessageDial.m_pub_fn_bCreate();
|
|
|
|
ERROR_VERIFY( p_clFamilyDll->fn_bLoadBaseObject(m_pclSelectedFamily) );
|
|
}
|
|
|
|
//Creates all needed objects
|
|
|
|
///////////////////////////////
|
|
//Creates Editor's Actor
|
|
CPA_Actor *pclNewEditorActor = new CPA_Actor( NULL,
|
|
NULL,
|
|
g_c_csActorModelType,
|
|
NULL,
|
|
m_pclSelectedFamily,
|
|
NULL,
|
|
m_csNewModelName);
|
|
|
|
pclNewEditorActor->m_fn_vMakeGenDoor(m_bIsAGenDoor);
|
|
|
|
////////////////////////////////////////////////////////
|
|
//Creates a SuperObject to place in the hierarchy
|
|
m_pclCreatedModel = g_pclInterface->GetInterface()->GetNewSuperObject(E_ss_NoSave,
|
|
C_Protected,
|
|
"",
|
|
"");
|
|
|
|
pclNewEditorActor->m_fn_vMakeGenDoor(m_bIsAGenDoor);
|
|
pclNewEditorActor->m_pub_fn_vSetSuperObject(m_pclCreatedModel);
|
|
pclNewEditorActor->m_fn_vSetModelDefaultValues();
|
|
|
|
m_pclCreatedModel->SetModelName(pclNewEditorActor->GetName());
|
|
m_pclCreatedModel->SetObject(pclNewEditorActor);
|
|
//PROVISOIRE...
|
|
m_pclCreatedModel->GetStruct()->hLocalMatrix = (GEO_tdxHandleToMatrix)malloc(sizeof(POS_tdstCompletePosition));
|
|
POS_fn_vSetIdentityMatrix(m_pclCreatedModel->GetStruct()->hLocalMatrix);
|
|
|
|
EndDialog(IDOK);
|
|
}
|
|
|
|
AfxGetApp()->DoWaitCursor(-1);
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnSelchangeListFamilies()
|
|
{
|
|
CListBox *pclLB = (CListBox *)GetDlgItem(IDC_LIST_FAMILIES);
|
|
short wIndex = pclLB->GetCurSel();
|
|
if ( wIndex != LB_ERR )
|
|
{
|
|
m_pclSelectedFamily = ((struct m_stFamilyDescription *)(pclLB->GetItemDataPtr(wIndex)))->pclFamily;
|
|
|
|
if ( ((struct m_stFamilyDescription *)(pclLB->GetItemDataPtr(wIndex)))->bIsAGenDoorFamily )
|
|
{
|
|
m_bIsAGenDoor = TRUE;
|
|
m_fn_vFillListBoxWithBitmapNames(&m_clListOfBitmapsForGenDoors);
|
|
}
|
|
else
|
|
{
|
|
m_bIsAGenDoor = FALSE;
|
|
m_fn_vFillListBoxWithBitmapNames(&m_clListOfBitmapsForActors);
|
|
}
|
|
}
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnDblclkListFamilies()
|
|
{
|
|
// OnOK();
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnRadioAllFamilies()
|
|
{
|
|
UpdateData(TRUE);
|
|
m_fn_vDisplayFilteredFamilies();
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnRadioLoadedFamilies()
|
|
{
|
|
UpdateData(TRUE);
|
|
m_fn_vDisplayFilteredFamilies();
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnRadioUnloadedFamilies()
|
|
{
|
|
UpdateData(TRUE);
|
|
m_fn_vDisplayFilteredFamilies();
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnChangeEditContaining()
|
|
{
|
|
UpdateData(TRUE);
|
|
m_fn_vDisplayFilteredFamilies();
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnChangeEditStartWith()
|
|
{
|
|
UpdateData(TRUE);
|
|
m_fn_vDisplayFilteredFamilies();
|
|
}
|
|
|
|
//**************************************************************************
|
|
//Fills the list box with Families
|
|
void EdActors_ModelCreationDialog::m_fn_vDisplayFilteredFamilies()
|
|
{
|
|
//Fills the list box with Families
|
|
CListBox *pclLB = (CListBox *)GetDlgItem(IDC_LIST_FAMILIES);
|
|
|
|
pclLB->ResetContent();
|
|
|
|
BOOL bMustDisplayCurrentFamily;
|
|
short wIndex;
|
|
struct m_stFamilyDescription *p_stCurrentFamilyDescriptor;
|
|
CPA_Family *pclCurrentFamily;
|
|
POSITION pos = m_clListOfFamilies.GetHeadPosition();
|
|
while ( pos != 0 )
|
|
{
|
|
p_stCurrentFamilyDescriptor = m_clListOfFamilies.GetNext(pos);
|
|
pclCurrentFamily = p_stCurrentFamilyDescriptor->pclFamily;
|
|
|
|
switch ( m_iFilterChoice )
|
|
{
|
|
//All families
|
|
case 0:
|
|
bMustDisplayCurrentFamily = TRUE;
|
|
break;
|
|
//Loaded families
|
|
case 1:
|
|
bMustDisplayCurrentFamily = ( pclCurrentFamily->fn_bIsAvailable() );
|
|
break;
|
|
//Unloaded families
|
|
case 2:
|
|
bMustDisplayCurrentFamily = ( !(pclCurrentFamily->fn_bIsAvailable()) );
|
|
break;
|
|
default:
|
|
bMustDisplayCurrentFamily = FALSE;
|
|
break;
|
|
}
|
|
|
|
if ( bMustDisplayCurrentFamily )
|
|
{
|
|
CString csFamilyName = pclCurrentFamily->GetName();
|
|
csFamilyName.MakeLower();
|
|
|
|
//Looks for strings
|
|
if ( !m_csStartWith.IsEmpty() )
|
|
{
|
|
m_csStartWith.MakeLower();
|
|
bMustDisplayCurrentFamily = ( csFamilyName.Left(m_csStartWith.GetLength()).CompareNoCase(m_csStartWith) == 0 );
|
|
}
|
|
|
|
if ( bMustDisplayCurrentFamily )
|
|
if ( !m_csContaining.IsEmpty() )
|
|
{
|
|
m_csContaining.MakeLower();
|
|
bMustDisplayCurrentFamily = ( csFamilyName.Find(m_csContaining) != -1 );
|
|
}
|
|
|
|
if ( bMustDisplayCurrentFamily )
|
|
{
|
|
wIndex = pclLB->AddString(pclCurrentFamily->GetName());
|
|
pclLB->SetItemDataPtr(wIndex, (void *)p_stCurrentFamilyDescriptor);
|
|
}
|
|
}
|
|
}
|
|
|
|
m_pclSelectedFamily = NULL;
|
|
}
|
|
|
|
//**************************************************************************
|
|
CPA_SuperObject *EdActors_ModelCreationDialog::m_fn_pclGetNewModel()
|
|
{
|
|
return m_pclCreatedModel;
|
|
}
|
|
|
|
//**************************************************************************
|
|
CString EdActors_ModelCreationDialog::m_fn_csGetBitmapName()
|
|
{
|
|
return m_csBitmapName;
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnCheckAspect()
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
if ( !m_bQuickView )
|
|
{
|
|
if ( m_hNoBitmap == NULL )
|
|
if ( m_clBitmapNoImage.LoadBitmap(IDB_BITMAP_NO_IMAGE) )
|
|
m_hNoBitmap = HBITMAP(m_clBitmapNoImage);
|
|
|
|
CStatic *pclStatic = (CStatic *)GetDlgItem(IDC_PICTURES);
|
|
pclStatic->SetBitmap(m_hNoBitmap);
|
|
}
|
|
else
|
|
OnSelchangeListBitmaps();
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnSelchangeListBitmaps()
|
|
{
|
|
CListBox *pclLB = (CListBox *)GetDlgItem(IDC_LIST_BITMAPS);
|
|
short wIndex = pclLB->GetCurSel();
|
|
|
|
if ( wIndex != LB_ERR )
|
|
{
|
|
pclLB->GetText(wIndex, m_csBitmapName);
|
|
|
|
CWnd *pclWnd = GetDlgItem(IDC_PICTURES);
|
|
CRect crPictureRect;
|
|
pclWnd->GetWindowRect(crPictureRect);
|
|
|
|
struct m_stBitmapDescription *p_stBMDesc;
|
|
p_stBMDesc = (struct m_stBitmapDescription *)pclLB->GetItemDataPtr(wIndex);
|
|
|
|
if ( (m_bQuickView) && (!p_stBMDesc->bLoaded) )
|
|
{
|
|
CString csBitmapNameAndPath;
|
|
if ( m_bIsAGenDoor )
|
|
csBitmapNameAndPath = g_pclInterface->m_clDocument.m_csModelsBitmapsCompletePathForGenDoors
|
|
+ m_csBitmapName;
|
|
else
|
|
csBitmapNameAndPath = g_pclInterface->m_clDocument.m_csModelsBitmapsCompletePath
|
|
+ m_csBitmapName;
|
|
|
|
//Gets size
|
|
m_fn_bGetBitmapSize(csBitmapNameAndPath, &p_stBMDesc->csSize);
|
|
int xSize, ySize;
|
|
double dfRatio;
|
|
if ( p_stBMDesc->csSize.cx > p_stBMDesc->csSize.cy )
|
|
{
|
|
xSize = crPictureRect.Width();
|
|
dfRatio = (double)crPictureRect.Width() / (double)p_stBMDesc->csSize.cx;
|
|
ySize = (int)(p_stBMDesc->csSize.cy * dfRatio);
|
|
}
|
|
else
|
|
{
|
|
ySize = crPictureRect.Height();
|
|
dfRatio = (double)crPictureRect.Height() / (double)p_stBMDesc->csSize.cy;
|
|
xSize = (int)(p_stBMDesc->csSize.cx * dfRatio);
|
|
}
|
|
|
|
//Loads Bitmap
|
|
p_stBMDesc->hBitmap = (HBITMAP)LoadImage( NULL,
|
|
csBitmapNameAndPath,
|
|
IMAGE_BITMAP,
|
|
xSize,
|
|
ySize,
|
|
LR_LOADFROMFILE | LR_CREATEDIBSECTION
|
|
);
|
|
|
|
p_stBMDesc->bLoaded = TRUE;
|
|
}
|
|
|
|
m_hBitmap = p_stBMDesc->hBitmap;
|
|
m_csBitmapSize = p_stBMDesc->csSize;
|
|
|
|
if ( m_bQuickView )
|
|
{
|
|
//Sets size Text
|
|
CWnd *pclStaticWnd = GetDlgItem(IDC_PICTURE_SIZE);
|
|
CString csSizeText;
|
|
csSizeText.Format("%i x %i", m_csBitmapSize.cx, m_csBitmapSize.cy);
|
|
pclStaticWnd->SetWindowText(csSizeText);
|
|
|
|
//Displays it
|
|
CStatic *pclStatic = (CStatic *)GetDlgItem(IDC_PICTURES);
|
|
pclStatic->SetBitmap(m_hBitmap);
|
|
}
|
|
}
|
|
}
|
|
|
|
//**************************************************************************
|
|
BOOL EdActors_ModelCreationDialog::m_fn_bGetBitmapSize(CString csFileName, CSize *sz)
|
|
{
|
|
FILE *hFile;
|
|
BITMAPFILEHEADER bf;
|
|
BITMAPINFOHEADER bi;
|
|
|
|
if ( (hFile = fopen( csFileName, "rb")) == NULL)
|
|
return FALSE;
|
|
|
|
if (sizeof(bf) == fread( &bf, 1, sizeof(bf), hFile ))
|
|
{
|
|
if (bf.bfType == 0x4d42 /*BM*/)
|
|
{
|
|
if ( sizeof(bi) == fread( &bi, 1, sizeof(bi), hFile) )
|
|
{
|
|
sz->cx = bi.biWidth;
|
|
sz->cy = bi.biHeight;
|
|
fclose(hFile);
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
fclose(hFile);
|
|
return FALSE;
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
|
|
{
|
|
if ( nIDCtl == IDC_LIST_FAMILIES )
|
|
{
|
|
ERROR_ASSERT( lpDrawItemStruct->CtlType == ODT_LISTBOX );
|
|
|
|
CDC *pclDC;
|
|
pclDC = pclDC->FromHandle(lpDrawItemStruct->hDC);
|
|
CRect crRect(lpDrawItemStruct->rcItem);
|
|
|
|
CFont *pclFont = GetFont();
|
|
pclDC->SelectObject(pclFont);
|
|
|
|
struct m_stFamilyDescription *p_stDescriptor = (struct m_stFamilyDescription *)lpDrawItemStruct->itemData;
|
|
CPA_Family *pclFamily = p_stDescriptor->pclFamily;
|
|
|
|
COLORREF colRef;
|
|
COLORREF colRefForBackground;
|
|
if ( (lpDrawItemStruct->itemState & ODS_SELECTED) != 0 )
|
|
{
|
|
colRef = pclFamily->fn_bIsAvailable() ? EdActors_C_INVERSE_COLOR_FOR_LOADED_FAMILIES
|
|
: EdActors_C_INVERSE_COLOR_FOR_UNLOADED_FAMILIES;
|
|
colRefForBackground = pclFamily->fn_bIsAvailable() ? EdActors_C_COLOR_FOR_SELECTED_LOADED_FAMILIES
|
|
: EdActors_C_COLOR_FOR_SELECTED_UNLOADED_FAMILIES;
|
|
}
|
|
else
|
|
{
|
|
colRef = pclFamily->fn_bIsAvailable() ? EdActors_C_COLOR_FOR_LOADED_FAMILIES
|
|
: EdActors_C_COLOR_FOR_UNLOADED_FAMILIES;
|
|
colRefForBackground = m_colrefBackGroundColor;
|
|
}
|
|
|
|
pclDC->SetTextColor(colRef);
|
|
pclDC->SetBkMode(TRANSPARENT);
|
|
|
|
pclDC->FillSolidRect(&(lpDrawItemStruct->rcItem), colRefForBackground);
|
|
|
|
CString csCurrentText = p_stDescriptor->bIsAGenDoorFamily ? EdActors_C_szGenDoorsDescriptor : EdActors_C_szNormalDescriptor;
|
|
csCurrentText += pclFamily->GetName();
|
|
pclDC->TextOut(crRect.left + 1, crRect.top + 1, csCurrentText);
|
|
}
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::OnCheckGenDoor()
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
if ( m_bIsAGenDoor )
|
|
m_fn_vFillListBoxWithBitmapNames(&m_clListOfBitmapsForGenDoors);
|
|
else
|
|
m_fn_vFillListBoxWithBitmapNames(&m_clListOfBitmapsForActors);
|
|
}
|
|
|
|
//**************************************************************************
|
|
void EdActors_ModelCreationDialog::m_fn_vFillListBoxWithBitmapNames(CPA_List<struct m_stBitmapDescription> *_pclListOfBitmaps)
|
|
{
|
|
BOOL bMustSwap = FALSE;
|
|
|
|
//Gets current list type
|
|
CButton *pclGenDoorButton = (CButton *)GetDlgItem(IDC_CHECK_GEN_DOOR);
|
|
|
|
if ( pclGenDoorButton->GetCheck() )
|
|
{
|
|
//Must swap modes
|
|
if ( !m_bIsAGenDoor )
|
|
bMustSwap = TRUE;
|
|
}
|
|
else
|
|
{
|
|
//Must swap modes
|
|
if ( m_bIsAGenDoor )
|
|
bMustSwap = TRUE;
|
|
}
|
|
|
|
if ( bMustSwap )
|
|
{
|
|
pclGenDoorButton->SetCheck( !pclGenDoorButton->GetCheck() );
|
|
|
|
CListBox *pclLB = (CListBox *)GetDlgItem(IDC_LIST_BITMAPS);
|
|
pclLB->ResetContent();
|
|
|
|
short wIndex;
|
|
struct m_stBitmapDescription *pstCurrentBDesc;
|
|
POSITION pos = _pclListOfBitmaps->GetHeadPosition();
|
|
while (pos != NULL )
|
|
{
|
|
pstCurrentBDesc = _pclListOfBitmaps->GetNext(pos);
|
|
|
|
wIndex = pclLB->AddString(pstCurrentBDesc->csFileName);
|
|
|
|
pclLB->SetItemDataPtr(wIndex, (void *)pstCurrentBDesc);
|
|
}
|
|
|
|
//Selects first bitmap
|
|
if ( pclLB->GetCount() > 0 )
|
|
{
|
|
pclLB->SetCurSel(0);
|
|
OnSelchangeListBitmaps();
|
|
}
|
|
}
|
|
}
|
|
|
|
//**************************************************************************
|
|
BOOL EdActors_ModelCreationDialog::m_pri_fn_bIsAGenDoorFamily(CPA_Family *_pclFamily)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
|
|
//Gets the Family Subfolder
|
|
CString csFolderName = _pclFamily->GetCompleteSectionName();
|
|
short wIndex = csFolderName.ReverseFind('\\');
|
|
if ( wIndex != -1 )
|
|
csFolderName = csFolderName.Left(++wIndex);
|
|
|
|
//Looks in Family subfolder for the CHL or TBL file
|
|
HANDLE hFileHandle;
|
|
WIN32_FIND_DATA FindData;
|
|
|
|
// check if CHL exists
|
|
CString csFileName = csFolderName + "*.chl";
|
|
|
|
hFileHandle = FindFirstFile(LPCTSTR(csFileName), &FindData);
|
|
bReturn = (hFileHandle == INVALID_HANDLE_VALUE);
|
|
|
|
FindClose(hFileHandle);
|
|
|
|
if (!bReturn)
|
|
return FALSE;
|
|
|
|
// checks if TBL exist
|
|
csFileName = csFolderName + "*.tbl";
|
|
|
|
hFileHandle = FindFirstFile(LPCTSTR(csFileName), &FindData);
|
|
bReturn = ( hFileHandle == INVALID_HANDLE_VALUE );
|
|
|
|
FindClose(hFileHandle);
|
|
|
|
if (!bReturn)
|
|
return FALSE;
|
|
|
|
// Look in Specific directories
|
|
char szVersion[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
|
|
return bReturn;
|
|
|
|
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
|
|
wIndex = csFolderName.Find('\\');
|
|
if (wIndex != -1)
|
|
csFolderName = (iNumVersion ? szVersion2 : szVersion1) + csFolderName.Mid(wIndex);
|
|
|
|
// check if CHL exists
|
|
csFileName = csFolderName + "*.chl";
|
|
|
|
hFileHandle = FindFirstFile(LPCTSTR(csFileName), &FindData);
|
|
bReturn = (hFileHandle == INVALID_HANDLE_VALUE);
|
|
|
|
FindClose(hFileHandle);
|
|
|
|
if (!bReturn)
|
|
return FALSE;
|
|
|
|
// checks if TBL exist
|
|
csFileName = csFolderName + "*.tbl";
|
|
|
|
hFileHandle = FindFirstFile(LPCTSTR(csFileName), &FindData);
|
|
bReturn = (hFileHandle == INVALID_HANDLE_VALUE);
|
|
|
|
FindClose(hFileHandle);
|
|
|
|
if (!bReturn)
|
|
return FALSE;
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|