1870 lines
58 KiB
C++
1870 lines
58 KiB
C++
/*
|
|
=======================================================================================
|
|
Name : ipo_intf.cpp
|
|
|
|
Author : vincent lhullier Date :22/05/97
|
|
|
|
Description :IPO DLL Interface - implementation
|
|
=======================================================================================
|
|
Modification -> Author : Shaitan Date : 26/06/97
|
|
Description :
|
|
=======================================================================================
|
|
Modification -> Author : Vincent Lhullier Date : 07/07/97
|
|
Description :
|
|
=======================================================================================
|
|
Modification -> Author : Shaitan Date : 18/08/97
|
|
Description :
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#include <direct.h>
|
|
|
|
#include "stdafx.h"
|
|
#include "acp_base.h"
|
|
#include "ITF.h"
|
|
#include "dpt.h"
|
|
#include "IPO_intf.hpp"
|
|
#include "edit_cla.hpp"
|
|
#include "isi.h"
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
//ROMTEAM WorldEditor (Nicu 28/10/97)
|
|
#include "ogd.h"
|
|
#include "po\postruc.h"
|
|
#include "x:\cpa\tempgrp\gliGLOU\MULTIDRV\inc\visus_st.h"
|
|
#undef __PCSStruc_H__
|
|
#define PCS_MAIN
|
|
#include "pcs\pcs_str.h"
|
|
//ENDROMTEAM WorldEditor (Nicu)
|
|
|
|
// infos
|
|
static CString g_csOITName = "Instanciated Physical";
|
|
static CString g_csOITAuthor = "Vincent Lhullier";
|
|
static CString g_csOITVersion = "V 2.0.2 18/03/98";
|
|
static CString g_csOITFrenchHelpFile = "";
|
|
static CString g_csOITEnglishHelpFile = "";
|
|
|
|
BOOL g_bTipFirstTime = TRUE;
|
|
|
|
/*
|
|
=======================================================================================
|
|
GLOBALS
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
* the DLL global definition
|
|
*/
|
|
tdstDLLIdentity g_stIPOIdentity;
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Constructor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
IPOInterface::IPOInterface (void)
|
|
{
|
|
m_p_stDLLIdentity = &g_stIPOIdentity;
|
|
|
|
// Does your DLL can output in main game view ?
|
|
m_stBaseDLLDefinition.bCanOutputIn3DView = FALSE;
|
|
|
|
SetCurrent(FALSE);
|
|
SetEditorInfo(g_csOITName, g_csOITAuthor, g_csOITVersion, g_csOITFrenchHelpFile, g_csOITEnglishHelpFile);
|
|
|
|
m_bAllClassCreated = FALSE;
|
|
m_p_oDialogList = NULL;
|
|
m_p_oLeftFrame = NULL;
|
|
m_p_oPOClassDlg = NULL;
|
|
m_p_oIPOEditDlg = NULL;
|
|
m_p_oSelectedIPO = NULL;
|
|
m_p_oSelectedSuperObject = NULL;
|
|
|
|
//ROMTEAM WorldEditor (Cristian Stegaru 11/97)
|
|
m_pEPOInxTriangle = NULL;
|
|
//ENDROMTEAM WorldEditor (Cristian Stegaru)
|
|
m_b3DView = NULL; // Nicu
|
|
m_bMainDeviceWasSwapped = FALSE;
|
|
m_p_oMainDevice = NULL;
|
|
|
|
// CPA2 ASilvescu 98-04-14
|
|
m_pSelectedSPO = NULL;
|
|
// CPA2 ASilvescu 98-04-14
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Inits
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Register type and static initialisatoin
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vJustAfterRegistered (void)
|
|
{
|
|
CString types[] = { C_szInstanciatedPhysicalObjectTypeName, C_szPhysicalObjectClassTypeName };
|
|
|
|
fn_vRegisterObjectsType(types,2);
|
|
EditorIPO::StaticInit();
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Construct editor interface
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vConstruct (void)
|
|
{
|
|
/*~~~ In case of inactive editor, don't create dialogs ~~~*/
|
|
#ifndef __INACTIVE_INTERFACE__
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
// Frame
|
|
m_p_oLeftFrame = new CSplitFrame;
|
|
m_p_oLeftFrame->CreateBase("LIST", 1, 2, GetMainWorld());
|
|
m_p_oLeftFrame->m_iInitWidth = 180;
|
|
m_p_oLeftFrame->mfn_vEnableCaption(FALSE);
|
|
m_p_oLeftFrame->m_stWinBottom.cLinkSame = FRM_C_MoveRight;
|
|
m_p_oLeftFrame->CreateSplitter(C_cVerticalSplitter, 3);
|
|
|
|
// Dialog List
|
|
m_p_oDialogList = new CPA_DialogList;
|
|
m_p_oDialogList->fn_vInitDialog(this, m_p_oLeftFrame);
|
|
m_p_oDialogList->fn_vInitAllLists();
|
|
m_p_oLeftFrame->SetPaneView(0, m_p_oDialogList, "IPO", 240);
|
|
|
|
// resource
|
|
HINSTANCE hOldInst = AfxGetResourceHandle();
|
|
AfxSetResourceHandle(m_p_stDLLIdentity->hModule);
|
|
|
|
|
|
// create view
|
|
m_p_oLeftFrame->CreateView( 1, RUNTIME_CLASS( CIPOEditionDialog ), "PO & RLI", 11 );
|
|
m_p_oIPOEditDlg = (CIPOEditionDialog *) m_p_oLeftFrame->m_fn_p_oGetPane( 1 );
|
|
m_p_oIPOEditDlg->fn_vSetEditor( this );
|
|
m_p_oIPOEditDlg->fn_vUpdateIPO( NULL );
|
|
|
|
// create view
|
|
m_p_oLeftFrame->CreateView( 2, RUNTIME_CLASS( CPhysicalObjectClassDialog ), "CLASSES & MODELS", 400 );
|
|
m_p_oPOClassDlg = (CPhysicalObjectClassDialog *) m_p_oLeftFrame->m_fn_p_oGetPane( 2 );
|
|
m_p_oPOClassDlg->fn_vSetEditor( this );
|
|
|
|
// resource
|
|
AfxSetResourceHandle(hOldInst);
|
|
|
|
m_p_oLeftFrame->SetPaneSize( 1, 11 );
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#endif /*__INACTIVE_INTERFACE__*/
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Called when root world change
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vOnChangeRoot (void)
|
|
{
|
|
if (m_p_oDialogList)
|
|
{
|
|
m_p_oDialogList->fn_vInitAllLists();
|
|
m_p_oDialogList->fn_vReinitDialog();
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Called when world change
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vOnChangeWorld (void)
|
|
{
|
|
fn_vOnChangeRoot();
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Called when device change
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vOnChangeDevice (void)
|
|
{
|
|
fn_vOnChangeRoot();
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
EDITOR <-> ENGINE
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : called before engine loop
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vBeforeEngine (void)
|
|
{
|
|
if (fn_bIsCurrentEditor())
|
|
{
|
|
g_oFrameGest.mfn_vSetRefresh(FALSE);
|
|
g_oFrameGest.mfn_vDisactivateWindow(m_p_oLeftFrame);
|
|
g_oFrameGest.mfn_vDisactivateWindow(GetInterface()->GetModelFrame() );
|
|
g_oFrameGest.mfn_vSetRefresh(TRUE);
|
|
}
|
|
m_p_oIPOEditDlg->m_fn_vSwapLOD( 0, TRUE, FALSE );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : called before editor mode
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vBeforeEditor (void)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
CPA_BaseObjectList *p_oPOList;
|
|
EditorPOClass *p_oPOClass;
|
|
EditorPO *p_oPO;
|
|
long lIndex;
|
|
long lCount;
|
|
char szClassName[ _MAX_PATH ];
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* build list of PO class object
|
|
*/
|
|
if (!m_bAllClassCreated)
|
|
{
|
|
fn_vFindAllClasses();
|
|
m_bAllClassCreated = TRUE;
|
|
}
|
|
|
|
//CPA2 Stegaru Cristian 98-04
|
|
mfn_vLoadITObjects ();
|
|
//End CPA2 Stegaru Cristian 98-04
|
|
|
|
// get list of all physical and load classes that have at least one representation in level
|
|
p_oPOList = GetMainWorld()->fn_p_oGetOriginalObjectList(C_szPhysicalObjectTypeName);
|
|
|
|
if (p_oPOList != NULL)
|
|
{
|
|
lCount = p_oPOList->GetCount();
|
|
for (lIndex = 0; lIndex < lCount; lIndex ++)
|
|
{
|
|
p_oPO = (EditorPO *) p_oPOList->GetObjectWithIndex(lIndex, E_lo_Object);
|
|
if (p_oPO->fn_cGetOrigin() == C_cFromClasses)
|
|
{
|
|
// find class that contain this PO Model
|
|
strcpy (szClassName, p_oPO->GetReferencedSectionName());
|
|
*strchr(szClassName, '\\') = 0;
|
|
p_oPOClass = (EditorPOClass *) GetMainWorld()->fn_p_oFindObject(szClassName, C_szPhysicalObjectClassTypeName);
|
|
// load class if she doesn't exist
|
|
|
|
//ROMTEAM WorldEditor (Nicu 28/10/97)
|
|
if (p_oPOClass)
|
|
//ENDROMTEAM WorldEditor (Nicu)
|
|
if (!p_oPOClass->fn_bIsAvailable())
|
|
{
|
|
fn_bLoadBaseObject(p_oPOClass);
|
|
}
|
|
p_oPO->fn_bSetOwner(p_oPOClass);
|
|
}
|
|
//CPA2 Stegaru Cristian 98-04
|
|
else
|
|
{
|
|
CString csObjectName = p_oPO->GetName ();
|
|
CString csITObjectName;
|
|
POSITION pos = m_lstOfInitialITObjects.GetHeadPosition ();
|
|
while (pos)
|
|
{
|
|
csITObjectName = m_lstOfInitialITObjects.GetNext (pos);
|
|
if (csObjectName == csITObjectName)
|
|
{
|
|
mfn_vLoadBaseITObject (mfn_pGetITClass (), csITObjectName);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
//End CPA2 Stegaru Cristian 98-04
|
|
}
|
|
}
|
|
|
|
m_p_oPOClassDlg->fn_vInitClassList();
|
|
|
|
if (m_p_oDialogList)
|
|
{
|
|
m_p_oDialogList->fn_vInitAllLists();
|
|
m_p_oDialogList->fn_vReinitDialog();
|
|
}
|
|
|
|
|
|
if (fn_bIsCurrentEditor())
|
|
{
|
|
// Frame
|
|
g_oFrameGest.mfn_vSetRefresh(FALSE);
|
|
//g_oFrameGest.mfn_vActivateWindow (m_p_oPOClassFrame);
|
|
g_oFrameGest.mfn_vActivateWindow (m_p_oLeftFrame );
|
|
g_oFrameGest.mfn_vActivateWindow (GetInterface()->GetModelFrame());
|
|
g_oFrameGest.mfn_vSetRefresh(TRUE);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
CURRENT EDITOR
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : return TRUE if IPO editor can be activated
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL IPOInterface::fn_bCanActivateEditor (CPA_List<CPA_BaseObject> *pParam)
|
|
{
|
|
/*~~~ In case of inactive editor, refuse access to editor ~~~*/
|
|
#ifdef __INACTIVE_INTERFACE__
|
|
return FALSE;
|
|
#endif /*__INACTIVE_INTERFACE__*/
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
return (!fn_bIsCurrentEditor() );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : return TRUE if IPO editor can be closed
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL IPOInterface::fn_bCanCloseEditor (void)
|
|
{
|
|
return ( fn_bIsCurrentEditor() );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Activate editor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vOnActivateEditor (CPA_List<CPA_BaseObject> *pParam, BOOL bBackActivated /*=FALSE*/)
|
|
{
|
|
g_oFrameGest.mfn_vActivateWindow (m_p_oLeftFrame) ;
|
|
g_oFrameGest.mfn_vActivateWindow (GetInterface()->GetModelFrame());
|
|
|
|
m_p_oPOClassDlg->fn_vOnOpen();
|
|
|
|
fn_bGetIPOFromListOrSelection( pParam );
|
|
|
|
if(m_p_oDialogList)
|
|
m_p_oDialogList->fn_vUpdateSelection(E_lrm_ChangeSelection);
|
|
|
|
// display Tip of the Day
|
|
GetInterface()->fn_vDisplayTipOfDay("IPOs", "OIT", g_bTipFirstTime);
|
|
g_bTipFirstTime = FALSE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Close editor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vOnCloseEditor (void)
|
|
{
|
|
if (m_b3DView)
|
|
fn_vSet3DView(FALSE);
|
|
m_p_oPOClassDlg->fn_vOnClose();
|
|
m_p_oIPOEditDlg->m_fn_vSwapLOD( 0, TRUE, TRUE );
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
MENUS
|
|
=======================================================================================
|
|
*/
|
|
//**************************************************************************************
|
|
//Begin Mircea Dunka 3 Sept 1998 - DialogBar interface
|
|
void IPOInterface::fn_vDefineDlgBarBtnIcon (tde_DlgBarCategory wCategory, tds_DlgBarBtn *_pDlgBarBtn)
|
|
{
|
|
if(wCategory == C_DlgBarCategoryEditor)
|
|
{
|
|
_pDlgBarBtn->hIcon = ::LoadIcon((HINSTANCE)(GetDLLIdentity()->hModule), MAKEINTRESOURCE(IDI_IPO_DLGBAR_ICON));
|
|
|
|
CString oCst;
|
|
oCst = "IPO";
|
|
if( (M_GetMainApp()) && (M_GetMainApp()->mp_oAppKeyboard) )
|
|
{
|
|
oCst += " (";
|
|
oCst += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate IPO Editor"));
|
|
oCst += ")";
|
|
}
|
|
strcpy(_pDlgBarBtn->szToolTip, (char*)(LPCTSTR)oCst);
|
|
_pDlgBarBtn->uID = (UINT)this;
|
|
}
|
|
}
|
|
//end Mircea Dunka 3 Sept 1998
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Add entries to sub menus
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL IPOInterface::fn_bDefineSubMenu (EDT_SubMenu *p_oEDTSubMenu)
|
|
{
|
|
/*
|
|
* add entries only in "Editor" submenu
|
|
*/
|
|
if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEditor)
|
|
{
|
|
CString oCst;
|
|
|
|
oCst = "IPO";
|
|
if( (M_GetMainApp()) && (M_GetMainApp()->mp_oAppKeyboard) )
|
|
{
|
|
oCst += "\t";
|
|
oCst += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate IPO Editor"));
|
|
}
|
|
|
|
if (fn_bIsCurrentEditor())
|
|
p_oEDTSubMenu->AddAnEntry(this, (char*)(LPCTSTR)oCst, 2,TRUE);
|
|
else
|
|
p_oEDTSubMenu->AddAnEntry(this, (char*)(LPCTSTR)oCst, 1,FALSE,fn_bCanActivateEditor(NULL));
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Answer submenu commands
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::_OnSubMenuCommand (EDT_SubMenu *p_oEDTSubMenu,UINT uiMsgID)
|
|
{
|
|
if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEditor)
|
|
_OnPopUpMenuCommand(uiMsgID);
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : add entries in popup menu
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL IPOInterface::fn_bDefinePopupMenu (EDT_PopUpMenu *pPopup, CPA_List<CPA_SuperObject> *pSelection, BOOL bIsAlone)
|
|
{
|
|
if (bIsAlone)
|
|
{
|
|
pPopup->AddAnEntry(this, "Exit IPO editor", 2);
|
|
return TRUE;
|
|
}
|
|
|
|
if (!fn_bIsCurrentEditor())
|
|
{
|
|
if (fn_bGetIPOFromListOrSelection( NULL ))
|
|
{
|
|
pPopup->AddAnEntry(this, "Edit IPO Object", 1);
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Answer to popup commands
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::_OnPopUpMenuCommand (UINT m_IDCmdMsg)
|
|
{
|
|
switch (m_IDCmdMsg)
|
|
{
|
|
case 1:
|
|
GetMainWorld()->fn_bActivateEditor(this,NULL); // open with selection
|
|
break;
|
|
case 2:
|
|
GetMainWorld()->fn_bCloseEditor(this);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
HIERARCHY INITS
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Add a PO Type name in model list
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vInitListsOfModels (void)
|
|
{
|
|
GetInterface()->fn_bAddANewModelList(C_szPhysicalObjectTypeName, this);
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Add an IPO Type name in dialod lists
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vInitListByType (CPA_World *pWorld)
|
|
{
|
|
pWorld->fn_vAddANewListByType(C_szInstanciatedPhysicalObjectTypeName, this);
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Identify the engine types of the objects handled by the DLL
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL IPOInterface::fn_bCanHandleThisType (long lEngineType)
|
|
{
|
|
if (lEngineType & (HIE_C_ulIPO | HIE_C_ulIPO_Mirror))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Hierarchy Build
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Create a new editor IPO with an engine IPO
|
|
hEngineInstance -> engine IPO object
|
|
Returns (CPA_SuperObject * ) new editor IPO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPA_SuperObject * IPOInterface::GetNewEditorInstance (HIE_tdxHandleToSuperObject hEngineInstance)
|
|
{
|
|
CPA_SuperObject *pSupObj;
|
|
|
|
pSupObj = GetInterface()->GetNewSuperObject(hEngineInstance, E_ss_NoSave);
|
|
fn_vBuildNewEditorInstance(pSupObj, hEngineInstance);
|
|
return pSupObj;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : encapsulate an engine IPO in an editor IPO
|
|
pEditorInstance -> editor IPO
|
|
hEngineInstance -> engine IPO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vBuildNewEditorInstance (CPA_SuperObject *pEditorInstance, HIE_tdxHandleToSuperObject hEngineInstance)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
IPO_tdxHandleToIPO hEngineObject;
|
|
EditorIPO *pEdObj;
|
|
char *p_szSectionName;
|
|
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char *p_szFileName;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
hEngineObject = (IPO_tdxHandleToIPO) HIE_fn_hGetSuperObjectObject(hEngineInstance);
|
|
/*
|
|
* get parameters
|
|
*/
|
|
p_szSectionName = SCR_M_p_sz_Link_GetKey(SCR_fnp_st_Link_SearchValue(&IPO_g_stLinkTable, (unsigned long) hEngineObject));
|
|
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, szFileName, szActionName, szName);
|
|
|
|
p_szFileName = szFileName + 1 + strlen(fn_szGetLevelsDataPath());
|
|
|
|
/*
|
|
* create object
|
|
*/
|
|
pEdObj = new EditorIPO(this, hEngineObject, szName, p_szFileName, szActionName, TRUE, HIE_fn_ulGetSuperObjectType((HIE_tdxHandleToSuperObject)pEditorInstance->GetSuperObjectStruct()));
|
|
|
|
pEditorInstance->SetObject(pEdObj);
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : update editor instance according to engine instance
|
|
pEditorInstance -> editor IPO instance
|
|
pEngineInstance -> engine IPO instance
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vUpdateEditorInstance (CPA_SuperObject *pEditorInstance, HIE_tdxHandleToSuperObject pEngineInstance)
|
|
{
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
MODELS & INSTANCES
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Say were in hierarchy IPO object could be inserted
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
tdeTypeSO IPOInterface::GetTypeInstance (CString csTypeName, CString csModelName)
|
|
{
|
|
if (strcmp((char *) (LPCTSTR) csTypeName, C_szPhysicalObjectTypeName) == 0)
|
|
return C_Static;
|
|
|
|
return C_NoType;
|
|
}
|
|
|
|
//ANNECY Shaitan EmptySectors 25/02/98
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Say were in hierarchy IPO object could be inserted
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
tdeSaveStatus IPOInterface::GetStatusInstance (CString csTypeName, CString csModelName)
|
|
{
|
|
if (strcmp((char *) (LPCTSTR) csTypeName, C_szPhysicalObjectTypeName) == 0)
|
|
return E_ss_Modify;
|
|
|
|
return E_ss_NoStatus;
|
|
}
|
|
//ENDANNECY Shaitan EmptySectors
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Crate a new IPO with a model (PO)
|
|
csTypeName -> type of model (Physical object)
|
|
csModelName -> model name
|
|
pParent -> parent in hierarchy
|
|
Returns (CPA_SuperObject) new IPO instance
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPA_SuperObject *IPOInterface::GetNewInstance(CString csTypeName, CString csModelName, CPA_SuperObject *pParent)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
PO_tdxHandleToPhysicalObject hEnginePO;
|
|
IPO_tdxHandleToIPO hEngineIPO;
|
|
CPA_ObjectDLLBase *p_oPODll;
|
|
CPA_SuperObject *p_oSuperObject;
|
|
EditorIPO *p_oIPO;
|
|
EditorPO *p_oPO;
|
|
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char *p_szPOName;
|
|
char *p_szFileName;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
|
|
if (strcmp((char*) (LPCTSTR) csTypeName, C_szPhysicalObjectTypeName) == 0)
|
|
{
|
|
/*
|
|
* Get PO model
|
|
*/
|
|
|
|
//ROMTEAM WorldEditor (Nicu 24/11/97)
|
|
p_oPO = (EditorPO *) GetMainWorld()->fn_p_oFindObject(csModelName, csTypeName);
|
|
if (p_oPO == NULL) return NULL;
|
|
|
|
EditorPO *p_oPO1 = mfn_vCreateCloneGeomPO (p_oPO);
|
|
if (p_oPO1 != NULL) p_oPO = p_oPO1;
|
|
if (m_p_oPOClassDlg) m_p_oPOClassDlg->fn_vUpdateClassList ();
|
|
//ENDROMTEAM WorldEditor (Nicu)
|
|
|
|
/*
|
|
* load eventually PO
|
|
*/
|
|
if (!p_oPO->fn_bIsAvailable())
|
|
{
|
|
p_oPODll = GetMainWorld()->GetObjectDLLWithName(C_szDLLPhysicalObjectName);
|
|
if (p_oPODll != NULL)
|
|
{
|
|
if (p_oPODll->fn_bLoadBaseObject(p_oPO))
|
|
if (m_p_oPOClassDlg)
|
|
m_p_oPOClassDlg->GetDlgItem(IDC_LIST_POMODEL)->Invalidate();
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Get engine PO and create engine IPO
|
|
*/
|
|
hEnginePO = p_oPO->GetStruct();
|
|
hEngineIPO = IPO_fn_hAllocInstanciatedPhysicalObject();
|
|
IPO_fn_vSetPhysicalObject(hEngineIPO, hEnginePO);
|
|
IPO_fn_vSetRadiosity(hEngineIPO, NULL);
|
|
|
|
/*
|
|
* compute name of file, section and IPO object section
|
|
*/
|
|
p_szPOName = p_oPO->fn_p_szGetName();
|
|
if (strnicmp(p_szPOName, "PO_", 3) == 0)
|
|
p_szPOName += 3;
|
|
strcpy(szName, "IPO_");
|
|
strcpy(szName + 4, p_szPOName);
|
|
|
|
fn_zsGetActualLevelFilename(szFileName, "IPO");
|
|
|
|
/*
|
|
* create Editor IPO object
|
|
*/
|
|
p_oIPO = new EditorIPO(this, hEngineIPO, szName, szFileName, "IPO", FALSE,HIE_C_ulIPO);
|
|
|
|
/*
|
|
* create super object
|
|
*/
|
|
fn_zsGetActualLevelFilename(szFileName, "SPO");
|
|
p_szFileName = szFileName + strlen( fn_szGetLevelsDataPath()) + 1;
|
|
strcpy(szName, "SO-");
|
|
strcpy(szName + 3, p_szPOName);
|
|
p_oSuperObject = GetInterface()->GetNewSuperObject(E_ss_Modify, C_Static, szName, p_szFileName);
|
|
p_oSuperObject->SetObject(p_oIPO);
|
|
|
|
return p_oSuperObject;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Duplicate IPO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPA_BaseObject * IPOInterface::Duplicate (CPA_BaseObject *pObject, CPA_SuperObject *pNewSuperObject)
|
|
{
|
|
EditorIPO *pObj, *pNewObj;
|
|
|
|
pObj = (EditorIPO *) pObject;
|
|
pNewObj = new EditorIPO(*pObj);
|
|
|
|
return pNewObj;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Editor Modifs
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Selection
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vOnSelect(CPA_SuperObject *pEdObj, tdeTypeModif eType, tdeStatus eStatus)
|
|
{
|
|
if( eStatus == C_AsCurrentEditor )
|
|
{
|
|
m_p_oSelectedSuperObject = m_p_oSelectedIPO = NULL;
|
|
/*
|
|
if( eType == C_EDTDo )
|
|
{
|
|
m_p_oSelectedSuperObject = pEdObj;
|
|
m_p_oSelectedIPO = (EditorIPO *) pEdObj->GetObject();
|
|
}
|
|
*/
|
|
//if (fn_bGetIPOFromObject( pEdObj->GetObject() ) )
|
|
if (fn_bGetIPOFromObject( pEdObj ) )
|
|
{
|
|
/*
|
|
* force current object to be the only one that is selected
|
|
*/
|
|
if (M_GetCountSelected() > 1)
|
|
{
|
|
M_CancelSelection();
|
|
GetInterface()->fn_vAddSelectedObject(pEdObj,FALSE);
|
|
}
|
|
}
|
|
m_p_oIPOEditDlg->fn_vUpdateIPO( m_p_oSelectedIPO );
|
|
}
|
|
|
|
if(m_p_oDialogList)
|
|
m_p_oDialogList->fn_vUpdateSelection(E_lrm_ChangeSelection);
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Insertion
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vOnModifInsert
|
|
(
|
|
CPA_SuperObject *pEdObj,
|
|
CPA_SuperObject *pParent,
|
|
tdstPosition *p_stPosition,
|
|
tdeTypeModif eType,
|
|
tdeStatus eStatus
|
|
)
|
|
{
|
|
CPA_ObjectDLLBase *p_oLightDLL;
|
|
EditorIPO *p_oIPO;
|
|
|
|
/*
|
|
* check status
|
|
*/
|
|
if (eStatus != C_AsConcernedDLL)
|
|
return;
|
|
|
|
/*
|
|
* get corresponding object
|
|
*/
|
|
p_oIPO = (EditorIPO *) pEdObj->GetObject();
|
|
if (!(p_oIPO->GetDataType() & (HIE_C_ulIPO | HIE_C_ulIPO_Mirror)))
|
|
return;
|
|
|
|
/*
|
|
* update section
|
|
*/
|
|
//ROMTEAM Correction (Cristian Stegaru 27/02/98)
|
|
if (C_EDTDo == eType || C_EDTRedo == eType)
|
|
//ENDROMTEAM Correction (Cristian Stegaru)
|
|
p_oIPO->fn_vNotifySave();
|
|
else
|
|
p_oIPO->fn_vNotifyUnSave();
|
|
|
|
/*
|
|
* update RLI
|
|
*/
|
|
p_oLightDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLLightName);
|
|
if (p_oLightDLL != NULL)
|
|
{
|
|
p_oLightDLL->OnQueryAction(this, C_uiQueryComputeRli, (long)p_oIPO);
|
|
//ANNECY Shaitan Correction 03/03/98 {
|
|
CString oRLIName = fn_szGetLevelsDataPath();
|
|
oRLIName += "\\" + p_oIPO->GetRLISectionName();
|
|
SCR_fnp_st_Link_SetValue(ISI_fn_pGetLinkTable(), (char*)(LPCSTR)oRLIName, (unsigned long)IPO_fn_hGetRadiosity(p_oIPO->GetStruct()));
|
|
//ENDANNECY Shaitan Correction }
|
|
}
|
|
|
|
if(m_p_oDialogList)
|
|
m_p_oDialogList->fn_vUpdateSelection(E_lrm_ReinitList);
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Supression
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vOnModifDelete (CPA_List<EDT_SaveParents> *pListObjects, tdeTypeModif eType, tdeStatus eStatus)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
CPA_ObjectDLLBase *p_oLightDLL;
|
|
EDT_SaveParents *pElem;
|
|
EditorIPO *p_oIPO;
|
|
POSITION pos;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* check status
|
|
*/
|
|
if (eStatus != C_AsConcernedDLL)
|
|
return;
|
|
|
|
/*
|
|
* for all elements in the list
|
|
*/
|
|
for (pElem = pListObjects->GetHeadElement(pos); pElem; pElem = pListObjects->GetNextElement(pos))
|
|
{
|
|
/*
|
|
* get corresponding object
|
|
*/
|
|
p_oIPO = (EditorIPO *) pElem->m_pChild->GetObject();
|
|
if (p_oIPO->GetDataType() & (HIE_C_ulIPO | HIE_C_ulIPO_Mirror))
|
|
{
|
|
/*
|
|
* update section
|
|
*/
|
|
//ROMTEAM Correction (Cristian Stegaru 27/02/98)
|
|
if (C_EDTDo == eType || C_EDTRedo == eType)
|
|
//ENDROMTEAM Correction (Cristian Stegaru)
|
|
p_oIPO->fn_vNotifyUnSave();
|
|
else
|
|
p_oIPO->fn_vNotifyRestore();
|
|
}
|
|
}
|
|
|
|
/*
|
|
* update RLI
|
|
*/
|
|
p_oLightDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLLightName);
|
|
if (p_oLightDLL)
|
|
p_oLightDLL->OnQueryAction(this, C_uiQueryComputeRli, NULL);
|
|
if(m_p_oDialogList)
|
|
m_p_oDialogList->fn_vUpdateSelection(E_lrm_ReinitList);
|
|
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Copy
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vOnModifCopy (CPA_List<EDT_SaveParents> *pListObjects, tdeTypeModif eType, tdeStatus eStatus)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
CPA_ObjectDLLBase *p_oLightDLL;
|
|
EDT_SaveParents *pElem;
|
|
EditorIPO *p_oIPO;
|
|
POSITION pos;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* check status
|
|
*/
|
|
if (eStatus != C_AsConcernedDLL)
|
|
return;
|
|
|
|
/*
|
|
* for all elements in the list
|
|
*/
|
|
for (pElem = pListObjects->GetHeadElement(pos); pElem; pElem = pListObjects->GetNextElement(pos))
|
|
{
|
|
/*
|
|
* get corresponding object
|
|
*/
|
|
p_oIPO = (EditorIPO *) pElem->m_pChild->GetObject();
|
|
if (p_oIPO->GetDataType() & (HIE_C_ulIPO | HIE_C_ulIPO_Mirror))
|
|
{
|
|
/*
|
|
* update section
|
|
*/
|
|
//ROMTEAM Correction (Cristian Stegaru 27/02/98)
|
|
if (C_EDTDo == eType || C_EDTRedo == eType)
|
|
//ENDROMTEAM Correction (Cristian Stegaru)
|
|
p_oIPO->fn_vNotifySave();
|
|
else
|
|
p_oIPO->fn_vNotifyUnSave();
|
|
}
|
|
}
|
|
|
|
/*
|
|
* update RLI
|
|
*/
|
|
p_oLightDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLLightName);
|
|
if (p_oLightDLL)
|
|
p_oLightDLL->OnQueryAction(this, C_uiQueryComputeRli, NULL);
|
|
//ANNECY Shaitan Correction 30/03/98 {
|
|
CString oRLIName = fn_szGetLevelsDataPath();
|
|
oRLIName += "\\" + p_oIPO->GetRLISectionName();
|
|
SCR_fnp_st_Link_SetValue(ISI_fn_pGetLinkTable(), (char*)(LPCSTR)oRLIName, (unsigned long)IPO_fn_hGetRadiosity(p_oIPO->GetStruct()));
|
|
//ENDANNECY Shaitan Correction }
|
|
|
|
if(m_p_oDialogList)
|
|
m_p_oDialogList->fn_vUpdateSelection(E_lrm_ReinitList);
|
|
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Move
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vOnModifMove (CPA_List<EDT_SavePos> *pListObjects, CPA_List<EDT_SaveGlobalPos> *pListConcerned, tdeTypeModif eType, tdeStatus eStatus)
|
|
{
|
|
CPA_ObjectDLLBase *p_oLightDLL;
|
|
|
|
/*
|
|
* update RLI
|
|
*/
|
|
p_oLightDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLLightName);
|
|
if (p_oLightDLL)
|
|
p_oLightDLL->OnQueryAction(this, C_uiQueryComputeRli, NULL);
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
For dialog list
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : return selected Super object
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
CPA_BaseObject* IPOInterface::GetDialogSelection (CPA_DialogList *pDialog, CString csTypeName, tdeListDrawMode eDrawMode)
|
|
{
|
|
return m_p_oSelectedSuperObject;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : init list to display in dialog list box
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::GetListsForDialog (CPA_DialogList *pDialog)
|
|
{
|
|
if (pDialog == m_p_oDialogList )
|
|
pDialog->fn_vAddANewList(C_szInstanciatedPhysicalObjectTypeName,GetInterface()->GetSortedListByType(C_szInstanciatedPhysicalObjectTypeName));
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : init default parameters for dialog list
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vInitDefaultParameters( CPA_DialogList *pDialog )
|
|
{
|
|
if (pDialog == m_p_oDialogList )
|
|
{
|
|
pDialog->SetPermanentHeaders(FALSE);
|
|
pDialog->SetDefaultTypeName(C_szInstanciatedPhysicalObjectTypeName);
|
|
pDialog->SetDefaultTestName("No Test");
|
|
pDialog->SetDefaultButtonState(FALSE);
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : called when selection change in Dialog list
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL IPOInterface::fn_bOnSelChangeListObjects(CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pSelectedObject, BOOL _bUnselect)
|
|
{
|
|
if( fn_bIsCurrentEditor() )
|
|
{
|
|
if( _bUnselect )
|
|
{
|
|
M_CancelSelection();
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog);
|
|
m_p_oSelectedIPO = NULL;
|
|
}
|
|
else
|
|
{
|
|
M_CancelSelection();
|
|
GetInterface()->fn_vAddSelectedObject((CPA_SuperObject*)pSelectedObject,FALSE);
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog);
|
|
fn_bGetIPOFromObject( ((CPA_SuperObject *)pSelectedObject)->GetObject() );
|
|
}
|
|
m_p_oIPOEditDlg->fn_vUpdateIPO( m_p_oSelectedIPO );
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
BOUNDING VOLUMES
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : compute bounding volume of given IPO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vComputeBoundingVolume (CPA_BaseObject *pObject)
|
|
{
|
|
EditorIPO *pObj = (EditorIPO *) pObject;
|
|
EditorPO *poPOObj = pObj->GetPhysicalObject();
|
|
|
|
if (poPOObj != NULL)
|
|
{
|
|
((CPA_ObjectDLLBase*) poPOObj->GetEditor())->fn_vComputeBoundingVolume(poPOObj);
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : return bounding volume of given IPO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
ACP_tdxHandleOfObject IPOInterface::fn_hGetBoundingVolume (CPA_BaseObject *pObject)
|
|
{
|
|
EditorIPO *pObj = (EditorIPO *) pObject;
|
|
EditorPO *poPOObj = pObj->GetPhysicalObject();
|
|
|
|
if (poPOObj != NULL)
|
|
{
|
|
return ((CPA_ObjectDLLBase*) poPOObj->GetEditor())->fn_hGetBoundingVolume(poPOObj);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Communication
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : communication (query action from other DLL)
|
|
p_oSender -> DLL that query the action
|
|
wQuery -> action
|
|
lParam -> additional parameters
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long IPOInterface::OnQueryAction (CPA_EditorBase *p_oSender, WPARAM wQuery, LPARAM lParam)
|
|
{
|
|
EditorPOClass *p_oClass;
|
|
|
|
switch (wQuery)
|
|
{
|
|
case C_IPO_dwLoadPhysicalObjectClass:
|
|
// load new class
|
|
p_oClass = (EditorPOClass *) lParam;
|
|
return fn_bLoadBaseObject(p_oClass);
|
|
|
|
//ROMTEAM WorldEditor (Cristian Stegaru 11/97)
|
|
case C_IPO_uiCreateITModel:
|
|
{
|
|
QueryActionParam paramInput = *(QueryActionParam*)lParam;
|
|
ITObject3D *pITObject = (ITObject3D *)paramInput.m_p3DObject;
|
|
if (!pITObject || !m_pEPOInxTriangle)
|
|
return FALSE;
|
|
|
|
CPA_ObjectDLLBase *p_oPODll = GetMainWorld()->GetObjectDLLWithName (C_szDLLPhysicalObjectName);
|
|
|
|
//CPA2 Stegaru Cristian 98-04
|
|
|
|
CString csLevelsPath (fn_szGetLevelsDataPath ());
|
|
CString csLevelName (fn_p_szGetLevelName ());
|
|
CString csPhyName;
|
|
HINSTANCE hOldInst = AfxGetResourceHandle();
|
|
AfxSetResourceHandle (GetDLLIdentity()->hModule);
|
|
|
|
csPhyName = "\\" + csLevelName + "\\" + csLevelName + ".phy^PHY:";
|
|
|
|
//"GameData\\World\\Levels\\level\\level.phy^PHY:"
|
|
CString csFileName = csLevelsPath + csPhyName + paramInput.m_csName;
|
|
QueryActionParam paramOutput;
|
|
paramOutput.SetContent (pITObject, csFileName, -1);
|
|
EditorPO *pEditorPO = (EditorPO*)p_oPODll->OnQueryAction( (CPA_EditorBase *) m_pEPOInxTriangle, OPD_ActionCreateGeometricPO, (LPARAM) ¶mOutput);
|
|
ASSERT (pEditorPO);
|
|
pEditorPO->mfn_vSetClone (TRUE);
|
|
pEditorPO->SetExistingSection (FALSE);
|
|
pEditorPO->fn_vNotifySave ();
|
|
ASSERT (pITObject);
|
|
CString csReferencedSectionName, csElementSectionName, csElementName, csElementSufix;
|
|
//"level\\level.mod^Geometric: "
|
|
csReferencedSectionName = csLevelName + "\\" + csLevelName + ".mod^Geometric:";
|
|
pITObject->SetReferencedSectionName ((LPCTSTR)csReferencedSectionName);
|
|
pITObject->fn_vUpdateSectionName ();
|
|
pITObject->SetDataPath ((char*)(LPCTSTR)csLevelsPath);
|
|
//"level\\level.mod^ElementIndexedTriangles:"
|
|
csElementSectionName = csLevelName + "\\" + csLevelName + ".mod^ElementIndexedTriangles:";
|
|
csElementSufix.LoadString (IDS_ELEMENT_SUFIX_NAME);
|
|
csElementName = pITObject->GetName () + csElementSufix;
|
|
csElementSectionName += csElementName;
|
|
|
|
AfxSetResourceHandle(hOldInst);
|
|
//construct the element indexed triangle section
|
|
pITObject->mfn_vInitElement ((char*)(LPCTSTR)csElementSectionName, (char*)(LPCTSTR)csLevelsPath);
|
|
pITObject->fn_vNotifySave ();
|
|
|
|
//End CPA2 Stegaru Cristian 98-04
|
|
|
|
if (m_p_oPOClassDlg)
|
|
m_p_oPOClassDlg->fn_vUpdateClassList ();
|
|
return TRUE;
|
|
}
|
|
//ENDROMTEAM WorldEditor (Cristian Stegaru
|
|
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Load content of a class
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL IPOInterface::fn_bLoadBaseObject (CPA_BaseObject *p_oObject)
|
|
{
|
|
if ( strcmp(p_oObject->fn_p_szGetType(), C_szPhysicalObjectClassTypeName) == 0 )
|
|
{
|
|
return ((EditorPOClass *) p_oObject)->fn_bLoadEditorPO();
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
SPECIFIC FUNCTIONS
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Find All po classes on disk
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void IPOInterface::fn_vFindAllClasses (void)
|
|
{
|
|
WIN32_FIND_DATA stFindData;
|
|
HANDLE hFind;
|
|
char szFilter[ _MAX_PATH ];
|
|
EditorPOClass *p_oNewClass;
|
|
BOOL bIsLoadingWorld;
|
|
|
|
sprintf(szFilter, "%s\\*.*", fn_szGetGraphicsClassesDataPath());
|
|
|
|
if ((hFind = FindFirstFile(szFilter, &stFindData)) == INVALID_HANDLE_VALUE)
|
|
return;
|
|
|
|
/*
|
|
* Avoid prefixage of name
|
|
*/
|
|
bIsLoadingWorld = GetInterface()->fn_bIsLoadingWorld();
|
|
GetInterface()->SetLoadingWorld(TRUE);
|
|
|
|
//ROMTEAM WorldEditor (Cristian Stegaru 11/97)
|
|
CString csITName;
|
|
HINSTANCE hOldInst = AfxGetResourceHandle();
|
|
AfxSetResourceHandle (GetDLLIdentity()->hModule);
|
|
|
|
csITName.LoadString (IDS_ITNAME);
|
|
AfxSetResourceHandle(hOldInst);
|
|
//ENDROMTEAM WorldEditor (Cristian Stegaru)
|
|
|
|
/*
|
|
* for each directory class create a EditorPOClass
|
|
*/
|
|
do
|
|
{
|
|
if (stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
{
|
|
if (*stFindData.cFileName != '.')
|
|
{
|
|
p_oNewClass = new EditorPOClass(stFindData.cFileName, this);
|
|
//ROMTEAM WorldEditor (Nicu 06/01/98)
|
|
//CPA2 Stegaru Cristian 98-04
|
|
if (csITName == stFindData.cFileName)
|
|
ASSERT (FALSE);
|
|
//End CPA2 Stegaru Cristian 98-04
|
|
// if (csITName == stFindData.cFileName) m_pEPOInxTriangle = p_oNewClass;
|
|
//ENDROMTEAM WorldEditor (Nicu)
|
|
}
|
|
}
|
|
}
|
|
while(FindNextFile(hFind, &stFindData));
|
|
|
|
//ROMTEAM WorldEditor (Nicu 28/10/97)
|
|
p_oNewClass = new EditorPOClass("Geometric", this);
|
|
CPA_ObjectDLLBase *p_oPODll = GetMainWorld()->GetObjectDLLWithName( C_szDLLPhysicalObjectName );
|
|
|
|
QueryActionParam *param;
|
|
CPA_ObjectDLLBase *p_oGeomDll = GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName);
|
|
|
|
// Create geometric objects
|
|
int i = 0;
|
|
do // for all Geom Objects in Geometric DLL
|
|
{
|
|
param = (QueryActionParam *)p_oGeomDll->OnQueryAction(p_oGeomDll, C_uiCreateObject, i | C_origGeomObjectFlag);
|
|
if(param)
|
|
{
|
|
//CPA2 Stegaru Cristian 98-04
|
|
CString csLevelName = fn_p_szGetLevelName ();
|
|
CString csLevelsPath (fn_szGetLevelsDataPath ());
|
|
param->m_csName = csLevelsPath + "\\" + csLevelName + "\\" + csLevelName + ".phy^PHY:PO_" + param->m_csName;
|
|
p_oPODll->OnQueryAction( (CPA_EditorBase *) p_oNewClass, OPD_ActionCreateGeometricPO, (LPARAM)param);
|
|
p_oNewClass->SetAvailable(TRUE);
|
|
delete param;
|
|
// CString csClassPath (fn_szGetGraphicsClassesDataPath ());
|
|
// param->m_csName = csClassPath + "\\" + csITName + "\\" + csITName + ".phy^PHY:PO_" + param->m_csName;
|
|
// p_oPODll->OnQueryAction( (CPA_EditorBase *) p_oNewClass, OPD_ActionCreateGeometricPO, (LPARAM)param);
|
|
// p_oNewClass->SetAvailable(TRUE);
|
|
// delete param;
|
|
//End CPA2 Stegaru Cristian 98-04
|
|
}
|
|
i++; // next object
|
|
} while(param);
|
|
|
|
// Create the <Indexed Triangle> PO Class if the directory IT doesn't exist
|
|
|
|
//CPA2 Stegaru Cristian 98-04
|
|
mfn_vCreateITDirectory ();
|
|
p_oNewClass = m_pEPOInxTriangle = new EditorPOClass("it", this);
|
|
m_pEPOInxTriangle->SetAvailable(TRUE);
|
|
//End CPA2 Stegaru Cristian 98-04
|
|
|
|
//ENDROMTEAM WorldEditor (Nicu)
|
|
|
|
GetInterface()->SetLoadingWorld(bIsLoadingWorld);
|
|
|
|
FindClose(hFind);
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : try to find an IPO from list or selected object
|
|
pParam -> list of object (or NULL to take selected object )
|
|
Returns (BOOL ) TRUE if selected object is alone and is an IPO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL IPOInterface::fn_bGetIPOFromListOrSelection( CPA_List<CPA_BaseObject> *_p_oListObjects )
|
|
{
|
|
CPA_BaseObject *p_oObject;
|
|
|
|
/* init */
|
|
p_oObject = NULL;
|
|
|
|
if ( _p_oListObjects != NULL )
|
|
{
|
|
/*
|
|
* can be activate with only one object
|
|
*/
|
|
if ( _p_oListObjects->GetCount() == 1 )
|
|
p_oObject = _p_oListObjects->GetHead();
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
* take selection has list of objects
|
|
*/
|
|
if (M_GetCountSelected() == 1)
|
|
{
|
|
p_oObject = M_GetSingleSelection()->GetObject();
|
|
}
|
|
}
|
|
|
|
return fn_bGetIPOFromObject( p_oObject );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : try to find an IPO from a given object
|
|
_p_oObject-> given object
|
|
Returns (BOOL ) TRUE if object is an IPO
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL IPOInterface::fn_bGetIPOFromObject( CPA_BaseObject *_p_oObject )
|
|
{
|
|
CPA_BaseObject *p_oObj;
|
|
if (_p_oObject == NULL)
|
|
return FALSE;
|
|
|
|
/*
|
|
* check if object is an IPO
|
|
*/
|
|
if (_p_oObject->fn_bIsOfType( C_szSuperObjectTypeName ))
|
|
{
|
|
p_oObj = ((CPA_SuperObject *) _p_oObject )->GetObject();
|
|
if (p_oObj && p_oObj->fn_bIsOfType( C_szInstanciatedPhysicalObjectTypeName ) )
|
|
{
|
|
m_p_oSelectedSuperObject = _p_oObject;
|
|
m_p_oSelectedIPO = (EditorIPO *) p_oObj;
|
|
return TRUE;
|
|
}
|
|
}
|
|
if (_p_oObject->fn_bIsOfType( C_szInstanciatedPhysicalObjectTypeName ) )
|
|
{
|
|
m_p_oSelectedSuperObject = NULL;
|
|
m_p_oSelectedIPO = (EditorIPO *) _p_oObject;
|
|
return TRUE;
|
|
}
|
|
|
|
char *szType = _p_oObject->fn_p_szGetType();
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//ROMTEAM WorldEditor (Nicu 10/11/97)
|
|
BOOL IPOInterface::_OnLButtonDblClk (UINT nFlags, tdstMousePos *p_stPos, ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stPickInfo)
|
|
{
|
|
if (m_b3DView)
|
|
return TRUE;
|
|
|
|
CPA_SuperObject* psoSuperObject=NULL;
|
|
int j=0;
|
|
for (ACP_tdxIndex i=0; i<xIndex; i++)
|
|
{
|
|
CPA_SuperObject* pChild = GetInterface()->GetEditorObject(p_stPickInfo[i].hSprObject);
|
|
while (pChild )
|
|
{
|
|
if ((pChild && pChild->GetObjectType() & (HIE_C_ulIPO | HIE_C_ulIPO_Mirror)) && j!=1 )
|
|
{
|
|
psoSuperObject = pChild;
|
|
j=1;
|
|
|
|
}
|
|
pChild = (CPA_SuperObject*)pChild->GetParent();
|
|
}
|
|
}
|
|
|
|
if (psoSuperObject)
|
|
{
|
|
EditorPO *pPO = ((EditorIPO *)(psoSuperObject->GetObject()))->GetPhysicalObject();
|
|
ASSERT (pPO);
|
|
Shape3D * poObject=(Shape3D *) pPO->m_pGeom;
|
|
if(poObject)
|
|
{
|
|
CPA_Modif *o = poObject->GetUndoData();
|
|
if(poObject->_OnLButtonDblClk ( nFlags, p_stPos, xIndex, p_stPickInfo))
|
|
{
|
|
if(o) M_GetEditManager()->AskFor(o);
|
|
poObject->fn_vNotifySaveObject ();
|
|
}
|
|
else delete o;
|
|
poObject->mfn_vRefreshElement ();
|
|
return FALSE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
static Shape3D* sh = NULL;
|
|
CPA_Modif *undo = NULL;
|
|
BOOL IPOInterface::_OnMouseMove (UINT nFlags, tdstMousePos * p_stPos, MTH3D_tdstVector * p_stObject)
|
|
{
|
|
if (m_b3DView)
|
|
return TRUE;
|
|
|
|
if(sh)
|
|
{
|
|
if(!undo) undo = sh->GetUndoData();
|
|
BOOL retval = sh->_OnMouseMove (nFlags, p_stPos, p_stObject);
|
|
if(retval)
|
|
{
|
|
sh->fn_vNotifySaveObject ();
|
|
return TRUE;
|
|
}
|
|
delete undo;
|
|
undo = NULL;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
BOOL IPOInterface::_OnRButtonDown (UINT nFlags, tdstMousePos * p_stPos, ACP_tdxIndex xIndex, HIE_tdstPickInfo * p_stPickInfo)
|
|
{
|
|
if (m_b3DView)
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL IPOInterface::_OnLButtonDown (UINT nFlags, tdstMousePos * p_stPos, ACP_tdxIndex xIndex, HIE_tdstPickInfo * p_stPickInfo)
|
|
{
|
|
if (m_b3DView)
|
|
return TRUE;
|
|
|
|
CPA_SuperObject* psoSuperObject=NULL;
|
|
int j=0;
|
|
if(GetAsyncKeyState(VK_CONTROL) & 0x8000 == 0) return FALSE;
|
|
|
|
for (ACP_tdxIndex i=0; i<xIndex; i++)
|
|
{
|
|
CPA_SuperObject* pChild = GetInterface()->GetEditorObject(p_stPickInfo[i].hSprObject);
|
|
while (pChild )
|
|
{
|
|
if ((pChild && pChild->GetObjectType() & (HIE_C_ulIPO | HIE_C_ulIPO_Mirror)) && j!=1 )
|
|
{
|
|
psoSuperObject = pChild;
|
|
j=1;
|
|
}
|
|
pChild = (CPA_SuperObject*)pChild->GetParent();
|
|
}
|
|
}
|
|
|
|
sh = NULL;
|
|
undo = NULL;
|
|
if (psoSuperObject)
|
|
{
|
|
Shape3D * m_poObject=sh=(Shape3D *) ((EditorIPO *)(psoSuperObject->GetObject()))->GetPhysicalObject()->m_pGeom;
|
|
if(m_poObject)
|
|
{
|
|
m_poObject->SetSuperObject(psoSuperObject);
|
|
return m_poObject->_OnLButtonDown( nFlags, p_stPos, xIndex, p_stPickInfo);
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL IPOInterface::_OnLButtonUp (UINT nFlags, tdstMousePos * p_stPos) // Called when the left button is released
|
|
{
|
|
if (m_b3DView)
|
|
return TRUE;
|
|
|
|
if(sh)
|
|
{ BOOL b = sh->_OnLButtonUp (nFlags, p_stPos);
|
|
sh = NULL;
|
|
if(undo) M_GetEditManager()->AskFor(undo);
|
|
undo = NULL;
|
|
return b;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL IPOInterface::_OnKeyDown (UINT _nChar , UINT , UINT)
|
|
{
|
|
return Shape3D::_OnKeyDown (_nChar);
|
|
}
|
|
|
|
|
|
BOOL IPOInterface::_OnKeyUp (UINT _nChar , UINT , UINT)
|
|
{
|
|
return Shape3D::_OnKeyUp (_nChar);
|
|
}
|
|
//ENDROMTEAM WorldEditor (Nicu)
|
|
|
|
|
|
//ROMTEAM WorldEditor (Cristian Stegaru 24/11/97)
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : mfn_vCreateCloneGeomPO
|
|
// Date : 97-11
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// Author : Cristian Stegaru - CPA2
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification : Nicolae Suparatu
|
|
// Date : 97-24-11
|
|
// By :
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
EditorPO* IPOInterface::mfn_vCreateCloneGeomPO (EditorPO *po)
|
|
{
|
|
ASSERT (po);
|
|
if (NULL == m_pEPOInxTriangle || po->mfn_bIsClone ())
|
|
return NULL;
|
|
|
|
if (po->m_iIdx >= 0)
|
|
{
|
|
CPA_ObjectDLLBase *p_oPODll = GetMainWorld()->GetObjectDLLWithName( C_szDLLPhysicalObjectName );
|
|
CPA_ObjectDLLBase *p_oOGDDll = GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName);
|
|
// BEGIN CPA2 Cristi Petrescu 98-03-
|
|
QueryActionParam *param = (QueryActionParam *)p_oOGDDll->OnQueryAction(p_oOGDDll, C_uiCreateCloneObject, po->m_iIdx);
|
|
// END CPA2 Cristi Petrescu 98-03-
|
|
ASSERT (param);
|
|
|
|
//CPA2 Stegaru Cristian 98-04
|
|
// //save the geometry object in order to add the information needed for save
|
|
Geometry3D *p3D = param->m_p3DObject;
|
|
// CString csITName;
|
|
HINSTANCE hOldInst = AfxGetResourceHandle();
|
|
AfxSetResourceHandle (GetDLLIdentity()->hModule);
|
|
|
|
// csITName.LoadString (IDS_ITNAME);
|
|
CString *pcsLevelsPath = new CString(fn_szGetLevelsDataPath ());
|
|
CString csLevelName (fn_p_szGetLevelName ());
|
|
param->m_csName = *pcsLevelsPath + "\\" + csLevelName + "\\" + csLevelName + ".phy^PHY:PO_" + param->m_csName;
|
|
EditorPO *pEditorPO = (EditorPO*)p_oPODll->OnQueryAction( (CPA_EditorBase *) m_pEPOInxTriangle, OPD_ActionCreateGeometricPO, (LPARAM)param);
|
|
//ROMTEAM WorldEditor (Cristian Stegaru 12/97)
|
|
ASSERT (pEditorPO);
|
|
pEditorPO->mfn_vSetClone (TRUE);
|
|
pEditorPO->SetExistingSection (FALSE);
|
|
pEditorPO->fn_vNotifySave ();
|
|
//ENDROMTEAM WorldEditor (Cristian Stegaru)
|
|
delete param;
|
|
ASSERT (p3D);
|
|
CString csReferencedSectionName, csElementSectionName, csElementName, csElementSufix;
|
|
//"level\\level.mod^Geometric: "
|
|
csReferencedSectionName = csLevelName + "\\" + csLevelName + ".mod^Geometric:";
|
|
p3D->SetReferencedSectionName ((LPCTSTR)csReferencedSectionName);
|
|
p3D->fn_vUpdateSectionName ();
|
|
p3D->SetDataPath ((char *)(LPCSTR)*pcsLevelsPath);
|
|
// BEGIN CPA2 Cristi Petrescu 98-03-
|
|
p3D -> mfn_vCreateModifSection ();
|
|
// END CPA2 Cristi Petrescu 98-03-
|
|
//"level\\level.mod^ElementIndexedTriangles:"
|
|
// BEGIN CPA2 Cristi Petrescu 98-03-
|
|
if (po->m_iIdx == 3)
|
|
{
|
|
// ALTIMAP !!!
|
|
//CPA2 Stegaru Cristian 98-04
|
|
// csElementSectionName.LoadString (IDS_ELEMENT_ALTIMAP_SECTION_NAME);
|
|
csElementSectionName = csLevelName + "\\" + csLevelName + ".mod^ElementAltimap:";
|
|
//End CPA2 Stegaru Cristian 98-04
|
|
csElementSufix.LoadString (IDS_ELEMENT_ALTIMAP_SUFIX_NAME);
|
|
}
|
|
else
|
|
{
|
|
csElementSectionName = csLevelName + "\\" + csLevelName + ".mod^ElementIndexedTriangles:";
|
|
csElementSufix.LoadString (IDS_ELEMENT_SUFIX_NAME);
|
|
}
|
|
// END CPA2 Cristi Petrescu 98-03-
|
|
csElementName = p3D->GetName () + csElementSufix;
|
|
csElementSectionName += csElementName;
|
|
|
|
AfxSetResourceHandle(hOldInst);
|
|
//construct the element indexed triangle section
|
|
p3D->mfn_vInitElement ((char*)(LPCTSTR)csElementSectionName, (char *)(LPCSTR)*pcsLevelsPath);
|
|
p3D->fn_vNotifySave ();
|
|
return pEditorPO;
|
|
|
|
//End CPA2 Stegaru Cristian 98-04
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : mfn_vCreateITDirectory
|
|
// Date : 97-12
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// Author : Cristian Stegaru - CPA2
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification :
|
|
// Date :
|
|
// By :
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void IPOInterface::mfn_vCreateITDirectory (void)
|
|
{
|
|
|
|
//CPA2 Stegaru Cristian 98-04
|
|
CFile file;
|
|
UINT uOpenFlags = CFile::modeCreate | CFile::modeWrite;
|
|
CString csInitialText, csFileName, csDirName = fn_szGetLevelsDataPath ();
|
|
CString csLevelName (fn_p_szGetLevelName ());
|
|
|
|
csDirName += "\\" + csLevelName;
|
|
|
|
/*
|
|
csFileName = csDirName + "\\geomobj.log";
|
|
CFileStatus status;
|
|
BOOL bFileExists = TRUE == CFile::GetStatus (csFileName, status);
|
|
if (!bFileExists)
|
|
{
|
|
if (file.Open (csFileName, uOpenFlags))
|
|
{
|
|
csInitialText = ";1 xxx";
|
|
file.Write ((LPCSTR)csInitialText, csInitialText.GetLength ());
|
|
file.Close ();
|
|
}
|
|
}
|
|
*/
|
|
csFileName = csDirName + "\\" + csLevelName + ".mdt";
|
|
CFileStatus status;
|
|
BOOL bFileExists = TRUE == CFile::GetStatus (csFileName, status);
|
|
if (!bFileExists)
|
|
{
|
|
if (file.Open (csFileName, uOpenFlags))
|
|
file.Close ();
|
|
}
|
|
|
|
//End CPA2 Stegaru Cristian 98-04
|
|
}
|
|
//ENDROMTEAM WorldEditor (Cristian Stegaru)
|
|
|
|
//ANNECY Shaitan Correction (15/04/98) {
|
|
void IPOInterface::fn_vSet3DView (BOOL b3DView)
|
|
{
|
|
static DEV_MultiDevice* s_p_oMulti;
|
|
|
|
// update flag
|
|
m_b3DView = b3DView;
|
|
|
|
if(!m_p_oMainDevice) m_p_oMainDevice = m_p_oPOClassDlg->m_p_oMainDevice;
|
|
// CPA2 ASilvescu 98-04-09
|
|
POSITION pos;
|
|
if(m_b3DView)
|
|
{
|
|
m_pSelectedSPO = M_GetWorld()->GetListSelected()->GetHeadElement(pos); // get first selected object;
|
|
if(m_pSelectedSPO) GetInterface()->fn_vRemoveSelectedObject(m_pSelectedSPO, FALSE);
|
|
}
|
|
// End CPA2 ASilvescu 98-04-09
|
|
|
|
// swap to full screen
|
|
if (m_p_oMainDevice)
|
|
{
|
|
if (b3DView)
|
|
{
|
|
if (m_p_oMainDevice->IsFullScreen())
|
|
{
|
|
m_p_oMainDevice->SwapFullScreen();
|
|
m_bMainDeviceWasSwapped = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
m_p_oPOClassDlg->GetFrameForDevice3D()->ShowWindow( b3DView );
|
|
|
|
if (b3DView)
|
|
{
|
|
s_p_oMulti = (DEV_MultiDevice*)g_oFrameGest.ma_p_oWinArray[2][2]->GetActiveView();
|
|
GetInterface()->SetMultiDevice(m_p_oPOClassDlg->GetDevice3D());
|
|
}
|
|
else
|
|
{
|
|
GetInterface()->SetMultiDevice(s_p_oMulti);
|
|
}
|
|
|
|
if (m_p_oMainDevice)
|
|
{
|
|
if (!b3DView)
|
|
{
|
|
if (m_bMainDeviceWasSwapped)
|
|
{
|
|
m_bMainDeviceWasSwapped = FALSE;
|
|
if (!m_p_oMainDevice->IsFullScreen() )
|
|
m_p_oMainDevice->SwapFullScreen();
|
|
}
|
|
}
|
|
}
|
|
|
|
// CPA2 ASilvescu 98-04-09
|
|
if(m_pSelectedSPO && m_b3DView)
|
|
{
|
|
if(m_pSelectedSPO)
|
|
{
|
|
m_SPOMatrix = HIE_fn_hGetSuperObjectMatrix(m_pSelectedSPO->GetStruct());
|
|
m_SPOGlobelMatrix = m_pSelectedSPO->GetStruct()->hGlobalMatrix;
|
|
HIE_fn_vSetSuperObjectMatrix(m_pSelectedSPO->GetStruct(), HIE_fn_hGetSuperObjectMatrix(m_p_oPOClassDlg->m_p_oRootSO->GetStruct()));
|
|
m_pSelectedSPO->GetStruct()->hGlobalMatrix = m_p_oPOClassDlg->m_p_oRootSO->GetStruct()->hGlobalMatrix;
|
|
m_p_oPOClassDlg->DisplayModelIcon();
|
|
}
|
|
}
|
|
|
|
if(m_pSelectedSPO && !m_b3DView)
|
|
{
|
|
m_p_oPOClassDlg->m_p_oWorld->fn_vSetRoot( m_p_oPOClassDlg->m_p_oRootSO );
|
|
HIE_fn_vSetSuperObjectMatrix(m_pSelectedSPO->GetStruct(), m_SPOMatrix);
|
|
m_pSelectedSPO->GetStruct()->hGlobalMatrix = m_SPOGlobelMatrix;
|
|
GetInterface()->fn_vAddSelectedObject(m_pSelectedSPO, TRUE);
|
|
}
|
|
// End CPA2 ASilvescu 98-04-09
|
|
|
|
GetInterface()->fn_vUpdateAll(E_mc_JustDraw);
|
|
}
|
|
//ENDANNECY Shaitan Correction }
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : fn_vAfterSaveAll
|
|
// Date : 98-04
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// Author : Stegaru Cristian - CPA2
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification :
|
|
// Date :
|
|
// By :
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void IPOInterface::fn_vAfterSaveAll (void)
|
|
{
|
|
mfn_vSaveITObjects ();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : mfn_vLoadITObjects
|
|
// Date : 98-04
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// Author : Stegaru Cristian - CPA2
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification :
|
|
// Date :
|
|
// By :
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void IPOInterface::mfn_vLoadITObjects ()
|
|
{
|
|
CStdioFile file;
|
|
CString csFileName = mfn_csGetITObjectsFileName ();
|
|
if (!file.Open (csFileName, CFile::modeRead | CFile::typeText))
|
|
return; //first time we enter the level
|
|
|
|
CString csITObject;
|
|
while (file.ReadString (csITObject))
|
|
{
|
|
csITObject.TrimLeft ();
|
|
csITObject.TrimRight ();
|
|
if (!csITObject.IsEmpty ())
|
|
m_lstOfInitialITObjects.AddTail (csITObject);;
|
|
|
|
}
|
|
file.Close ();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : mfn_vSaveITObjects
|
|
// Date : 98-04
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// Author : Stegaru Cristian - CPA2
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification :
|
|
// Date :
|
|
// By :
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void IPOInterface::mfn_vSaveITObjects ()
|
|
{
|
|
CPA_BaseObject *p_oClass = mfn_pGetITClass ();
|
|
CPA_List<CPA_BaseObject> oPOList;
|
|
CPA_BaseObject *p_oPO;
|
|
POSITION xPos;
|
|
CStdioFile file;
|
|
CString csFileName = mfn_csGetITObjectsFileName ();
|
|
|
|
if (!file.Open (csFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeText))
|
|
return; //can't open the file
|
|
|
|
long lCount = GetMainWorld ()->fn_lFindObjects (&oPOList, "", C_szPhysicalObjectTypeName, p_oClass);
|
|
for (p_oPO = oPOList.GetHeadElement (xPos); xPos; p_oPO = oPOList.GetNextElement (xPos))
|
|
{
|
|
CString csName = p_oPO->GetName();
|
|
csName += "\n";
|
|
file.WriteString (csName);
|
|
}
|
|
file.Close ();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : mfn_csGetITObjectsFileName
|
|
// Date : 98-04
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// Author : Stegaru Cristian - CPA2
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification :
|
|
// Date :
|
|
// By :
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
CString IPOInterface::mfn_csGetITObjectsFileName ()
|
|
{
|
|
char szBaseRoot [_MAX_PATH];
|
|
GetModuleFileName (NULL, szBaseRoot, _MAX_PATH);
|
|
CString csBaseRoot (szBaseRoot);
|
|
int iInx = csBaseRoot.ReverseFind ('\\');
|
|
ASSERT (-1 != iInx);
|
|
csBaseRoot = csBaseRoot.Left (iInx + 1);
|
|
CString csFileName = csBaseRoot + fn_szGetLevelsDataPath () + "\\" + fn_p_szGetLevelName () + "\\" + fn_p_szGetLevelName () + szITObjectsExt;
|
|
return csFileName;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : mfn_vLoadBaseITObject
|
|
// Date : 98-04
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// Author : Stegaru Cristian - CPA2
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification :
|
|
// Date :
|
|
// By :
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void IPOInterface::mfn_vLoadBaseITObject (CPA_BaseObject *pObject, CString csITObjectName)
|
|
{
|
|
ASSERT (strcmp(pObject->fn_p_szGetType(), C_szPhysicalObjectClassTypeName) == 0);
|
|
((EditorPOClass *) pObject)->mfn_vLoadITEditorPO (csITObjectName);
|
|
}
|
|
|