/* ======================================================================================= 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 #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 *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 *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 *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 *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 *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 *pListObjects, CPA_List *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 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 *_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; iGetEditorObject(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; iGetEditorObject(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 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); }