/* *======================================================================================= * Name :PO_Inter.cpp * Author :VL Date :22/05/97 * Description :DLL interface to manage Physical Objects (PO) *======================================================================================= * Modification -> Author : Date : * Description : *======================================================================================= */ #ifdef ACTIVE_EDITOR /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ #include "stdafx.h" #include "ACP_Base.h" #include "ITF.h" #include "vig.h" #include "incOPD.h" #include "PODialog.h" #include "x:\Cpa\Main\inc\_EditId.h" #include "OIT.h" //ROMTEAM WorldEditor (Nicu 28/10/97) #include "ogd.h" #include "po\postruc.h" #include "x:\cpa\tempgrp\gliGLOU\MULTIDRV\inc\visus_st.h" #include "DPT.h" #define STR_LENGTH 200 #define NB_LENGTH 10 //ENDROMTEAM WorldEditor (Nicu) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ // infos static CString g_csOPDName = "Physical"; static CString g_csOPDAuthor = "Vincent Lhullier"; static CString g_csOPDVersion = "V 2.0.2 18/03/98"; static CString g_csOPDFrenchHelpFile = ""; static CString g_csOPDEnglishHelpFile = ""; BOOL g_bTipFirstTime = TRUE; /* *============================================================================== Constants *============================================================================== */ #define OPD_GetFullGeomSectionName 999 /* *============================================================================== Globals *============================================================================== */ /* the DLL global definition */ tdstDLLIdentity g_stPOIdentity; /* ---------------------------------------------------------------------------------------- Description : constructor ---------------------------------------------------------------------------------------- */ POInterface::POInterface() { /* private internal */ m_p_stDLLIdentity = &g_stPOIdentity; m_stBaseDLLDefinition.bCanOutputIn3DView = FALSE; m_stBaseDLLDefinition.bCanBeRefreshedByEngine = FALSE; SetCurrent( FALSE ); SetEditorInfo(g_csOPDName, g_csOPDAuthor, g_csOPDVersion, g_csOPDFrenchHelpFile, g_csOPDEnglishHelpFile); /* * set default value for dialog box */ m_p_oDlgVse = NULL; m_p_oDlgList = NULL; /* * selected item */ m_p_oSelectedPO = NULL; m_p_oSelectedActor = NULL; //ROMTEAM WorldEditor (Cristian Stegaru 01/98) m_bEPOListOK = FALSE; //ENDROMTEAM WorldEditor (Cristian Stegaru) } /* ======================================================================================= Specific functions ======================================================================================= */ void POInterface::fn_vDisplayPOInfo( EditorPO *_p_oPO ) { if (m_p_oDlgVse) m_p_oDlgVse->fn_vUpdateInfo( _p_oPO ); } /* *======================================================================================= ACP Messages *======================================================================================= */ /* *======================================================================================= Begin / End Methods *======================================================================================= */ /* ---------------------------------------------------------------------------------------- Called just after DLL registration ---------------------------------------------------------------------------------------- */ void POInterface::fn_vJustAfterRegistered() { /* * Type of objects created */ CString a_csTypeOfObject[] = { C_szPhysicalObjectTypeName }; fn_vRegisterObjectsType(a_csTypeOfObject, 1); /* * object static init */ EditorPO::StaticInit(); } /* ---------------------------------------------------------------------------------------- construct interface window ---------------------------------------------------------------------------------------- */ void POInterface::fn_vConstruct() { /*~~~ In case of inactive editor, don't create dialogs ~~~*/ #ifndef __INACTIVE_INTERFACE__ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ /* * Frame */ m_p_oSplitterLeft = new CSplitFrame () ; m_p_oSplitterLeft->CreateBase ( "Physical Objects editor" , 1, 2, GetMainWorld () ); m_p_oSplitterLeft->m_iInitWidth = 200; m_p_oSplitterLeft->mfn_vEnableCaption(FALSE); m_p_oSplitterLeft->m_stWinRight.cLinkSame = FRM_C_MoveBottom; m_p_oSplitterLeft->CreateSplitter( C_cVerticalSplitter , 2 ); /* * save old resource handle and set the dll resource handle */ HINSTANCE hOldInst = AfxGetResourceHandle(); AfxSetResourceHandle( m_p_stDLLIdentity->hModule ); /* * first pane : dialog to list all PO object */ m_p_oSplitterLeft->CreateView( 0, RUNTIME_CLASS( CPODlgList ), "LIST OF PHYSICAL", 0); m_p_oDlgList = (CPODlgList *) m_p_oSplitterLeft->m_fn_p_oGetPane( 0 ); m_p_oDlgList->fn_vSetParentDLL( this ); /* * second pane : dialog to edit VSE data */ m_p_oSplitterLeft->CreateView ( 1, RUNTIME_CLASS( CPODlgVse ), "CARACTERISTICS", C_wCaptionHeight ) ; m_p_oDlgVse = (CPODlgVse *)m_p_oSplitterLeft-> m_fn_p_oGetPane ( 1 ) ; m_p_oDlgVse->fn_vSetParentDLL ( this ) ; fn_vDisplayPOInfo( NULL ); AfxSetResourceHandle( hOldInst ); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ #endif /*__INACTIVE_INTERFACE__*/ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ } /* ---------------------------------------------------------------------------------------- Called before engine ---------------------------------------------------------------------------------------- */ void POInterface::fn_vBeforeEngine(void) { // Frame if(fn_bIsCurrentEditor()) { g_oFrameGest.mfn_vSetRefresh(FALSE); g_oFrameGest.mfn_vDisactivateWindow (m_p_oSplitterLeft) ; g_oFrameGest.mfn_vSetRefresh(TRUE); } m_p_oDlgVse->m_fn_vSwapLOD( 0, TRUE, FALSE ); } /* ---------------------------------------------------------------------------------------- Called before editor ---------------------------------------------------------------------------------------- */ void POInterface::fn_vBeforeEditor(void) { if(fn_bIsCurrentEditor()) { if (m_p_oDlgList) m_p_oDlgList->fn_vRefreshListContent(); /* * Frame */ g_oFrameGest.mfn_vSetRefresh(FALSE); g_oFrameGest.mfn_vActivateWindow (m_p_oSplitterLeft) ; g_oFrameGest.mfn_vSetRefresh(TRUE); } } /* ======================================================================================= Reinitialization methods ======================================================================================= */ /* ---------------------------------------------------------------------------------------- Description : called when root world change ---------------------------------------------------------------------------------------- */ void POInterface::fn_vOnChangeRoot(void) { if ( fn_bIsCurrentEditor() ) { if (m_p_oDlgList) { m_p_oDlgList->fn_vRefreshListContent(); } } } /* ---------------------------------------------------------------------------------------- Description : called when device change ---------------------------------------------------------------------------------------- */ void POInterface::fn_vOnChangeDevice(void) { fn_vOnChangeRoot(); } /* ---------------------------------------------------------------------------------------- Description : called when world change ---------------------------------------------------------------------------------------- */ void POInterface::fn_vOnChangeWorld(void) { fn_vOnChangeRoot(); } /* *======================================================================================= Editor Messages *======================================================================================= */ /* ---------------------------------------------------------------------------------------- Description : ---------------------------------------------------------------------------------------- */ BOOL POInterface::fn_bAcceptModifCopy(CPA_List *pListObjects, tdeStatus eStatus) { return (eStatus != C_AsConcernedDLL); } /* ---------------------------------------------------------------------------------------- Description : called when an object has been deleted ---------------------------------------------------------------------------------------- */ void POInterface::fn_vOnModifDelete(CPA_List *pListObjects, tdeTypeModif eType, tdeStatus eStatus) { if (m_p_oDlgList) m_p_oDlgList->fn_vRefreshListContent(); } /* ---------------------------------------------------------------------------------------- Description : called when an object has been modified ---------------------------------------------------------------------------------------- */ void POInterface::fn_vOnModifParent(CPA_List *pListObjects, tdeTypeModif eType, tdeStatus eStatus) { if (m_p_oDlgList) m_p_oDlgList->fn_vRefreshListContent(); } /* ---------------------------------------------------------------------------------------- Description : called when an object has been modified and copied ---------------------------------------------------------------------------------------- */ void POInterface::fn_vOnModifCopy(CPA_List *pListObjects, tdeTypeModif eType, tdeStatus eStatus) { if (m_p_oDlgList) m_p_oDlgList->fn_vRefreshListContent(); } /* ---------------------------------------------------------------------------------------- Description : called when object name has been modified ---------------------------------------------------------------------------------------- */ void POInterface::fn_vOnModifName (CPA_SuperObject *pEdObj, CString csInitalName, CString csFinalName, tdeTypeModif eType, tdeStatus eStatus) { if (m_p_oDlgList) m_p_oDlgList->fn_vRefreshListContent(); } /* ---------------------------------------------------------------------------------------- Description : called when an object is selected ---------------------------------------------------------------------------------------- */ void POInterface::fn_vOnSelect(CPA_SuperObject *pEdObj, tdeTypeModif eType, tdeStatus) { if( fn_bIsCurrentEditor() && ( eType == C_EDTDo) && (pEdObj) && (pEdObj->GetObject()) ) { if (fn_bGetPOFromObject( pEdObj->GetObject() ) ) { /* * force current object to be the only one that is selected */ if (M_GetCountSelected() > 1) { M_CancelSelection(); GetInterface()->fn_vAddSelectedObject(pEdObj,FALSE); } } m_p_oDlgList->fn_vSetCurrentItem( m_p_oSelectedPO, m_p_oSelectedActor ); } /* else { fn_vUnSelect(); m_p_oDlgVse->fn_vUpdateInfo(NULL); } */ } /* ======================================================================================= Menu Methods ======================================================================================= */ //************************************************************************************** //Begin Mircea Dunka 31 Aug 1998 - DialogBar interface void POInterface::fn_vDefineDlgBarBtnIcon (tde_DlgBarCategory wCategory, tds_DlgBarBtn *_pDlgBarBtn) { if(wCategory == C_DlgBarCategoryEditor) { _pDlgBarBtn->hIcon = ::LoadIcon((HINSTANCE)(GetDLLIdentity()->hModule), MAKEINTRESOURCE(IDI_OPD_DLGBAR_ICON)); CString oCst; oCst = "Physical"; if( (M_GetMainApp()) && (M_GetMainApp()->mp_oAppKeyboard) ) { oCst += " ("; oCst += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate Physical Object Editor")); oCst += ")"; } strcpy(_pDlgBarBtn->szToolTip, (char*)(LPCTSTR)oCst); _pDlgBarBtn->uID = (UINT)this; } } //end Mircea Dunka 31 Aug 1998 /* ---------------------------------------------------------------------------------------- Description : define sub menu to enter this editor ---------------------------------------------------------------------------------------- */ BOOL POInterface::fn_bDefineSubMenu(EDT_SubMenu *_p_oEDTSubMenu) { if (_p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEditor) { CString oCst; oCst = "Physical"; if( (M_GetMainApp()) && (M_GetMainApp()->mp_oAppKeyboard) ) { oCst += "\t"; oCst += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate Physical Object Editor")); } if( fn_bIsCurrentEditor() ) _p_oEDTSubMenu->AddAnEntry(this, (char*)(LPCTSTR)oCst, IDM_EXIT,TRUE); else _p_oEDTSubMenu->AddAnEntry(this, (char*)(LPCTSTR)oCst, IDM_EDIT, FALSE, TRUE); return TRUE; } return FALSE; } void POInterface::_OnSubMenuCommand(EDT_SubMenu *_p_oEDTSubMenu,UINT uiMsgID) { if(_p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEditor) _OnPopUpMenuCommand(uiMsgID); } /* ======================================================================================= Popup menus method ======================================================================================= */ BOOL POInterface::fn_bDefinePopupMenu(EDT_PopUpMenu *pPopup, CPA_List *pSelection, BOOL bIsAlone) { if(bIsAlone) { pPopup->AddAnEntry(this, "Exit Physical Object editor", IDM_EXIT); return TRUE; } if( !fn_bIsCurrentEditor() ) { if (fn_bGetPOFromListOrSelection( NULL )) { pPopup->AddAnEntry(this, "Edit physical object", IDM_EDIT); return TRUE; } } return FALSE; } void POInterface::_OnPopUpMenuCommand(UINT m_IDCmdMsg) { switch(m_IDCmdMsg) { case IDM_EDIT: GetMainWorld()->fn_bActivateEditor(this,NULL); // open with selection break; case IDM_EXIT: GetMainWorld()->fn_bCloseEditor(this); break; } } /* ======================================================================================= Editor methods ======================================================================================= */ /* ---------------------------------------------------------------------------------------- Description : try to find a PO from a given object _p_oObject-> given object Returns (BOOL ) TRUE if selected object is alone and has a PO inside ---------------------------------------------------------------------------------------- */ BOOL POInterface::fn_bGetPOFromObject( CPA_BaseObject *_p_oObject ) { /* init */ //m_p_oSelectedPO = NULL; //m_p_oSelectedActor = NULL; if (_p_oObject == NULL) return FALSE; /* * check if object is a PO object */ if (_p_oObject->fn_bIsOfType( C_szPhysicalObjectTypeName ) ) { m_p_oSelectedPO = (EditorPO *) _p_oObject; m_p_oSelectedActor = NULL; return TRUE; } /* * check if object is an IPO */ if (_p_oObject->fn_bIsOfType( C_szInstanciatedPhysicalObjectTypeName ) ) { m_p_oSelectedPO = ((EditorIPO *) _p_oObject)->GetPhysicalObject(); m_p_oSelectedActor = NULL; return TRUE; } /* * check if object is an actor */ if (_p_oObject->fn_bIsOfType( C_szActorInstanceTypeName )) { m_p_oSelectedPO = NULL; m_p_oSelectedActor = _p_oObject; return TRUE; } char *szType = _p_oObject->fn_p_szGetType(); return FALSE; } /* ---------------------------------------------------------------------------------------- Description : try to find a PO from list or selected object pParam -> list of object (or NULL to take selected object ) Returns (BOOL ) TRUE if selected object is alone and has a PO inside ---------------------------------------------------------------------------------------- */ BOOL POInterface::fn_bGetPOFromListOrSelection( 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_bGetPOFromObject( p_oObject ); } /* ---------------------------------------------------------------------------------------- Description : return TRUE if actor can be currently activated with a given list of objects (or current selection if list of object is NULL ) pParam -> list of objects Returns (BOOL) TRUE if PO editor can be activated ---------------------------------------------------------------------------------------- */ BOOL POInterface::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 editaor can be closed. Returns (BOOL) ---------------------------------------------------------------------------------------- */ BOOL POInterface::fn_bCanCloseEditor (void) { return ( fn_bIsCurrentEditor() ); } /* ---------------------------------------------------------------------------------------- Description : Activate editor with list of object or is back activated pParam -> list of object bBackActivated -> TRUE if editor is activate cause another editor closed ---------------------------------------------------------------------------------------- */ void POInterface::fn_vOnActivateEditor(CPA_List *pParam, BOOL bBackActivated /*=FALSE*/) { /* * refresh list of PO */ m_p_oDlgList->fn_vRefreshListContent(); /* * activate frame */ //g_oFrameGest.mfn_vSetRefresh(FALSE); g_oFrameGest.mfn_vActivateWindow (m_p_oSplitterLeft) ; //g_oFrameGest.mfn_vSetRefresh(TRUE); if (!bBackActivated ) { fn_bGetPOFromListOrSelection( pParam ); } m_p_oDlgList->fn_vSetCurrentItem( m_p_oSelectedPO, m_p_oSelectedActor ); //m_p_oDlgVse->fn_vUpdateInfo(m_p_oSelectedPO); // display Tip of the Day GetInterface()->fn_vDisplayTipOfDay("POs", "OPT", g_bTipFirstTime); g_bTipFirstTime = FALSE; } void POInterface::fn_vOnCloseEditor (void) { m_p_oDlgVse->m_fn_vSwapLOD( 0, TRUE, TRUE ); } /* *======================================================================================= * General Purpose *======================================================================================= */ /* ---------------------------------------------------------------------------------------- Description : do a query action p_oSender -> DLL that query the action WPARAM -> action --------------------------------------------------------------------------------------- action -> OPD_ActionEncapsulateObject LPARAM -> engine physical object (PO_tdxHandleToPhysicalObject) Returns -> editor physical object (EditorPO *) ---------------------------------------------------------------------------------------- */ long POInterface::OnQueryAction(CPA_EditorBase *p_oSender, WPARAM wParam, LPARAM lParam) { long lResult = 0; PO_tdxHandleToPhysicalObject hPO; EditorPO *p_oEditPO; char *p_szSectionName; char szFileName[SCR_CV_ui_Cfg_MaxLenName]; char szActionName[SCR_CV_ui_Cfg_MaxLenName]; char szName[SCR_CV_ui_Cfg_MaxLenName]; CPA_BaseObject *p_oOwner; switch( wParam ) { case OPD_ActionEncapsulateObject: { p_oOwner = (CPA_BaseObject *) p_oSender; hPO = (PO_tdxHandleToPhysicalObject) lParam; // search if object already exists p_oEditPO = (EditorPO*)GetBaseObject( hPO, C_szPhysicalObjectTypeName ); if( p_oEditPO == NULL ) { // new object p_szSectionName = SCR_M_p_sz_Link_GetKey(SCR_fnp_st_Link_SearchValue(&PO_g_stLinkTable, (unsigned long) hPO)); SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, szFileName, szActionName, szName); //ROMTEAM WorldEditor (Cristian Stegaru 01/98) BOOL bNeedAGeometricObject = mfn_bIsACandidateEPO (szName); if (bNeedAGeometricObject) p_oEditPO = mfn_pGetEPOwithGeomObjAttached (hPO, p_oOwner, p_szSectionName); else p_oEditPO = new EditorPO(this, hPO, p_oOwner, szName, szFileName, szActionName); //ENDROMTEAM WorldEditor (Cristian Stegaru) } fn_vComputeBoundingVolume(p_oEditPO); lResult = (long) p_oEditPO; } break; case OPD_ActionSecondPass: { hPO = (PO_tdxHandleToPhysicalObject) lParam; p_oEditPO = (EditorPO *) GetMainWorld () -> fn_p_oFindObjectWithEngine (hPO , C_szPhysicalObjectTypeName); ASSERT (p_oEditPO); p_oEditPO -> m_fn_vInitDataMembers (TRUE); } break; case OPD_ActionCreateEmptyPO: { SCR_tdst_Link_Value *p_stLinkValue; p_oOwner = (CPA_BaseObject *) p_oSender; p_szSectionName = (char *) lParam; /* * look first if object exist */ p_stLinkValue = SCR_fnp_st_Link_SearchKey(&PO_g_stLinkTable, p_szSectionName ); if (p_stLinkValue == NULL) { hPO = NULL; p_oEditPO = NULL; } else { hPO = (PO_tdxHandleToPhysicalObject) SCR_M_ul_Link_GetValue( p_stLinkValue ); p_oEditPO = (EditorPO*) GetBaseObject( hPO, C_szPhysicalObjectTypeName ); } if (p_oEditPO == NULL) { SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, szFileName, szActionName, szName); p_oEditPO = new EditorPO( this, hPO, p_oOwner, szName, szFileName, szActionName); } lResult = (long) p_oEditPO; } break; //ROMTEAM WorldEditor (Nicu 28/10/97) case OPD_ActionCreateGeometricPO: { QueryActionParam *param = (QueryActionParam*)lParam; p_szSectionName = param->m_csName.GetBuffer (param->m_csName.GetLength () + 1); Geometry3D *g3d = param->m_p3DObject; p_oOwner = (CPA_BaseObject *) p_oSender; SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, szFileName, szActionName, szName); PO_tdxHandleToPhysicalObject hPO = mfn_hGethPOFromGeomObj (g3d); ASSERT (hPO); p_oEditPO = new EditorPO( this, hPO, p_oOwner, szName, szFileName, szActionName); p_oEditPO->SetZone(3, g3d, FALSE); p_oEditPO->m_iIdx = param->m_iIdx; m_lstOfCandidateEPO.AddTail (p_oEditPO); lResult = (long) p_oEditPO; } break; //ENDROMTEAM WorldEditor (Nicu) //CPA2 Stegaru Cristian 98-03 case OPD_GetFullGeomSectionName: { EditorPO *pPO = (EditorPO *)lParam; CString *pcsFullGeomSectionName = new CString; *pcsFullGeomSectionName = pPO->mfn_csGetFullGeomSectionName (); lResult = (long)pcsFullGeomSectionName; } break; //End CPA2 Stegaru Cristian 98-03 } return lResult; } /* ======================================================================================= Reachable Objects ======================================================================================= */ /* ---------------------------------------------------------------------------------------- Description : load engine struct associated with an empty CPA_BaseObject of PhysicalObject type p_oObject -> empty editor PO Returns (BOOL ) TRUE if load success ---------------------------------------------------------------------------------------- */ BOOL POInterface::fn_bLoadBaseObject( CPA_BaseObject *p_oObject ) { BOOL bIsLoadingWorld; BOOL bLoaded; if ( strcmp( p_oObject->fn_p_szGetType(), C_szPhysicalObjectTypeName) == 0) { bIsLoadingWorld = GetInterface()->fn_bIsLoadingWorld(); GetInterface()->SetLoadingWorld( TRUE ); bLoaded = ((EditorPO *) p_oObject)->m_fn_bLoadEnginePO() ; GetInterface()->SetLoadingWorld( bIsLoadingWorld ); return bLoaded; } return FALSE; } /* ======================================================================================= OBJECT DLL FUNCTIONS OVERLOAD ======================================================================================= */ /* ---------------------------------------------------------------------------------------- create a new super object and new PO object ---------------------------------------------------------------------------------------- */ CPA_SuperObject * POInterface::GetNewEditorInstance (HIE_tdxHandleToSuperObject hEngineInstance) { CPA_SuperObject *pSupObj; pSupObj = GetInterface()->GetNewSuperObject(hEngineInstance, E_ss_NoSave); fn_vBuildNewEditorInstance( pSupObj, hEngineInstance ); return pSupObj; } /* ---------------------------------------------------------------------------------------- encapsulate an engine IPO in a editor IPO create the object but not the super object ---------------------------------------------------------------------------------------- */ void POInterface::fn_vBuildNewEditorInstance (CPA_SuperObject *pEditorInstance, HIE_tdxHandleToSuperObject hEngineInstance) { PO_tdxHandleToPhysicalObject hEngineObject; EditorPO *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]; SCR_tdst_Link_Table *pLT = &PO_g_stLinkTable; // fbolefeysot - 06/08/98 // bidouille pour morphing premiere frame{ SCR_tdst_Link_Value *p_stLinkValue; //END fbolefeysot} CPA_BaseObjectList *p_oPOList; hEngineObject = (PO_tdxHandleToPhysicalObject) HIE_fn_hGetSuperObjectObject(hEngineInstance); // look if physical object editor doesn't till exist p_oPOList = GetMainWorld()->fn_p_oGetOriginalObjectList( C_szPhysicalObjectTypeName ); pEdObj = (EditorPO *) p_oPOList->fn_p_oFindObjectWithdData( (void *) hEngineObject ); if (pEdObj == NULL) { // fbolefeysot - 06/08/98 // bidouille pour morphing premiere frame{ p_stLinkValue = SCR_fnp_st_Link_SearchValue(&PO_g_stLinkTable, (unsigned long) hEngineObject); p_szSectionName = (p_stLinkValue) ? SCR_M_p_sz_Link_GetKey(p_stLinkValue) : NULL; //END fbolefeysot} if (p_szSectionName == NULL) { pEdObj = new EditorPO(this, hEngineObject, NULL); pEdObj->SetExistingSection( FALSE ); pEdObj->fn_p_oGetPCSSection()->SetExistingSection(FALSE); pEdObj->fn_p_oGetVSESection()->SetExistingSection(FALSE); } else { SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, szFileName, szActionName, szName); // create object pEdObj = new EditorPO(this, hEngineObject, NULL, szName, szFileName, szActionName); pEdObj->SetExistingSection(TRUE); pEdObj->fn_p_oGetPCSSection()->SetExistingSection(TRUE); pEdObj->fn_p_oGetVSESection()->SetExistingSection(TRUE); } } pEditorInstance->SetObject(pEdObj); } /* ---------------------------------------------------------------------------------------- Duplicate an object ---------------------------------------------------------------------------------------- */ CPA_BaseObject * POInterface::Duplicate (CPA_BaseObject *pObject, CPA_SuperObject *pNewSupObj) { return NULL; } /* ---------------------------------------------------------------------------------------- return TRUE if given type is PO type ---------------------------------------------------------------------------------------- */ BOOL POInterface::fn_bCanHandleThisType(long lEngineType) { return (lEngineType == HIE_C_ulPO); } /* ---------------------------------------------------------------------------------------- Add PO type name to Dialog List ---------------------------------------------------------------------------------------- */ void POInterface::fn_vInitListByType(CPA_World *pWorld) { pWorld->fn_vAddANewListByType (C_szPhysicalObjectTypeName, this); } /* *============================================================================== owner methods *============================================================================== */ void POInterface::fn_vUnSelect() { // m_p_oSelectedPO = NULL; } void POInterface::fn_vNameChanged() { //m_p_oDlgList->fn_vUpdateSelection(E_lrm_ReinitList); } /* ---------------------------------------------------------------------------------------- Compute bounding volume of the physical object. ---------------------------------------------------------------------------------------- */ void POInterface::fn_vComputeBoundingVolume(CPA_BaseObject *_pObj) { //ANNECY TQ 22/06/98{ EditorPO *pObj = (EditorPO *) _pObj; PO_tdxHandleToPhysicalObject hPO; GEO_tdxHandleToVisualSet hVisSet; GEO_tdxHandleToBoundingSphere hBound; ACP_tdxHandleOfObject hGeom; MTH_tdxReal xThreshold; MTH3D_tdstVector stCenter = {0,0,0}; MTH_tdxReal xRadius = 0.0; hPO = (PO_tdxHandleToPhysicalObject) pObj->GetEngineStruct(); if (hPO == NULL) return; hVisSet = PO_fn_hGetVisualSet(hPO); hBound = PO_fn_hGetBoundingVolume(hPO); if(hBound == NULL) GEO_fn_vCreateBoundingSphere(&hBound); GLI_vGetVisualSetLOD(hVisSet, 0, &xThreshold, &hGeom); GEO_fn_vAddObjectToSphere(hGeom, &stCenter, &xRadius); GEO_fn_vSetBoundingSphere(hBound, &stCenter, xRadius); PO_fn_vSetBoundingVolume(hPO, hBound); GEO_fn_vUpdateGeometricSphere(pObj->fn_hGetEditorPOBoundingVolume(), hBound); //ENDANNECY TQ} } /* ---------------------------------------------------------------------------------------- return bounding volume of physical object ---------------------------------------------------------------------------------------- */ ACP_tdxHandleOfObject POInterface::fn_hGetBoundingVolume(CPA_BaseObject *_pObj) { EditorPO *pObj = (EditorPO *) _pObj; PO_tdxHandleToPhysicalObject hPO = (PO_tdxHandleToPhysicalObject) pObj->GetEngineStruct(); fn_vComputeBoundingVolume( _pObj ); //ANNECY TQ 22/06/98{ return (pObj->fn_hGetEditorPOBoundingVolume()); //ENDANNECY TQ} } //ROMTEAM WorldEditor (Cristian Stegaru 01/98) ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : mfn_bIsACandidateEPO // Date : 98-01 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Cristian Stegaru - CPA2 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// BOOL POInterface::mfn_bIsACandidateEPO (const CString csName) { // look in m_lstOfCandidateEPO (that is loaded in fn_vBeforeEditor) if (!m_bEPOListOK) { m_bEPOListOK = TRUE; mfn_vFillListOfCandidateEPO (); } POSITION pos = m_lstNameOfCandidateEPO.GetHeadPosition (); while (NULL != pos) { CString csCandidateName = m_lstNameOfCandidateEPO.GetNext (pos); if (csName == csCandidateName) return TRUE; } return FALSE; } ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : mfn_iGetEPOIdx // Date : 98-01 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Cristian Stegaru - CPA2 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// int POInterface::mfn_iGetEPOIdx (CString csEPOName) { char szIdx [NB_LENGTH]; ASSERT (!m_csEPOFile.IsEmpty ()); if (GetPrivateProfileString (csEPOName, "IDX", NULL, szIdx, NB_LENGTH, m_csEPOFile)) { int iIdx = atoi (szIdx); return iIdx; } return -2; } ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : mfn_vFillListOfCandidateEPO // Date : 98-01 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Cristian Stegaru - CPA2 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// void POInterface::mfn_vFillListOfCandidateEPO () { char szCnt [NB_LENGTH], szEPOName [STR_LENGTH]; HINSTANCE hOldInst = AfxGetResourceHandle(); AfxSetResourceHandle (GetDLLIdentity()->hModule); //compute the epo filename //CPA2 Stegaru Cristian 98-04 CString csLevelsPath = fn_szGetLevelsDataPath (), csEPOFile; /// char szBasePath [_MAX_PATH]; GetModuleFileName (NULL, szBasePath, _MAX_PATH); CString csBasePath (szBasePath); int iInx = csBasePath.ReverseFind ('\\'); ASSERT (-1 != iInx); csBasePath = csBasePath.Left (iInx + 1); // csEPOFile = fn_p_szGetLevelName (); csEPOFile = "\\" + csEPOFile + "\\" + csEPOFile + ".geo"; m_csEPOFile = csBasePath + csLevelsPath + csEPOFile; //End CPA2 Stegaru Cristian 98-04 CString csMainSection; csMainSection.LoadString (IDS_MAINSECTION); int iCnt = 0; itoa (iCnt++, szCnt, 10); while (GetPrivateProfileString (csMainSection, szCnt, NULL, szEPOName, STR_LENGTH, m_csEPOFile)) { CString csEPOName (szEPOName); csEPOName.TrimRight (); if ("##" != csEPOName) m_lstNameOfCandidateEPO.AddTail (csEPOName); itoa (iCnt++, szCnt, 10); } AfxSetResourceHandle(hOldInst); } ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : fn_vBeforeSaveAll // Date : 98-01 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Cristian Stegaru - CPA2 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// void POInterface::fn_vBeforeSaveAll (void) { //save the info concerning the candidate EPO HINSTANCE hOldInst = AfxGetResourceHandle(); AfxSetResourceHandle (GetDLLIdentity()->hModule); CString csMainSection; csMainSection.LoadString (IDS_MAINSECTION); int iCnt = 0; char szCnt[10]; POSITION pos = m_lstOfCandidateEPO.GetHeadPosition (); while (NULL != pos) { EditorPO *pEPO = m_lstOfCandidateEPO.GetNext (pos); ASSERT (pEPO); BOOL bEPOHasAGeomObj = pEPO->mfn_bIsClone () && (NULL != pEPO->m_pGeom) && (pEPO->m_iIdx >= 0); if (bEPOHasAGeomObj) { itoa (iCnt++, szCnt, 10); WritePrivateProfileString (csMainSection, szCnt, pEPO->GetName (), m_csEPOFile); ((Shape3D*)pEPO->m_pGeom)->mfn_vSave (m_csEPOFile, pEPO->GetName (), pEPO->m_iIdx); } else if (mfn_bIsACandidateEPO (pEPO->GetName ())) //was loaded as a geometric object { itoa (iCnt++, szCnt, 10); WritePrivateProfileString (csMainSection, szCnt, "##", m_csEPOFile); } } AfxSetResourceHandle(hOldInst); } ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : mfn_pGetGeomObjFromEPOName // Date : 98-01 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Cristian Stegaru - CPA2 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// Shape3D* POInterface::mfn_pGetGeomObjFromEPOName (CString csEPOName) { //geom obj stuff ASSERT (!m_csEPOFile.IsEmpty ()); int iIdx = mfn_iGetEPOIdx (csEPOName); CPA_ObjectDLLBase *p_oOGDDll = GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName); ASSERT (p_oOGDDll); char szGeomObjName [STR_LENGTH]; GetPrivateProfileString (csEPOName, "NAME", NULL, szGeomObjName, STR_LENGTH, m_csEPOFile); p_oOGDDll->OnQueryAction (this, C_uiSetName, (long)szGeomObjName); //CPA2 Stegaru Cristian 98-04 // QueryActionParam *param = (QueryActionParam *)p_oOGDDll->OnQueryAction (this, C_uiCreateObject, iIdx); QueryActionParam *param = (QueryActionParam *)p_oOGDDll->OnQueryAction (this, C_uiCreateCloneObject, iIdx); //End CPA2 Stegaru Cristian 98-04 Shape3D *pGO = (Shape3D*)param->m_p3DObject; ASSERT (pGO); //assume there is a section from a previous save pGO->SetExistingSection (TRUE); delete param; pGO->mfn_vLoad (m_csEPOFile, csEPOName); return pGO; } ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : mfn_hGethPOFromGeomObj // Date : 98-01 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Cristian Stegaru - CPA2 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// PO_tdxHandleToPhysicalObject POInterface::mfn_hGethPOFromGeomObj (Geometry3D *pG3D) { ASSERT (pG3D); PO_tdxHandleToPhysicalObject hPO = new PO_tdstPhysicalObject_; ASSERT (hPO); hPO->_hCollideSet = NULL; hPO->_hBoundingVolume = NULL; struct GEO_tdstVisualSet_ *hVS = hPO->_hVisualSet = new struct GEO_tdstVisualSet_; hVS->xLastDistance = 100000; ///hysteresys. Works with only one viewport. hVS->xNbLodDefinitions = 1; hVS->d_xThresholdsTable = new MTH_tdxReal; *hVS->d_xThresholdsTable = 1e20f; hVS->d_p_stLodDefinitions = new (struct GEO_tdstGeometricObject_*); *hVS->d_p_stLodDefinitions = pG3D->GetStruct(); return hPO; } ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : mfn_pGetEPOwithGeomObjAttached // Date : 98-01 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : // Author : Cristian Stegaru - CPA2 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// EditorPO * POInterface::mfn_pGetEPOwithGeomObjAttached (PO_tdxHandleToPhysicalObject hPO, CPA_BaseObject * pOwner, char * szSection) { char szFileName[SCR_CV_ui_Cfg_MaxLenName]; char szActionName[SCR_CV_ui_Cfg_MaxLenName]; char szName[SCR_CV_ui_Cfg_MaxLenName]; ASSERT (szSection); SCR_fn_v_RdL0_SplitSectionName(szSection, szFileName, szActionName, szName); ASSERT (mfn_bIsACandidateEPO (szName)); //call this function only for candidate EPO Shape3D *pGO = NULL; pGO = mfn_pGetGeomObjFromEPOName (szName); ASSERT (pGO); if (hPO) { GMT_tdxHandleToGameMaterial hMaterial; GEO_vGetGameMaterialOfIndexedTriangles (*hPO->_hVisualSet->d_p_stLodDefinitions, 0, &hMaterial); struct GEO_tdstVisualSet_ *hVS = hPO->_hVisualSet; *hVS->d_p_stLodDefinitions = pGO->GetStruct(); GEO_vSetGameMaterialOfIndexedTriangles (pGO->GetStruct(), 0, hMaterial); } else { hPO = mfn_hGethPOFromGeomObj (pGO); } EditorPO *p_oEditPO = new EditorPO(this, hPO, pOwner, szName, szFileName, szActionName); ASSERT (p_oEditPO); p_oEditPO->SetZone(3, pGO, FALSE); p_oEditPO->m_iIdx = mfn_iGetEPOIdx (szName); p_oEditPO->mfn_vSetClone (TRUE); p_oEditPO->SetExistingSection (TRUE); p_oEditPO->SetAvailable( TRUE ); p_oEditPO->fn_vNotifySave (); m_lstOfCandidateEPO.AddTail (p_oEditPO); return p_oEditPO; } //ENDROMTEAM WorldEditor (Cristian Stegaru) #endif // ACTIVE_EDITOR