5499 lines
191 KiB
C++
5499 lines
191 KiB
C++
/*=========================================================================
|
||
*
|
||
* EvtEditor.cpp : Editor : Implementation file.
|
||
*
|
||
*
|
||
* Version 1.0
|
||
* Creation date
|
||
* Revision date
|
||
*
|
||
* Shaitan
|
||
*=======================================================================*/
|
||
#include "stdafx.h"
|
||
|
||
#include "itf/customid.h"
|
||
#ifdef ACTIVE_EDITOR
|
||
#include "acp_base.h"
|
||
|
||
#include <direct.h>
|
||
|
||
#include "geo.h"
|
||
#include "gli.h"
|
||
#include "tex.h"
|
||
|
||
#include "itf/CPAInter.hpp"
|
||
|
||
#include "itf/camdllb.hpp"
|
||
#include "itf/CPAProj.hpp"
|
||
|
||
#include "itf/CPAHieEd.hpp"
|
||
#include "itf/CPAMWorl.hpp"
|
||
#include "itf/DevMul3D.hpp"
|
||
|
||
#include "itf/CPAdlang.hpp"
|
||
|
||
#include "itf/StdDLLID.h"
|
||
#include "itf/cohemngr.hpp"
|
||
|
||
//SHATEMP
|
||
/*
|
||
#include "X:\cpa\tempgrp\GLI\PC\light_st.h"
|
||
#include "X:\cpa\tempgrp\GLI\PC\PvObj_st.h"
|
||
#include "X:\cpa\tempgrp\GLI\PC\InterfLL.h"
|
||
#include "X:\cpa\tempgrp\GLI\PC\linear.h"
|
||
*/
|
||
|
||
#include "X:\cpa\tempgrp\GLIGLOU\MULTIDRV\inc\light_st.h"
|
||
#include "X:\cpa\tempgrp\GLIGLOU\MULTIDRV\inc\PvObj_st.h"
|
||
#include "X:\cpa\tempgrp\GLIGLOU\MULTIDRV\inc\linear.h"
|
||
|
||
|
||
#include "x:\cpa\main\inc\_EditID.h"
|
||
#include "GAM/Input.h"
|
||
|
||
// --------------------------- popup ---------------------------------------
|
||
#define C_ui_CancelDrawingAction 12
|
||
#define C_ui_NormalDrawingAction 15
|
||
#define C_ui_GridedDrawingAction 16
|
||
#define C_ui_WiredDrawingAction 17
|
||
#define C_ui_ShowAxisAction 18
|
||
#define C_ui_ShowBoundingV 19
|
||
#define C_ui_ScaleAction 24
|
||
#define C_ui_ReScaleAction 25
|
||
#define C_ui_ComputeCentersAction 26
|
||
|
||
// --------------------------- submenu ---------------------------------------
|
||
#define C_ui_ComputeBV 31
|
||
#define C_ui_CoherenceMngr 32
|
||
#define C_ui_Option 33
|
||
#define C_ui_DeltaSelect 40
|
||
#define C_ui_FullSelect 41
|
||
#define C_ui_UnselectAll 42
|
||
#define C_ui_Textured 43
|
||
#define C_ui_Grided 44
|
||
#define C_ui_Wired 45
|
||
#define C_ui_World 46
|
||
#define C_ui_CollisionMap 61
|
||
#define C_ui_Visible 47
|
||
#define C_ui_Current 48
|
||
#define C_ui_NoBV 49
|
||
#define C_ui_SectorsBV 50
|
||
#define C_ui_ActorsBV 51
|
||
#define C_ui_ObjectsBV 52
|
||
#define C_ui_NoAxis 53
|
||
#define C_ui_DownRightAxis 54
|
||
#define C_ui_DownLeftAxis 55
|
||
#define C_ui_NoCenter 56
|
||
#define C_ui_MainCenters 57
|
||
#define C_ui_AllCenters 58
|
||
#define C_ui_BKColors 59
|
||
#define C_ui_SaveDisplay 60
|
||
// Begin Silviu Simen Select by sector and type
|
||
#define C_ui_SelectSectorType 61
|
||
// End Silviu Simen Select by sector and type
|
||
|
||
// --------------------------- colors ---------------------------------------
|
||
#define C_lc_SelectColor E_lc_Red
|
||
#define C_lc_ChildColor E_lc_Blue
|
||
#define C_lc_ParentColor E_lc_Green
|
||
#define C_lc_BrotherColor E_lc_Yellow
|
||
#define C_lc_ShowColor E_lc_Violet
|
||
#define C_lc_NoColor E_lc_NoColor
|
||
|
||
#define C_lNbConst 0.1
|
||
|
||
#define C_szTipOfDayIniFile "TipOfDay.ini"
|
||
#define C_szAstucesIniFile "Astuces.ini"
|
||
|
||
|
||
//***********************************************
|
||
//*** DR (20/01/98) *****************************
|
||
extern HMODULE g_hWawModule;
|
||
//*** End DR ************************************
|
||
//***********************************************
|
||
|
||
|
||
//#################################################################################
|
||
// INITS
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
Constructor
|
||
=========================================================================*/
|
||
CPA_Interface::CPA_Interface (void)
|
||
{
|
||
CString csFileName;
|
||
|
||
// init parameters
|
||
m_p_oMultiDevice = NULL;
|
||
m_p_oMainWorld = NULL;
|
||
// init models
|
||
m_pListAllModels = NULL;
|
||
m_pCurrentModel = NULL;
|
||
// init pyramid selection
|
||
m_bSelectionFrameVisible=FALSE;
|
||
m_bSelectionFrameCreating=FALSE;
|
||
m_bPyramidDepthChanging=FALSE;
|
||
|
||
//init object move parameters
|
||
m_bLastMovePlaneRemembered = FALSE;
|
||
m_bModeIsObjectMouseMove = FALSE;
|
||
fn_vSetMouseMovePlane(E_mmp_Standard);
|
||
|
||
MTH3D_M_vSetVectorElements(&m_stMouseXAxe, 1.0, 0.0, 0.0);
|
||
MTH3D_M_vSetVectorElements(&m_stMouseYAxe, 0.0, 1.0, 0.0);
|
||
MTH3D_M_vNullVector(&m_stLastMoveXAxe);
|
||
MTH3D_M_vNullVector(&m_stLastMoveYAxe);
|
||
|
||
m_dfZNearSelectionFrame=0.1;
|
||
m_dfZFarSelectionFrame=20.0;
|
||
|
||
// init editor
|
||
m_p_oEditor = new CPA_HierarchyEditor();
|
||
m_p_oEditor = NULL;
|
||
// init specific interface
|
||
m_oSpecificInterface.SetInterface(this);
|
||
|
||
// for rename during loading
|
||
m_bIsLoadingWorld = FALSE;
|
||
m_lNbObjectsRenamed = 0;
|
||
// user preferences
|
||
m_lNbAuthorized = 0;
|
||
m_lNbProhibited = 0;
|
||
m_lNbUsers = 0;
|
||
// user prefix
|
||
m_csUserPrefix.Empty();
|
||
m_bUseUserPreferences = TRUE;
|
||
// Language
|
||
m_csCurrentLanguage.Empty();
|
||
|
||
// Put on Ground
|
||
m_bPyramidMode = FALSE;
|
||
|
||
// Selection
|
||
m_bDeltaSelect = FALSE;
|
||
m_bFullSelect = FALSE;
|
||
m_bIgnoreFlags = FALSE;
|
||
m_bLockSelection = FALSE;
|
||
m_bFixedDepth = FALSE;
|
||
m_bRealTime = FALSE;
|
||
m_fPyramidalDepth = 1.f;
|
||
m_fCameraTargetDepth = 1.f;
|
||
|
||
// display parameters
|
||
m_iShowCenter = 0;
|
||
m_bLoaded = FALSE;
|
||
m_bScaleObject= FALSE;
|
||
m_eBVMode = E_bv_None;
|
||
|
||
// status bar info
|
||
m_eStatusBarMode = E_sb_InstanceInfo;
|
||
m_bDisplayDistance = FALSE;
|
||
|
||
// mouse swap
|
||
m_bAutomaticSwap = TRUE;
|
||
m_bCursorInFirstScreen = TRUE;
|
||
m_eForceSwap = eSwapRight;
|
||
|
||
// tip of day
|
||
m_bDisplayTipOfDay = TRUE;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
Destructor
|
||
=========================================================================*/
|
||
CPA_Interface::~CPA_Interface (void)
|
||
{
|
||
// models
|
||
while (!m_stListOfModelsByType.IsEmpty())
|
||
delete m_stListOfModelsByType.RemoveHead();
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
Create
|
||
=========================================================================*/
|
||
void CPA_Interface::Create (void)
|
||
{
|
||
// Bottom Frame Window
|
||
m_pModelFrame = new CSplitFrame;
|
||
m_pModelFrame->CreateBase("INSERT", 2, 3, m_p_oMainWorld);
|
||
m_pModelFrame->m_iInitWidth = 0;
|
||
m_pModelFrame->m_iInitHeight = 120;
|
||
m_pModelFrame->mfn_vEnableCaption(FALSE);
|
||
|
||
// init hierarchy editor
|
||
m_p_oEditor->Create();
|
||
|
||
// init select mode
|
||
m_pComboSelectMode = (CComboBox *) GetFrameBase()->m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_SELECTMODE);
|
||
m_csSelectMode = "All Types";
|
||
m_bLinkMode = FALSE;
|
||
|
||
// init dialog select
|
||
m_oDialogSelect.m_bDoDialog = FALSE;
|
||
// init specific interface
|
||
m_oSpecificInterface.fn_vSpecificInit();
|
||
|
||
// init map state
|
||
m_bInitialState = FALSE;
|
||
// init camera mode
|
||
m_bAutoTarget = FALSE;
|
||
m_bAutoZoom = FALSE;
|
||
|
||
// init selection & move
|
||
m_bConsX = FALSE;
|
||
m_bConsY = FALSE;
|
||
m_bConsZ = FALSE;
|
||
m_bPyramidMode = FALSE;
|
||
|
||
// init camera move mode
|
||
m_bMoveCamera = FALSE;
|
||
|
||
}
|
||
|
||
/*===========================================================================
|
||
Init
|
||
=========================================================================*/
|
||
void CPA_Interface::Init (void)
|
||
{
|
||
// Dialog Insert
|
||
m_pDialogInsert = new CPA_DialogInsert;
|
||
m_pDialogInsert->fn_vInitDialog(this, m_pModelFrame);
|
||
m_pModelFrame->SetActiveView(m_pDialogInsert, TRUE);
|
||
// Models
|
||
if (!m_pListAllModels)
|
||
{
|
||
m_stListAllBitmaps.m_fn_vCreate(C_cVariableSize, 32, 32);
|
||
m_pListAllModels = new EDT_ModelsByType("All Types", NULL, m_pDialogInsert, &m_stListAllBitmaps);
|
||
fn_vInitListOfModelsByType(GetMainWorld()->GetListOfObjectDLLBase());
|
||
}
|
||
}
|
||
|
||
/*===========================================================================
|
||
Static Init
|
||
=========================================================================*/
|
||
void CPA_Interface::StaticInit (void)
|
||
{
|
||
// init models
|
||
SCR_fn_v_RdL0_RegisterCallback("Edit-ListOfModels", CallBackLoadModelList, SCR_CRC_c_RdL0_ForSection);
|
||
}
|
||
|
||
//#################################################################################
|
||
// GET FUNCTIONS
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: Main Frame (for dialog bar & menus)
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_EditorBase * CPA_Interface::GetEditor (void)
|
||
{
|
||
return m_p_oEditor;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Main Frame (for dialog bar & menus)
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
FRMBaseMenu * CPA_Interface::GetFrameBase (void)
|
||
{
|
||
return GetMultiDevice()->GetParentFrame();
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Current World (for lists)
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_World * CPA_Interface::GetCurrentWorld (void)
|
||
{
|
||
return GetMultiDevice3D()->GetWorld();
|
||
}
|
||
|
||
|
||
//#################################################################################
|
||
// SET FUNCTIONS
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: set main world and update editor
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetMainWorld (CPA_MainWorld *p_oMainWorld)
|
||
{
|
||
m_p_oMainWorld = p_oMainWorld;
|
||
m_p_oEditor->SetMainWorld(m_p_oMainWorld);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Set multidevice and dispatch message
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetMultiDevice (DEV_MultiDevice *p_oMultiDevice)
|
||
{
|
||
CPA_DLLBase *p_oDLL;
|
||
POSITION pos;
|
||
|
||
// set new device
|
||
if (m_p_oMultiDevice)
|
||
{
|
||
m_p_oMultiDevice->Disactivate();
|
||
}
|
||
|
||
m_p_oMultiDevice = p_oMultiDevice;
|
||
p_oMultiDevice->Activate();
|
||
|
||
|
||
if (m_p_oMultiDevice)
|
||
m_p_oMultiDevice->SetInterface(this);
|
||
|
||
// specific update
|
||
m_oSpecificInterface.fn_vSpecificUpdate(TRUE);
|
||
|
||
// tell hierarchy editor
|
||
m_p_oEditor->fn_vOnChangeDevice();
|
||
|
||
if (!m_p_oMainWorld)
|
||
return;
|
||
|
||
// tell all Object DLLs
|
||
for (p_oDLL = m_p_oMainWorld->GetListOfObjectDLLBase()->GetHeadElement(pos); p_oDLL;
|
||
p_oDLL = m_p_oMainWorld->GetListOfObjectDLLBase()->GetNextElement(pos))
|
||
p_oDLL->fn_vOnChangeDevice();
|
||
|
||
// tell all Tool DLLs
|
||
for (p_oDLL = m_p_oMainWorld->GetListOfToolDLLBase()->GetHeadElement(pos); p_oDLL;
|
||
p_oDLL = m_p_oMainWorld->GetListOfToolDLLBase()->GetNextElement(pos))
|
||
p_oDLL->fn_vOnChangeDevice();
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: dispatch message when world changes
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vChangeWorld (void)
|
||
{
|
||
CPA_DLLBase *p_oDLL;
|
||
POSITION pos;
|
||
|
||
// specific update
|
||
m_oSpecificInterface.fn_vSpecificUpdate(TRUE);
|
||
|
||
// tell hierarchy editor
|
||
m_p_oEditor->fn_vOnChangeWorld();
|
||
|
||
if (!m_p_oMainWorld)
|
||
return;
|
||
|
||
// tell all Object DLLs
|
||
for (p_oDLL = m_p_oMainWorld->GetListOfObjectDLLBase()->GetHeadElement(pos); p_oDLL;
|
||
p_oDLL = m_p_oMainWorld->GetListOfObjectDLLBase()->GetNextElement(pos))
|
||
p_oDLL->fn_vOnChangeWorld();
|
||
|
||
// tell all Tool DLLs
|
||
for (p_oDLL = m_p_oMainWorld->GetListOfToolDLLBase()->GetHeadElement(pos); p_oDLL;
|
||
p_oDLL = m_p_oMainWorld->GetListOfToolDLLBase()->GetNextElement(pos))
|
||
p_oDLL->fn_vOnChangeWorld();
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: dispatch message when root changes
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vChangeRoot (void)
|
||
{
|
||
CPA_DLLBase *p_oDLL;
|
||
POSITION pos;
|
||
|
||
// specific update
|
||
m_oSpecificInterface.fn_vSpecificUpdate(TRUE);
|
||
|
||
// tell hierarchy editor
|
||
m_p_oEditor->fn_vOnChangeRoot();
|
||
|
||
if (!m_p_oMainWorld)
|
||
return;
|
||
|
||
// tell all Object DLLs
|
||
for (p_oDLL = m_p_oMainWorld->GetListOfObjectDLLBase()->GetHeadElement(pos); p_oDLL;
|
||
p_oDLL = m_p_oMainWorld->GetListOfObjectDLLBase()->GetNextElement(pos))
|
||
p_oDLL->fn_vOnChangeRoot();
|
||
|
||
// tell all Tool DLLs
|
||
for (p_oDLL = m_p_oMainWorld->GetListOfToolDLLBase()->GetHeadElement(pos); p_oDLL;
|
||
p_oDLL = m_p_oMainWorld->GetListOfToolDLLBase()->GetNextElement(pos))
|
||
p_oDLL->fn_vOnChangeRoot();
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Before Editor
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vBeforeEditor (void)
|
||
{
|
||
CString csFileName;
|
||
|
||
/* Init sinus effect and global fog */
|
||
GLI_vInitWaterplaneModule();
|
||
GLI_cGlobalFogIsOn = 0;
|
||
|
||
// init user parameters
|
||
fn_vInitUserPrefix();
|
||
GetSpecificInterface()->fn_vInitUserStatus();
|
||
// init scripts
|
||
csFileName = M_GetMainApp()->m_csEngineDataPath + "\\ModifLst.txt";
|
||
SCR_fn_v_SvL1_SetModificationFileName((char*)(LPCSTR)csFileName);
|
||
|
||
//init Language
|
||
fn_vInitLanguage();
|
||
|
||
//*********************************************
|
||
//*** DR (20/01/98) : Init Watch Window ******
|
||
if( g_hWawModule != NULL )
|
||
{
|
||
void (*WawInitFunction)(void) = (void (__cdecl*)(void))GetProcAddress( g_hWawModule, "WAW_fn_vInitWatchWindow" );
|
||
if( WawInitFunction != NULL ) WawInitFunction();
|
||
else AfxMessageBox("Init function has not been found in DLL (WAW module)");
|
||
}
|
||
//*** End DR (20/01/98) ***********************
|
||
//*********************************************
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: InitLanguage
|
||
* Creation date:
|
||
* Author: Xavier Billault
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vInitLanguage(void)
|
||
{
|
||
if (m_csCurrentLanguage.IsEmpty())
|
||
{
|
||
// user prefix
|
||
if (m_bUseUserPreferences)
|
||
{
|
||
char szLanguage[256];
|
||
|
||
CString csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
GetPrivateProfileString ("User", "User Language", "", szLanguage, 255, (char*)(LPCSTR)csFileName);
|
||
m_csCurrentLanguage = szLanguage;
|
||
}
|
||
|
||
// if no preference, use dialog
|
||
if (m_csCurrentLanguage.IsEmpty())
|
||
{
|
||
CStringList cslLangList;
|
||
|
||
CStdioFile cfFile;
|
||
CString csFile;
|
||
|
||
csFile=M_GetMainApp()->m_csEditorDataPath + "\\Language.txt";
|
||
|
||
if(cfFile.Open(csFile,CFile::modeRead))
|
||
{
|
||
CString csLanguage;
|
||
|
||
while(cfFile.ReadString(csLanguage))
|
||
cslLangList.AddTail(csLanguage);
|
||
|
||
cfFile.Close();
|
||
}
|
||
else
|
||
{
|
||
AfxMessageBox("Can't open "+csFile+"\nUse Default Language !!!");
|
||
|
||
cslLangList.AddTail("English");
|
||
cslLangList.AddTail("French");
|
||
}
|
||
|
||
CPA_DialogLanguage LangBox(this,&cslLangList);
|
||
if(LangBox.DoModal()==IDOK)
|
||
m_csCurrentLanguage=LangBox.m_csLanguage;
|
||
else
|
||
m_csCurrentLanguage="Fran<EFBFBD>ais";
|
||
}
|
||
}
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: SaveLanguage
|
||
* Creation date:
|
||
* Author: Xavier Billault
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSaveLanguage(CString csLanguage)
|
||
{
|
||
CString csFileName;
|
||
BOOL bRes;
|
||
|
||
// preference file
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
// try to write preference
|
||
bRes = WritePrivateProfileString ("User", "User Language", (char*)(LPCSTR) csLanguage, (char*)(LPCSTR)csFileName);
|
||
// warning if problem
|
||
if (!bRes)
|
||
M_GetMainWnd()->UpdateStatus("Hierarchy Editor cannot save your preferences. CPAPref.ini may have a ReadOnly status ?", C_STATUSPANE_INFOS, C_STATUS_WARNING);
|
||
else
|
||
M_GetMainWnd()->UpdateStatus("Preferences saved", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Before Editor
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vUpdateEditor (void)
|
||
{
|
||
// for objects renamed during loading
|
||
M_GetMainWnd()->UpdateStatus((char *) (LPCSTR) m_p_oEditor->GetLoadingMessage(), C_STATUSPANE_INFOS, m_p_oEditor->GetLoadingStatus());
|
||
// update frame
|
||
GetSpecificInterface()->fn_vSetFrameTitle();
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Update all dialogs
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vUpdateAll (tdeModeChange eMode)
|
||
{
|
||
if ((!GetMultiDevice())||(!GetCurrentWorld()))
|
||
return;
|
||
|
||
// update frame and dialogbar
|
||
switch (eMode)
|
||
{
|
||
case E_mc_JustDraw:
|
||
case E_mc_UpdateSelection:
|
||
case E_mc_UpdateDialog:
|
||
break;
|
||
|
||
case E_mc_UpdateAll:
|
||
// update selection
|
||
if (!fn_bIsSelectionValid())
|
||
fn_vCancelCurrentSelection(FALSE);
|
||
// update display mode
|
||
GetSpecificInterface()->fn_vInitCurrentSector();
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
// call editor update
|
||
m_p_oMainWorld->GetCurrentEditor()->fn_vUpdateEditor(eMode);
|
||
|
||
// redraw the world
|
||
fn_vUpdatePositions();
|
||
GetMultiDevice()->DrawEditorObject();
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: update global matrix
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vUpdatePositions (void)
|
||
{
|
||
HIE_fn_vInvalidateAllGlobalMatrices();
|
||
if (GetMultiDevice3D()->GetEngineWorld())
|
||
HIE_fn_vRefreshHierarchy(GetMultiDevice3D()->GetEngineWorld());
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Check if current selection match the Select Mode
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bIsSelectionValid (void)
|
||
{
|
||
// Mode "AllType" -> any selection is valid
|
||
if (m_csSelectMode == "All Types")
|
||
return TRUE;
|
||
|
||
// find the current select type
|
||
if (m_csSelectMode == GetTypeSelected())
|
||
return TRUE;
|
||
|
||
// selection is not valid
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Find the type of selected objects (multi-type -> 0)
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CString CPA_Interface::GetTypeSelected (void)
|
||
{
|
||
CPA_SuperObject *pElem;
|
||
POSITION pos;
|
||
CString csSelectType;
|
||
|
||
csSelectType = "All Types";
|
||
|
||
for (pElem = GetCurrentWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
||
pElem = GetCurrentWorld()->GetListSelected()->GetNextElement(pos))
|
||
{
|
||
// first time => init select type
|
||
if (csSelectType == "All Types")
|
||
csSelectType = pElem->GetRealTypeName();
|
||
// next times => compare type name
|
||
else if (csSelectType != pElem->GetRealTypeName())
|
||
return ("All Types");
|
||
}
|
||
|
||
return csSelectType;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Find the type of selected objects (multi-type -> 0)
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vCancelAllModes (void)
|
||
{
|
||
// reinit editor
|
||
m_p_oEditor->fn_vCancelAllModes();
|
||
// reinit dialogs
|
||
m_oDialogSelect.m_bDoDialog = FALSE;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: set all drawing flags to normal
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vCancelAllDrawingFlags (void)
|
||
{
|
||
SetDrawingFlags(GetCurrentWorld()->GetRoot(), E_df_Normal);
|
||
}
|
||
|
||
//#################################################################################
|
||
// SELECT MODE
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: Set the select mode and update drawing
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetSelectMode (CString csSelectMode)
|
||
{
|
||
m_csSelectMode = csSelectMode;
|
||
fn_vChangeSelectMode(csSelectMode);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: init combo for select mode
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vInitSelectMode (void)
|
||
{
|
||
EDT_ListByDLL *pListDLL;
|
||
EDT_ListByType *pListType;
|
||
POSITION pos, pos1;
|
||
int iInd;
|
||
|
||
// init the list
|
||
m_pComboSelectMode->ResetContent();
|
||
m_pComboSelectMode->AddString("All Types");
|
||
|
||
// check lists by type to find the available DLLs
|
||
for (pListDLL = GetCurrentWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListDLL;
|
||
pListDLL = GetCurrentWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
||
{
|
||
for (pListType = pListDLL->m_stListOfListByType.GetHeadElement(pos1); pListType;
|
||
pListType = pListDLL->m_stListOfListByType.GetNextElement(pos1))
|
||
m_pComboSelectMode->AddString(pListType->GetTypeName());
|
||
}
|
||
|
||
// set current selection
|
||
iInd = m_pComboSelectMode->FindStringExact(-1, m_csSelectMode);
|
||
m_pComboSelectMode->SetCurSel(iInd);
|
||
|
||
// if necessary, update link mode
|
||
if (m_bLinkMode)
|
||
fn_vUpdateLink(m_csSelectMode);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: update link mode
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vOnChangeLinkMode (void)
|
||
{
|
||
char szCurrentMode[30];
|
||
|
||
// if necessary, update drawing
|
||
if (m_bLinkMode)
|
||
{
|
||
m_pComboSelectMode->GetLBText(m_pComboSelectMode->GetCurSel(), szCurrentMode);
|
||
fn_vUpdateLink(szCurrentMode);
|
||
}
|
||
else
|
||
m_pComboSelectMode->EnableWindow(TRUE);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: update select mode when selection changes in combo
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vOnChangeSelectMode (void)
|
||
{
|
||
char szText[256];
|
||
|
||
// update select mode
|
||
m_pComboSelectMode->GetLBText(m_pComboSelectMode->GetCurSel(), szText);
|
||
SetSelectMode(szText);
|
||
// update drawing
|
||
fn_vUpdateAll(E_mc_UpdateAll);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: update combo when select mode changes
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vChangeSelectMode (CString csSelectMode)
|
||
{
|
||
EDT_ListByType *pListType;
|
||
CString csCurrentMode;
|
||
int iInd;
|
||
|
||
// get the new select mode
|
||
pListType = GetListWithTypeName(csSelectMode);
|
||
if (pListType)
|
||
csCurrentMode = csSelectMode;
|
||
else
|
||
csCurrentMode = "All Types";
|
||
// set combo selection
|
||
iInd = m_pComboSelectMode->FindStringExact(-1, csCurrentMode);
|
||
m_pComboSelectMode->SetCurSel(iInd);
|
||
// if necessary, update link
|
||
if (m_bLinkMode)
|
||
fn_vUpdateLink(csCurrentMode);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: init combo for select mode
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vUpdateLink (CString csCurrentMode)
|
||
{
|
||
CString csNewMode;
|
||
|
||
// only in link mode
|
||
if (!m_bLinkMode)
|
||
return;
|
||
|
||
// editor
|
||
m_p_oEditor->fn_vUpdateLink(csCurrentMode);
|
||
|
||
// if necessary, update selectmode
|
||
m_pComboSelectMode->GetLBText(m_pComboSelectMode->GetCurSel(), csNewMode);
|
||
if (csNewMode != csCurrentMode)
|
||
{
|
||
// update mode
|
||
SetSelectMode(csNewMode);
|
||
// update all
|
||
fn_vUpdateAll(E_mc_UpdateAll);
|
||
}
|
||
}
|
||
|
||
|
||
//#################################################################################
|
||
// SELECTION
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: Add a new object in the list of selection
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vAddSelectedObject (CPA_SuperObject *pNewObj, BOOL bUpdateDisplay)
|
||
{
|
||
CPA_List<CPA_SuperObject> stListRemoved;
|
||
CPA_SuperObject *pElem;
|
||
POSITION pos;
|
||
|
||
// if the selection is locked, cancel
|
||
if (GetLockSelection())
|
||
return;
|
||
|
||
// check if there is a world
|
||
if (!GetCurrentWorld() || !GetCurrentWorld()->GetRoot())
|
||
return;
|
||
|
||
if (!pNewObj)
|
||
return;
|
||
|
||
// check all the elements in the list
|
||
for (pElem = GetCurrentWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
||
pElem = GetCurrentWorld()->GetListSelected()->GetNextElement(pos))
|
||
{
|
||
// if this is a child of pNewObj, remove it from the list
|
||
if (pElem->fn_bIsUnderObject(pNewObj))
|
||
stListRemoved.AddTail(pElem);
|
||
}
|
||
// remove redondant elements
|
||
for (pElem = stListRemoved.GetHeadElement(pos); pElem;
|
||
pElem = stListRemoved.GetNextElement(pos))
|
||
{
|
||
// remove it from the selected objects
|
||
GetCurrentWorld()->fn_vUpdateSelectLists(pElem, E_lum_Delete, TRUE);
|
||
// update color and tell DLLs
|
||
fn_vSetLocalColor(pElem, E_lm_ShowNormal);
|
||
fn_vSendMessageSelect(pElem, C_EDTUndo);
|
||
}
|
||
// add the new object in the list
|
||
GetCurrentWorld()->fn_vUpdateSelectLists(pNewObj, E_lum_Insert, TRUE);
|
||
fn_vSetLocalColor(pNewObj, E_lm_ShowSelected);
|
||
|
||
// tell DLLs
|
||
fn_vSendMessageSelect(pNewObj, C_EDTDo);
|
||
|
||
// target & zoom
|
||
if (GetCurrentWorld()->GetCountSelected() == 1)
|
||
{
|
||
if ((m_bAutoTarget) || (m_bAutoZoom))
|
||
fn_vCenterOnObject(GetCurrentWorld()->GetSingleSelection(), m_bAutoZoom, m_bAutoTarget);
|
||
}
|
||
|
||
// update all
|
||
if (bUpdateDisplay)
|
||
fn_vUpdateAll(E_mc_UpdateSelection);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Remove an object from the list of selection
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vRemoveSelectedObject (CPA_SuperObject *pEdObj, BOOL bUpdateDisplay)
|
||
{
|
||
POSITION pos;
|
||
|
||
// if the selection is locked, cancel
|
||
if (GetLockSelection())
|
||
return;
|
||
|
||
// check if there is a world
|
||
if (!GetCurrentWorld() || !GetCurrentWorld()->GetRoot())
|
||
return;
|
||
|
||
// remove selected object from the list
|
||
pos = GetCurrentWorld()->GetListSelected()->Find(pEdObj);
|
||
if (pos)
|
||
{
|
||
GetCurrentWorld()->fn_vUpdateSelectLists(pEdObj, E_lum_Delete, TRUE);
|
||
// update selection
|
||
fn_vSetLocalColor(pEdObj, E_lm_ShowNormal);
|
||
// tell DLLs
|
||
fn_vSendMessageSelect(pEdObj, C_EDTUndo);
|
||
}
|
||
// update all
|
||
if (bUpdateDisplay)
|
||
fn_vUpdateAll(E_mc_UpdateSelection);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Cancel current selection
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vCancelCurrentSelection (BOOL bUpdateDisplay)
|
||
{
|
||
EDT_ListByDLL *pListSelect;
|
||
CPA_SuperObject *pElem;
|
||
POSITION pos;
|
||
|
||
// if the selection is locked, cancel
|
||
if (GetLockSelection())
|
||
return;
|
||
|
||
// check if there is a world
|
||
if (!GetCurrentWorld() || !GetCurrentWorld()->GetRoot())
|
||
return;
|
||
|
||
// cancel engine selection
|
||
fn_vSetLocalColor(GetCurrentWorld()->GetRoot(), E_lm_ShowNormal);
|
||
// check all the elements in the list
|
||
while (GetCurrentWorld()->GetListSelected()->GetCount() > 0)
|
||
{
|
||
pElem = GetCurrentWorld()->GetListSelected()->RemoveTail();
|
||
// tell DLLs
|
||
fn_vSendMessageSelect(pElem, C_EDTUndo);
|
||
}
|
||
// cancel Editor selection
|
||
GetCurrentWorld()->GetListSelected()->RemoveAll();
|
||
GetCurrentWorld()->GetListAllDLLs()->m_stListConcerned.RemoveAll();
|
||
// cancel SelectByType
|
||
for (pListSelect = GetCurrentWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
||
pListSelect = GetCurrentWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
||
{
|
||
pListSelect->m_stListConcerned.RemoveAll();
|
||
pListSelect->m_stListSelected.RemoveAll();
|
||
pListSelect->m_stListProtectSelected.RemoveAll();
|
||
pListSelect->m_stListProtectConcerned.RemoveAll();
|
||
}
|
||
// disable edit dialog
|
||
if (bUpdateDisplay)
|
||
fn_vUpdateAll(E_mc_UpdateSelection);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Select object corresponding to the choice in the list
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bSelectObject (CPA_SuperObject *pSelectedObject, BOOL bCenter, BOOL bCheck)
|
||
{
|
||
int iInd = 0;
|
||
|
||
// if the selection is locked, cancel
|
||
if (GetLockSelection())
|
||
return FALSE;
|
||
|
||
// check if there is a world
|
||
if (!GetCurrentWorld() || !GetCurrentWorld()->GetRoot())
|
||
return FALSE;
|
||
|
||
// cancel the current selection
|
||
fn_vCancelCurrentSelection(FALSE);
|
||
|
||
// find the object corresponding to the choice in the listbox
|
||
if (!pSelectedObject)
|
||
return FALSE;
|
||
|
||
// ask for permission and select object
|
||
if ((!bCheck)||(fn_bCanSelect(pSelectedObject) == C_Accept))
|
||
fn_vAddSelectedObject(pSelectedObject, FALSE);
|
||
else
|
||
return FALSE;
|
||
|
||
// if necessary, center and zoom object on the screen
|
||
if (bCenter)
|
||
{
|
||
if (m_bAutoTarget)
|
||
fn_vZoomOnObject(pSelectedObject);
|
||
else
|
||
fn_vCenterOnObject(pSelectedObject, TRUE, FALSE);
|
||
}
|
||
|
||
// redraw the world
|
||
fn_vUpdateAll(E_mc_UpdateSelection);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Check if chosen object can be selected in 3D view
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
tdeTypeAnswer CPA_Interface::fn_bCanSelect (CPA_SuperObject *pEdObj, ACP_tdxIndex xIndex, HIE_tdstPickInfo *pPicking)
|
||
{
|
||
CPA_ObjectDLLBase *p_oDLL, *p_oOwnerDLL;
|
||
tdeTypeAnswer eAnswer = C_Accept;
|
||
tdeTypeAnswer eOwnerAnswer = C_Accept;
|
||
tdeTypeAnswer eEditorAnswer = C_Accept;
|
||
CPA_DLLBase *pCurrentEditor;
|
||
|
||
// No object => no selection
|
||
if (!pEdObj)
|
||
return C_Refuse;
|
||
|
||
// selection must be valid
|
||
if ((m_csSelectMode != "All Types")&&(pEdObj->GetRealTypeName() != m_csSelectMode))
|
||
return C_Refuse;
|
||
|
||
// non editable childs can't be selected
|
||
if (pEdObj->fn_bIsEditProtected())
|
||
return C_Refuse;
|
||
|
||
// drawing flag
|
||
if ((!fn_bIgnoreFlags())&&(pEdObj->GetDrawingFlag() != E_df_Normal)&&(pEdObj->GetDrawingFlag() != E_df_BoundingV))
|
||
return C_Refuse;
|
||
|
||
p_oDLL = pEdObj->GetObjectDLL();
|
||
|
||
// ask current editor permission
|
||
if (!m_p_oEditor->fn_bIsCurrentEditor())
|
||
{
|
||
pCurrentEditor = (CPA_DLLBase *)m_p_oMainWorld->GetCurrentEditor();
|
||
eEditorAnswer = pCurrentEditor->fn_bAcceptSelect(pEdObj, xIndex, pPicking, C_AsCurrentEditor);
|
||
if (eEditorAnswer == C_Refuse)
|
||
return C_Refuse;
|
||
}
|
||
// ask world permission
|
||
if (!GetCurrentWorld()->fn_bAcceptSelect(p_oDLL))
|
||
return C_Refuse;
|
||
// ask DLL permission
|
||
if (p_oDLL)
|
||
{
|
||
eAnswer = p_oDLL->fn_bAcceptSelect(pEdObj, xIndex, pPicking, C_AsConcernedDLL);
|
||
if (eAnswer == C_Refuse)
|
||
return C_Refuse;
|
||
}
|
||
// if necessary, ask owner permission
|
||
if (pEdObj->GetSuperObjectOwner())
|
||
{
|
||
p_oOwnerDLL = pEdObj->GetSuperObjectOwner()->GetObjectDLL();
|
||
if (p_oOwnerDLL)
|
||
{
|
||
eOwnerAnswer = p_oOwnerDLL->fn_bAcceptSelect(pEdObj, xIndex, pPicking, C_AsChildOwner);
|
||
if (eOwnerAnswer == C_Refuse)
|
||
return C_Refuse;
|
||
}
|
||
}
|
||
|
||
// accept or next ?
|
||
if ((eAnswer == C_Accept)&&(eOwnerAnswer == C_Accept)&&(eEditorAnswer == C_Accept))
|
||
return C_Accept;
|
||
else
|
||
return C_WantNext;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: update colors for dialog selection
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vUpdateSelection (CPA_SuperObject *pSelectedObject, tdeSelectMode eMode)
|
||
{
|
||
CPA_SuperObject *pElem;
|
||
POSITION pos;
|
||
|
||
// there must be a valid world
|
||
if ((!GetMultiDevice())||(!GetCurrentWorld()))
|
||
return;
|
||
|
||
// cancel current drawing
|
||
fn_vSetLocalColor(GetCurrentWorld()->GetRoot(), E_lm_ShowNormal);
|
||
// parent mode => draw dialog selection
|
||
if (((eMode == E_sm_SelectParent)||(eMode == E_sm_SelectPFather))&&(pSelectedObject))
|
||
fn_vSetLocalColor(pSelectedObject, E_lm_ShowParent);
|
||
// draw current selection
|
||
for (pElem = GetCurrentWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
||
pElem = GetCurrentWorld()->GetListSelected()->GetNextElement(pos))
|
||
fn_vSetLocalColor(pElem, E_lm_ShowSelected);
|
||
// select mode => draw new selection
|
||
if ((eMode != E_sm_SelectParent)&&(eMode != E_sm_SelectPFather)&&(pSelectedObject))
|
||
fn_vSetLocalColor(pSelectedObject, E_lm_ShowOnly);
|
||
// update drawing
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: set colors for selection
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSetLocalColor (CPA_SuperObject *pEdObj, tdeLightMode eMode)
|
||
{
|
||
CPA_SuperObject *pChild;
|
||
tdeLocalColor eCurrent;
|
||
tdeLightMode eChild;
|
||
|
||
// find color and childs mode corresponding to current mode
|
||
switch (eMode)
|
||
{
|
||
case E_lm_ShowSelected:
|
||
eCurrent = C_lc_SelectColor;
|
||
eChild = E_lm_ShowChild;
|
||
break;
|
||
case E_lm_ShowChild:
|
||
eCurrent = C_lc_ChildColor;
|
||
eChild = eMode;
|
||
break;
|
||
case E_lm_ShowParent:
|
||
eCurrent = C_lc_ParentColor;
|
||
eChild = E_lm_ShowBrother;
|
||
break;
|
||
case E_lm_ShowBrother:
|
||
eCurrent = C_lc_BrotherColor;
|
||
eChild = E_lm_ShowNormal;
|
||
break;
|
||
case E_lm_ShowOnly:
|
||
eCurrent = C_lc_ShowColor;
|
||
eChild = eMode;
|
||
break;
|
||
default:
|
||
eCurrent = C_lc_NoColor;
|
||
eChild = E_lm_ShowNormal;
|
||
break;
|
||
}
|
||
|
||
// set current super-object color
|
||
pEdObj->SetLocalColor(eCurrent);
|
||
// set all childs colors
|
||
for (pChild = pEdObj->GetSuperObjectFirstChild(); pChild;
|
||
pChild = pEdObj->GetSuperObjectNextChild(pChild))
|
||
{
|
||
// selected childs of parent have selection color
|
||
if ((eMode == E_lm_ShowParent)&&(GetCurrentWorld()->GetListSelected()->Find(pChild)))
|
||
fn_vSetLocalColor(pChild, E_lm_ShowSelected);
|
||
// protected childs of super-object have the same color
|
||
else if (pChild->GetSuperObjectOwner())
|
||
fn_vSetLocalColor(pChild, eMode);
|
||
// non protected childs have child color
|
||
else
|
||
fn_vSetLocalColor(pChild, eChild);
|
||
}
|
||
}
|
||
|
||
|
||
//#################################################################################
|
||
// SELECTION (GET FUNCTIONS)
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: Find the selected objects corresponding to the current DLL
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_List<CPA_SuperObject> * CPA_Interface::GetSelectedObjects (CPA_ObjectDLLBase *p_oDLL)
|
||
{
|
||
EDT_ListByDLL *pListSelect;
|
||
POSITION pos;
|
||
|
||
if ((!p_oDLL)||(!GetMultiDevice())||(!GetCurrentWorld()))
|
||
return NULL;
|
||
|
||
// search the lists to find the type
|
||
for (pListSelect = GetCurrentWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
||
pListSelect = GetCurrentWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
||
{
|
||
if (pListSelect->GetDLL() == p_oDLL)
|
||
return (&pListSelect->m_stListSelected);
|
||
}
|
||
|
||
// SelectList was not found
|
||
return NULL;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Get objects of the good type in mouse selection
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_List<CPA_SuperObject> * CPA_Interface::GetMouseSelection (ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject, CString csTypeName)
|
||
{
|
||
HIE_tdstPickInfo *pPicking;
|
||
CPA_SuperObject *pFirstSelect;
|
||
ACP_tdxIndex xInd;
|
||
|
||
// init list
|
||
m_oDialogSelect.fn_vInitDialog();
|
||
// find the selected objects corresponding to this mode
|
||
for (xInd = xIndex, pPicking = p_stObject; xInd > 0; xInd--, pPicking++)
|
||
{
|
||
pFirstSelect = GetFirstSelection(E_sm_SelectByType, xInd, pPicking, csTypeName);
|
||
if (pFirstSelect)
|
||
fn_lFindSelectionInHierarchy(E_sm_SelectByType, pFirstSelect, csTypeName);
|
||
}
|
||
|
||
return &m_oDialogSelect.m_stHierarchy;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Get objects of the good type in mouse selection
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_List<CPA_SuperObject> * CPA_Interface::GetMouseSelection (ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject, CString a_csValidTypes[], long lNbTypes)
|
||
{
|
||
HIE_tdstPickInfo *pPicking;
|
||
CPA_SuperObject *pFirstSelect;
|
||
ACP_tdxIndex xInd;
|
||
long lIndex;
|
||
|
||
// init list
|
||
m_oDialogSelect.fn_vInitDialog();
|
||
// find the selected objects corresponding to this mode
|
||
for (xInd = xIndex, pPicking = p_stObject; xInd > 0; xInd--, pPicking++)
|
||
{
|
||
pFirstSelect = GetFirstSelection(E_sm_SelectByType, xInd, pPicking, "All Types");
|
||
// find selection for each type
|
||
for (lIndex = 0; lIndex <lNbTypes; lIndex++)
|
||
fn_lFindSelectionInHierarchy(E_sm_SelectByType, pFirstSelect, a_csValidTypes[lIndex]);
|
||
}
|
||
|
||
return &m_oDialogSelect.m_stHierarchy;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Get objects of the good type in mouse selection
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetUserMouseSelection (ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject, CString csTypeName)
|
||
{
|
||
CPA_SuperObject *pSelect;
|
||
long lNbSelect;
|
||
|
||
// init dialog
|
||
m_oDialogSelect.fn_vInitDialog();
|
||
lNbSelect = 0;
|
||
// find the selected objects corresponding to this mode
|
||
if (xIndex)
|
||
{
|
||
lNbSelect = fn_lFindSelectionInDepth(E_sm_SelectByType, xIndex, p_stObject, csTypeName);
|
||
if (lNbSelect == 1)
|
||
{
|
||
pSelect = m_oDialogSelect.m_stListSelect.FindElementFromIndex(0);
|
||
lNbSelect = fn_lFindSelectionInHierarchy(E_sm_SelectByType, pSelect, csTypeName);
|
||
}
|
||
}
|
||
|
||
// if there are several possibilities, do dialog
|
||
if (lNbSelect > 1)
|
||
{
|
||
m_oDialogSelect.fn_vDoDialog(this, E_sm_SelectByType, csTypeName);
|
||
return (m_oDialogSelect.m_pObjectToSelect);
|
||
}
|
||
// if there is only one choice, give it
|
||
else if (lNbSelect == 1)
|
||
return (m_oDialogSelect.m_stListSelect.FindElementFromIndex(0));
|
||
// if there is no selection
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Get objects of the good type in mouse selection
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetUserMouseSelection (ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject, CString a_csValidTypes[], long lNbTypes)
|
||
{
|
||
CPA_SuperObject *pSelect;
|
||
long lNbSelect;
|
||
long lIndex;
|
||
|
||
// init dialog
|
||
m_oDialogSelect.fn_vInitDialog();
|
||
lNbSelect =0;
|
||
// find the selected objects corresponding to this mode
|
||
if (xIndex)
|
||
{
|
||
for (lIndex = 0; lIndex <lNbTypes; lIndex++)
|
||
lNbSelect += fn_lFindSelectionInDepth(E_sm_SelectByType, xIndex, p_stObject, a_csValidTypes[lIndex]);
|
||
if (lNbSelect == 1)
|
||
{
|
||
pSelect = m_oDialogSelect.m_stListSelect.FindElementFromIndex(0);
|
||
lNbSelect = 0;
|
||
for (lIndex = 0; lIndex <lNbTypes; lIndex++)
|
||
lNbSelect += fn_lFindSelectionInHierarchy(E_sm_SelectByType, pSelect, a_csValidTypes[lIndex]);
|
||
}
|
||
}
|
||
|
||
// if there are several possibilities, do dialog
|
||
if (lNbSelect > 1)
|
||
{
|
||
m_oDialogSelect.fn_vDoDialog(this, E_sm_SelectByType, "", a_csValidTypes, lNbTypes);
|
||
return (m_oDialogSelect.m_pObjectToSelect);
|
||
}
|
||
// if there is only one choice, give it
|
||
else if (lNbSelect == 1)
|
||
return (m_oDialogSelect.m_stListSelect.FindElementFromIndex(0));
|
||
// if there is no selection
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Get selection from picking (depending on mode)
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetPickingSelection (tdeSelectMode eModeSelect, ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject, tdstMousePos *p_stPos, BOOL *bWillDoDialog, CPA_SuperObject *pPreviousSelection)
|
||
{
|
||
HIE_tdstPickInfo *pPicking;
|
||
CPA_SuperObject *pSelectedObject;
|
||
DEV_ViewPort3D *pViewPort;
|
||
tdeTypeAnswer eAnswer;
|
||
ACP_tdxIndex xRealInd;
|
||
long lNbSelect;
|
||
int iRange, iDelta, iPixel;
|
||
int iMaxRange, iMaxDelta, iMaxPixel;
|
||
int arDelta[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
|
||
|
||
// reinit dialog select & drawing
|
||
m_oDialogSelect.fn_vInitDialog();
|
||
*bWillDoDialog = FALSE;
|
||
|
||
pViewPort = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
iMaxRange = (m_bDeltaSelect) ? 5 : 1;
|
||
iMaxDelta = (m_bDeltaSelect) ? 4 : 1;
|
||
|
||
for (iRange = 1; iRange <= iMaxRange; iRange++)
|
||
{
|
||
p_stPos->stPos2D.xX -= 1;
|
||
p_stPos->stPos2D.xY -= 1;
|
||
|
||
for (iDelta = 0; iDelta < iMaxDelta; iDelta++)
|
||
{
|
||
iMaxPixel = (m_bDeltaSelect) ? 2 * iRange : 1;
|
||
for (iPixel = 0; iPixel < iMaxPixel; iPixel++)
|
||
{
|
||
switch (eModeSelect)
|
||
{
|
||
case E_sm_SelectParent:
|
||
case E_sm_SelectPFather:
|
||
// find selected objects
|
||
lNbSelect = fn_lFindSelectionInDepth(eModeSelect, xIndex, p_stObject);
|
||
// select the object corresponding to the current mode
|
||
if (lNbSelect == 1)
|
||
{
|
||
pSelectedObject = m_oDialogSelect.m_stListSelect.FindElementFromIndex(0);
|
||
lNbSelect = fn_lFindSelectionInHierarchy(eModeSelect, pSelectedObject);
|
||
}
|
||
if (lNbSelect == 1)
|
||
return pSelectedObject;
|
||
else if (lNbSelect > 1)
|
||
{
|
||
m_oDialogSelect.m_bDoDialog = TRUE;
|
||
*bWillDoDialog = TRUE;
|
||
}
|
||
break;
|
||
|
||
case E_sm_SelectChoice:
|
||
// find selected objects
|
||
lNbSelect = fn_lFindSelectionInDepth(E_sm_SelectNormal, xIndex, p_stObject);
|
||
if (lNbSelect)
|
||
{
|
||
*bWillDoDialog = TRUE;
|
||
m_oDialogSelect.m_bDoDialog = TRUE;
|
||
}
|
||
break;
|
||
|
||
case E_sm_SelectNormal:
|
||
// init search
|
||
eAnswer = C_WantNext;
|
||
pPicking = p_stObject;
|
||
xRealInd = 0;
|
||
while ((eAnswer == C_WantNext)&&(xIndex>0))
|
||
{
|
||
// reinit dialog
|
||
m_oDialogSelect.m_stListSelect.RemoveAll();
|
||
m_oDialogSelect.m_pObjectToSelect = NULL;
|
||
// find the new selection
|
||
pSelectedObject = GetFirstSelection(E_sm_SelectNormal, xIndex, pPicking);
|
||
if (pSelectedObject)
|
||
{
|
||
if ((pPreviousSelection)&&(pSelectedObject == pPreviousSelection))
|
||
eAnswer = C_Accept;
|
||
else
|
||
eAnswer = fn_bCanSelect(pSelectedObject, xIndex, pPicking);
|
||
}
|
||
else
|
||
eAnswer = C_WantNext;
|
||
// next choice
|
||
xIndex--;
|
||
pPicking++;
|
||
xRealInd++;
|
||
}
|
||
if (eAnswer == C_Accept)
|
||
{
|
||
// reinit mouse move (selected object is not always the first one)
|
||
pViewPort->InitMouseMove (&p_stObject[xRealInd-1].stPickedObject.aDEF_stDataOfElement[0].stHit, &p_stPos->stPos2D);
|
||
return pSelectedObject;
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (m_bDeltaSelect && p_stObject)
|
||
{
|
||
p_stPos->stPos2D.xX += arDelta[iDelta][0];
|
||
p_stPos->stPos2D.xY += arDelta[iDelta][1];
|
||
xIndex = HIE_xIsSuperObjectPick(GLI_C_ModePickingFace, pViewPort->m_hDisplayDevice,
|
||
pViewPort->m_hDisplayViewport, &p_stPos->stPos2D, GetMultiDevice3D()->GetEngineWorld(), p_stObject);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Getselection from dialog (depending on mode)
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetDialogSelection (tdeSelectMode eModeSelect)
|
||
{
|
||
CPA_SuperObject *pSelected = NULL;
|
||
CPA_SuperObject *pElem;
|
||
tdeLightMode eMode;
|
||
POSITION pos;
|
||
|
||
// if necessary, display the Selection Dialog
|
||
if (m_oDialogSelect.m_bDoDialog)
|
||
{
|
||
// cancel show mode
|
||
fn_vSetLocalColor(GetCurrentWorld()->GetRoot(), E_lm_ShowNormal);
|
||
// do modal dialog
|
||
m_oDialogSelect.fn_vDoDialog(this, eModeSelect);
|
||
// get parent
|
||
pSelected = m_oDialogSelect.m_pObjectToSelect;
|
||
// init redraw mode
|
||
eMode = (eModeSelect == E_sm_SelectNormal) ? E_lm_ShowSelected : E_lm_ShowParent;
|
||
// redraw selection
|
||
fn_vSetLocalColor(GetCurrentWorld()->GetRoot(), E_lm_ShowNormal);
|
||
for (pElem = GetCurrentWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
||
pElem = GetCurrentWorld()->GetListSelected()->GetNextElement(pos))
|
||
fn_vSetLocalColor(pElem->GetSuperObjectFather(), eMode);
|
||
// init return value
|
||
if (eModeSelect == E_sm_SelectNormal)
|
||
pSelected = (fn_bCanSelect(pSelected) == C_Accept) ? pSelected : NULL;
|
||
// reinit dialog
|
||
m_oDialogSelect.fn_vInitDialog();
|
||
}
|
||
return pSelected;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: find the first object corresponding to the picking
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetFirstSelection (tdeSelectMode eSelect, ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stPickInfo, CString csTypeName)
|
||
{
|
||
CPA_SuperObject *pCurChild = NULL;
|
||
|
||
// there must be a world
|
||
if ((!GetMultiDevice())||(!GetCurrentWorld()))
|
||
return NULL;
|
||
|
||
if (xIndex)
|
||
{
|
||
// find the child corresponding to p_tIndex
|
||
pCurChild = GetEditorObject(p_stPickInfo[0].hSprObject);
|
||
|
||
// no more selection
|
||
while (pCurChild)
|
||
{
|
||
// For DLLs
|
||
if ((eSelect == E_sm_SelectByType)&&(!csTypeName.IsEmpty()))
|
||
{
|
||
if (fn_bCanBeSelected(pCurChild, csTypeName, FALSE))
|
||
return pCurChild;
|
||
}
|
||
// only non EditProtected child can be selected
|
||
else if (!pCurChild->fn_bIsEditProtected())
|
||
{
|
||
if (!fn_bIgnoreFlags() &&
|
||
(pCurChild->GetDrawingFlag() != E_df_BoundingV) &&
|
||
(pCurChild->GetDrawingFlag() != E_df_Normal))
|
||
return NULL;
|
||
|
||
// Parent Mode
|
||
if (eSelect == E_sm_SelectParent)
|
||
{
|
||
if (m_p_oEditor->fn_bCanBeParentForAll(pCurChild))
|
||
return pCurChild;
|
||
}
|
||
// Paste Mode
|
||
if (eSelect == E_sm_SelectPFather)
|
||
{
|
||
if (m_p_oEditor->fn_bCanPasteAllObjects(E_pm_PasteChoice, pCurChild))
|
||
return pCurChild;
|
||
}
|
||
// Select Mode
|
||
else if (eSelect == E_sm_SelectNormal)
|
||
{
|
||
// Type of the object must be valid
|
||
if (fn_bCanSelect(pCurChild) == C_Accept)
|
||
return pCurChild;
|
||
}
|
||
}
|
||
// previous level of hierarchy
|
||
pCurChild = pCurChild->GetSuperObjectFather();
|
||
}
|
||
}
|
||
// selection
|
||
return NULL;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: find all objects in depth corresponding to the picking
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
long CPA_Interface::fn_lFindSelectionInDepth (tdeSelectMode eSelect, ACP_tdxIndex xNbPicked, HIE_tdstPickInfo *p_stPickInfo, CString csTypeName)
|
||
{
|
||
ACP_tdxIndex xIndex;
|
||
HIE_tdstPickInfo *pPicking;
|
||
CPA_SuperObject *pCurSel;
|
||
long lNbPicked;
|
||
|
||
// init parameters
|
||
lNbPicked = 0;
|
||
pPicking = p_stPickInfo;
|
||
xIndex = xNbPicked;
|
||
|
||
while (xIndex)
|
||
{
|
||
// get selected object
|
||
pCurSel = GetFirstSelection(eSelect, xIndex, pPicking, csTypeName);
|
||
// update dialog
|
||
if ((pCurSel)&&(!m_oDialogSelect.m_stListSelect.Find(pCurSel)))
|
||
{
|
||
m_oDialogSelect.m_stListSelect.AddTail(pCurSel);
|
||
lNbPicked++;
|
||
}
|
||
// next level of picking
|
||
xIndex--;
|
||
pPicking++;
|
||
}
|
||
return lNbPicked;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: find all objects in depth corresponding to the picking
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
long CPA_Interface::fn_lFindSelectionInHierarchy (tdeSelectMode eSelect, CPA_SuperObject *pFirstSelect, CString csTypeName)
|
||
{
|
||
CPA_SuperObject *pCurChild;
|
||
long lNbPicked;
|
||
|
||
// init parameters
|
||
pCurChild = pFirstSelect;
|
||
lNbPicked = 0;
|
||
|
||
// no more selection
|
||
while (pCurChild)
|
||
{
|
||
// For DLLs
|
||
if ((eSelect == E_sm_SelectByType)&&(!csTypeName.IsEmpty()))
|
||
{
|
||
if (fn_bCanBeSelected(pCurChild, csTypeName, FALSE))
|
||
{
|
||
m_oDialogSelect.m_stHierarchy.AddTail(pCurChild);
|
||
lNbPicked++;
|
||
}
|
||
}
|
||
// only non EditProtected child can be selected
|
||
else if ( (!pCurChild->fn_bIsEditProtected())
|
||
&&( fn_bIgnoreFlags()
|
||
||(pCurChild->GetDrawingFlag() == E_df_BoundingV)
|
||
||(pCurChild->GetDrawingFlag() == E_df_Normal)))
|
||
{
|
||
// Parent Mode
|
||
if (eSelect == E_sm_SelectParent)
|
||
{
|
||
if (m_p_oEditor->fn_bCanBeParentForAll(pCurChild))
|
||
{
|
||
m_oDialogSelect.m_stHierarchy.AddTail(pCurChild);
|
||
lNbPicked++;
|
||
}
|
||
}
|
||
// Paste Mode
|
||
if (eSelect == E_sm_SelectPFather)
|
||
{
|
||
if (m_p_oEditor->fn_bCanPasteAllObjects(E_pm_PasteChoice, pCurChild))
|
||
{
|
||
m_oDialogSelect.m_stHierarchy.AddTail(pCurChild);
|
||
lNbPicked++;
|
||
}
|
||
}
|
||
// Select Mode
|
||
else if (eSelect == E_sm_SelectNormal)
|
||
{
|
||
// Type of the object must be valid
|
||
if (fn_bCanSelect(pCurChild) == C_Accept)
|
||
{
|
||
m_oDialogSelect.m_stHierarchy.AddTail(pCurChild);
|
||
lNbPicked++;
|
||
}
|
||
}
|
||
}
|
||
// previous level of hierarchy
|
||
pCurChild = pCurChild->GetSuperObjectFather();
|
||
}
|
||
return lNbPicked;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: check if the new selected object has parents in
|
||
* the list of selected objects
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetPreviousSelection (CPA_SuperObject *pEdObj)
|
||
{
|
||
CPA_SuperObject *pElem;
|
||
POSITION pos;
|
||
|
||
// check all the elements in the list
|
||
for (pElem = GetCurrentWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
||
pElem = GetCurrentWorld()->GetListSelected()->GetNextElement(pos))
|
||
{
|
||
if (pEdObj->fn_bIsUnderObject(pElem))
|
||
return pElem;
|
||
}
|
||
// object has no parent in the list
|
||
return NULL;
|
||
}
|
||
|
||
//CPA2 Corneliu Babiuc (multiple registration) 02-07-98
|
||
//#################################################################################
|
||
// REGISTRATION FUNCTIONS
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: check if the new registration object has parents in
|
||
* the list of registered objects
|
||
* Creation date:
|
||
* Author: Corneliu Babiuc
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetPreviousRegistration (CPA_SuperObject *pEdObj)
|
||
{
|
||
CPA_SuperObject *pElem;
|
||
POSITION pos;
|
||
|
||
// check all the elements in the list
|
||
for (pElem = GetCurrentWorld()->GetListRegistered()->GetHeadElement(pos); pElem;
|
||
pElem = GetCurrentWorld()->GetListRegistered()->GetNextElement(pos))
|
||
{
|
||
if (pEdObj->fn_bIsUnderObject(pElem))
|
||
return pElem;
|
||
}
|
||
// object has no parent in the list
|
||
return NULL;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Add an object in the list of registration
|
||
* Creation date:
|
||
* Author: Corneliu Babiuc
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vAddRegisteredObject (CPA_SuperObject *pNewObj)
|
||
{
|
||
CPA_List<CPA_SuperObject> stListRemoved;
|
||
CPA_SuperObject *pElem;
|
||
POSITION pos;
|
||
|
||
if (!pNewObj)
|
||
return;
|
||
|
||
// check all the elements in the list
|
||
for (pElem = GetCurrentWorld()->GetListRegistered()->GetHeadElement(pos); pElem;
|
||
pElem = GetCurrentWorld()->GetListRegistered()->GetNextElement(pos))
|
||
{
|
||
// if this is a child of pNewObj, remove it from the list
|
||
if (pElem->fn_bIsUnderObject(pNewObj))
|
||
stListRemoved.AddTail(pElem);
|
||
}
|
||
// remove redondant elements
|
||
for (pElem = stListRemoved.GetHeadElement(pos); pElem;
|
||
pElem = stListRemoved.GetNextElement(pos))
|
||
{
|
||
// remove it from the selected objects
|
||
GetCurrentWorld()->fn_vUpdateRegisterLists(pElem, E_lum_Delete, TRUE);
|
||
}
|
||
// add the new object in the list
|
||
GetCurrentWorld()->fn_vUpdateRegisterLists(pNewObj, E_lum_Insert, TRUE);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Remove an object from the list of registration
|
||
* Creation date:
|
||
* Author: Corneliu Babiuc
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vRemoveRegisteredObject (CPA_SuperObject *pEdObj)
|
||
{
|
||
POSITION pos;
|
||
|
||
// check if there is a world
|
||
if (!GetCurrentWorld() || !GetCurrentWorld()->GetRoot())
|
||
return;
|
||
|
||
// remove object from the list
|
||
pos = GetCurrentWorld()->GetListRegistered()->Find(pEdObj);
|
||
if (pos)
|
||
{
|
||
GetCurrentWorld()->fn_vUpdateRegisterLists(pEdObj, E_lum_Delete, TRUE);
|
||
}
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Add a list of objects in the list of registration:
|
||
* if all objects are already registered, then they'll be
|
||
* removed from the list, else unregistered objects are added
|
||
* Creation date:
|
||
* Author: Corneliu Babiuc
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vUpdateRegistrationFromSelection (CPA_List<CPA_SuperObject> * p_lstSelection)
|
||
{
|
||
CPA_SuperObject *pElem;
|
||
POSITION pos;
|
||
BOOL bRemove = TRUE;
|
||
|
||
for (pElem = p_lstSelection->GetHeadElement(pos);pElem;
|
||
pElem = p_lstSelection->GetNextElement(pos) )
|
||
{
|
||
//check if the object is allready registered
|
||
if (!GetPreviousRegistration(pElem))
|
||
{
|
||
fn_vAddRegisteredObject(pElem);
|
||
bRemove = FALSE;
|
||
}
|
||
}
|
||
//if all objects are already registered then remove them from registration list
|
||
if (bRemove)
|
||
for (pElem = p_lstSelection->GetHeadElement(pos);pElem;
|
||
pElem = p_lstSelection->GetNextElement(pos) )
|
||
{
|
||
fn_vRemoveRegisteredObject(pElem);
|
||
}
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Cancel current selection (clear the lists)
|
||
* Creation date:
|
||
* Author: Corneliu Babiuc
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vCancelCurrentRegistration()
|
||
{
|
||
EDT_ListByDLL *pListSelect;
|
||
CPA_SuperObject *pElem;
|
||
POSITION pos;
|
||
|
||
// check if there is a world
|
||
if (!GetCurrentWorld() || !GetCurrentWorld()->GetRoot())
|
||
return;
|
||
|
||
while (GetCurrentWorld()->GetListRegistered()->GetCount() > 0)
|
||
{
|
||
pElem = GetCurrentWorld()->GetListRegistered()->RemoveTail();
|
||
}
|
||
// cancel Editor selection
|
||
GetCurrentWorld()->GetListRegistered()->RemoveAll();
|
||
GetCurrentWorld()->GetRegisterListAllDLLs()->m_stListConcerned.RemoveAll();
|
||
// cancel SelectByType
|
||
for (pListSelect = GetCurrentWorld()->GetListOfRegisteredListByDLL()->GetHeadElement(pos); pListSelect;
|
||
pListSelect = GetCurrentWorld()->GetListOfRegisteredListByDLL()->GetNextElement(pos))
|
||
{
|
||
pListSelect->m_stListConcerned.RemoveAll();
|
||
pListSelect->m_stListSelected.RemoveAll();
|
||
pListSelect->m_stListProtectSelected.RemoveAll();
|
||
pListSelect->m_stListProtectConcerned.RemoveAll();
|
||
}
|
||
}
|
||
//END CPA2 Corneliu Babiuc (multiple registration) 02-07-98
|
||
|
||
|
||
//#################################################################################
|
||
// LISTS (GET FUNCTIONS)
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: Return the list of all objects of the specified type
|
||
* in the hierarchy
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author: Shaitan
|
||
*=========================================================================*/
|
||
CPA_List<CPA_SuperObject> * CPA_Interface::GetObjectListByType (CString csTypeName, CPA_ObjectDLLBase *p_oDLL)
|
||
{
|
||
EDT_ListByType *pListType;
|
||
EDT_ListByDLL *pListDLL;
|
||
POSITION pos;
|
||
|
||
// there must be a world
|
||
if ((!GetMultiDevice())||(!GetCurrentWorld()))
|
||
return NULL;
|
||
|
||
// look for the list only for the corresponding DLL
|
||
if (p_oDLL)
|
||
{
|
||
pListDLL = GetCurrentWorld()->GetListFromObjectDLL(p_oDLL);
|
||
if (!pListDLL)
|
||
return NULL;
|
||
pListType = pListDLL->GetListByType(csTypeName);
|
||
if (pListType)
|
||
return &pListType->m_stListObjects;
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
// all types
|
||
if (csTypeName == "All Types")
|
||
return &GetCurrentWorld()->GetListAllDLLs()->m_stListAllTypes.m_stListObjects;
|
||
|
||
// find the corresponding list by type
|
||
for (pListDLL = GetCurrentWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListDLL;
|
||
pListDLL = GetCurrentWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
||
{
|
||
// try to find the correspponding list by type
|
||
pListType = pListDLL->GetListByType(csTypeName);
|
||
if (pListType)
|
||
return &pListType->m_stListObjects;
|
||
}
|
||
// list was not found
|
||
return NULL;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Return the sorted list of all objects of the specified
|
||
* type in the hierarchy
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author: Shaitan
|
||
*=========================================================================*/
|
||
CPA_BaseObjectList * CPA_Interface::GetSortedListByType (CString csTypeName, CPA_ObjectDLLBase *p_oDLL)
|
||
{
|
||
EDT_ListByType *pListType;
|
||
EDT_ListByDLL *pListDLL;
|
||
POSITION pos;
|
||
|
||
// there must be a world
|
||
if ((!GetMultiDevice())||(!GetCurrentWorld()))
|
||
return NULL;
|
||
|
||
// look for the list only for the corresponding DLL
|
||
if (p_oDLL)
|
||
{
|
||
pListDLL = GetCurrentWorld()->GetListFromObjectDLL(p_oDLL);
|
||
if (!pListDLL)
|
||
return NULL;
|
||
pListType = pListDLL->GetListByType(csTypeName);
|
||
if (pListType)
|
||
return &pListType->m_stSortedList;
|
||
else
|
||
return NULL;
|
||
}
|
||
// all types
|
||
if (csTypeName == "All Types")
|
||
return &GetCurrentWorld()->GetListAllDLLs()->m_stListAllTypes.m_stSortedList;
|
||
|
||
// find the corresponding list by type
|
||
for (pListDLL = GetCurrentWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListDLL;
|
||
pListDLL = GetCurrentWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
||
{
|
||
// try to find the correspponding list by type
|
||
pListType = pListDLL->GetListByType(csTypeName);
|
||
if (pListType)
|
||
return &pListType->m_stSortedList;
|
||
}
|
||
// list was not found
|
||
return NULL;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Return the list of all objects of the specified type
|
||
* in the hierarchy
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author: Shaitan
|
||
*=========================================================================*/
|
||
EDT_ListByType * CPA_Interface::GetListWithTypeName (CString oTypeName, CPA_ObjectDLLBase *p_oDLL)
|
||
{
|
||
EDT_ListByType *pListType;
|
||
EDT_ListByDLL *pListDLL;
|
||
POSITION pos;
|
||
|
||
// there must be a world
|
||
if ((!GetMultiDevice())||(!GetCurrentWorld()))
|
||
return NULL;
|
||
|
||
// if DLL, return simply corresponding list
|
||
if (p_oDLL)
|
||
{
|
||
pListDLL = GetCurrentWorld()->GetListFromObjectDLL(p_oDLL);
|
||
if (pListDLL)
|
||
return pListDLL->GetListByType(oTypeName);
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
// all types
|
||
if (oTypeName == "All Types")
|
||
return &GetCurrentWorld()->GetListAllDLLs()->m_stListAllTypes;
|
||
|
||
// find the corresponding list by type
|
||
for (pListDLL = GetCurrentWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListDLL;
|
||
pListDLL = GetCurrentWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
||
{
|
||
// try to find the correspponding list by type
|
||
pListType = pListDLL->GetListByType(oTypeName);
|
||
if (pListType)
|
||
return pListType;
|
||
}
|
||
// list was not found
|
||
return NULL;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: find the Editor Object corresponding to pSupObj.
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetEditorObject (HIE_tdxHandleToSuperObject hSupObj)
|
||
{
|
||
return m_p_oEditor->GetEditorObject(hSupObj);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Find super-object from its type and name
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetSuperObject (CString csTypeName, CString csName)
|
||
{
|
||
EDT_ListByType *pListType;
|
||
|
||
// find the corresponding list by type
|
||
pListType = GetListWithTypeName(csTypeName);
|
||
if (!pListType)
|
||
return NULL;
|
||
else
|
||
return (pListType->GetObjectWithName(csName));
|
||
}
|
||
|
||
|
||
//#################################################################################
|
||
// MODELS
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: Set the select mode and update drawing
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetCurrentModel (EDT_Model *pModel)
|
||
{
|
||
m_pCurrentModel = pModel;
|
||
|
||
// if necessary, update editor
|
||
m_p_oEditor->fn_vUpdateModel();
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: find the list of models corresponding to the name
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
EDT_ModelsByType * CPA_Interface::GetModelsWithTypeName (CString csName)
|
||
{
|
||
EDT_ModelsByType *pElem;
|
||
POSITION pos;
|
||
|
||
// list all types
|
||
if (csName == "All Types")
|
||
return m_pListAllModels;
|
||
// list by type
|
||
for (pElem = m_stListOfModelsByType.GetHeadElement(pos); pElem;
|
||
pElem = m_stListOfModelsByType.GetNextElement(pos))
|
||
{
|
||
if (pElem->GetTypeName() == csName)
|
||
return pElem;
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: create a new instance of the given model and type
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetNewInstance (CString csTypeName, CString csModel)
|
||
{
|
||
EDT_ModelsByType *pListType;
|
||
EDT_Model *pModel = NULL;
|
||
|
||
// find the corresponding list by type
|
||
pListType = GetModelsWithTypeName(csTypeName);
|
||
if (pListType)
|
||
pModel = pListType->GetModelWithName(csModel);
|
||
if (pModel)
|
||
return pModel->m_pObjectDLL->GetNewInstance(pModel->m_csTypeName, csModel, NULL);
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: create and init the list of models by type
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vInitListOfModelsByType (CPA_List<CPA_ObjectDLLBase> *pListOfObjectDLLs)
|
||
{
|
||
CPA_ObjectDLLBase *p_oDLL;
|
||
POSITION pos;
|
||
|
||
m_pListAllModels = new EDT_ModelsByType("All Types", NULL, m_pDialogInsert, &m_stListAllBitmaps);
|
||
|
||
for (p_oDLL = pListOfObjectDLLs->GetHeadElement(pos); p_oDLL;
|
||
p_oDLL = pListOfObjectDLLs->GetNextElement(pos))
|
||
p_oDLL->fn_vInitListsOfModels();
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: create and init the lists of models
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bAddANewModelList (CString csListName, CPA_ObjectDLLBase *pObjectDLL)
|
||
{
|
||
EDT_ModelsByType *pListModels;
|
||
|
||
// find the corresponding list
|
||
pListModels = GetModelsWithTypeName(csListName);
|
||
// if necessary, create the new list
|
||
if (!pListModels)
|
||
{
|
||
pListModels = new EDT_ModelsByType(csListName, pObjectDLL, m_pDialogInsert, &m_stListAllBitmaps);
|
||
m_stListOfModelsByType.AddTail(pListModels);
|
||
return TRUE;
|
||
}
|
||
// if already exists, do not change
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: check if a list already exists
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bIsAlreadyLoaded (CString csListName)
|
||
{
|
||
EDT_ModelsByType *pListModels;
|
||
|
||
// find the corresponding list
|
||
pListModels = GetModelsWithTypeName(csListName);
|
||
return (pListModels != NULL);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: add a model to the corresponding list
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bAddANewModel (EDT_Model *pModel, CString csListName, CPA_ObjectDLLBase *pObjectDLL)
|
||
{
|
||
EDT_ModelsByType *pListModels;
|
||
|
||
// find the corresponding list
|
||
pListModels = GetModelsWithTypeName(csListName);
|
||
// if necessary, create the new list
|
||
if (!pListModels)
|
||
{
|
||
pListModels = new EDT_ModelsByType(csListName, pObjectDLL, m_pDialogInsert, &m_stListAllBitmaps);
|
||
m_stListOfModelsByType.AddTail(pListModels);
|
||
}
|
||
|
||
// already exists => do not change
|
||
if (pListModels->GetModelWithName(pModel->m_csName))
|
||
return FALSE;
|
||
// update list of models by type
|
||
pListModels->fn_vAddANewModel(pModel);
|
||
// update list of all models
|
||
if (!m_pListAllModels->GetModelWithName(pModel->m_csName))
|
||
m_pListAllModels->fn_vAddANewModel(pModel);
|
||
// tell owner DLL
|
||
pModel->m_pObjectDLL->fn_vOnAddModelToList(pObjectDLL, csListName, pModel->m_csName, C_EDTDo);
|
||
// tell current editor
|
||
if (!pModel->m_pObjectDLL->fn_bIsCurrentEditor())
|
||
GetMainWorld()->GetCurrentEditor()->fn_vOnAddModelToList(pObjectDLL, csListName, pModel->m_csName, C_EDTDo);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: remove a model from the corresponding list
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bRemoveAModel (CString csModelName, CString csListName)
|
||
{
|
||
EDT_ModelsByType *pListModels;
|
||
EDT_Model *pModel;
|
||
|
||
// find the corresponding list
|
||
pListModels = GetModelsWithTypeName(csListName);
|
||
if (!pListModels)
|
||
return FALSE;
|
||
// find corresponding model
|
||
pModel = pListModels->GetModelWithName(csModelName);
|
||
if (!pModel)
|
||
return FALSE;
|
||
// ask owner DLL for permission
|
||
if (!pModel->m_pObjectDLL->fn_bCanDeleteThisModel(csListName, pModel->m_csTypeName, pModel->m_csName))
|
||
return FALSE;
|
||
// Remove it from the list
|
||
pListModels->fn_vRemoveAModel(pModel);
|
||
// remove it from global list
|
||
m_pListAllModels->fn_vRemoveAModel(pModel);
|
||
// tell owner DLL
|
||
pModel->m_pObjectDLL->fn_vOnAddModelToList(pListModels->GetDLL(), csListName, pModel->m_csName, C_EDTUndo);
|
||
// tell current editor
|
||
if (!pModel->m_pObjectDLL->fn_bIsCurrentEditor())
|
||
GetMainWorld()->GetCurrentEditor()->fn_vOnAddModelToList(pListModels->GetDLL(), csListName, pModel->m_csName, C_EDTUndo);
|
||
// destroy it
|
||
if (pModel == m_pCurrentModel)
|
||
SetCurrentModel(NULL);
|
||
delete pModel;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: load a new list of models
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bLoadModelList (CString csFileName, CString csListName, CPA_ObjectDLLBase *p_oDLL)
|
||
{
|
||
SCR_tdst_Cxt_Values *p_stValues ;
|
||
EDT_ModelsByType *pNewModelList;
|
||
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
|
||
|
||
// find if the list already exists
|
||
pNewModelList = GetModelsWithTypeName(csListName);
|
||
if (pNewModelList)
|
||
return FALSE;
|
||
|
||
// init scripts parameters
|
||
SCRIPT_vRegisterPath((char *)(LPCSTR) M_GetMainApp()->m_csEditorDataPath);
|
||
SCRIPT_vRegisterPath((char *)(LPCSTR) M_GetMainApp()->m_csEngineDataPath);
|
||
|
||
SCR_M_RdL0_SetContextLong(1, 0, (long) p_oDLL);
|
||
|
||
// section name
|
||
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, (char *)(LPCSTR) csFileName,
|
||
"Edit-ListOfModels", (char *)(LPCSTR) csListName);
|
||
// load list from file
|
||
p_stValues = SCR_fnp_st_RdL0_AnalyseSection(szSectionName, SCR_CDF_uw_Anl_Normal);
|
||
if (p_stValues)
|
||
pNewModelList = (EDT_ModelsByType *) p_stValues->a_ulValues[0];
|
||
// add it to the list
|
||
if (pNewModelList)
|
||
m_stListOfModelsByType.AddTail(pNewModelList);
|
||
|
||
return (pNewModelList != NULL);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: save a list of models
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSaveModelList (CString csFileName, CString csListName, CPA_ObjectDLLBase *p_oDLL, CPA_List<EDT_Model> *pListModels)
|
||
{
|
||
SCR_tdst_Ntfy_Description *pNotification;
|
||
SCR_tde_Ntfy_Action eAction;
|
||
BOOL bAlreadyExist;
|
||
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
|
||
|
||
if ((!pListModels)||(!pListModels->GetCount()))
|
||
return;
|
||
|
||
// init section name
|
||
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, (char *)(LPCSTR) csFileName, "Edit-ListOfModels", (char *)(LPCSTR) csListName);
|
||
// register modification
|
||
bAlreadyExist = SCR_fn_c_RdL0_IsSectionExists(szSectionName);
|
||
eAction = bAlreadyExist ? SCR_EA_Ntfy_AddSection : SCR_EA_Ntfy_RebuildSection;
|
||
SCR_fn_v_SvL1_RegisterNotify(szSectionName, CallBackSaveModelList, (void *) pListModels, eAction);
|
||
// update notification
|
||
pNotification = SCR_fnp_st_SvL1_GetRegisterNotify(szSectionName);
|
||
fn_v_SvL1_UpdateOneNotify(pNotification, eAction);
|
||
// unregister notification
|
||
SCR_fn_v_SvL1_DeleteRegisterNotify(szSectionName, SCR_CDR_c_RdL0_Match);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: call back for save
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::CallBackSaveModelList (SCR_tdst_File_Description *p_stFile, char *szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
|
||
{
|
||
CPA_List<EDT_Model> *pListModels;
|
||
CPA_ObjectDLLBase *p_oDLL;
|
||
EDT_Model *pModel;
|
||
POSITION pos;
|
||
char szNewSectionName[SCR_CV_ui_Cfg_MaxLenName];
|
||
char szName[SCR_CV_ui_Cfg_MaxLenName];
|
||
|
||
switch (eAction)
|
||
{
|
||
case SCR_EA_Ntfy_AddSection:
|
||
// go to end of file (we need all file directive to load this section)
|
||
SCR_fn_v_SvL1_ToEndSection(p_stFile);
|
||
SCR_M_SvL0_SaveBlankLine (p_stFile);
|
||
|
||
case SCR_EA_Ntfy_RebuildSection:
|
||
// get parameters
|
||
pListModels = (CPA_List<EDT_Model> *) p_vData;
|
||
// save begin section
|
||
SCR_fn_v_RdL0_SplitSectionName(szSectionName, NULL, szNewSectionName, szName);
|
||
SCR_fn_v_RdL0_ComputeSectionName(szNewSectionName, NULL, "Edit-ListOfModels", szName);
|
||
SCR_M_SvL0_SaveBeginSection(p_stFile, szNewSectionName, SCR_CC_C_Cfg_NoChar);
|
||
// save DLL name
|
||
pModel = pListModels->GetHeadElement(pos);
|
||
p_oDLL = pModel->m_pObjectDLL;
|
||
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, (char *)(LPCSTR) p_oDLL->GetName());
|
||
// save al models in list
|
||
for (pModel = pListModels->GetHeadElement(pos); pModel;
|
||
pModel = pListModels->GetNextElement(pos))
|
||
{
|
||
SCR_M_SvL0_SaveEntry(p_stFile, "AddModel", SCR_CC_C_Cfg_NoChar);
|
||
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 3,
|
||
(char *)(LPCSTR) pModel->m_csTypeName,
|
||
(char *)(LPCSTR) pModel->m_csName,
|
||
(char *)(LPCSTR) pModel->m_csBitmapName);
|
||
}
|
||
// end section
|
||
SCR_M_SvL0_SaveEndSection (p_stFile, SCR_CC_C_Cfg_EOL);
|
||
if (eAction == SCR_EA_Ntfy_AddSection)
|
||
SCR_M_SvL0_SaveBlankLine (p_stFile);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: call back for load
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
SCRIPT_tdeReturnValue CPA_Interface::CallBackLoadModelList (SCR_tdst_File_Description *p_stFile, char *szSectionName, char *szParams[], SCR_tde_Anl_Action eAction)
|
||
{
|
||
CPA_ObjectDLLBase *p_oDLL;
|
||
EDT_ModelsByType *pNewListModels;
|
||
CPA_Interface *pInterface;
|
||
EDT_Model *pNewModel;
|
||
|
||
switch (eAction)
|
||
{
|
||
// section => create
|
||
case SCR_EA_Anl_BeginSection:
|
||
// get parameters
|
||
SCR_M_RdL0_GetContextLong(0, 0, CPA_ObjectDLLBase *, p_oDLL);
|
||
pInterface = p_oDLL->GetInterface();
|
||
pNewListModels = NULL;
|
||
// check DLL Name and create list
|
||
if (!strcmp((char *) (LPCSTR) p_oDLL->GetName(), szParams[0]))
|
||
pNewListModels = new EDT_ModelsByType(szSectionName, p_oDLL, pInterface->GetDialogInsert(), pInterface->GetBitmapList());
|
||
// set result
|
||
SCR_M_RdL0_SetSectionLong(0, 0, (long) pNewListModels);
|
||
break;
|
||
|
||
case SCR_EA_Anl_Entry:
|
||
// load a new model
|
||
if (strcmp(szSectionName,"AddModel") == 0)
|
||
{
|
||
// get list
|
||
SCR_M_RdL0_GetSectionLong(0, 0, EDT_ModelsByType *, pNewListModels);
|
||
if (!pNewListModels)
|
||
break;
|
||
// get parameters
|
||
p_oDLL = pNewListModels->GetDLL();
|
||
pInterface = p_oDLL->GetInterface();
|
||
// create and add model to the list
|
||
pNewModel = new EDT_Model(p_oDLL, szParams[0], szParams[1], szParams[2], pInterface);
|
||
pNewListModels->fn_vAddANewModel(pNewModel);
|
||
// update list all models
|
||
if (!pInterface->m_pListAllModels->GetModelWithName(pNewModel->m_csName))
|
||
pInterface->m_pListAllModels->fn_vAddANewModel(pNewModel);
|
||
// call DLL to create its model
|
||
p_oDLL->fn_vOnLoadNewModel(pNewListModels->GetTypeName(), pNewModel);
|
||
break;
|
||
}
|
||
break;
|
||
|
||
case SCR_EA_Anl_EndSection:
|
||
break;
|
||
}
|
||
return SCR_ERV_Anl_NormalReturn;
|
||
}
|
||
|
||
|
||
|
||
//#################################################################################
|
||
// HIERARCHY
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: insert object in hierarchy, as last child of pParent
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bInsertObjectInHierarchy (CPA_SuperObject *pEdObj, CPA_SuperObject *pParent, BOOL bUseEditManager, BOOL bUpdateModif, BOOL bSelect, BOOL pBlock)
|
||
{
|
||
return m_p_oEditor->fn_bInsertObjectInHierarchy (pEdObj, pParent, bUseEditManager, bUpdateModif, bSelect, pBlock);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: insert object in hierarchy, as next brother of pBrother
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bInsertAsPreviousBrother (CPA_SuperObject *pEdObj, CPA_SuperObject *pBrother, BOOL bUseEditManager, BOOL bUpdateModif, BOOL bSelect, BOOL pBlock)
|
||
{
|
||
return m_p_oEditor->fn_bInsertAsPreviousBrother (pEdObj, pBrother, bUseEditManager, bUpdateModif, bSelect, pBlock);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: remove object from hierarchy
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bDeleteObjectInHierarchy (CPA_SuperObject *pEdObj, BOOL bUseEditManager, BOOL bUpdateModif, BOOL bDestroySuperObject, BOOL bSelect, BOOL pBlock)
|
||
{
|
||
return m_p_oEditor->fn_bDeleteObjectInHierarchy (pEdObj, bUseEditManager, bUpdateModif, bDestroySuperObject, bSelect, pBlock);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: create new editor super-object from engine SO
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetNewSuperObject (HIE_tdxHandleToSuperObject hEngineSO,
|
||
tdeSaveStatus eStatus, tdeTypeSO eTypeSO,
|
||
CString csName, CString csEngineFileName)
|
||
{
|
||
return m_p_oEditor->GetNewSuperObject(hEngineSO, eStatus, eTypeSO, csName, csEngineFileName);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: create new super-object
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetNewSuperObject (tdeSaveStatus eStatus, tdeTypeSO eTypeSO,
|
||
CString csName, CString csEngineFileName)
|
||
{
|
||
return m_p_oEditor->GetNewSuperObject(eStatus, eTypeSO, csName, csEngineFileName);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: create a copy of pModel
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_SuperObject * CPA_Interface::GetCopyOfSuperObject (CPA_SuperObject *pModel)
|
||
{
|
||
return m_p_oEditor->GetCopyOfSuperObject(pModel);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: create new super-object
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CPA_FileObject * CPA_Interface::GetFileObject (CString csFileName)
|
||
{
|
||
return m_p_oEditor->GetFileObject(csFileName);
|
||
}
|
||
|
||
//#################################################################################
|
||
// PYRAMID
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: init or cancel depth move for pyramid selection
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vInitPyramidDepth (BOOL bInitMove)
|
||
{
|
||
if (bInitMove)
|
||
{
|
||
if (m_bSelectionFrameCreating)
|
||
{
|
||
m_bPyramidDepthChanging = TRUE;
|
||
GetCursorPos(&m_stMouseFixPoint);
|
||
}
|
||
}
|
||
else
|
||
if (m_bPyramidDepthChanging)
|
||
m_bPyramidDepthChanging=FALSE;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: init selection pyramid
|
||
* Creation date:
|
||
* Author: Yann Le Tensorer
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author: Shaitan
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vInitSelectionPyramid(tdstMousePos *p_stPos)
|
||
{
|
||
DEV_ViewPort *ViewPort;
|
||
char szMessage[256], szMode[20];
|
||
|
||
m_stSelectionStartVertex.stPos2D.xX=p_stPos->stPos2D.xX;
|
||
m_stSelectionVertexTopLeft.stPos2D.xX=p_stPos->stPos2D.xX;
|
||
m_stSelectionVertexTopRight.stPos2D.xX=p_stPos->stPos2D.xX;
|
||
m_stSelectionVertexBottomRight.stPos2D.xX=p_stPos->stPos2D.xX;
|
||
m_stSelectionVertexBottomLeft.stPos2D.xX=p_stPos->stPos2D.xX;
|
||
|
||
m_stSelectionStartVertex.stPos2D.xY=p_stPos->stPos2D.xY;
|
||
m_stSelectionVertexTopLeft.stPos2D.xY=p_stPos->stPos2D.xY;
|
||
m_stSelectionVertexTopRight.stPos2D.xY=p_stPos->stPos2D.xY;
|
||
m_stSelectionVertexBottomRight.stPos2D.xY=p_stPos->stPos2D.xY;
|
||
m_stSelectionVertexBottomLeft.stPos2D.xY=p_stPos->stPos2D.xY;
|
||
|
||
m_bSelectionFrameVisible=FALSE;
|
||
m_bSelectionFrameCreating=TRUE;
|
||
m_bPyramidDepthChanging=FALSE;
|
||
|
||
ViewPort = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stSelectionVertexBottomRight.stPos3D,
|
||
&m_stSelectionVertexBottomRight.stPos3D,
|
||
m_dfZNearSelectionFrame);
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stSelectionVertexTopRight.stPos3D,
|
||
&m_stSelectionVertexTopRight.stPos3D,
|
||
m_dfZNearSelectionFrame);
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stSelectionVertexTopLeft.stPos3D,
|
||
&m_stSelectionVertexTopLeft.stPos3D,
|
||
m_dfZNearSelectionFrame);
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stSelectionVertexBottomLeft.stPos3D,
|
||
&m_stSelectionVertexBottomLeft.stPos3D,
|
||
m_dfZNearSelectionFrame);
|
||
|
||
float saveZ = (float)m_dfZFarSelectionFrame;
|
||
if (m_bFixedDepth)
|
||
m_dfZFarSelectionFrame = m_dfZNearSelectionFrame + GetPyramidalDepth();
|
||
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stFarSelectionVertexBottomRight.stPos3D,
|
||
&m_stFarSelectionVertexBottomRight.stPos3D,
|
||
m_dfZFarSelectionFrame);
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stFarSelectionVertexTopRight.stPos3D,
|
||
&m_stFarSelectionVertexTopRight.stPos3D,
|
||
m_dfZFarSelectionFrame);
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stFarSelectionVertexTopLeft.stPos3D,
|
||
&m_stFarSelectionVertexTopLeft.stPos3D,
|
||
m_dfZFarSelectionFrame);
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stFarSelectionVertexBottomLeft.stPos3D,
|
||
&m_stFarSelectionVertexBottomLeft.stPos3D,
|
||
m_dfZFarSelectionFrame);
|
||
|
||
// message in status bar
|
||
strcpy(szMode, m_bRealTime ? "REAL TIME" : "STATIC");
|
||
if (m_bFixedDepth)
|
||
sprintf(szMessage, "Pyramid Selection : %s, FIXED depth : %3.2f m (choosed in options)", szMode, GetPyramidalDepth());
|
||
else
|
||
sprintf(szMessage, "Pyramid Selection : %s, FREE depth : %3.2f m (use 'W' to change the depth)", szMode, m_dfZFarSelectionFrame);
|
||
|
||
M_GetMainWnd()->UpdateStatus(szMessage, C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
||
|
||
m_dfZFarSelectionFrame = saveZ;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Draw pyramid selection (OnMouseMove)
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bDoSelectionPyramid (tdstMousePos *p_stPos)
|
||
{
|
||
// if necessary, update pyramid depth
|
||
if (m_bPyramidDepthChanging)
|
||
fn_vChangePyramidDepth(p_stPos);
|
||
|
||
// if pyramid enabled, draw pyramid
|
||
if (m_bSelectionFrameCreating)
|
||
{
|
||
fn_vCreateSelectionFrame(p_stPos);
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
return TRUE;
|
||
}
|
||
|
||
// no action
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Draw selection frame.
|
||
* Creation date:
|
||
* Author: Yann Le Tensorer
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author: Shaitan
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vDrawSelectionFrame(GLD_tdstViewportAttributes *p1)
|
||
{
|
||
|
||
POS_tdstCompletePosition stMatrix;
|
||
MTH3D_tdstVector stTopRight, stTopLeft, stBottomRight, stBottomLeft;
|
||
MTH3D_tdstVector stFarTopRight, stFarTopLeft, stFarBottomRight, stFarBottomLeft;
|
||
|
||
POS_fn_vSetIdentityMatrix(&stMatrix);
|
||
|
||
if (!m_bSelectionFrameVisible)
|
||
return;
|
||
|
||
if (g_p_stCurrentMatrix!=0)
|
||
{
|
||
GLI_xGetCameraMatrix(((GLI_tdstSpecificAttributesFor3D*)(p1->p_vSpecificToXD))->p_stCam,&stMatrix);
|
||
GLI_xLoadMatrix(&stMatrix);
|
||
|
||
stBottomRight = m_stSelectionVertexBottomRight.stPos3D;
|
||
stBottomLeft = m_stSelectionVertexBottomLeft.stPos3D;
|
||
stTopRight = m_stSelectionVertexTopRight.stPos3D;
|
||
stTopLeft = m_stSelectionVertexTopLeft.stPos3D;
|
||
|
||
stFarBottomRight = m_stFarSelectionVertexBottomRight.stPos3D;
|
||
stFarBottomLeft = m_stFarSelectionVertexBottomLeft.stPos3D;
|
||
stFarTopRight = m_stFarSelectionVertexTopRight.stPos3D;
|
||
stFarTopLeft = m_stFarSelectionVertexTopLeft.stPos3D;
|
||
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stFarTopLeft,&stFarTopRight,0xffffffff/*0xcccccccc*/);
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stFarTopRight,&stFarBottomRight,0xffffffff/*0xcccccccc*/);
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stFarBottomRight,&stFarBottomLeft,0xffffffff/*0xcccccccc*/);
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stFarBottomLeft,&stFarTopLeft,0xffffffff/*0xcccccccc*/);
|
||
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stTopLeft,&stFarTopLeft,0xffffffff/*0xcccccccc*/);
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stTopRight,&stFarTopRight,0xffffffff/*0xcccccccc*/);
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stBottomRight,&stFarBottomRight,0xffffffff/*0xcccccccc*/);
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stBottomLeft,&stFarBottomLeft,0xffffffff/*0xcccccccc*/);
|
||
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stTopLeft,&stTopRight,0xffffffff);
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stTopRight,&stBottomRight,0xffffffff);
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stBottomRight,&stBottomLeft,0xffffffff);
|
||
GLI_xDraw3DLine16((GLD_tdstViewportAttributes_*)p1,&stBottomLeft,&stTopLeft,0xffffffff);
|
||
|
||
GLI_xPopMatrix();
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: end pyramid selection mode
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author: Yann Le Tensorer
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vEndSelectionPyramid (void)
|
||
{
|
||
if (m_bSelectionFrameCreating||m_bPyramidDepthChanging)
|
||
{
|
||
if (!m_bRealTime)
|
||
fn_vSelectObjectsInPyramid();
|
||
m_bSelectionFrameCreating = FALSE;
|
||
m_bSelectionFrameVisible = FALSE;
|
||
m_bPyramidDepthChanging = FALSE;
|
||
fn_vUpdateAll(E_mc_UpdateDialog);
|
||
}
|
||
}
|
||
|
||
|
||
/*######################################################################################
|
||
functions for object moving
|
||
######################################################################################*/
|
||
|
||
void CPA_Interface::fn_vEnterObjectMouseMoveMode()
|
||
{
|
||
m_bModeIsObjectMouseMove = TRUE;
|
||
m_bLastMovePlaneRemembered = FALSE;
|
||
//m_vSetMouseMovePlane(E_mmp_Standard);
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::fn_vLeaveObjectMouseMoveMode()
|
||
{
|
||
if ( m_bModeIsObjectMouseMove )
|
||
{
|
||
m_bModeIsObjectMouseMove = FALSE;
|
||
// redraw everything,
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
}
|
||
m_bLastMovePlaneRemembered = FALSE;
|
||
fn_vSetMouseMovePlane(E_mmp_Standard);
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bGetObjectMouseMoveMode()
|
||
{
|
||
return m_bModeIsObjectMouseMove;
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
tdeMouseMovePlane CPA_Interface::fn_eGetMouseMovePlane()
|
||
{
|
||
return m_eMouseMovePlane;
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::fn_vSetMouseMovePlane(tdeMouseMovePlane _eMMP)
|
||
{
|
||
m_eMouseMovePlane = _eMMP;
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::SetPlaneForMouseMove(MTH3D_tdstVector *p_stX_Axe, MTH3D_tdstVector *p_stY_Axe)
|
||
{
|
||
memcpy(&m_stMouseXAxe, p_stX_Axe, sizeof(m_stMouseXAxe));
|
||
memcpy(&m_stMouseYAxe, p_stY_Axe, sizeof(m_stMouseYAxe));
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::RememberLastMouseMovePlane(MTH3D_tdstVector *p_stX_Axe, MTH3D_tdstVector *p_stY_Axe)
|
||
{
|
||
memcpy(&m_stLastMoveXAxe, p_stX_Axe, sizeof(m_stLastMoveXAxe));
|
||
memcpy(&m_stLastMoveYAxe, p_stY_Axe, sizeof(m_stLastMoveYAxe));
|
||
m_bLastMovePlaneRemembered = TRUE;
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::SetMovePlaneCenter(MTH3D_tdstVector *p_stPosition)
|
||
{
|
||
memcpy(&m_stMouseMovePlaneCenter, p_stPosition, sizeof(m_stMouseMovePlaneCenter));
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::GetPlaneForMouseMove(MTH3D_tdstVector *p_stX_Axe, MTH3D_tdstVector *p_stY_Axe)
|
||
{
|
||
memcpy(p_stX_Axe, &m_stMouseXAxe, sizeof(m_stMouseXAxe));
|
||
memcpy(p_stY_Axe, &m_stMouseYAxe, sizeof(m_stMouseYAxe));
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::fn_vComputeSuperObjectsCenters(GLD_tdstViewportAttributes *p1)
|
||
{
|
||
// GLI_tdstSpecificAttributesFor3D *p_st3DAtributes;
|
||
CPA_List<CPA_SuperObject> *p_oListOfObjects;
|
||
MTH3D_tdstVector stCamPos;
|
||
CPA_SuperObject *p_oObject;
|
||
DEV_ViewPort3D *pViewPort;
|
||
POS_tdstCompletePosition stMatrix, stRealMatrix;
|
||
POSITION xPos;
|
||
|
||
// init parameters
|
||
p_oListOfObjects = GetCurrentWorld()->GetListAllObjects();
|
||
xPos = p_oListOfObjects->GetHeadPosition();
|
||
|
||
// p_st3DAtributes = (GLI_tdstSpecificAttributesFor3D*)(p1->p_vSpecificToXD);
|
||
// GLI_xGetCameraMatrix(p_st3DAtributes->p_stCam, &stMatrix);
|
||
|
||
// get camera parameters
|
||
pViewPort = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
GLI_xGetCameraMatrix(pViewPort->GetEngineCamera(), &stMatrix);
|
||
POS_fn_vInvertMatrix(&stRealMatrix,&stMatrix);
|
||
POS_fn_vGetTranslationVector(&stRealMatrix, &stCamPos);
|
||
|
||
// check all objects in the list
|
||
while (xPos)
|
||
{
|
||
p_oObject = (CPA_SuperObject *) p_oListOfObjects->GetNext(xPos);
|
||
|
||
if (GetShowcenter() && p_oObject->GetObject() && (GetShowcenter() & 1 || fn_bCanSelect(p_oObject) == C_Accept))
|
||
{
|
||
HIE_tdxHandleToSuperObject hSuperObject;
|
||
HIE_aDEF_stTabOfPickInfo a_stPickInfo;
|
||
GLI_tdstAligned2DVector a2_st2DVertex;
|
||
GLI_tdstAligned3DVector a2_stVertex;
|
||
GEO_tdxHandleToMatrix hGlobalMatrix;
|
||
MTH3D_tdstVector stPosition;
|
||
GLI_tdst2DVertex stPos2D;
|
||
ACP_tdxIndex xNbPicked;
|
||
BOOL bFound = FALSE;
|
||
|
||
// get superobject parameters
|
||
hSuperObject = p_oObject->GetStruct();
|
||
hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObject);
|
||
POS_fn_vGetTranslationVector(hGlobalMatrix, &stPosition);
|
||
|
||
// get projection of center
|
||
GLI_xSerialLinearOp(1, &stPosition, &a2_stVertex, &stMatrix);
|
||
GLI_xSerialProjection(pViewPort->GetEngineCamera(), 1, &a2_stVertex, &a2_st2DVertex);
|
||
stPos2D.xX = a2_st2DVertex.xX;
|
||
stPos2D.xY = a2_st2DVertex.xY;
|
||
|
||
// check if center is visible
|
||
xNbPicked = HIE_xIsSuperObjectPick(GLI_C_ModePickingFace, pViewPort->m_hDisplayDevice, pViewPort->m_hDisplayViewport,
|
||
&stPos2D, GetMultiDevice3D()->GetEngineWorld(), a_stPickInfo);
|
||
if (xNbPicked > 0)
|
||
{
|
||
MTH3D_tdstVector stHit, stDistHit, stDistObj;
|
||
|
||
// check distance
|
||
stHit = a_stPickInfo[0].stPickedObject.aDEF_stDataOfElement[0].stHit;
|
||
MTH3D_M_vSubVector(&stDistHit, &stCamPos, &stHit);
|
||
MTH3D_M_vSubVector(&stDistObj, &stCamPos, &stPosition);
|
||
if (MTH3D_M_xNormVector(&stDistHit) >= MTH3D_M_xNormVector(&stDistObj) - 0.15)
|
||
bFound = TRUE;
|
||
|
||
// check picking
|
||
HIE_tdxHandleToSuperObject hPicked = a_stPickInfo[0].hSprObject;
|
||
while (hPicked && !bFound)
|
||
{
|
||
if (hPicked == hSuperObject)
|
||
bFound = TRUE;
|
||
else
|
||
hPicked = HIE_fn_hGetSuperObjectFather(hPicked);
|
||
}
|
||
}
|
||
|
||
// update super object flag
|
||
p_oObject->SetCenterVisible(bFound);
|
||
}
|
||
}
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::fn_vDrawSuperObjectsCenters(GLD_tdstViewportAttributes *p1)
|
||
{
|
||
CPA_List<CPA_SuperObject> *p_oListOfObjects = GetCurrentWorld()->GetListAllObjects();
|
||
POSITION xPos = p_oListOfObjects->GetHeadPosition();
|
||
POS_tdstCompletePosition matrix;
|
||
|
||
while ( xPos )
|
||
{
|
||
CPA_SuperObject *p_oObject = (CPA_SuperObject *) p_oListOfObjects->GetNext(xPos);
|
||
if (GetShowcenter() && p_oObject->GetObject() && p_oObject->fn_bIsCenterVisible() &&
|
||
(GetShowcenter() & 1 || fn_bCanSelect(p_oObject) == C_Accept))
|
||
{
|
||
MTH3D_tdstVector p;
|
||
GLI_tdstAligned2DVector a2_st2DVertex;
|
||
GLI_tdstAligned3DVector a2_stVertex;
|
||
GLI_tdstSpecificAttributesFor3D *p_st3DAtributes;
|
||
|
||
HIE_tdxHandleToSuperObject hSuperObject = p_oObject->GetStruct();
|
||
|
||
if(!m_bLoaded)
|
||
{
|
||
GLI_xCreateMaterial(&m_hCenterMaterial);
|
||
GLI_xLoadTexture(&m_pTexBar, NULL, "center.bmp", 0, 0);
|
||
if (m_pTexBar)
|
||
TEX_vSetTextureQualityLevel(m_pTexBar,(char)TEX_C_QHIGH); // eventuellement
|
||
GLI_vEndofGeometricLoad();
|
||
GLI_xSetMaterialTexture(m_hCenterMaterial,m_pTexBar);
|
||
m_bLoaded = TRUE;
|
||
}
|
||
GEO_tdxHandleToMatrix hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObject);
|
||
POS_fn_vGetTranslationVector(hGlobalMatrix, &p);
|
||
|
||
p_st3DAtributes = (GLI_tdstSpecificAttributesFor3D*)(p1->p_vSpecificToXD);
|
||
GLI_xGetCameraMatrix(p_st3DAtributes->p_stCam, &matrix);
|
||
GLI_xSerialLinearOp(1, &p, &a2_stVertex, &matrix);
|
||
GLI_xSerialProjection(p_st3DAtributes->p_stCam, 1, &a2_stVertex, &a2_st2DVertex);
|
||
// g_stCurLLInterface.p_fnSerialSnap2DVertices (&a2_st2DVertex, 1);
|
||
|
||
float near1 = (float)p_st3DAtributes->p_stCam->xNear;
|
||
p_st3DAtributes->p_stCam->xNear += 0.01f;
|
||
GLI_vDraw2DSprite(p1, a2_st2DVertex.xX-5, a2_st2DVertex.xX + 5, a2_st2DVertex.xY-5, a2_st2DVertex.xY + 5, m_hCenterMaterial);
|
||
p_st3DAtributes->p_stCam->xNear = near1;
|
||
}
|
||
}
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::fn_vGetScreenProjection(CPA_SuperObject *obj, MTH3D_tdstVector *prj)
|
||
{
|
||
MTH3D_tdstVector p;
|
||
GLI_tdstAligned2DVector a2_st2DVertex;
|
||
GLI_tdstAligned3DVector a2_stVertex;
|
||
GLI_tdstSpecificAttributesFor3D *p_st3DAtributes;
|
||
GLD_tdstViewportAttributes ViewAttr;
|
||
POS_tdstCompletePosition matrix;
|
||
|
||
prj->xX = prj->xY = prj->xZ = 0;
|
||
DEV_ViewPort3D *ViewPort = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
if ( !GLD_bGetViewportAttributes( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport, &ViewAttr)) return;
|
||
p_st3DAtributes = (GLI_tdstSpecificAttributesFor3D *)ViewAttr.p_vSpecificToXD;
|
||
|
||
GEO_tdxHandleToMatrix hGlobalMatrix = HIE_fn_hGetSuperObjectMatrix(obj->GetStruct());
|
||
POS_fn_vGetTranslationVector(hGlobalMatrix, &p);
|
||
p_st3DAtributes = (GLI_tdstSpecificAttributesFor3D*)(ViewAttr.p_vSpecificToXD);
|
||
GLI_xGetCameraMatrix(p_st3DAtributes->p_stCam, &matrix);
|
||
GLI_xSerialLinearOp(1, &p, &a2_stVertex, &matrix);
|
||
GLI_xSerialProjection(p_st3DAtributes->p_stCam, 1, &a2_stVertex, &a2_st2DVertex);
|
||
// g_stCurLLInterface.p_fnSerialSnap2DVertices (&a2_st2DVertex, 1);
|
||
|
||
prj->xX = a2_st2DVertex.xX;
|
||
prj->xY = a2_st2DVertex.xY;
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::fn_vDrawSuperObjectsAxis(GLD_tdstViewportAttributes *p1)
|
||
{
|
||
|
||
CPA_List<CPA_SuperObject> *p_oListOfObjects = GetCurrentWorld()->GetListAllObjects();
|
||
POSITION xPos = p_oListOfObjects->GetHeadPosition();
|
||
|
||
while ( xPos )
|
||
{
|
||
CPA_SuperObject *p_oObject = (CPA_SuperObject *) p_oListOfObjects->GetNext(xPos);
|
||
if ( p_oObject && p_oObject->fn_bIsAxisDrawn() )
|
||
{
|
||
HIE_tdxHandleToSuperObject hSuperObject = p_oObject->GetStruct();
|
||
GEO_tdxHandleToMatrix hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObject);
|
||
//get the origin and axis of the superobject
|
||
MTH3D_tdstVector stOrigin, stI, stJ, stK;
|
||
POS_fn_vGetTranslationVector(hGlobalMatrix, &stOrigin);
|
||
POS_fn_vGetRotationMatrix(hGlobalMatrix, &stI, &stJ, &stK);
|
||
//now draw lines from the origin of the matrix to each vector:
|
||
MTH3D_M_vAddVector(&stI, &stI, &stOrigin);
|
||
MTH3D_M_vAddVector(&stJ, &stJ, &stOrigin);
|
||
MTH3D_M_vAddVector(&stK, &stK, &stOrigin);
|
||
GLI_xDraw3DLine16(
|
||
(GLD_tdstViewportAttributes_*)p1,
|
||
&stOrigin,
|
||
&stI,
|
||
0xff000000
|
||
);
|
||
GLI_xDraw3DLine16(
|
||
(GLD_tdstViewportAttributes_*)p1,
|
||
&stOrigin,
|
||
&stJ,
|
||
0x00ff0000
|
||
);
|
||
GLI_xDraw3DLine16(
|
||
(GLD_tdstViewportAttributes_*)p1,
|
||
&stOrigin,
|
||
&stK,
|
||
0x0000ff00
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
/*=========================================================================*/
|
||
/*=========================================================================*/
|
||
void CPA_Interface::fn_vDrawMoveObjectFrame(GLD_tdstViewportAttributes *p1)
|
||
{
|
||
if ( fn_bGetObjectMouseMoveMode() && m_bLastMovePlaneRemembered && m_stMouseYAxe.xZ )
|
||
{
|
||
POS_tdstCompletePosition stMatrix, stInvMatrix;
|
||
|
||
POS_fn_vSetIdentityMatrix(&stMatrix);
|
||
POS_fn_vSetIdentityMatrix(&stInvMatrix);
|
||
|
||
//array of positions around a square numbered as follows:
|
||
// 0--1--2
|
||
// | |
|
||
// 3 Q 4
|
||
// | |
|
||
// 5--6--7
|
||
|
||
MTH3D_tdstVector stVertexes[8];
|
||
//linear combination of X and Y vectors to go from the center Q
|
||
//to an extermity of a line to draw
|
||
#define C_fDist 1.0
|
||
float aa_fXY[8][2] =
|
||
{
|
||
{ -C_fDist, C_fDist },
|
||
{ 0.0, C_fDist },
|
||
{ C_fDist, C_fDist },
|
||
{ -C_fDist, 0.0 },
|
||
{ C_fDist, 0.0 },
|
||
{ -C_fDist, -C_fDist },
|
||
{ 0.0, -C_fDist },
|
||
{ C_fDist, -C_fDist }
|
||
};
|
||
GEO_tdstColor ColBidon;
|
||
|
||
ColBidon.xR=0.5;
|
||
ColBidon.xG=0.5;
|
||
ColBidon.xB=0.5;
|
||
ColBidon.xA=0.5;
|
||
|
||
GLI_xGetCameraMatrix(((GLI_tdstSpecificAttributesFor3D*)(p1->p_vSpecificToXD))->p_stCam,&stMatrix);
|
||
GLI_xLoadMatrix(&stMatrix);
|
||
GLI_vSetFog(100,100,200,&ColBidon);
|
||
|
||
POS_fn_vInvertMatrix(&stInvMatrix , &stMatrix);
|
||
|
||
for ( short wIndex = 0; wIndex < 8; wIndex ++ )
|
||
{
|
||
//put the center of the plane in the vertex
|
||
MTH3D_M_vCopyVector(&stVertexes[wIndex], &m_stMouseMovePlaneCenter);
|
||
//convert the point into camera coordinates
|
||
//POS_fn_vMulMatrixVertex(&stVertexes[wIndex], &stMatrix , &stVertexes[wIndex]);
|
||
//compute the new position of the point after it moved away from the center
|
||
MTH3D_tdstVector stTempVector;
|
||
MTH3D_M_vCopyVector(&stTempVector, &m_stLastMoveXAxe);
|
||
MTH3D_M_vMulScalarVector(&stTempVector, aa_fXY[wIndex][0], &stTempVector);
|
||
MTH3D_M_vAddVector(&stVertexes[wIndex], &stVertexes[wIndex], &stTempVector);
|
||
MTH3D_M_vCopyVector(&stTempVector, &m_stLastMoveYAxe);
|
||
MTH3D_M_vMulScalarVector(&stTempVector, aa_fXY[wIndex][1], &stTempVector);
|
||
MTH3D_M_vAddVector(&stVertexes[wIndex], &stVertexes[wIndex], &stTempVector);
|
||
//convert the point back into world coordinates
|
||
//POS_fn_vMulMatrixVertex(&stVertexes[wIndex], &stInvMatrix, &stVertexes[wIndex]);
|
||
}
|
||
//now draw all the lines we want: 0-2, 3-4, 5-7, 0-5, 1-6, 2-7
|
||
short aa_wIndexes[6][2] =
|
||
{
|
||
{ 0, 2 },
|
||
{ 3, 4 },
|
||
{ 5, 7 },
|
||
{ 0, 5 },
|
||
{ 1, 6 },
|
||
{ 2, 7 }
|
||
};
|
||
for (wIndex = 0; wIndex < 6; wIndex ++ )
|
||
{
|
||
GLI_xDraw3DLine16(
|
||
(GLD_tdstViewportAttributes_*)p1,
|
||
&stVertexes[aa_wIndexes[wIndex][0]],
|
||
&stVertexes[aa_wIndexes[wIndex][1]],
|
||
(wIndex == 1 || wIndex == 4) ? 0xeeeeeeee : 0x99999999 //crosshair is brighter than outer frame
|
||
);
|
||
}
|
||
GLI_xPopMatrix();
|
||
}
|
||
}
|
||
|
||
|
||
//#################################################################################
|
||
// MENU FUNCTIONS
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: display popup menu
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vDisplayPopupMenu (tdstMousePos *p_stCoords)
|
||
{
|
||
CPA_SuperObject *pSelected;
|
||
CPA_ToolDLLBase *pDLLTool;
|
||
DEV_ViewPort3D *pCurViewport;
|
||
EDT_ListByDLL *pSelect;
|
||
CPA_DLLBase *p_oCameraInterface;
|
||
EDT_SubMenu *p_oSubMenu;
|
||
POSITION pos;
|
||
CString csMenuDescString, csMenuAccelString;
|
||
|
||
|
||
// get camera interface
|
||
pCurViewport = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
p_oCameraInterface = pCurViewport->GetCameraInterface();
|
||
|
||
// clear popupmenu
|
||
m_oPopUpMenu.Clear();
|
||
|
||
if (p_oCameraInterface->fn_bDefinePopupMenu(&m_oPopUpMenu, GetCurrentWorld()->GetListSelected(), FALSE))
|
||
m_oPopUpMenu.AddASeparator();
|
||
|
||
// drawing
|
||
if (GetCurrentWorld()->GetCountSelected() == 1)
|
||
{
|
||
pSelected = GetCurrentWorld()->GetSingleSelection();
|
||
// display
|
||
p_oSubMenu = m_oPopUpMenu.fn_p_oGetNewSubMenu("Display");
|
||
//CPA2 Corneliu Babiuc 13-05-98
|
||
//make the menu string
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Normal Object"));
|
||
csMenuDescString.Format("Normal\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_NormalDrawingAction, (pSelected->GetDrawingFlag() == E_df_Normal), TRUE);
|
||
|
||
//make the menu string
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Grided Object"));
|
||
csMenuDescString.Format("Grided\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_GridedDrawingAction, (pSelected->GetDrawingFlag() == E_df_Grided), TRUE);
|
||
|
||
//make the menu string
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Wired Object"));
|
||
csMenuDescString.Format("Wired\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_WiredDrawingAction, (pSelected->GetDrawingFlag() == E_df_Wired), TRUE);
|
||
//END CPA2 Corneliu Babiuc 13-05-98
|
||
m_oPopUpMenu.AddASubMenu(p_oSubMenu);
|
||
// show
|
||
p_oSubMenu = m_oPopUpMenu.fn_p_oGetNewSubMenu("Show");
|
||
//CPA2 Corneliu Babiuc 19-05-98
|
||
//make the menu string
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Show Object Axis"));
|
||
csMenuDescString.Format("Show Axis\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_ShowAxisAction, pSelected->fn_bIsAxisDrawn(), TRUE);
|
||
|
||
p_oSubMenu->AddAnEntry(NULL, "Show Bounding Volume", C_ui_ShowBoundingV, (pSelected->GetDrawingFlag() == E_df_BoundingV), TRUE);
|
||
//END CPA2 Corneliu Babiuc 19-05-98
|
||
m_oPopUpMenu.AddASubMenu(p_oSubMenu);
|
||
|
||
m_oPopUpMenu.AddASeparator();
|
||
}
|
||
|
||
// Hierarchy Editor Entries
|
||
if (m_p_oEditor->fn_bDefinePopupMenu(&m_oPopUpMenu, GetCurrentWorld()->GetListSelected(), TRUE))
|
||
m_oPopUpMenu.AddASeparator();
|
||
|
||
// ask current editor first
|
||
if (!m_p_oEditor->fn_bIsCurrentEditor())
|
||
{
|
||
if (GetMainWorld()->GetCurrentEditor()->fn_bDefinePopupMenu(&m_oPopUpMenu, GetCurrentWorld()->GetListSelected(), TRUE))
|
||
m_oPopUpMenu.AddASeparator();
|
||
}
|
||
|
||
// ask all object DLLs
|
||
for (pSelect = GetCurrentWorld()->GetListOfListByDLL()->GetHeadElement(pos); pSelect;
|
||
pSelect = GetCurrentWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
||
{
|
||
if (pSelect->GetDLL() != p_oCameraInterface)
|
||
{
|
||
if (pSelect->GetDLL()->fn_bDefinePopupMenu(&m_oPopUpMenu, &pSelect->m_stListSelected, FALSE))
|
||
m_oPopUpMenu.AddASeparator();
|
||
}
|
||
}
|
||
|
||
// ask all tool DLLs
|
||
for (pDLLTool = GetMainWorld()->GetListOfToolDLLBase()->GetHeadElement(pos); pDLLTool;
|
||
pDLLTool = GetMainWorld()->GetListOfToolDLLBase()->GetNextElement(pos))
|
||
{
|
||
if (pDLLTool->fn_bDefinePopupMenu(&m_oPopUpMenu, GetCurrentWorld()->GetListSelected(), FALSE))
|
||
m_oPopUpMenu.AddASeparator();
|
||
}
|
||
|
||
// then, build and draw the popupmenu.
|
||
m_oPopUpMenu.Build();
|
||
m_oPopUpMenu.Draw((DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort(),p_stCoords);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: display popup menu
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vDisplayMenuCommand (UINT IDCmdMsg)
|
||
{
|
||
CPA_SuperObject *pSelected;
|
||
UINT IDRealCmdMsg;
|
||
CPA_EditorBase *pOwner;
|
||
|
||
// get real ID
|
||
if ((m_oPopUpMenu.fn_bFindCmdID(IDCmdMsg,&pOwner,&IDRealCmdMsg))&&(pOwner == NULL))
|
||
{
|
||
switch (IDRealCmdMsg)
|
||
{
|
||
// drawing
|
||
case C_ui_NormalDrawingAction:
|
||
pSelected = GetCurrentWorld()->GetSingleSelection();
|
||
pSelected->SetDrawingFlag(E_df_Normal);
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
return;
|
||
case C_ui_GridedDrawingAction:
|
||
pSelected = GetCurrentWorld()->GetSingleSelection();
|
||
pSelected->SetDrawingFlag(E_df_Grided);
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
return;
|
||
case C_ui_WiredDrawingAction:
|
||
pSelected = GetCurrentWorld()->GetSingleSelection();
|
||
pSelected->SetDrawingFlag(E_df_Wired);
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
return;
|
||
|
||
case C_ui_ShowAxisAction:
|
||
pSelected = GetCurrentWorld()->GetSingleSelection();
|
||
pSelected->SetDrawnAxis(!pSelected->fn_bIsAxisDrawn());
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
return;
|
||
|
||
case C_ui_ShowBoundingV:
|
||
pSelected = GetCurrentWorld()->GetSingleSelection();
|
||
if (pSelected->GetDrawingFlag() == E_df_BoundingV)
|
||
pSelected->SetDrawingFlag(E_df_Normal);
|
||
else
|
||
pSelected->SetDrawingFlag(E_df_BoundingV);
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
return;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
// other entries
|
||
m_oPopUpMenu._OnCommand(IDCmdMsg);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: define submenu
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bDefineSubMenu (EDT_SubMenu *p_oEDTSubMenu)
|
||
{
|
||
//CPA2 Corneliu Babiuc 07-05-98
|
||
CString csMenuDescString, csMenuAccelString;
|
||
//END CPA2 Corneliu Babiuc 07-05-98
|
||
|
||
if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEdit)
|
||
{
|
||
// Begin Silviu Simen Select by sector and type
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Select by Sector"));
|
||
csMenuDescString.Format("Select by Sector/Type\t%s", csMenuAccelString);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_SelectSectorType, FALSE, TRUE);
|
||
// End Silviu Simen Select by sector and type
|
||
// selection
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Unselect all"));
|
||
csMenuDescString.Format("Unselect all\t%s", csMenuAccelString);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_UnselectAll, FALSE, TRUE);
|
||
//CPA2 Corneliu Babiuc 19-05-98
|
||
// full selection
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Full selection"));
|
||
csMenuDescString.Format("Full selection\t%s", csMenuAccelString);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_FullSelect, m_bFullSelect, TRUE);
|
||
|
||
// delta selection
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Delta selection"));
|
||
csMenuDescString.Format("Delta selection\t%s", csMenuAccelString);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_DeltaSelect, m_bDeltaSelect, TRUE);
|
||
//END CPA2 Corneliu Babiuc 19-05-98
|
||
}
|
||
|
||
if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuTool)
|
||
{
|
||
p_oEDTSubMenu->AddAnEntry(NULL, "Recompute All Bounding Volumes", C_ui_ComputeBV, FALSE, TRUE);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, "Coherence Manager", C_ui_CoherenceMngr, FALSE, TRUE);
|
||
p_oEDTSubMenu->AddASeparator();
|
||
//CPA2 Corneliu Babiuc 07-05-98
|
||
csMenuAccelString = M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Options"));
|
||
csMenuDescString.Format("Options\t%s", csMenuAccelString);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_Option, FALSE, TRUE);
|
||
//END CPA2 Corneliu Babiuc 07-05-98
|
||
return TRUE;
|
||
}
|
||
|
||
if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenu3DView)
|
||
{
|
||
CPA_CameraDLLBase *p_oCameraInterface = ((DEV_ViewPort3D *) GetMultiDevice3D()->GetFocusDevice()->GetViewPort())->GetCameraInterface();
|
||
tdeDisplayReferential eDisplayModeAxis = p_oCameraInterface ? p_oCameraInterface -> GetReferentialDisplayMode() : DisplayNone ;
|
||
|
||
// appearance
|
||
EDT_SubMenu *p_oSubMenu = p_oEDTSubMenu->fn_p_oGetNewSubMenu("Appearance");
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Normal World"));
|
||
csMenuDescString.Format("Normal\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_Textured, fn_bWorldIsTextured(), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Grided World"));
|
||
csMenuDescString.Format("Grided\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_Grided, fn_bWorldIsGrided(), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Wired World"));
|
||
csMenuDescString.Format("Wired\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_Wired, fn_bWorldIsWired(), TRUE);
|
||
|
||
p_oEDTSubMenu->AddASubMenu(p_oSubMenu);
|
||
|
||
// display
|
||
p_oSubMenu = p_oEDTSubMenu->fn_p_oGetNewSubMenu("Display");
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("World Sectors"));
|
||
csMenuDescString.Format("World Sectors\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_World, (GetSpecificInterface()->GetDisplayMode() == E_dm_DrawWorld), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Visible Sectors"));
|
||
csMenuDescString.Format("Visible Sectors\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_Visible, (GetSpecificInterface()->GetDisplayMode() == E_dm_DrawVisibleSectors), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Current Sector"));
|
||
csMenuDescString.Format("Current Sector\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_Current, (GetSpecificInterface()->GetDisplayMode() == E_dm_DrawOnlyCurrentSector), TRUE);
|
||
// collision map
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Collision Map"));
|
||
csMenuDescString.Format("Collision Map\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_CollisionMap, (GetSpecificInterface()->GetDisplayMode() == E_dm_DrawCollisionMap), TRUE);
|
||
p_oEDTSubMenu->AddASubMenu(p_oSubMenu);
|
||
|
||
// bounding volume
|
||
p_oSubMenu = p_oEDTSubMenu->fn_p_oGetNewSubMenu("Bounding Volume");
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Sectors BV"));
|
||
csMenuDescString.Format("Sectors\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_SectorsBV, (m_eBVMode == E_bv_Sectors), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Actors BV"));
|
||
csMenuDescString.Format("Actors\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_ActorsBV, (m_eBVMode == E_bv_Actors), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Objects BV"));
|
||
csMenuDescString.Format("Objects\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_ObjectsBV, (m_eBVMode == E_bv_Objects), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("No BV"));
|
||
csMenuDescString.Format("None\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_NoBV, (m_eBVMode == E_bv_None), TRUE);
|
||
|
||
p_oEDTSubMenu->AddASubMenu(p_oSubMenu);
|
||
|
||
// axis
|
||
p_oSubMenu = p_oEDTSubMenu->fn_p_oGetNewSubMenu("Axis");
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Show Axis Left"));
|
||
csMenuDescString.Format("Down Left Corner\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_DownLeftAxis, (eDisplayModeAxis==DisplayDownLeft), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Show Axis Right"));
|
||
csMenuDescString.Format("Down Right Corner\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_DownRightAxis, (eDisplayModeAxis==DisplayDownRight), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Show No Axis"));
|
||
csMenuDescString.Format("None\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_NoAxis, (eDisplayModeAxis==DisplayNone), TRUE);
|
||
|
||
p_oEDTSubMenu->AddASubMenu(p_oSubMenu);
|
||
|
||
// centers
|
||
p_oSubMenu = p_oEDTSubMenu->fn_p_oGetNewSubMenu("Objects Center");
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Show Main Centers"));
|
||
csMenuDescString.Format("Instances\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_MainCenters, (m_iShowCenter == 2), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Show All Centers"));
|
||
csMenuDescString.Format("Objects\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_AllCenters, (m_iShowCenter == 1), TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Show No Center"));
|
||
csMenuDescString.Format("None\t%s", csMenuAccelString);
|
||
p_oSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_NoCenter, (m_iShowCenter == 0), TRUE);
|
||
|
||
p_oEDTSubMenu->AddASubMenu(p_oSubMenu);
|
||
|
||
// general entries
|
||
p_oEDTSubMenu->AddASeparator();
|
||
|
||
CPA_DLLBase *p_oSectorInterface = GetMainWorld()->GetObjectDLLWithName(C_szDLLSectorName);
|
||
p_oSectorInterface->fn_bDefineSubMenu(p_oEDTSubMenu);
|
||
|
||
if (!m_bScaleObject)
|
||
{
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Scale Editor Objects"));
|
||
csMenuDescString.Format("Scale pure editor objects\t%s", csMenuAccelString);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_ScaleAction );
|
||
}
|
||
else
|
||
{
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Scale Editor Objects"));
|
||
csMenuDescString.Format("Disable the scale\t%s", csMenuAccelString);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_ReScaleAction );
|
||
}
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Compute Centers"));
|
||
csMenuDescString.Format("Compute Objects Centers\t%s", csMenuAccelString);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_ComputeCentersAction, FALSE, TRUE);
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Cancel all drawing flags"));
|
||
csMenuDescString.Format("Cancel all drawing flags\t%s", csMenuAccelString);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_CancelDrawingAction, FALSE, TRUE);
|
||
|
||
// save
|
||
p_oEDTSubMenu->AddASeparator();
|
||
|
||
csMenuAccelString = M_GetMainApp()->mp_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Select Background Color"));
|
||
csMenuDescString.Format("Select Background Color\t%s", csMenuAccelString);
|
||
p_oEDTSubMenu->AddAnEntry(NULL, (char*)(LPCTSTR)csMenuDescString, C_ui_BKColors, FALSE, TRUE);
|
||
|
||
p_oEDTSubMenu->AddAnEntry(NULL, "Save Display Mode", C_ui_SaveDisplay, FALSE, TRUE);
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: submenu command
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::_OnSubMenuCommand (EDT_SubMenu *p_oEDTSubMenu,UINT uiMsgID)
|
||
{
|
||
if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEdit)
|
||
{
|
||
switch (uiMsgID)
|
||
{
|
||
// selection
|
||
case C_ui_DeltaSelect:
|
||
SetDeltaSelect(!m_bDeltaSelect);
|
||
GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateDeltaSelect(m_bDeltaSelect);
|
||
return;
|
||
case C_ui_FullSelect:
|
||
SetFullSelect(!m_bFullSelect);
|
||
fn_vUpdateAll(E_mc_UpdateDialog);
|
||
GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateFullSelect(m_bFullSelect);
|
||
return;
|
||
case C_ui_UnselectAll:
|
||
fn_vCancelCurrentSelection();
|
||
return;
|
||
// Begin Silviu Simen Select by sector and type
|
||
case C_ui_SelectSectorType:
|
||
SelectBySector();
|
||
return;
|
||
// End Silviu Simen Select by sector and type
|
||
default:
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuTool)
|
||
{
|
||
switch (uiMsgID)
|
||
{
|
||
case C_ui_ComputeBV:
|
||
fn_vComputeAllBound();
|
||
return;
|
||
case C_ui_CoherenceMngr:
|
||
g_oCoherenceManager.m_fn_vShowIncoherence();
|
||
return;
|
||
case C_ui_Option:
|
||
m_oDialogOption.fn_vDoDialog(this);
|
||
return;
|
||
default:
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenu3DView)
|
||
{
|
||
CPA_CameraDLLBase *p_oCameraInterface = ((DEV_ViewPort3D *) GetMultiDevice3D()->GetFocusDevice()->GetViewPort())->GetCameraInterface();
|
||
|
||
switch (uiMsgID)
|
||
{
|
||
// appearance
|
||
case C_ui_Textured:
|
||
fn_vChangeWorldMask(GLI_C_lIsTextured, !fn_bWorldIsTextured());
|
||
return;
|
||
case C_ui_Grided:
|
||
fn_vChangeWorldMask(GLI_C_lIsNotGrided, fn_bWorldIsGrided());
|
||
return;
|
||
case C_ui_Wired:
|
||
fn_vChangeWorldMask(GLI_C_lIsNotWired, fn_bWorldIsWired());
|
||
return;
|
||
|
||
// display
|
||
case C_ui_World:
|
||
GetSpecificInterface()->fn_vOnChangeDisplayMode(E_dm_DrawWorld);
|
||
return;
|
||
case C_ui_Visible:
|
||
GetSpecificInterface()->fn_vOnChangeDisplayMode(E_dm_DrawVisibleSectors);
|
||
return;
|
||
case C_ui_Current:
|
||
GetSpecificInterface()->fn_vOnChangeDisplayMode(E_dm_DrawOnlyCurrentSector);
|
||
return;
|
||
|
||
case C_ui_CollisionMap:
|
||
GetSpecificInterface()->fn_vOnChangeDisplayMode(E_dm_DrawCollisionMap);
|
||
return;
|
||
|
||
// bounding volumes
|
||
case C_ui_NoBV:
|
||
fn_vSetBVMode(E_bv_None);
|
||
return;
|
||
case C_ui_SectorsBV:
|
||
fn_vSetBVMode(E_bv_Sectors);
|
||
return;
|
||
case C_ui_ActorsBV:
|
||
fn_vSetBVMode(E_bv_Actors);
|
||
return;
|
||
case C_ui_ObjectsBV:
|
||
fn_vSetBVMode(E_bv_Objects);
|
||
return;
|
||
|
||
// axis
|
||
case C_ui_NoAxis:
|
||
p_oCameraInterface -> SetReferentialDisplayMode( DisplayNone );
|
||
return;
|
||
case C_ui_DownRightAxis:
|
||
p_oCameraInterface -> SetReferentialDisplayMode( DisplayDownRight );
|
||
return;
|
||
case C_ui_DownLeftAxis:
|
||
p_oCameraInterface -> SetReferentialDisplayMode( DisplayDownLeft );
|
||
return;
|
||
|
||
// centers
|
||
case C_ui_NoCenter:
|
||
SetShowcenter(0);
|
||
GetFrameBase()->m_oGeneralDialogBar.m_oDisplayToolbar.SetButton(IDCB_NORMAL);
|
||
return;
|
||
case C_ui_MainCenters:
|
||
SetShowcenter(2);
|
||
GetFrameBase()->m_oGeneralDialogBar.m_oDisplayToolbar.SetButton(IDCB_MAINCENTERS);
|
||
return;
|
||
case C_ui_AllCenters:
|
||
SetShowcenter(1);
|
||
GetFrameBase()->m_oGeneralDialogBar.m_oDisplayToolbar.SetButton(IDCB_ALLCENTERS);
|
||
return;
|
||
|
||
// background
|
||
case C_ui_BKColors:
|
||
{
|
||
CColorDialog oColorDialog;
|
||
COLORREF stColor;
|
||
|
||
// display color dialog
|
||
if (oColorDialog.DoModal() == IDOK)
|
||
{
|
||
// get selected color
|
||
stColor = oColorDialog.GetColor();
|
||
// update controls
|
||
GetMultiDevice()->SetBackgroundColor(stColor);
|
||
}
|
||
return;
|
||
}
|
||
|
||
case C_ui_SaveDisplay:
|
||
fn_vSaveDisplayMode();
|
||
return;
|
||
|
||
// cancel drawing
|
||
case C_ui_CancelDrawingAction:
|
||
fn_vCancelAllDrawingFlags();
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
return;
|
||
|
||
// compute centers
|
||
case C_ui_ComputeCentersAction:
|
||
fn_vComputeSuperObjectsCenters(NULL);
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
return;
|
||
|
||
// scale pure editor objects
|
||
case C_ui_ScaleAction:
|
||
fn_vScale();
|
||
fn_vUpdatePositions();
|
||
fn_vScale();
|
||
m_bScaleObject = TRUE;
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
return;
|
||
case C_ui_ReScaleAction:
|
||
fn_vReScale();
|
||
m_bScaleObject = FALSE;
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
return;
|
||
|
||
default:
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
//#################################################################################
|
||
// PROTECTED FUNCTIONS
|
||
//#################################################################################
|
||
|
||
/*===========================================================================
|
||
* Description: check if object can be selected
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bCanBeSelected (CPA_SuperObject *pEdObj, CString csTypeName, BOOL bCheckSelect)
|
||
{
|
||
// type must be valid
|
||
if ((csTypeName != "All Types") && (pEdObj->GetRealTypeName() != csTypeName) )
|
||
return FALSE;
|
||
|
||
// non editable childs can't be selected
|
||
if ((pEdObj->fn_bIsEditProtected())||(!pEdObj->GetObjectDLL()))
|
||
return FALSE;
|
||
|
||
// drawing flag
|
||
if (!fn_bIgnoreFlags() && (pEdObj->GetDrawingFlag() != E_df_Normal) && (pEdObj->GetDrawingFlag() != E_df_BoundingV))
|
||
return FALSE;
|
||
|
||
// is object already selected ?
|
||
if ((bCheckSelect)&&(GetPreviousSelection(pEdObj)))
|
||
return FALSE;
|
||
|
||
// object can be selected
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: dispatch message when selection changes
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSendMessageSelect (CPA_SuperObject *pEdObj, tdeTypeModif eType)
|
||
{
|
||
CPA_ToolDLLBase *pDLLTool;
|
||
CPA_DLLBase *pCurrentEditor;
|
||
POSITION pos;
|
||
|
||
pCurrentEditor = (CPA_DLLBase *) m_p_oMainWorld->GetCurrentEditor();
|
||
|
||
// current editor
|
||
if (!m_p_oEditor->fn_bIsCurrentEditor())
|
||
pCurrentEditor->fn_vOnSelect(pEdObj, eType, C_AsCurrentEditor);
|
||
// Object DLL
|
||
if (pEdObj->GetObjectDLL())
|
||
pEdObj->GetObjectDLL()->fn_vOnSelect(pEdObj, eType, C_AsConcernedDLL);
|
||
// owner DLL
|
||
if (pEdObj->GetSuperObjectOwner())
|
||
pEdObj->GetSuperObjectOwner()->GetObjectDLL()->fn_vOnSelect(pEdObj, eType, C_AsChildOwner);
|
||
// Tool DLLs
|
||
for (pDLLTool = m_p_oMainWorld->GetToolDLLReceivingEvtEditorMsg()->GetHeadElement(pos); pDLLTool;
|
||
pDLLTool = m_p_oMainWorld->GetToolDLLReceivingEvtEditorMsg()->GetNextElement(pos))
|
||
{
|
||
if (pDLLTool != pCurrentEditor)
|
||
pDLLTool->fn_vOnSelect(pEdObj, eType, C_AsToolDLL);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: change pyramid Depth (OnMouseMove)
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author: Yann Le Tensorer
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vChangePyramidDepth (tdstMousePos *p_stPos)
|
||
{
|
||
DEV_ViewPort *ViewPort;
|
||
POINT stTmpPoint;
|
||
MSG Message;
|
||
char szMessage[256], szMode[20];
|
||
|
||
ViewPort = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
|
||
SetCursorPos(m_stMouseFixPoint.x ,m_stMouseFixPoint.y);
|
||
|
||
// Delete the MouseMove message sent by SetCursorPos
|
||
while (PeekMessage (& Message , NULL , WM_MOUSEMOVE , WM_MOUSEMOVE , PM_REMOVE)) ;
|
||
|
||
// change z accordin to vertical mouse move
|
||
stTmpPoint.x=MTH_M_xRealToLong(p_stPos->stPos.x/*2D.xX*/);
|
||
stTmpPoint.y=MTH_M_xRealToLong(p_stPos->stPos.y/*2D.xY*/);
|
||
// ViewPort->ClientToScreen(&stTmpPoint);
|
||
stTmpPoint.x=stTmpPoint.x-m_stMouseFixPoint.x;
|
||
stTmpPoint.y=stTmpPoint.y-m_stMouseFixPoint.y;
|
||
m_dfZFarSelectionFrame=m_dfZFarSelectionFrame-(MTH_M_xLongToReal(stTmpPoint.y)/100.0);
|
||
if (m_dfZFarSelectionFrame<=m_dfZNearSelectionFrame)
|
||
m_dfZFarSelectionFrame=m_dfZNearSelectionFrame+0.1;
|
||
|
||
// change mouse 2D coordinates to previous position
|
||
stTmpPoint=m_stMouseFixPoint;
|
||
// ViewPort->ScreenToClient(&stTmpPoint);
|
||
p_stPos->stPos.x/*2D.xX*/= stTmpPoint.x;
|
||
p_stPos->stPos.y/*2D.xY*/= stTmpPoint.y;
|
||
|
||
// message in status bar
|
||
strcpy(szMode, m_bRealTime ? "REAL TIME" : "STATIC");
|
||
if (!m_bFixedDepth)
|
||
sprintf(szMessage, "Pyramid Selection : %s, FREE depth : %3.2f m (use 'W' to change the depth)", szMode, m_dfZFarSelectionFrame);
|
||
|
||
M_GetMainWnd()->UpdateStatus(szMessage, C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
||
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: create selection frame (OnMouseMove)
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author: Yann Le Tensorer
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vCreateSelectionFrame (tdstMousePos *p_stPos)
|
||
{
|
||
DEV_ViewPort *ViewPort;
|
||
|
||
ViewPort = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
|
||
if (p_stPos->stPos2D.xX<=m_stSelectionStartVertex.stPos2D.xX && p_stPos->stPos2D.xY<=m_stSelectionStartVertex.stPos2D.xY)
|
||
{/* ^
|
||
\
|
||
\ */
|
||
m_stSelectionVertexTopLeft.stPos2D.xX=p_stPos->stPos2D.xX;
|
||
m_stSelectionVertexTopLeft.stPos2D.xY=p_stPos->stPos2D.xY;
|
||
m_stSelectionVertexBottomRight.stPos2D.xX=m_stSelectionStartVertex.stPos2D.xX;
|
||
m_stSelectionVertexBottomRight.stPos2D.xY=m_stSelectionStartVertex.stPos2D.xY;
|
||
}
|
||
|
||
else
|
||
if (p_stPos->stPos2D.xX<=m_stSelectionStartVertex.stPos2D.xX && p_stPos->stPos2D.xY>=m_stSelectionStartVertex.stPos2D.xY)
|
||
{// /
|
||
// /
|
||
// ^
|
||
m_stSelectionVertexTopLeft.stPos2D.xX=p_stPos->stPos2D.xX;
|
||
m_stSelectionVertexTopLeft.stPos2D.xY=m_stSelectionStartVertex.stPos2D.xY;
|
||
m_stSelectionVertexBottomRight.stPos2D.xX=m_stSelectionStartVertex.stPos2D.xX;
|
||
m_stSelectionVertexBottomRight.stPos2D.xY=p_stPos->stPos2D.xY;
|
||
}
|
||
|
||
else
|
||
if (p_stPos->stPos2D.xX>=m_stSelectionStartVertex.stPos2D.xX && p_stPos->stPos2D.xY>=m_stSelectionStartVertex.stPos2D.xY)
|
||
{// \
|
||
// \
|
||
// ^
|
||
m_stSelectionVertexBottomRight=*p_stPos;
|
||
m_stSelectionVertexTopLeft=m_stSelectionStartVertex;
|
||
}
|
||
|
||
else
|
||
if (p_stPos->stPos2D.xX>=m_stSelectionStartVertex.stPos2D.xX && p_stPos->stPos2D.xY<=m_stSelectionStartVertex.stPos2D.xY)
|
||
{// ^
|
||
// /
|
||
// /
|
||
m_stSelectionVertexTopLeft.stPos2D.xX=m_stSelectionStartVertex.stPos2D.xX;
|
||
m_stSelectionVertexTopLeft.stPos2D.xY=p_stPos->stPos2D.xY;
|
||
m_stSelectionVertexBottomRight.stPos2D.xX=p_stPos->stPos2D.xX;
|
||
m_stSelectionVertexBottomRight.stPos2D.xY=m_stSelectionStartVertex.stPos2D.xY;
|
||
}
|
||
|
||
m_stSelectionVertexTopRight.stPos2D.xX=m_stSelectionVertexBottomRight.stPos2D.xX;
|
||
m_stSelectionVertexTopRight.stPos2D.xY=m_stSelectionVertexTopLeft.stPos2D.xY;
|
||
m_stSelectionVertexBottomLeft.stPos2D.xX=m_stSelectionVertexTopLeft.stPos2D.xX;
|
||
m_stSelectionVertexBottomLeft.stPos2D.xY=m_stSelectionVertexBottomRight.stPos2D.xY;
|
||
|
||
PIC_vMouse3DScreen(ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,&m_stSelectionVertexBottomRight.stPos2D,&m_stSelectionVertexBottomRight.stPos3D);
|
||
PIC_vMouse3DScreen(ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,&m_stSelectionVertexBottomLeft.stPos2D,&m_stSelectionVertexBottomLeft.stPos3D);
|
||
PIC_vMouse3DScreen(ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,&m_stSelectionVertexTopRight.stPos2D,&m_stSelectionVertexTopRight.stPos3D);
|
||
PIC_vMouse3DScreen(ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,&m_stSelectionVertexTopLeft.stPos2D,&m_stSelectionVertexTopLeft.stPos3D);
|
||
|
||
m_stFarSelectionVertexBottomRight=m_stSelectionVertexBottomRight;
|
||
m_stFarSelectionVertexBottomLeft=m_stSelectionVertexBottomLeft;
|
||
m_stFarSelectionVertexTopRight=m_stSelectionVertexTopRight;
|
||
m_stFarSelectionVertexTopLeft=m_stSelectionVertexTopLeft;
|
||
|
||
float saveZ = (float)m_dfZFarSelectionFrame;
|
||
if (m_bFixedDepth)
|
||
m_dfZFarSelectionFrame = m_dfZNearSelectionFrame + GetPyramidalDepth();
|
||
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stFarSelectionVertexBottomRight.stPos3D,
|
||
&m_stFarSelectionVertexBottomRight.stPos3D,
|
||
m_dfZFarSelectionFrame);
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stFarSelectionVertexTopRight.stPos3D,
|
||
&m_stFarSelectionVertexTopRight.stPos3D,
|
||
m_dfZFarSelectionFrame);
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stFarSelectionVertexTopLeft.stPos3D,
|
||
&m_stFarSelectionVertexTopLeft.stPos3D,
|
||
m_dfZFarSelectionFrame);
|
||
fn_vSetZCamera( ViewPort->m_hDisplayDevice,ViewPort->m_hDisplayViewport,
|
||
&m_stFarSelectionVertexBottomLeft.stPos3D,
|
||
&m_stFarSelectionVertexBottomLeft.stPos3D,
|
||
m_dfZFarSelectionFrame);
|
||
|
||
m_dfZFarSelectionFrame = saveZ;
|
||
|
||
// Calculate normals
|
||
fn_vCalculateSelectionPyramidNormals();
|
||
|
||
// select objects
|
||
if(m_bRealTime)
|
||
fn_vSelectObjectsInPyramid();
|
||
|
||
// pyramid is visible only if volume > 0
|
||
if (
|
||
(m_stSelectionVertexTopLeft.stPos2D.xX!=m_stSelectionVertexBottomRight.stPos2D.xX) &&
|
||
(m_stSelectionVertexTopLeft.stPos2D.xY!=m_stSelectionVertexBottomRight.stPos2D.xY)
|
||
)
|
||
m_bSelectionFrameVisible=TRUE;
|
||
else
|
||
m_bSelectionFrameVisible=FALSE;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: calculate all normals (6 faces).
|
||
* Creation date:
|
||
* Author: Yann Le Tensorer
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vCalculateSelectionPyramidNormals()
|
||
{
|
||
MTH3D_tdstVector Vect1;
|
||
MTH3D_tdstVector Vect2;
|
||
|
||
MTH3D_M_vSubVector( &Vect1,&m_stSelectionVertexTopRight.stPos3D ,&m_stSelectionVertexTopLeft.stPos3D );
|
||
MTH3D_M_vSubVector( &Vect2,&m_stFarSelectionVertexTopLeft.stPos3D ,&m_stSelectionVertexTopLeft.stPos3D );
|
||
MTH3D_M_vCrossProductVector(&m_stNormaleTop,&Vect1,&Vect2);
|
||
|
||
MTH3D_M_vSubVector( &Vect1,&m_stFarSelectionVertexBottomRight.stPos3D ,&m_stFarSelectionVertexBottomLeft.stPos3D );
|
||
MTH3D_M_vSubVector( &Vect2,&m_stSelectionVertexBottomLeft.stPos3D ,&m_stFarSelectionVertexBottomLeft.stPos3D );
|
||
MTH3D_M_vCrossProductVector(&m_stNormaleBottom,&Vect1,&Vect2);
|
||
|
||
MTH3D_M_vSubVector( &Vect1,&m_stSelectionVertexBottomRight.stPos3D ,&m_stSelectionVertexTopRight.stPos3D );
|
||
MTH3D_M_vSubVector( &Vect2,&m_stFarSelectionVertexTopRight.stPos3D ,&m_stSelectionVertexTopRight.stPos3D );
|
||
MTH3D_M_vCrossProductVector(&m_stNormaleRight,&Vect1,&Vect2);
|
||
|
||
MTH3D_M_vSubVector( &Vect1,&m_stFarSelectionVertexBottomLeft.stPos3D ,&m_stFarSelectionVertexTopLeft.stPos3D );
|
||
MTH3D_M_vSubVector( &Vect2,&m_stSelectionVertexTopLeft.stPos3D ,&m_stFarSelectionVertexTopLeft.stPos3D );
|
||
MTH3D_M_vCrossProductVector(&m_stNormaleLeft,&Vect1,&Vect2);
|
||
|
||
MTH3D_M_vSubVector( &Vect1,&m_stSelectionVertexBottomLeft.stPos3D ,&m_stSelectionVertexTopLeft.stPos3D );
|
||
MTH3D_M_vSubVector( &Vect2,&m_stSelectionVertexTopRight.stPos3D ,&m_stSelectionVertexTopLeft.stPos3D );
|
||
MTH3D_M_vCrossProductVector(&m_stNormaleNear,&Vect1,&Vect2);
|
||
|
||
MTH3D_M_vSubVector( &Vect1,&m_stFarSelectionVertexBottomRight.stPos3D ,&m_stFarSelectionVertexTopRight.stPos3D );
|
||
MTH3D_M_vSubVector( &Vect2,&m_stFarSelectionVertexTopLeft.stPos3D ,&m_stFarSelectionVertexTopRight.stPos3D );
|
||
MTH3D_M_vCrossProductVector(&m_stNormaleFar,&Vect1,&Vect2);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: check if vertex is in selection pyramid.
|
||
* Creation date:
|
||
* Author: Yann Le Tensorer
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bIsVertexInSelectionPyramid(MTH3D_tdstVector *p_stSrcVertex)
|
||
{
|
||
MTH3D_tdstVector vect1;
|
||
double ProdScal;
|
||
|
||
MTH3D_M_vSubVector(&vect1,&m_stFarSelectionVertexTopLeft.stPos3D,p_stSrcVertex);
|
||
ProdScal=MTH3D_M_xDotProductVector(&vect1,&m_stNormaleFar);
|
||
if (ProdScal<=0) return FALSE;
|
||
ProdScal=MTH3D_M_xDotProductVector(&vect1,&m_stNormaleLeft);
|
||
if (ProdScal<=0) return FALSE;
|
||
ProdScal=MTH3D_M_xDotProductVector(&vect1,&m_stNormaleTop);
|
||
if (ProdScal<=0) return FALSE;
|
||
|
||
MTH3D_M_vSubVector(&vect1,&m_stSelectionVertexBottomRight.stPos3D,p_stSrcVertex);
|
||
ProdScal=MTH3D_M_xDotProductVector(&vect1,&m_stNormaleBottom);
|
||
if (ProdScal<=0) return FALSE;
|
||
ProdScal=MTH3D_M_xDotProductVector(&vect1,&m_stNormaleRight);
|
||
if (ProdScal<=0) return FALSE;
|
||
ProdScal=MTH3D_M_xDotProductVector(&vect1,&m_stNormaleNear);
|
||
if (ProdScal<=0) return FALSE;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Change z : world coordinate -> camera coordinate,
|
||
* keep x & y on screen.
|
||
* Creation date:
|
||
* Author: Yann Le Tensorer
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSetZCamera(GLD_tdhDevice hDev,
|
||
GLD_tdhViewport hVp,
|
||
MTH3D_tdstVector *p_stSrcVertex,
|
||
MTH3D_tdstVector *p_stDstVertex,
|
||
double z)
|
||
{
|
||
GLI_tdstSpecificAttributesFor3D *p_stSpecAttrib3D;
|
||
GLD_tdstViewportAttributes stViewAttrib;
|
||
struct GLI_tdstCamera_ *p_stCam;
|
||
POS_tdstCompletePosition stMatrix, stInvMatrix ;
|
||
MTH3D_tdstVector stTmpVertex;
|
||
double z1;
|
||
|
||
POS_fn_vSetIdentityMatrix(&stMatrix);
|
||
POS_fn_vSetIdentityMatrix(&stInvMatrix);
|
||
|
||
if ( !GLD_bGetViewportAttributes( hDev, hVp, &stViewAttrib ) )
|
||
return;
|
||
p_stSpecAttrib3D = (GLI_tdstSpecificAttributesFor3D *)stViewAttrib.p_vSpecificToXD;
|
||
p_stCam = p_stSpecAttrib3D->p_stCam;
|
||
|
||
|
||
// camera coordinates
|
||
GLI_xGetCameraMatrix ( p_stCam , &stMatrix );
|
||
POS_fn_vMulMatrixVertex( &stTmpVertex , &stMatrix , p_stSrcVertex );
|
||
|
||
// z1 = initial Z (camera coords.)
|
||
z1=stTmpVertex.xZ;
|
||
// z = new Z (camera coords.)
|
||
stTmpVertex.xZ=(float) z;
|
||
// calculate x&y (same projection on screen)
|
||
stTmpVertex.xX=(float) (z*stTmpVertex.xX/z1);
|
||
stTmpVertex.xY=(float) (z*stTmpVertex.xY/z1);
|
||
|
||
// World coordinates
|
||
POS_fn_vInvertMatrix ( &stInvMatrix , &stMatrix );
|
||
POS_fn_vMulMatrixVertex( p_stDstVertex , &stInvMatrix , &stTmpVertex );
|
||
}
|
||
|
||
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: Select object in pyramid.
|
||
* Creation date:
|
||
* Author: Yann Le Tensorer
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author: Shaitan
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSelectObjectsInPyramid()
|
||
{
|
||
GEO_tdxHandleToMatrix h_stObjectGlobalMatrix;
|
||
MTH3D_tdstVector stPosObject;
|
||
CPA_SuperObject *pElem;
|
||
CPA_SuperObject *pPreviousSelection;
|
||
POSITION pos = NULL;
|
||
|
||
// single selection : cancel current one
|
||
if (!m_p_oEditor->fn_bIsMultiSelectModeEnabled())
|
||
fn_vCancelCurrentSelection(FALSE);
|
||
|
||
// select all objects in pyramid
|
||
for (pElem = GetCurrentWorld()->GetListAllObjects()->GetHeadElement(pos); pElem;
|
||
pElem = GetCurrentWorld()->GetListAllObjects()->GetNextElement(pos))
|
||
{
|
||
h_stObjectGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pElem->GetStruct());
|
||
POS_fn_vGetTranslationVector(h_stObjectGlobalMatrix,&stPosObject);
|
||
if (fn_bIsVertexInSelectionPyramid(&stPosObject))
|
||
{
|
||
if (fn_bCanSelect(pElem) == C_Accept)
|
||
{
|
||
// object already selected ?
|
||
pPreviousSelection = GetPreviousSelection(pElem);
|
||
if (!pPreviousSelection)
|
||
fn_vAddSelectedObject(pElem, FALSE);
|
||
}
|
||
}
|
||
}
|
||
fn_vUpdateAll(E_mc_UpdateSelection);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: set all drawing flags
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetDrawingFlags (CPA_SuperObject *pEdObj, tdeDrawingFlag eNewFlag)
|
||
{
|
||
CPA_SuperObject *pChild;
|
||
|
||
// set flag
|
||
pEdObj->CPA_SuperObjectBase::SetDrawingFlag(eNewFlag);
|
||
// next level (recursive function)
|
||
for (pChild = pEdObj->GetSuperObjectFirstChild(); pChild;
|
||
pChild = pEdObj->GetSuperObjectNextChild(pChild))
|
||
SetDrawingFlags(pChild, eNewFlag);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: center object
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vCenterOnObject (CPA_SuperObject *pTarget, BOOL bZoom, BOOL bKeepTargeted)
|
||
{
|
||
DEV_ViewPort3D *pCurViewport;
|
||
CPA_CameraDLLBase *p_oCameraInterface;
|
||
CPA_BaseObject *p_oCamera;
|
||
BOOL bWasNotTargeted;
|
||
|
||
// get camera
|
||
pCurViewport = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
p_oCameraInterface = pCurViewport->GetCameraInterface();
|
||
if (! p_oCameraInterface) return;
|
||
p_oCamera = pCurViewport->GetCamera();
|
||
if (! p_oCamera) return;
|
||
|
||
bWasNotTargeted = (p_oCameraInterface->GetTargetType(p_oCamera) == tNone);
|
||
|
||
// target on super-object
|
||
p_oCameraInterface->SetTargetSuperObject(p_oCamera,pTarget);
|
||
p_oCameraInterface->SetTargetType(p_oCamera,tSuperObject);
|
||
p_oCameraInterface->Update(p_oCamera);
|
||
// zoom
|
||
if (bZoom)
|
||
{
|
||
p_oCameraInterface->ZoomOnTarget(p_oCamera, pTarget);
|
||
p_oCameraInterface->Update(p_oCamera);
|
||
}
|
||
// reinit camera mode
|
||
if ((!bKeepTargeted)&&(bWasNotTargeted))
|
||
{
|
||
p_oCameraInterface->SetTargetType(p_oCamera,tNone);
|
||
p_oCameraInterface->Update(p_oCamera);
|
||
}
|
||
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: center object
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vZoomOnObject (CPA_SuperObject *pTarget)
|
||
{
|
||
DEV_ViewPort3D *pCurViewport;
|
||
CPA_CameraDLLBase *p_oCameraInterface;
|
||
CPA_BaseObject *p_oCamera;
|
||
|
||
// get camera
|
||
pCurViewport = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
p_oCameraInterface = pCurViewport->GetCameraInterface();
|
||
if (! p_oCameraInterface) return;
|
||
p_oCamera = pCurViewport->GetCamera();
|
||
if (! p_oCamera) return;
|
||
|
||
// zoom
|
||
p_oCameraInterface->ZoomOnTarget(p_oCamera, pTarget);
|
||
p_oCameraInterface->Update(p_oCamera);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: set auto target
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetAutoTarget (BOOL bAutoTarget)
|
||
{
|
||
DEV_ViewPort3D *pCurViewport;
|
||
CPA_CameraDLLBase *p_oCameraInterface;
|
||
CPA_BaseObject *p_oCamera;
|
||
|
||
// get camera
|
||
pCurViewport = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
p_oCameraInterface = pCurViewport->GetCameraInterface();
|
||
p_oCamera = pCurViewport->GetCamera();
|
||
if (!p_oCameraInterface || ! p_oCamera)
|
||
return;
|
||
|
||
if (m_bAutoTarget != bAutoTarget)
|
||
{
|
||
// update flag
|
||
m_bAutoTarget = bAutoTarget;
|
||
// update camera
|
||
if (m_bAutoTarget)
|
||
{
|
||
// save previous mode
|
||
m_ePreviousMode = p_oCameraInterface->GetTargetType(p_oCamera);
|
||
// if necessary , target selection
|
||
if (GetCurrentWorld()->GetCountSelected() == 1)
|
||
fn_vCenterOnObject(GetCurrentWorld()->GetSingleSelection(), FALSE, TRUE);
|
||
}
|
||
else
|
||
{
|
||
p_oCameraInterface->SetTargetType(p_oCamera,m_ePreviousMode);
|
||
p_oCameraInterface->Update(p_oCamera);
|
||
}
|
||
// update dialogbar
|
||
GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateAutoTarget(m_bAutoTarget);
|
||
}
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: set auto zoom
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetAutoZoom (BOOL bAutoZoom)
|
||
{
|
||
DEV_ViewPort3D *pCurViewport;
|
||
CPA_CameraDLLBase *p_oCameraInterface;
|
||
CPA_BaseObject *p_oCamera;
|
||
|
||
// get camera
|
||
pCurViewport = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
p_oCameraInterface = pCurViewport->GetCameraInterface();
|
||
p_oCamera = pCurViewport->GetCamera();
|
||
if (!p_oCameraInterface || ! p_oCamera)
|
||
return;
|
||
|
||
if (m_bAutoZoom != bAutoZoom)
|
||
{
|
||
// update flag
|
||
m_bAutoZoom = bAutoZoom;
|
||
// update camera
|
||
if (m_bAutoZoom && (GetCurrentWorld()->GetCountSelected() == 1))
|
||
fn_vCenterOnObject(GetCurrentWorld()->GetSingleSelection(), TRUE, FALSE);
|
||
// update dialogbar
|
||
GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateAutoZoom(m_bAutoZoom);
|
||
}
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: set constrain for X axes
|
||
* Creation date:
|
||
* Author: DCerbu
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetConsX (BOOL bCons)
|
||
{
|
||
|
||
m_bConsX=bCons;
|
||
}
|
||
/*===========================================================================
|
||
* Description: set constrain for Y axes
|
||
* Creation date:
|
||
* Author: DCerbu
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetConsY (BOOL bCons)
|
||
{
|
||
m_bConsY=bCons;
|
||
}
|
||
/*===========================================================================
|
||
* Description: set constrain for Z axes
|
||
* Creation date:
|
||
* Author: DCerbu
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetConsZ (BOOL bCons)
|
||
{
|
||
m_bConsZ=bCons;
|
||
}
|
||
|
||
//#################################################################################
|
||
// USER PREFIX
|
||
//#################################################################################
|
||
/*===========================================================================
|
||
* Description: get prefixed name for unicity
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CString CPA_Interface::GetPrefixedName (const CString csName)
|
||
{
|
||
CString csPrefix, csPrefixedName;
|
||
|
||
// get current prefix
|
||
csPrefix = csName.Left(4);
|
||
|
||
// if necessary, add prefix
|
||
csPrefixedName = (csPrefix == m_csUserPrefix) ? csName : m_csUserPrefix + csName;
|
||
|
||
return csPrefixedName;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: check prefix for permissions
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bCanModifyObject (CPA_BaseObject *pObject)
|
||
{
|
||
CString csPrefix;
|
||
long lIndex;
|
||
|
||
|
||
// get object prefix
|
||
csPrefix = pObject->GetName().Left(4);
|
||
|
||
// can modify user objects
|
||
if (csPrefix == m_csUserPrefix)
|
||
return TRUE;
|
||
|
||
lIndex = GetPrefixIndex(csPrefix.Left(3));
|
||
csPrefix = (lIndex != -1) ? csPrefix.Left(3) : "";
|
||
|
||
// can modify objects with authorized prefix
|
||
if (fn_bIsAuthorized(csPrefix))
|
||
return TRUE;
|
||
|
||
// never modify objects with forbidden prefix
|
||
if (fn_bIsProhibited(csPrefix))
|
||
return FALSE;
|
||
|
||
// else must ask for permission
|
||
return m_oDialogPermission.fn_bDoDialog(this, pObject, lIndex);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: init user prefix
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vInitUserPrefix (void)
|
||
{
|
||
CString csFileName, csUserPrefix;
|
||
char szUserPrefix[256];
|
||
BOOL bUserList;
|
||
|
||
// load list of available users
|
||
bUserList = fn_bLoadListOfUsers();
|
||
|
||
// try to read preference
|
||
if (m_csUserPrefix.IsEmpty())
|
||
{
|
||
// user prefix
|
||
if (m_bUseUserPreferences)
|
||
{
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
GetPrivateProfileString ("User", "User Prefix", "", szUserPrefix, 5, (char*)(LPCSTR)csFileName);
|
||
csUserPrefix = szUserPrefix;
|
||
}
|
||
|
||
// if no preference, use dialog
|
||
if (csUserPrefix.IsEmpty())
|
||
{
|
||
if (!bUserList)
|
||
csUserPrefix = "DS1";
|
||
else
|
||
csUserPrefix = GetUserFromUsersFile();
|
||
}
|
||
|
||
// set user prefix
|
||
if (csUserPrefix.GetLength() > 3)
|
||
csUserPrefix = csUserPrefix.Left(3);
|
||
else while (csUserPrefix.GetLength() < 3)
|
||
csUserPrefix += "_";
|
||
|
||
m_csUserPrefix = csUserPrefix + "_";
|
||
|
||
if (m_bUseUserPreferences)
|
||
{
|
||
// read permissions
|
||
fn_vLoadAuthorizations();
|
||
// read interdictions
|
||
fn_vLoadProhibitions();
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: load list of avalable users and prefix
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bLoadListOfUsers (void)
|
||
{
|
||
CString csFileName, csUser;
|
||
FILE *pFile;
|
||
char szUser[256];
|
||
int iPos;
|
||
|
||
m_lNbUsers = 0;
|
||
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + "\\UserList.txt";
|
||
|
||
// open file
|
||
pFile = fopen((char*)(LPCTSTR)csFileName, "rt");
|
||
if (!pFile)
|
||
{
|
||
AfxMessageBox("Unable to open EDT_DATA\\UserList.txt",MB_ICONEXCLAMATION | MB_OK);
|
||
return FALSE;
|
||
}
|
||
|
||
// get all user names and prefix
|
||
while (fgets(szUser, 256, pFile) != NULL)
|
||
{
|
||
csUser = szUser;
|
||
iPos = csUser.Find(" = ");
|
||
m_a_csUserNames[m_lNbUsers] = csUser.Left(iPos);
|
||
m_a_csUserPrefix[m_lNbUsers] = csUser.Mid(iPos+3,3);
|
||
m_lNbUsers++;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: ask user to get prefix
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
CString CPA_Interface::GetUserFromUsersFile (void)
|
||
{
|
||
long lIndex;
|
||
|
||
// ask user for his name
|
||
lIndex = m_oDialogPrefix.fn_lDoDialog(this, m_a_csUserNames, m_lNbUsers);
|
||
// register corresponding prefix
|
||
return (m_a_csUserPrefix[lIndex]);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: get index from prefix
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
long CPA_Interface::GetPrefixIndex (CString csUserPrefix)
|
||
{
|
||
long lIndex;
|
||
|
||
// check prefix list
|
||
for (lIndex = 0; lIndex < m_lNbUsers; lIndex++)
|
||
{
|
||
if (m_a_csUserPrefix[lIndex] == csUserPrefix)
|
||
return lIndex;
|
||
}
|
||
|
||
// prefix was not found
|
||
return -1;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: add authorisation for given prefix
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vAddAuthorization (CString csPrefix)
|
||
{
|
||
if (!fn_bIsAuthorized(csPrefix))
|
||
m_a_csAuthorized[m_lNbAuthorized++] = csPrefix;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: check if given prefix is authorized
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bIsAuthorized (CString csPrefix)
|
||
{
|
||
long lIndex;
|
||
|
||
for (lIndex = 0; lIndex < m_lNbAuthorized; lIndex++)
|
||
{
|
||
if (m_a_csAuthorized[lIndex] == csPrefix)
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: add authorisation for given prefix
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vAddProhibition (CString csPrefix)
|
||
{
|
||
if (!fn_bIsProhibited(csPrefix))
|
||
m_a_csProhibited[m_lNbProhibited++] = csPrefix;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: check if given prefix is authorized
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bIsProhibited (CString csPrefix)
|
||
{
|
||
long lIndex;
|
||
|
||
for (lIndex = 0; lIndex < m_lNbProhibited; lIndex++)
|
||
{
|
||
if (m_a_csProhibited[lIndex] == csPrefix)
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: save user preference
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSaveUserPrefix (CString csUserPrefix)
|
||
{
|
||
CString csFileName;
|
||
BOOL bRes;
|
||
|
||
// preference file
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
// try to write preference
|
||
bRes = WritePrivateProfileString ("User", "User Prefix", (char*)(LPCSTR) csUserPrefix, (char*)(LPCSTR)csFileName);
|
||
// warning if problem
|
||
if (!bRes)
|
||
M_GetMainWnd()->UpdateStatus("Hierarchy Editor cannot save your preferences. CPAPref.ini may have a ReadOnly status ?", C_STATUSPANE_INFOS, C_STATUS_WARNING);
|
||
else
|
||
M_GetMainWnd()->UpdateStatus("Preferences saved", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: save user preference
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSaveAuthorizations (void)
|
||
{
|
||
CString csFileName;
|
||
BOOL bRes;
|
||
long lIndex;
|
||
char szText[30];
|
||
|
||
// preference file
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
// try to write nb authorizations
|
||
sprintf(szText, "%ld", m_lNbAuthorized);
|
||
bRes = WritePrivateProfileString ("Permissions", "Nb Authorized", szText, (char*)(LPCSTR)csFileName);
|
||
// write each authorization
|
||
for (lIndex = 0; lIndex < m_lNbAuthorized; lIndex++)
|
||
{
|
||
sprintf(szText, "Authorized%ld", lIndex);
|
||
WritePrivateProfileString ("Permissions", szText, (char*)(LPCSTR) m_a_csAuthorized[lIndex], (char*)(LPCSTR)csFileName);
|
||
}
|
||
// warning if problem
|
||
if (!bRes)
|
||
M_GetMainWnd()->UpdateStatus("Hierarchy Editor cannot save your preferences. CPAPref.ini may have a ReadOnly status ?", C_STATUSPANE_INFOS, C_STATUS_WARNING);
|
||
else
|
||
M_GetMainWnd()->UpdateStatus("Preferences saved", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: save user preference
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSaveProhibitions (void)
|
||
{
|
||
CString csFileName;
|
||
BOOL bRes;
|
||
long lIndex;
|
||
char szText[30];
|
||
|
||
// preference file
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
// try to write nb authorizations
|
||
sprintf(szText, "%ld", m_lNbProhibited);
|
||
bRes = WritePrivateProfileString ("Interdictions", "Nb Prohibited", szText, (char*)(LPCSTR)csFileName);
|
||
// write each authorization
|
||
for (lIndex = 0; lIndex < m_lNbProhibited; lIndex++)
|
||
{
|
||
sprintf(szText, "Prohibited%ld", lIndex);
|
||
WritePrivateProfileString ("Interdictions", szText, (char*)(LPCSTR) m_a_csProhibited[lIndex], (char*)(LPCSTR)csFileName);
|
||
}
|
||
// warning if problem
|
||
if (!bRes)
|
||
M_GetMainWnd()->UpdateStatus("Hierarchy Editor cannot save your preferences. CPAPref.ini may have a ReadOnly status ?", C_STATUSPANE_INFOS, C_STATUS_WARNING);
|
||
else
|
||
M_GetMainWnd()->UpdateStatus("Preferences saved", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: load user preference
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vLoadAuthorizations (void)
|
||
{
|
||
CString csFileName;
|
||
long lIndex;
|
||
char szText[30];
|
||
char szEntry[30];
|
||
|
||
// preference file
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
// try to write nb authorizations
|
||
GetPrivateProfileString ("Permissions", "Nb Authorized", "", szText, 30, (char*)(LPCSTR)csFileName);
|
||
if (strcmp(szText, ""))
|
||
sscanf(szText, "%ld", &m_lNbAuthorized);
|
||
else
|
||
m_lNbProhibited = 0;
|
||
// write each authorization
|
||
for (lIndex = 0; lIndex < m_lNbAuthorized; lIndex++)
|
||
{
|
||
sprintf(szEntry, "Authorized%ld", lIndex);
|
||
GetPrivateProfileString ("Permissions", szEntry, "", szText, 30, (char*)(LPCSTR)csFileName);
|
||
m_a_csAuthorized[lIndex] = szText;
|
||
}
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: load user preference
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vLoadProhibitions (void)
|
||
{
|
||
CString csFileName;
|
||
long lIndex;
|
||
char szText[30];
|
||
char szEntry[30];
|
||
|
||
// preference file
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
// try to write nb authorizations
|
||
GetPrivateProfileString ("Interdictions", "Nb Prohibited", "", szText, 30, (char*)(LPCSTR)csFileName);
|
||
if (strcmp(szText, ""))
|
||
sscanf(szText, "%ld", &m_lNbProhibited);
|
||
else
|
||
m_lNbProhibited = 0;
|
||
// write each authorization
|
||
for (lIndex = 0; lIndex < m_lNbProhibited; lIndex++)
|
||
{
|
||
sprintf(szEntry, "Prohibited%ld", lIndex);
|
||
GetPrivateProfileString ("Interdictions", szEntry, "", szText, 30, (char*)(LPCSTR)csFileName);
|
||
m_a_csProhibited[lIndex] = szText;
|
||
}
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: Translation of the CPA_SuperObject
|
||
* Creation date: oct 20 -1997
|
||
* Author: DCerbu
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vTranslate (CPA_SuperObject *pSelected,MTH3D_tdstVector *p_stVector, BOOL bAbsolute)
|
||
{
|
||
POS_tdstCompletePosition stMatrix,*p_stMatrix;
|
||
MTH3D_tdstVector stVector,stTemp;
|
||
|
||
POS_fn_vSetIdentityMatrix(&stMatrix);
|
||
// translation on OBJECT axis
|
||
if (!bAbsolute)
|
||
{
|
||
// update vector according to the rotation matrix of the object
|
||
stMatrix = *(HIE_fn_hGetSuperObjectMatrix(pSelected->GetStruct()));
|
||
MTH3D_M_vNullVector(&stVector);
|
||
POS_fn_vSetTranslationVector(&stMatrix, &stVector);
|
||
POS_fn_vMulMatrixVertex(&stVector, &stMatrix, p_stVector);
|
||
}
|
||
// Translation on CAMERA's axis
|
||
else
|
||
{
|
||
// update vector according to object's position
|
||
POS_fn_vInvertMatrix(&stMatrix,HIE_fn_hGetSuperObjectGlobalMatrix(HIE_fn_hGetSuperObjectFather(pSelected->GetStruct())));
|
||
MTH3D_M_vNullVector(&stVector);
|
||
POS_fn_vSetTranslationVector(&stMatrix, &stVector);
|
||
POS_fn_vMulMatrixVertex(&stVector, &stMatrix, p_stVector);
|
||
}
|
||
|
||
// update the translation vector of the object
|
||
p_stMatrix = HIE_fn_hGetSuperObjectMatrix(pSelected->GetStruct());
|
||
POS_fn_vGetTranslationVector(p_stMatrix, &stTemp);
|
||
MTH3D_M_vAddVector(&stTemp, &stTemp, &stVector);
|
||
POS_fn_vSetTranslationVector(p_stMatrix, &stTemp);
|
||
// POS_fn_vNormalizeMatrix(p_stMatrix);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: scale all pure editor objects
|
||
* Creation date: 03-09-98
|
||
* Author: ionut grozea
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vScale ()
|
||
{
|
||
CPA_List<CPA_SuperObject> *poListWayPoint;
|
||
CPA_List<CPA_SuperObject> *poListLights;
|
||
CPA_ObjectDLLBase *poObjectDLL;
|
||
CPA_SuperObject *poSuperObject;
|
||
CPA_SuperObject *poGraphicSupObj;
|
||
POSITION xSuperObjectPos;
|
||
|
||
|
||
//for lights
|
||
poListLights = GetObjectListByType ("Light");
|
||
poObjectDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLLightName);
|
||
|
||
// loop on the light super object
|
||
for (poSuperObject = poListLights->GetHeadElement(xSuperObjectPos); poSuperObject;
|
||
poSuperObject = poListLights->GetNextElement(xSuperObjectPos))
|
||
{
|
||
MTH3D_tdstVector stVectI,stVectJ,stVectK;
|
||
MTH3D_tdstVector stScale;
|
||
POS_tdstCompletePosition stMatrix, stTempCMatrix ,stCMatrix;
|
||
DEV_ViewPort3D *pCurViewport;
|
||
double dist;
|
||
|
||
// init vectors
|
||
MTH3D_M_vNullVector(&stVectI);
|
||
MTH3D_M_vNullVector(&stVectJ);
|
||
MTH3D_M_vNullVector(&stVectK);
|
||
|
||
// get graphic object
|
||
poGraphicSupObj = poObjectDLL->GetVisualSuperObject(poSuperObject);
|
||
if (poGraphicSupObj)
|
||
{
|
||
//the new matrix
|
||
POS_fn_vSetIdentityMatrix(&stMatrix);
|
||
POS_fn_vSetIdentityMatrix(&stCMatrix);
|
||
POS_fn_vSetIdentityMatrix(&stTempCMatrix);
|
||
|
||
stMatrix = *(HIE_fn_hGetSuperObjectGlobalMatrix(poGraphicSupObj->GetStruct()));
|
||
pCurViewport = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
GLI_xGetCameraMatrix(pCurViewport->GetEngineCamera(),&stTempCMatrix);
|
||
POS_fn_vInvertMatrix(&stCMatrix,&stTempCMatrix);
|
||
dist = sqrt((stMatrix.stTranslationVector.xX-stCMatrix.stTranslationVector.xX)*(stMatrix.stTranslationVector.xX-stCMatrix.stTranslationVector.xX)
|
||
+
|
||
(stMatrix.stTranslationVector.xY-stCMatrix.stTranslationVector.xY)*(stMatrix.stTranslationVector.xY-stCMatrix.stTranslationVector.xY)
|
||
+
|
||
(stMatrix.stTranslationVector.xZ-stCMatrix.stTranslationVector.xZ)*(stMatrix.stTranslationVector.xZ-stCMatrix.stTranslationVector.xZ)
|
||
);
|
||
stScale.xX =(float) (1+dist*C_lNbConst);
|
||
stScale.xY = (float)(1+dist*C_lNbConst);
|
||
stScale.xZ = (float)(1+dist*C_lNbConst);
|
||
MTH3D_M_vSetXofVector(&stVectI, MTH3D_M_xGetXofVector(&stScale));
|
||
MTH3D_M_vSetYofVector(&stVectJ, MTH3D_M_xGetYofVector(&stScale));
|
||
MTH3D_M_vSetZofVector(&stVectK, MTH3D_M_xGetZofVector(&stScale));
|
||
|
||
POS_fn_vSetScaleMatrix(HIE_fn_hGetSuperObjectMatrix(poGraphicSupObj->GetStruct()),&stVectI,&stVectJ,&stVectK);
|
||
}
|
||
}
|
||
|
||
|
||
//for waypoint
|
||
poListWayPoint = GetObjectListByType ("Waypoint");
|
||
poObjectDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLWayPointName);
|
||
|
||
// loop on the waypoint super object
|
||
for (poSuperObject = poListWayPoint->GetHeadElement(xSuperObjectPos); poSuperObject;
|
||
poSuperObject = poListWayPoint->GetNextElement(xSuperObjectPos))
|
||
{
|
||
MTH3D_tdstVector stVectI={0.f,0.f,0.f}, stVectJ={0.f,0.f,0.f},stVectK={0.f,0.f,0.f};
|
||
MTH3D_tdstVector stScale={0.f,0.f,0.f};
|
||
POS_tdstCompletePosition stMatrix, stTempCMatrix ,stCMatrix;
|
||
DEV_ViewPort3D *pCurViewport;
|
||
double dist;
|
||
|
||
// init vectors
|
||
MTH3D_M_vNullVector(&stVectI);
|
||
MTH3D_M_vNullVector(&stVectJ);
|
||
MTH3D_M_vNullVector(&stVectK);
|
||
|
||
// get graphic object
|
||
poGraphicSupObj = poObjectDLL->GetVisualSuperObject(poSuperObject);
|
||
if (poGraphicSupObj)
|
||
{
|
||
//the new matrix
|
||
POS_fn_vSetIdentityMatrix(&stMatrix);
|
||
POS_fn_vSetIdentityMatrix(&stCMatrix);
|
||
POS_fn_vSetIdentityMatrix(&stTempCMatrix);
|
||
stMatrix = *(HIE_fn_hGetSuperObjectGlobalMatrix(poGraphicSupObj->GetStruct()));
|
||
pCurViewport = (DEV_ViewPort3D *) GetMultiDevice()->GetFocusDevice()->GetViewPort();
|
||
GLI_xGetCameraMatrix(pCurViewport->GetEngineCamera(),&stTempCMatrix);
|
||
stCMatrix = stTempCMatrix;
|
||
POS_fn_vInvertMatrix(&stCMatrix,&stTempCMatrix);
|
||
dist = sqrt((stMatrix.stTranslationVector.xX-stCMatrix.stTranslationVector.xX)*(stMatrix.stTranslationVector.xX-stCMatrix.stTranslationVector.xX)
|
||
+
|
||
(stMatrix.stTranslationVector.xY-stCMatrix.stTranslationVector.xY)*(stMatrix.stTranslationVector.xY-stCMatrix.stTranslationVector.xY)
|
||
+
|
||
(stMatrix.stTranslationVector.xZ-stCMatrix.stTranslationVector.xZ)*(stMatrix.stTranslationVector.xZ-stCMatrix.stTranslationVector.xZ)
|
||
);
|
||
stScale.xX = (float)(1+dist*C_lNbConst);
|
||
stScale.xY = (float)(1+dist*C_lNbConst);
|
||
stScale.xZ = (float)(1+dist*C_lNbConst);
|
||
MTH3D_M_vSetXofVector(&stVectI, MTH3D_M_xGetXofVector(&stScale));
|
||
MTH3D_M_vSetYofVector(&stVectJ, MTH3D_M_xGetYofVector(&stScale));
|
||
MTH3D_M_vSetZofVector(&stVectK, MTH3D_M_xGetZofVector(&stScale));
|
||
|
||
POS_fn_vSetScaleMatrix(HIE_fn_hGetSuperObjectMatrix(poGraphicSupObj->GetStruct()),&stVectI,&stVectJ,&stVectK);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: rescale all pure editor objects
|
||
* Creation date: 03-09-98
|
||
* Author: ionut grozea
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vReScale ()
|
||
{
|
||
CPA_List<CPA_SuperObject> *poListWayPoint;
|
||
CPA_List<CPA_SuperObject> *poListLights;
|
||
CPA_ObjectDLLBase *poObjectDLL;
|
||
CPA_SuperObject *poSuperObject;
|
||
CPA_SuperObject *poGraphicSupObj;
|
||
POSITION xSuperObjectPos;
|
||
|
||
|
||
//for lights
|
||
poListLights = GetObjectListByType ("Light");
|
||
poObjectDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLLightName);
|
||
|
||
// loop on the light super object
|
||
for (poSuperObject = poListLights->GetHeadElement(xSuperObjectPos); poSuperObject;
|
||
poSuperObject = poListLights->GetNextElement(xSuperObjectPos))
|
||
{
|
||
// get graphic object
|
||
poGraphicSupObj = poObjectDLL->GetVisualSuperObject(poSuperObject);
|
||
if (poGraphicSupObj)
|
||
{
|
||
POS_fn_vResetScaleMatrix(HIE_fn_hGetSuperObjectMatrix(poGraphicSupObj->GetStruct()));
|
||
}
|
||
}
|
||
|
||
//for WayPoint
|
||
poListWayPoint = GetObjectListByType ("Waypoint");
|
||
poObjectDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLWayPointName);
|
||
|
||
// loop on the WayPoint super object
|
||
for (poSuperObject = poListWayPoint->GetHeadElement(xSuperObjectPos); poSuperObject;
|
||
poSuperObject=poListWayPoint->GetNextElement(xSuperObjectPos))
|
||
{
|
||
// get graphic object
|
||
poGraphicSupObj = poObjectDLL->GetVisualSuperObject(poSuperObject);
|
||
if (poGraphicSupObj)
|
||
{
|
||
POS_fn_vResetScaleMatrix(HIE_fn_hGetSuperObjectMatrix(poGraphicSupObj->GetStruct()));
|
||
}
|
||
}
|
||
|
||
fn_vUpdateAll(E_mc_UpdateAll);
|
||
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: save user preference
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSaveDisplayMode (void)
|
||
{
|
||
CPA_CameraDLLBase *p_oCameraInterface = ((DEV_ViewPort3D *) GetMultiDevice3D()->GetFocusDevice()->GetViewPort())->GetCameraInterface();
|
||
tdeDisplayReferential eDisplayModeAxis = p_oCameraInterface ? p_oCameraInterface -> GetReferentialDisplayMode() : DisplayNone ;
|
||
CString csFileName, csEntry;
|
||
BOOL bRes;
|
||
char cRed, cGreen, cBlue;
|
||
|
||
// preference file
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
// try to write preference
|
||
//
|
||
// Appearance
|
||
bRes = WritePrivateProfileString ("Drawing", "Appearance - Textured", fn_bWorldIsTextured() ? "TRUE" : "FALSE", (char*)(LPCSTR)csFileName);
|
||
bRes &= WritePrivateProfileString ("Drawing", "Appearance - Grided", fn_bWorldIsGrided() ? "TRUE" : "FALSE", (char*)(LPCSTR)csFileName);
|
||
bRes &= WritePrivateProfileString ("Drawing", "Appearance - Wired", fn_bWorldIsWired() ? "TRUE" : "FALSE", (char*)(LPCSTR)csFileName);
|
||
//
|
||
// Display
|
||
switch (m_oSpecificInterface.GetDisplayMode())
|
||
{
|
||
case E_dm_DrawWorld: csEntry = "World"; break;
|
||
case E_dm_DrawCollisionMap: csEntry = "Collision Map"; break;
|
||
case E_dm_DrawVisibleSectors: csEntry = "Visible"; break;
|
||
case E_dm_DrawOnlyCurrentSector: csEntry = "Current"; break;
|
||
}
|
||
bRes &= WritePrivateProfileString ("Drawing", "Display Mode", (char*)(LPCSTR) csEntry, (char*)(LPCSTR)csFileName);
|
||
//
|
||
// Bounding Volume
|
||
switch( m_eBVMode )
|
||
{
|
||
case E_bv_None: csEntry = "None"; break;
|
||
case E_bv_Sectors: csEntry = "Sectors"; break;
|
||
case E_bv_Actors: csEntry = "Actors"; break;
|
||
case E_bv_Objects: csEntry = "Objects"; break;
|
||
}
|
||
bRes &= WritePrivateProfileString ("Drawing", "Bounding Volume", (char*)(LPCSTR) csEntry, (char*)(LPCSTR)csFileName);
|
||
//
|
||
// Axis
|
||
switch( eDisplayModeAxis )
|
||
{
|
||
case DisplayNone: csEntry = "None"; break;
|
||
case DisplayDownRight: csEntry = "Down Right Corner"; break;
|
||
case DisplayDownLeft: csEntry = "Down Left Corner"; break;
|
||
}
|
||
bRes &= WritePrivateProfileString ("Drawing", "Axis", (char*)(LPCSTR) csEntry, (char*)(LPCSTR)csFileName);
|
||
//
|
||
// Objects Center
|
||
switch( m_iShowCenter )
|
||
{
|
||
case 0: csEntry = "None"; break;
|
||
case 1: csEntry = "Objects"; break;
|
||
case 2: csEntry = "Instances"; break;
|
||
}
|
||
bRes &= WritePrivateProfileString ("Drawing", "Objects Center", (char*)(LPCSTR) csEntry, (char*)(LPCSTR)csFileName);
|
||
//
|
||
// Background color
|
||
GetMultiDevice() -> GetBackgroundColor( &cRed, &cGreen, &cBlue );
|
||
csEntry . Format( "%d,%d,%d", cRed, cGreen, cBlue );
|
||
bRes &= WritePrivateProfileString ("Drawing", "Background Color", (char*)(LPCSTR) csEntry, (char*)(LPCSTR)csFileName);
|
||
//
|
||
// warning if problem
|
||
if (!bRes)
|
||
M_GetMainWnd()->UpdateStatus("Hierarchy Editor cannot save your preferences. CPAPref.ini may have a ReadOnly status ?", C_STATUSPANE_INFOS, C_STATUS_WARNING);
|
||
else
|
||
M_GetMainWnd()->UpdateStatus("Preferences saved", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: load user preference
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
|
||
char cRed, cGreen, cBlue; //chbani Moved from functin to Global because c plante dans sscanf
|
||
// je ne sais pas prq?
|
||
|
||
void CPA_Interface::fn_vLoadDisplayMode (void)
|
||
{
|
||
CString csFileName;
|
||
char szText[30];
|
||
CPA_CameraDLLBase *p_oCameraInterface = (CPA_CameraDLLBase*)GetMainWorld() -> GetObjectDLLWithName( C_szDLLCameraName );
|
||
|
||
|
||
// preference file
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
// try to read preferences
|
||
//
|
||
// Appearance
|
||
GetPrivateProfileString ("Drawing", "Appearance - Textured", "TRUE", szText, 30, (char*)(LPCSTR)csFileName);
|
||
fn_vChangeWorldMask(GLI_C_lIsTextured, !stricmp( szText, "TRUE" ) );
|
||
GetPrivateProfileString ("Drawing", "Appearance - Grided", "FALSE", szText, 30, (char*)(LPCSTR)csFileName);
|
||
fn_vChangeWorldMask(GLI_C_lIsNotGrided, stricmp( szText, "TRUE" ) );
|
||
GetPrivateProfileString ("Drawing", "Appearance - Wired", "FALSE", szText, 30, (char*)(LPCSTR)csFileName);
|
||
fn_vChangeWorldMask(GLI_C_lIsNotWired, stricmp( szText, "TRUE" ) );
|
||
//
|
||
// Display
|
||
GetPrivateProfileString ("Drawing", "Display Mode", "World", szText, 30, (char*)(LPCSTR)csFileName);
|
||
if ( !stricmp( szText, "World" ) )
|
||
m_oSpecificInterface.SetDisplayMode(E_dm_DrawWorld);
|
||
else if ( !stricmp( szText, "Collision Map" ) )
|
||
m_oSpecificInterface.SetDisplayMode(E_dm_DrawCollisionMap);
|
||
else if ( !stricmp( szText, "Visible" ) )
|
||
m_oSpecificInterface.SetDisplayMode(E_dm_DrawVisibleSectors);
|
||
else if ( !stricmp( szText, "Current" ) )
|
||
m_oSpecificInterface.SetDisplayMode(E_dm_DrawOnlyCurrentSector);
|
||
//
|
||
// Bounding Volume
|
||
GetPrivateProfileString ("Drawing", "Bounding Volume", "None", szText, 30, (char*)(LPCSTR)csFileName);
|
||
if( !stricmp( szText, "None" ) ) fn_vSetBVMode( E_bv_None );
|
||
else if( !stricmp( szText, "Sectors" ) ) fn_vSetBVMode( E_bv_Sectors );
|
||
else if( !stricmp( szText, "Actors" ) ) fn_vSetBVMode( E_bv_Actors );
|
||
else if( !stricmp( szText, "Objects" ) ) fn_vSetBVMode( E_bv_Objects );
|
||
//
|
||
// Axis
|
||
if( p_oCameraInterface )
|
||
{
|
||
GetPrivateProfileString ("Drawing", "Axis", "None", szText, 30, (char*)(LPCSTR)csFileName);
|
||
if( !stricmp( szText, "None" ) ) p_oCameraInterface -> SetReferentialDisplayMode( DisplayNone );
|
||
else if( !stricmp( szText, "Down Right Corner" ) ) p_oCameraInterface -> SetReferentialDisplayMode( DisplayDownRight );
|
||
else if( !stricmp( szText, "Down Left Corner" ) ) p_oCameraInterface -> SetReferentialDisplayMode( DisplayDownLeft );
|
||
}
|
||
|
||
|
||
//
|
||
// Object Center
|
||
GetPrivateProfileString ("Drawing", "Objects Center", "None", szText, 30, (char*)(LPCSTR)csFileName);
|
||
if( !stricmp( szText, "None" ) )
|
||
{
|
||
SetShowcenter( 0 );
|
||
GetFrameBase()->m_oGeneralDialogBar.m_oDisplayToolbar.SetButton(IDCB_NORMAL);
|
||
}
|
||
else if( !stricmp( szText, "Objects" ) )
|
||
{
|
||
SetShowcenter( 1 );
|
||
GetFrameBase()->m_oGeneralDialogBar.m_oDisplayToolbar.SetButton(IDCB_ALLCENTERS);
|
||
}
|
||
else if( !stricmp( szText, "Instances" ) )
|
||
{
|
||
SetShowcenter( 2 );
|
||
GetFrameBase()->m_oGeneralDialogBar.m_oDisplayToolbar.SetButton(IDCB_MAINCENTERS);
|
||
}
|
||
|
||
//
|
||
// Background color
|
||
GetPrivateProfileString ("Drawing", "Background Color", "", szText, 30, (char*)(LPCSTR)csFileName);
|
||
if( strlen( szText ) )
|
||
{
|
||
sscanf( szText, "%d,%d,%d", &cRed, &cGreen, &cBlue );
|
||
GetMultiDevice() -> SetBackgroundColor( cRed, cGreen, cBlue );
|
||
}
|
||
|
||
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: save options
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSaveOptions (void)
|
||
{
|
||
CString csFileName, csText;
|
||
BOOL bRes;
|
||
|
||
// preference file
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
|
||
// write general options
|
||
csText = g_oCoherenceManager.m_fn_bIsCoherenceManagerDialogAutomatic() ? "TRUE" : "FALSE";
|
||
bRes = WritePrivateProfileString ("Options", "Automatic Coherence", (char*)(LPCSTR)csText, (char*)(LPCSTR)csFileName);
|
||
|
||
csText = M_GetMainApp()->m_bAutoReinitTheMap ? "TRUE" : "FALSE";
|
||
bRes &= WritePrivateProfileString ("Options", "Reinit the Map", (char*)(LPCSTR)csText, (char*)(LPCSTR)csFileName);
|
||
|
||
csText = fn_bIsScaleActive() ? "TRUE" : "FALSE";
|
||
bRes &= WritePrivateProfileString ("Options", "Scale editor object", (char*)(LPCSTR)csText, (char*)(LPCSTR)csFileName);
|
||
|
||
// write pyramid depth
|
||
csText.Format("%8.4f", GetPyramidalDepth());
|
||
bRes &= WritePrivateProfileString ("Options", "Pyramid Depth", (char*)(LPCSTR)csText, (char*)(LPCSTR)csFileName);
|
||
|
||
// write target depth
|
||
csText.Format("%8.4f", GetCameraTargetDepth());
|
||
bRes &= WritePrivateProfileString ("Options", "Target Depth", (char*)(LPCSTR)csText, (char*)(LPCSTR)csFileName);
|
||
|
||
//CPA2 Gabi Dumitrascu 98/07/09
|
||
//write automatic swap
|
||
csText = fn_bGetAutomaticSwap () ? "TRUE" : "FALSE";
|
||
bRes &= WritePrivateProfileString ("Options", "Automatic swap", (char*)(LPCSTR)csText, (char*)(LPCSTR)csFileName);
|
||
|
||
//write swap mode
|
||
switch (m_eForceSwap)
|
||
{
|
||
case eSwapBoth : csText = "BOTH"; break;
|
||
case eSwapLeft : csText = "LEFT"; break;
|
||
case eSwapRight : csText = "RIGHT"; break;
|
||
}
|
||
bRes &= WritePrivateProfileString ("Options", "Swap mode", (char*)(LPCSTR)csText, (char*)(LPCSTR)csFileName);
|
||
//End CPA2 Gabi Dumitrascu 98/07/09
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: load options
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vLoadOptions (void)
|
||
{
|
||
CString csFileName;
|
||
char szText[30];
|
||
|
||
// preference file
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szInterfaceIniFile;
|
||
|
||
// read general options
|
||
GetPrivateProfileString ("Options", "Automatic Coherence", "FALSE", szText, 30, (char*)(LPCSTR)csFileName);
|
||
g_oCoherenceManager.m_fn_vSetAutomaticCoherenceManagerDialog(!stricmp(szText, "TRUE"));
|
||
|
||
GetPrivateProfileString ("Options", "Reinit the Map", "FALSE", szText, 30, (char*)(LPCSTR)csFileName);
|
||
M_GetMainApp()->m_bAutoReinitTheMap = !stricmp(szText, "TRUE");
|
||
|
||
GetPrivateProfileString ("Options", "Scale editor object", "FALSE", szText, 30, (char*)(LPCSTR)csFileName);
|
||
fn_bSetScaleActive(!stricmp(szText, "TRUE"));
|
||
|
||
// read pyramidal depth
|
||
GetPrivateProfileString ("Options", "Pyramid Depth", "FALSE", szText, 30, (char*)(LPCSTR)csFileName);
|
||
SetPyramidalDepth((float) atof(szText));
|
||
// read target depth
|
||
GetPrivateProfileString ("Options", "Target Depth", "FALSE", szText, 30, (char*)(LPCSTR)csFileName);
|
||
SetCameraTargetDepth((float) atof(szText));
|
||
|
||
//CPA2 Gabi Dumitrascu 98/07/09
|
||
GetPrivateProfileString ("Options", "Automatic swap", "TRUE", szText, 30, (char*)(LPCSTR)csFileName);
|
||
BOOL bAutomaticSwap = (stricmp(szText, "TRUE") == 0);
|
||
fn_bSetAutomaticSwap (bAutomaticSwap);
|
||
|
||
GetPrivateProfileString ("Options", "Swap mode", "Right", szText, 30, (char*)(LPCSTR)csFileName);
|
||
if (stricmp(szText, "Right") == 0) m_eForceSwap = eSwapRight;
|
||
if (stricmp(szText, "Left") == 0) m_eForceSwap = eSwapLeft;
|
||
if (stricmp(szText, "Both") == 0) m_eForceSwap = eSwapBoth;
|
||
//End CPA2 Gabi Dumitrascu 98/07/09
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: check world draw mask
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
BOOL CPA_Interface::fn_bWorldIsGrided (void)
|
||
{
|
||
HIE_tdxHandleToSuperObject hSup;
|
||
long lMask;
|
||
|
||
hSup = GetCurrentWorld()->GetRoot()->GetStruct();
|
||
lMask = HIE_fn_lGetSuperObjectDrawMask(hSup);
|
||
|
||
return !(lMask & GLI_C_lIsNotGrided);
|
||
}
|
||
|
||
BOOL CPA_Interface::fn_bWorldIsWired (void)
|
||
{
|
||
HIE_tdxHandleToSuperObject hSup;
|
||
long lMask;
|
||
|
||
hSup = GetCurrentWorld()->GetRoot()->GetStruct();
|
||
lMask = HIE_fn_lGetSuperObjectDrawMask(hSup);
|
||
|
||
return !(lMask & GLI_C_lIsNotWired);
|
||
}
|
||
|
||
BOOL CPA_Interface::fn_bWorldIsTextured (void)
|
||
{
|
||
HIE_tdxHandleToSuperObject hSup;
|
||
long lMask;
|
||
|
||
hSup = GetCurrentWorld()->GetRoot()->GetStruct();
|
||
lMask = HIE_fn_lGetSuperObjectDrawMask(hSup);
|
||
|
||
return (lMask & GLI_C_lIsTextured);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: change world draw mask
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vChangeWorldMask (long lOption, BOOL bAdd)
|
||
{
|
||
HIE_tdxHandleToSuperObject hSup;
|
||
long lMask;
|
||
|
||
hSup = GetCurrentWorld()->GetRoot()->GetStruct();
|
||
lMask = HIE_fn_lGetSuperObjectDrawMask(hSup);
|
||
|
||
// update mask
|
||
lMask = (bAdd) ? (lMask | lOption) : (lMask & ~lOption);
|
||
HIE_fn_vSetSuperObjectDrawMask(hSup,lMask);
|
||
|
||
// update Toolbar
|
||
GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateAppearance(lMask);
|
||
|
||
// update view
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: compute bounding volume
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vComputeBoundRecurs(CPA_SuperObject *pFather)
|
||
{
|
||
HIE_tdxHandleToSuperObject hSprObj;
|
||
ACP_tdxHandleOfObject hBoundingVolume;
|
||
CPA_ObjectDLLBase *p_oDLL;
|
||
CPA_SuperObject *pObject;
|
||
|
||
// TEMP => for actors
|
||
hSprObj = (HIE_tdxHandleToSuperObject) pFather->GetStruct();
|
||
if (HIE_fn_ulGetSuperObjectType(hSprObj) == HIE_C_ulActor)
|
||
{
|
||
p_oDLL = pFather->GetObjectDLL();
|
||
hBoundingVolume = p_oDLL->fn_hGetBoundingVolume(pFather->GetObject());
|
||
if (hBoundingVolume != NULL)
|
||
HIE_fn_vSetSuperObjectBoundingVolume(hSprObj, hBoundingVolume);
|
||
else
|
||
HIE_fn_vComputeAllBoundingVolumes(hSprObj);
|
||
}
|
||
|
||
// compute BV for childs
|
||
pObject = pFather->GetSuperObjectFirstChild();
|
||
|
||
if(!pObject)
|
||
{
|
||
if(pFather->GetObjectDLL())
|
||
pFather->GetObjectDLL()->fn_vComputeBoundingVolume(pFather->GetObject());
|
||
return;
|
||
}
|
||
|
||
while(pObject)
|
||
{
|
||
fn_vComputeBoundRecurs(pObject);
|
||
pObject = pFather->GetSuperObjectNextChild(pObject);
|
||
}
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: compute bounding volume
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vComputeAllBound(void)
|
||
{
|
||
HIE_tdxHandleToSuperObject hStaticWorld;
|
||
HIE_tdxHandleToSuperObject hDynamicWorld;
|
||
CPA_BaseObjectList *pList;
|
||
CPA_ObjectDLLBase *pDLL;
|
||
CPA_BaseObject *pObject;
|
||
Position xPos;
|
||
|
||
// compute BV of all physical objects
|
||
pList = m_p_oMainWorld->fn_p_oGetOriginalObjectList(C_szPhysicalObjectTypeName);
|
||
pDLL = m_p_oMainWorld->GetObjectDLLWithName(C_szDLLPhysicalObjectName);
|
||
xPos = pList->GetHeadPosition();
|
||
while(xPos)
|
||
{
|
||
pObject = pList->GetNext(xPos);
|
||
pDLL->fn_vComputeBoundingVolume(pObject);
|
||
}
|
||
|
||
// compute BV of all objects by calling the corresponding DLLs
|
||
fn_vComputeBoundRecurs(GetCurrentWorld()->GetRoot());
|
||
|
||
// Second pass : compute BV of super-objects
|
||
hDynamicWorld = HIE_fn_hGetSuperObjectFirstChild(GetMultiDevice3D()->GetEngineWorld());
|
||
hStaticWorld = HIE_fn_hGetSuperObjectNextBrother(hDynamicWorld);
|
||
|
||
// compute BV of static world
|
||
HIE_fn_vComputeBoundingVolumeOfSuperObjectBranch(hStaticWorld);
|
||
|
||
fn_vUpdatePositions();
|
||
|
||
// Refresh
|
||
fn_vUpdateAll(E_mc_JustDraw);
|
||
M_GetMainWnd()->UpdateStatus("Bounding volumes computed", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: center mode
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::SetShowcenter (int iShow)
|
||
{
|
||
// Display center of instance during Game ?
|
||
if (iShow==2)
|
||
{
|
||
g_ucDisplayCenters = 1;
|
||
}
|
||
else
|
||
{
|
||
g_ucDisplayCenters = 0;
|
||
}
|
||
m_iShowCenter = iShow;
|
||
GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateCenterMode(iShow);
|
||
if (m_iShowCenter)
|
||
fn_vComputeSuperObjectsCenters(NULL);
|
||
}
|
||
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: set bounding volumes mode
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSetBVMode (tdeBVMode eMode)
|
||
{
|
||
CPA_SuperObject *pStaticRoot, *pDynamicRoot;
|
||
CPA_SuperObject *pSector, *pActor;
|
||
|
||
switch (eMode)
|
||
{
|
||
case E_bv_None:
|
||
fn_vSetDisplayBV(FALSE, GetCurrentWorld()->GetRoot(), TRUE);
|
||
break;
|
||
|
||
case E_bv_Sectors:
|
||
// cancel previous mode
|
||
fn_vSetDisplayBV(FALSE, GetCurrentWorld()->GetRoot(), TRUE);
|
||
pStaticRoot = GetSpecificInterface()->GetStaticRoot();
|
||
// update sectors
|
||
for (pSector = pStaticRoot->GetSuperObjectFirstChild(); pSector;
|
||
pSector = pStaticRoot->GetSuperObjectNextChild(pSector))
|
||
fn_vSetDisplayBV(TRUE, pSector, FALSE);
|
||
break;
|
||
|
||
case E_bv_Actors:
|
||
// cancel previous mode
|
||
fn_vSetDisplayBV(FALSE, GetCurrentWorld()->GetRoot(), TRUE);
|
||
pDynamicRoot = GetSpecificInterface()->GetDynamicRoot();
|
||
// update sectors
|
||
for (pActor = pDynamicRoot->GetSuperObjectFirstChild(); pActor;
|
||
pActor = pDynamicRoot->GetSuperObjectNextChild(pActor))
|
||
fn_vSetDisplayBV(TRUE, pActor, FALSE);
|
||
break;
|
||
|
||
case E_bv_Objects:
|
||
// cancel previous mode
|
||
fn_vSetDisplayBV(TRUE, GetCurrentWorld()->GetRoot(), TRUE);
|
||
pStaticRoot = GetSpecificInterface()->GetStaticRoot();
|
||
// update sectors
|
||
for (pSector = pStaticRoot->GetSuperObjectFirstChild(); pSector;
|
||
pSector = pStaticRoot->GetSuperObjectNextChild(pSector))
|
||
fn_vSetDisplayBV(FALSE, pSector, FALSE);
|
||
pDynamicRoot = GetSpecificInterface()->GetDynamicRoot();
|
||
// update sectors
|
||
for (pActor = pDynamicRoot->GetSuperObjectFirstChild(); pActor;
|
||
pActor = pDynamicRoot->GetSuperObjectNextChild(pActor))
|
||
fn_vSetDisplayBV(FALSE, pActor, FALSE);
|
||
break;
|
||
}
|
||
// update mode
|
||
m_eBVMode = eMode;
|
||
GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateBVMode((int)eMode);
|
||
}
|
||
|
||
/*===========================================================================
|
||
* Description: display bounding volumes
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vSetDisplayBV (BOOL bDisplayBV, CPA_SuperObject *pSupObj, BOOL bRecursive)
|
||
{
|
||
CPA_SuperObject *pChild;
|
||
|
||
// update SO flag
|
||
pSupObj->fn_vDisplayBV(bDisplayBV);
|
||
|
||
// if necessary, update childs
|
||
if (bRecursive)
|
||
{
|
||
for (pChild = pSupObj->GetSuperObjectFirstChild(); pChild;
|
||
pChild = pSupObj->GetSuperObjectNextChild(pChild))
|
||
fn_vSetDisplayBV(bDisplayBV, pChild, TRUE);
|
||
}
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: display option dialog
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vDoDialogOptions (void)
|
||
{
|
||
m_oDialogOption.fn_vDoDialog(this);
|
||
}
|
||
|
||
|
||
/*===========================================================================
|
||
* Description: display TipOfDay dialog
|
||
* Creation date:
|
||
* Author: Shaitan
|
||
*---------------------------------------------------------------------------
|
||
* Revision date: Author:
|
||
*=========================================================================*/
|
||
void CPA_Interface::fn_vDisplayTipOfDay (CString csEditor, CString csTag, BOOL bFirstTime)
|
||
{
|
||
CString csFileName;
|
||
char szTip[10];
|
||
char szCurrentTip[10];
|
||
long lCurrentTip = 0;
|
||
|
||
//kwn : Desactivate Tip Of Day
|
||
return;
|
||
|
||
|
||
// Tip of the Day
|
||
if (csEditor == "Interface" && csTag == "ITF")
|
||
{
|
||
bFirstTime = m_bDisplayTipOfDay;
|
||
m_bDisplayTipOfDay = FALSE;
|
||
}
|
||
|
||
// get INI file
|
||
if (m_csCurrentLanguage == "Francais" || m_csCurrentLanguage == "French")
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szAstucesIniFile;
|
||
else
|
||
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szTipOfDayIniFile;
|
||
|
||
// check if tip must be displayed
|
||
if (!bFirstTime)
|
||
{
|
||
char szMode[10];
|
||
char szCurrentMode[10];
|
||
|
||
// get corresponding mode
|
||
sprintf(szMode, "%s_Mode", csTag);
|
||
GetPrivateProfileString ("TipOfDay", szMode, "Always", szCurrentMode, 256, (char*)(LPCSTR)csFileName);
|
||
// test mode
|
||
if (!strcmp(szCurrentMode, "FirstOnly"))
|
||
return;
|
||
}
|
||
|
||
// get current tip
|
||
sprintf(szTip, "%s_nTip", csTag);
|
||
GetPrivateProfileString ("TipOfDay", szTip, "0", szCurrentTip, 10, (char*)(LPCSTR)csFileName);
|
||
lCurrentTip = atol(szCurrentTip);
|
||
// if there is a tip to display
|
||
if (lCurrentTip > 0)
|
||
{
|
||
char szCurrentText[255];
|
||
|
||
sprintf(szCurrentTip, "%s%ld", csTag, lCurrentTip);
|
||
GetPrivateProfileString (szCurrentTip, "L1", "", szCurrentText, 256, (char*)(LPCSTR)csFileName);
|
||
// check if there is a text
|
||
if (strlen(szCurrentText) > 0)
|
||
{
|
||
HINSTANCE hOldInst = AfxGetResourceHandle();
|
||
HINSTANCE hNewInst = AfxGetInstanceHandle();
|
||
AfxSetResourceHandle(hNewInst);
|
||
|
||
m_oDialogTip.fn_vDoDialog(csEditor, csTag, csFileName, lCurrentTip);
|
||
|
||
AfxSetResourceHandle(hOldInst);
|
||
}
|
||
}
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// Begin Silviu Simen Select by sector
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
void CPA_Interface::SelectBySector (void)
|
||
{
|
||
CPA_HierarchyEditor *p_oHierarchy;
|
||
p_oHierarchy = GetEvtEditor();
|
||
ASSERT (p_oHierarchy);
|
||
p_oHierarchy ->fn_vSelectBySectorAndType();
|
||
fn_vUpdateAll(E_mc_UpdateSelection);
|
||
//fn_vUpdateAll(E_mc_UpdateAll);
|
||
}
|
||
///////////////////////////////////////////////////////////////////////////////
|
||
// End Silviu Simen Select by sector
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
#endif ACTIVE_EDITOR
|
||
|