7463 lines
254 KiB
C++
7463 lines
254 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 "EDTBase.Hpp"
|
|
#include "EDTSObj.hpp"
|
|
#include "EDTSpec.hpp"
|
|
#include "EDTTemp.hpp"
|
|
#include "EDTModif.hpp"
|
|
#include "EDTdEdit.hpp"
|
|
#include "EDTdUpdt.hpp"
|
|
#include "EDTdMove.hpp"
|
|
#include "EDTdFlag.hpp"
|
|
#include "EDTdSel.hpp"
|
|
//CPA2 Corneliu Babiuc 17-06-98
|
|
#include "EDTdVect.hpp"
|
|
//END CPA2 Corneliu Babiuc 17-06-98
|
|
#include "EDTParse.hpp"
|
|
|
|
#include "incCOL.h"
|
|
|
|
|
|
#include "incDPT.h"
|
|
#define D_PhysiCol_Define
|
|
#include "incGAM.h"
|
|
#include "incSPO.h"
|
|
#include "incPO.h"
|
|
#include "incIPO.h"
|
|
#undef D_PhysiCol_Define
|
|
|
|
#include "x:\cpa\Main\inc\_editid.h"
|
|
#include "TUT.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "incGeo.h"
|
|
|
|
extern "C" __declspec(dllimport) void GEO_vGetPointOfObject ( ACP_tdxHandleOfObject hObject ,
|
|
MTH3D_tdstVector *p_stPoint ,
|
|
ACP_tdxIndex xIndexOfPoint);
|
|
|
|
|
|
|
|
// infos
|
|
static CString g_csEDTName = "Hierarchy";
|
|
static CString g_csEDTAuthor = "Chantal Oury";
|
|
static CString g_csEDTVersion = "V 6.0.4 18/03/99";
|
|
static CString g_csEDTFrenchHelpFile = "Hierarchie.hlp";
|
|
static CString g_csEDTEnglishHelpFile = "";
|
|
|
|
BOOL g_bTipFirstTime = TRUE;
|
|
|
|
// macros
|
|
#define M_GetEngineRoot() GetInterface()->GetMultiDevice3D()->GetEngineWorld()
|
|
#define M_GetEditorRoot() GetInterface()->GetMultiDevice3D()->M_GetWorld()->GetRoot()
|
|
|
|
#define M_GetViewPort3d() ((DEV_ViewPort3D *) GetInterface()->GetMultiDevice()->GetFocusDevice()->GetViewPort())
|
|
#define M_GetToolDLLs() GetMainWorld()->GetToolDLLReceivingEvtEditorMsg()
|
|
|
|
#define M_ListConcerned M_GetListAllDLLs()->m_stListConcerned
|
|
#define M_ListSelected M_GetListAllDLLs()->m_stListSelected
|
|
|
|
// menu
|
|
#define C_ui_OrientInstanceAction 10
|
|
#define C_ui_CopyInstanceAction 11
|
|
#define C_ui_CopyObjectAction 12
|
|
#define C_ui_PasteSameAction 13
|
|
#define C_ui_PasteDefaultAction 14
|
|
#define C_ui_PutOnGroundAction 15
|
|
|
|
#define C_ui_DisplaySpecificAction 21
|
|
#define C_ui_EditorAction 22
|
|
|
|
#define C_ui_SaveStatusAction 30
|
|
#define C_ui_SavePrefixAction 31
|
|
#define C_ui_SavePermissions 32
|
|
#define C_ui_SaveInterdictions 33
|
|
#define C_ui_SaveDialogsAction 34
|
|
#define C_ui_ChangeOwner 42
|
|
|
|
|
|
|
|
// cursors
|
|
#define C_hc_CurrentCursor 0
|
|
#define C_hc_HierarchyCursor 1
|
|
#define C_hc_PFatherCursor 2
|
|
#define C_hc_PPositionCursor 3
|
|
#define C_hc_ChoiceCursor 4
|
|
#define C_hc_CopyAllCursor 5
|
|
#define C_hc_CopyAloneCursor 6
|
|
#define C_hc_SelectToCursor 7
|
|
#define C_hc_MoveToCursor 8
|
|
#define C_hc_OrientCursor 9
|
|
#define C_hc_VOrientCursor 10
|
|
|
|
// increase value for translation and rotation step
|
|
const GLI_tdxValue C_xTranslationStep = (GLI_tdxValue) 0.02;
|
|
const GLI_tdxValue C_xRotationStep = (GLI_tdxValue) 0.1;
|
|
|
|
#define AXE_X 0
|
|
#define AXE_Y 1
|
|
#define AXE_Z 2
|
|
|
|
//--------------- keys ------------------------
|
|
|
|
// selection
|
|
#define KA_ID_MULTI 1
|
|
#define KA_ID_PYRAMID 2
|
|
#define KA_ID_MULTIPYRAMID 3
|
|
#define KA_ID_CHOICE 4
|
|
|
|
// copy / paste
|
|
#define KA_ID_ALONE 11
|
|
#define KA_ID_COPY 12
|
|
#define KA_ID_PASTESAME 13
|
|
#define KA_ID_PASTEDEFAULT 14
|
|
#define KA_ID_PASTEFATHER 15
|
|
#define KA_ID_PASTEPOS 16
|
|
|
|
// modifs
|
|
#define KA_ID_DEL 17
|
|
#define KA_ID_PARENT 18
|
|
#define KA_ID_SUPEROBJECTFLAGS 19
|
|
|
|
// teleportation
|
|
#define KA_ID_REGISTERSELECTION 21
|
|
#define KA_ID_MOVETO 22
|
|
// put on ground
|
|
#define KA_ID_PUTONGROUND 23
|
|
// orientation
|
|
#define KA_ID_ORIENTINSTANCE 24
|
|
#define KA_ID_ORIENTVERTICAL 25
|
|
//CPA2 Corneliu Babiuc (multiple teleportation) 07-07-98
|
|
#define KA_ID_ADDDELREGISTRATION 26
|
|
//END CPA2 Corneliu Babiuc (multiple teleportation) 07-07-98
|
|
|
|
// moves
|
|
#define KA_ID_ROTX 31
|
|
#define KA_ID_ROTY 32
|
|
#define KA_ID_ROTZ 33
|
|
#define KA_ID_LEFT 34
|
|
#define KA_ID_RIGHT 35
|
|
#define KA_ID_ON 36
|
|
#define KA_ID_BACK 37
|
|
#define KA_ID_UP 38
|
|
#define KA_ID_DOWN 39
|
|
#define KA_ID_ROTINVX 40
|
|
#define KA_ID_ROTINVY 41
|
|
#define KA_ID_ROTINVZ 42
|
|
#define KA_ID_INCROTATIONSTEP 43
|
|
#define KA_ID_DECROTATIONSTEP 44
|
|
#define KA_ID_INCTRANSLATIONSTEP 45
|
|
#define KA_ID_DECTRANSLATIONSTEP 46
|
|
#define KA_ID_XCONSTRAINT 47
|
|
#define KA_ID_YCONSTRAINT 48
|
|
#define KA_ID_ZCONSTRAINT 49
|
|
#define KA_ID_MOVEDEPTH 50
|
|
#define KA_ID_WARPOBJECTDEPTHMOVE 51
|
|
#define KA_ID_MOVEDOBJECT 52
|
|
#define KA_ID_ROTATEOBJECTXY 53
|
|
#define KA_ID_ROTATEOBJECTXZ 54
|
|
|
|
// current sector
|
|
#define KA_ID_SECTORSELECTION 61
|
|
#define KA_ID_SECTORWITHMOUSE 62
|
|
|
|
//CPA2 Corneliu Babiuc 14-06-98
|
|
// specific teleportation
|
|
#define KA_ID_MOVETOINSTANCE 63
|
|
#define KA_ID_MOVETOCAMERA 64
|
|
#define KA_ID_MOVECAMERATOINSTANCE 65
|
|
#define KA_ID_MOVECAMERACENTERED 66
|
|
#define KA_ID_CHOOSEVECTOR 67
|
|
//END CPA2 Corneliu Babiuc 17-06-98
|
|
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
#define KA_ID_CUT 68
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
// Begin Silviu Simen 01 september 1998 List of Objects in Sectors
|
|
#define KA_ID_SELECTSECTOR 69
|
|
// End Silviu Simen 01 september 1998 List of Objects in Sectors
|
|
|
|
// keyboard
|
|
static tdstKeyboardActionDef g_EDTKeyboardAction[] =
|
|
{
|
|
// selection
|
|
{ "multiple selection", KA_ID_MULTI },
|
|
{ "pyramid selection", KA_ID_PYRAMID },
|
|
{ "multi-pyramid selection", KA_ID_MULTIPYRAMID },
|
|
{ "use Selection dialog", KA_ID_CHOICE },
|
|
// copy / paste
|
|
{ "Copy instance alone", KA_ID_ALONE },
|
|
{ "copy instance with Branch", KA_ID_COPY },
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
{ "cut instance", KA_ID_CUT },
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
{ "paste at chosen position", KA_ID_PASTEPOS },
|
|
{ "paste under Default parent", KA_ID_PASTEDEFAULT },
|
|
{ "paste under Found parent", KA_ID_PASTESAME },
|
|
{ "paste under same parent", KA_ID_PASTEFATHER },
|
|
// delete
|
|
{ "Delete selected instances", KA_ID_DEL },
|
|
// hierarchy
|
|
{ "Change super-object parent", KA_ID_PARENT },
|
|
// SuperObject Flags
|
|
{ "Edit super-object flags", KA_ID_SUPEROBJECTFLAGS },
|
|
// move to
|
|
{ "Register selection for move", KA_ID_REGISTERSELECTION },
|
|
//CPA2 Corneliu Babiuc (multiple teleportation) 07-07-98
|
|
{ "add/delete Registration", KA_ID_ADDDELREGISTRATION },
|
|
//END CPA2 Corneliu Babiuc (multiple teleportation) 07-07-98
|
|
{ "Teleport to new position", KA_ID_MOVETO },
|
|
//CPA2 Corneliu Babiuc 14-06-98
|
|
// specific teleportation
|
|
{ "Teleport to instance", KA_ID_MOVETOINSTANCE },
|
|
{ "Teleport to camera", KA_ID_MOVETOCAMERA },
|
|
{ "Teleport camera to instance", KA_ID_MOVECAMERATOINSTANCE },
|
|
{ "Teleport camera centered on Rayman", KA_ID_MOVECAMERACENTERED},
|
|
{ "Choose translation vector", KA_ID_CHOOSEVECTOR },
|
|
//END CPA2 Corneliu Babiuc 17-06-98
|
|
// put on ground
|
|
{ "put on Ground", KA_ID_PUTONGROUND },
|
|
// orient
|
|
{ "Orient to position", KA_ID_ORIENTINSTANCE },
|
|
{ "orient keePing vertical", KA_ID_ORIENTVERTICAL },
|
|
// rotations
|
|
{ "rotate instance / X", KA_ID_ROTX },
|
|
{ "rotate instance / Y", KA_ID_ROTY },
|
|
{ "rotate instance / Z", KA_ID_ROTZ },
|
|
// inverse rotations
|
|
{ "inverse rotate instance / X", KA_ID_ROTINVX },
|
|
{ "inverse rotate instance / Y", KA_ID_ROTINVY },
|
|
{ "inverse rotate instance / Z", KA_ID_ROTINVZ },
|
|
// translations
|
|
{ "translate instance -> Left", KA_ID_LEFT },
|
|
{ "translate instance -> Right", KA_ID_RIGHT },
|
|
{ "translate instance -> On", KA_ID_ON },
|
|
{ "translate instance -> Back", KA_ID_BACK },
|
|
{ "translate instance -> Up", KA_ID_UP },
|
|
{ "translate instance -> Down", KA_ID_DOWN },
|
|
// T/R steps
|
|
{ "increase rotation step", KA_ID_INCROTATIONSTEP },
|
|
{ "decrease rotation step", KA_ID_DECROTATIONSTEP },
|
|
{ "increase translation step", KA_ID_INCTRANSLATIONSTEP },
|
|
{ "decrease translation step", KA_ID_DECTRANSLATIONSTEP },
|
|
// constraints on axis
|
|
{ "X constraint axis", KA_ID_XCONSTRAINT },
|
|
{ "Y constraint axis", KA_ID_YCONSTRAINT },
|
|
{ "Z constraint axis", KA_ID_ZCONSTRAINT },
|
|
// scroll
|
|
{ "move mouse in depth", KA_ID_MOVEDEPTH },
|
|
{ "Warped move mouse in depth", KA_ID_WARPOBJECTDEPTHMOVE },
|
|
{ "camera follows instance", KA_ID_MOVEDOBJECT },
|
|
{ "mouse rotate Horizontal", KA_ID_ROTATEOBJECTXY },
|
|
{ "mouse rotate Vertical", KA_ID_ROTATEOBJECTXZ },
|
|
// current sector
|
|
{ "update current Sector", KA_ID_SECTORSELECTION },
|
|
{ "Detect current sector", KA_ID_SECTORWITHMOUSE },
|
|
// Begin Silviu Simen 01 september 1998 List of Objects in Sectors
|
|
{ "Select Sector", KA_ID_SELECTSECTOR },
|
|
// End Silviu Simen 01 september 1998 List of Objects in Sectors
|
|
// end of list
|
|
{ NULL, 0 }
|
|
};
|
|
|
|
tdstDLLIdentity g_stHierarchyIdentity;
|
|
|
|
#define M_xSgn(x) (x)
|
|
float sqr(float x);
|
|
|
|
//CPA2 Corneliu Babiuc 15-06-98
|
|
static EDT_SuperObject * g_pReferenceInstance = NULL;
|
|
//END CPA2 Corneliu Babiuc 15-06-98
|
|
|
|
//#################################################################################
|
|
// CONSTRUCTOR
|
|
//#################################################################################
|
|
/*===========================================================================
|
|
Constructor - init the lists from DLLs
|
|
=========================================================================*/
|
|
EDT_HierarchyEditor::EDT_HierarchyEditor (void)
|
|
{
|
|
// ************************** private internal
|
|
m_p_stDLLIdentity = &g_stHierarchyIdentity;
|
|
|
|
// Does your DLL can output in main game view ?
|
|
m_stBaseDLLDefinition.bCanOutputIn3DView = FALSE;
|
|
|
|
// Does your DLL can be refresh by engine ?
|
|
m_stBaseDLLDefinition.bCanBeRefreshedByEngine = TRUE;
|
|
|
|
// init parameters
|
|
m_pSpecificEditor = new EDT_SpecificEditor(this);
|
|
|
|
SetMainWorld(NULL);
|
|
SetCurrent(TRUE);
|
|
|
|
// init infos
|
|
SetEditorInfo(g_csEDTName, g_csEDTAuthor, g_csEDTVersion, g_csEDTFrenchHelpFile, g_csEDTEnglishHelpFile);
|
|
|
|
// Init Mode
|
|
m_eEditorMode = E_em_NoMode;
|
|
m_bMultiSelectMode = FALSE;
|
|
m_a_hCursors[C_hc_CurrentCursor] = NULL;
|
|
|
|
// Init members
|
|
m_stListToCopy.RemoveAll();
|
|
// Init Move
|
|
m_pMouseMove = NULL;
|
|
m_pKeyMove = NULL;
|
|
m_eMouseMoveMode = E_mmm_NoMouseMove;
|
|
m_bAvoidKeyRepeat = FALSE;
|
|
// Init rotation and translation step
|
|
m_xTranslationStep = (GLI_tdxValue) 0.02;
|
|
m_xRotationStep = (GLI_tdxValue) 0.1;
|
|
// Init orientation
|
|
m_pOrientedObject = NULL;
|
|
m_pOrientMove = NULL;
|
|
m_bKeepOrientMode = FALSE;
|
|
|
|
// Dialogs
|
|
m_pDialogList = NULL;
|
|
m_pDialogSelect = NULL;
|
|
|
|
HINSTANCE hOldInst = AfxGetResourceHandle();
|
|
AfxSetResourceHandle (GetDLLIdentity()->hModule);
|
|
|
|
m_pDialogUpdate = new EDT_DialogUpdate();
|
|
m_pDialogMove = new EDT_DialogMove();
|
|
m_pDialogFlag = new EDT_DialogFlag();
|
|
|
|
AfxSetResourceHandle(hOldInst);
|
|
|
|
m_eModifCanceled = E_cm_NoCancel;
|
|
m_csMessage.Empty();
|
|
|
|
// Keys
|
|
m_p_oDevKeyboard = new CPA_KeyActionConfiguration(C_szHierarchyIniFile, g_EDTKeyboardAction);
|
|
m_p_oDevKeyboard->mfn_vSetObjectName("Hierarchy Editor");
|
|
|
|
// Mouse moves
|
|
m_bMovedObjectStaysOnScreen = FALSE;
|
|
m_bCanDisplayPopup = TRUE;
|
|
m_bDoDialogSelect = FALSE;
|
|
m_bDisableFirstMove = TRUE;
|
|
|
|
// World
|
|
m_bHasCurrentWorld = FALSE;
|
|
|
|
// Super-Object Save
|
|
m_csSOReferencePath.Empty();
|
|
|
|
// modifications
|
|
m_pListOfTempModifs = NULL;
|
|
|
|
// teleportation
|
|
//CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
// m_pRegisteredObject = NULL;
|
|
// m_bIsASelection = FALSE;
|
|
//END CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
// sector selection
|
|
m_bSelectSector = FALSE;
|
|
m_bSelectSectorWithMouse = FALSE;
|
|
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
m_pRegisteredCuttedObject = NULL;
|
|
m_bSpecialObject = FALSE;
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
Destructor
|
|
=========================================================================*/
|
|
EDT_HierarchyEditor::~EDT_HierarchyEditor()
|
|
{
|
|
// Keys
|
|
delete m_p_oDevKeyboard;
|
|
m_p_oDevKeyboard = NULL;
|
|
|
|
// copy / paste
|
|
while (!m_stListToCopy.IsEmpty())
|
|
{
|
|
delete (m_stListToCopy.GetHead()->m_pChild);
|
|
delete (m_stListToCopy.RemoveHead());
|
|
}
|
|
}
|
|
|
|
//#################################################################################
|
|
// INITS
|
|
//#################################################################################
|
|
|
|
BOOL EDT_HierarchyEditor::fn_bAcceptModifFlag (CPA_SuperObject *pEdObj, unsigned long ulFlag)
|
|
{
|
|
unsigned long ulType = HIE_fn_ulGetSuperObjectType(pEdObj->GetStruct());
|
|
|
|
if (ulType != HIE_C_ulActor)
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
if (ulFlag == HIE_C_Flag_ulNotHitByRayTrace || ulFlag == HIE_C_Flag_ulNoShadowOnMe)
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*===========================================================================
|
|
Init
|
|
=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vJustAfterRegistered (void)
|
|
{
|
|
// modification list
|
|
fn_vRegisterModificationsType (C_szSuperObjectTypeName, g_a_csTypeModifs, C_lNbTypeModifs);
|
|
|
|
// scripts
|
|
SCR_fn_v_RdL0_RegisterCallback("Edit-Modifications", EDT_HierarchyEditor::CallBackLoadListModif, SCR_CRC_c_RdL0_ForSection);
|
|
SCR_fn_v_RdL0_RegisterCallback("Modif-SuperObject", EDT_SuperObject::CallBackLoadModif, SCR_CRC_c_RdL0_ForSection);
|
|
// engine
|
|
CPA_EdMot<HIE_tdxHandleToSuperObject>::Init(HIE_fn_hCreateSuperObject,HIE_fn_vCopySuperObject,HIE_fn_vDestroySuperObject);
|
|
}
|
|
|
|
/*===========================================================================
|
|
Construct
|
|
=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vConstruct (void)
|
|
{
|
|
CString csFileName;
|
|
char szDimension[256];
|
|
int iDim;
|
|
|
|
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szHierarchyIniFile;
|
|
|
|
// left frame width
|
|
GetPrivateProfileString ("Preference", "Left Frame Width", "0", szDimension, 256, (char*)(LPCSTR)csFileName);
|
|
iDim = atoi(szDimension);
|
|
// Left Frame Window
|
|
m_pLeftFrame = new CSplitFrame;
|
|
m_pLeftFrame->CreateBase("LIST", 1, 2, GetMainWorld());
|
|
m_pLeftFrame->m_iInitWidth = (iDim > 0) ? iDim : 180;
|
|
m_pLeftFrame->m_iInitHeight = 0;
|
|
m_pLeftFrame->mfn_vEnableCaption(FALSE);
|
|
m_pLeftFrame->m_stWinBottom.cLinkSame = FRM_C_MoveRight;
|
|
|
|
|
|
m_pLeftFrame->CreateSplitter(C_cVerticalSplitter, 3 );
|
|
|
|
// DialogList dimension
|
|
GetPrivateProfileString ("Preference", "DialogList Dimension", "0", szDimension, 256, (char*)(LPCSTR)csFileName);
|
|
iDim = atoi(szDimension);
|
|
// Dialog List
|
|
m_pDialogList = new CPA_DialogList;
|
|
m_pDialogList->fn_vInitDialog(this, m_pLeftFrame);
|
|
// FOR TUTORIAL
|
|
TUT_M_vGetTutDll();
|
|
|
|
TUT_M_vRegisterControl (m_pDialogList->GetComboHandle(), "EDT_DLIST_COMBO_CHOICE", TUT_e_ComboBox);
|
|
TUT_M_vRegisterControl (m_pDialogList->GetListHandle(), "EDT_DLIST_LIST_INSTANCES", TUT_e_ListBox);
|
|
TUT_M_vRegisterControl (m_pDialogList->GetTreeHandle(), "EDT_DLIST_TREE_HIERARCHY", TUT_e_TreeCtrl);
|
|
// END TUTORIAL
|
|
m_pLeftFrame->SetPaneView(0, m_pDialogList, "INSTANCES", (iDim > 0) ? iDim : 500);
|
|
|
|
HINSTANCE hOldInst = AfxGetResourceHandle();
|
|
AfxSetResourceHandle (GetDLLIdentity()->hModule);
|
|
|
|
// DialogEdit dimension
|
|
GetPrivateProfileString ("Preference", "DialogEdit Dimension", "0", szDimension, 256, (char*)(LPCSTR)csFileName);
|
|
iDim = atoi(szDimension);
|
|
// Dialog Edit
|
|
m_pDialogEdit = new EDT_DialogEdit;
|
|
m_pDialogEdit->fn_vInitDialog(this, m_pLeftFrame);
|
|
m_pLeftFrame->SetPaneView(1, m_pDialogEdit, "EDIT", (iDim > 0) ? iDim : 404);
|
|
|
|
// DialogSelect dimension
|
|
GetPrivateProfileString ("Preference", "DialogSelect Dimension", "0", szDimension, 256, (char*)(LPCSTR)csFileName);
|
|
iDim = atoi(szDimension);
|
|
// Dialog Selectt
|
|
m_pDialogSelect = new EDT_DialogSelect;
|
|
m_pDialogSelect->fn_vInitDialog(this, m_pLeftFrame);
|
|
m_pLeftFrame->SetPaneView(2, m_pDialogSelect, "SELECT", (iDim > 0) ? iDim : 250);
|
|
AfxSetResourceHandle(hOldInst);
|
|
m_pDialogSelect->m_edit = m_pDialogEdit;
|
|
|
|
// Bottom Frame Height
|
|
GetPrivateProfileString ("Preference", "Bottom Frame Height", "0", szDimension, 256, (char*)(LPCSTR)csFileName);
|
|
iDim = atoi(szDimension);
|
|
// Bottom Frame Window
|
|
m_pBottomFrame = GetInterface()->GetModelFrame();
|
|
m_pBottomFrame->m_iInitHeight = (iDim > 0) ? iDim : 120;
|
|
}
|
|
|
|
/*===========================================================================
|
|
Create
|
|
=========================================================================*/
|
|
void EDT_HierarchyEditor::Create (void)
|
|
{
|
|
CPA_HierarchyEditor::Create();
|
|
|
|
// specific
|
|
m_pSpecificEditor->fn_vSpecificInit();
|
|
|
|
// cursors
|
|
m_a_hCursors[C_hc_HierarchyCursor] = LoadCursor(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDC_PARENTMODE));
|
|
m_a_hCursors[C_hc_PFatherCursor] = LoadCursor(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDC_PASTEFATHER));
|
|
m_a_hCursors[C_hc_PPositionCursor] = LoadCursor(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDC_PASTEPOS));
|
|
m_a_hCursors[C_hc_ChoiceCursor] = LoadCursor(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDC_CHOICEMODE));
|
|
m_a_hCursors[C_hc_CopyAllCursor] = LoadCursor(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDC_COPYALLMODE));
|
|
m_a_hCursors[C_hc_CopyAloneCursor] = LoadCursor(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDC_COPYALONEMODE));
|
|
m_a_hCursors[C_hc_MoveToCursor] = LoadCursor(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDC_MOVETOMODE));
|
|
m_a_hCursors[C_hc_SelectToCursor] = LoadCursor(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDC_MOVETOSELECT));
|
|
m_a_hCursors[C_hc_OrientCursor] = LoadCursor(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDC_ORIENTMODE));
|
|
m_a_hCursors[C_hc_VOrientCursor] = LoadCursor(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDC_VORIENTMODE));
|
|
|
|
// icons for list
|
|
m_oMainIconList.Create(16, 16, ILC_MASK, 0, 12);
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_UNKNOWN)));
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_SUPOBJ)));
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_ACTOR)));
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_CAMERA)));
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_GEOM)));
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_IPO)));
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_LIGHT)));
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_PHYSICAL)));
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_SECTOR)));
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_WAYPOINT)));
|
|
m_oMainIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_ZONE)));
|
|
|
|
// icons for tree
|
|
m_oTreeIconList.Create(16, 16, ILC_MASK, 0, 6);
|
|
m_oTreeIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_EDIT)));
|
|
m_oTreeIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_EDIT)));
|
|
m_oTreeIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_NOEDIT)));
|
|
m_oTreeIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_PEDIT)));
|
|
m_oTreeIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(EDT_IDI_PNOEDIT)));
|
|
|
|
|
|
}
|
|
|
|
//#################################################################################
|
|
// FOCUS
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
Called just before engine loop
|
|
=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vBeforeEngine()
|
|
{
|
|
CPA_Interface *pInterface = GetInterface();
|
|
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
if (m_pRegisteredCuttedObject)
|
|
{
|
|
if (m_bSpecialObject)
|
|
{
|
|
EDT_SuperObject * m_pParent;
|
|
|
|
m_pParent = m_pSpecificEditor->GetDefaultParentForPaste(m_pRegisteredCuttedObject);
|
|
M_GetEditManager()->AskFor (new EDT_ModifInsert
|
|
(this, m_pRegisteredCuttedObject, m_pParent, NULL));
|
|
m_pRegisteredCuttedObject=NULL;
|
|
m_bSpecialObject = FALSE;
|
|
|
|
};
|
|
};
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
|
|
// disactivate all windows
|
|
g_oFrameGest.mfn_vDisactivateWindow(m_pLeftFrame);
|
|
g_oFrameGest.mfn_vDisactivateWindow(m_pBottomFrame);
|
|
// save reference position
|
|
m_pDialogUpdate->m_stRefMatrix = *(HIE_fn_hGetSuperObjectGlobalMatrix(M_GetEngineRoot()));
|
|
// update menu
|
|
GetMainWorld()->GetFRMBase()->fn_vUpdateCurrentEditor(NULL);
|
|
// update state
|
|
pInterface->SetInitialState(FALSE);
|
|
m_csLoadingMessage = "Editor Ready";
|
|
m_iLoadingStatus = C_STATUS_NORMAL;
|
|
// enable fog
|
|
GLI_vFogOn();
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
Update editor hierarchy after engine loop
|
|
=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vBeforeEditor()
|
|
{
|
|
CPA_Interface *pInterface = GetInterface();
|
|
BOOL bLoaded;
|
|
|
|
// update menu
|
|
GetMainWorld()->GetFRMBase()->fn_vUpdateCurrentEditor(GetMainWorld()->GetCurrentEditor());
|
|
|
|
// editor map
|
|
m_lNbUnknown = 0;
|
|
bLoaded = fn_bLoadEditorMap();
|
|
|
|
// Activate all Frame Windows
|
|
if (fn_bIsCurrentEditor())
|
|
{
|
|
g_oFrameGest.mfn_vSetRefresh(FALSE);
|
|
g_oFrameGest.mfn_vActivateWindow(m_pLeftFrame);
|
|
g_oFrameGest.mfn_vActivateWindow(m_pBottomFrame);
|
|
g_oFrameGest.mfn_vSetRefresh(TRUE);
|
|
}
|
|
|
|
if (!m_bHasCurrentWorld)
|
|
return;
|
|
|
|
// Update all views
|
|
m_pBottomFrame->SetActiveView(pInterface->GetDialogInsert(), TRUE);
|
|
m_pLeftFrame->SetActiveView(m_pDialogList, TRUE);
|
|
|
|
// reinit hierarchy
|
|
fn_vReinitEditorMap(!bLoaded);
|
|
|
|
// update drawing
|
|
if (bLoaded)
|
|
{
|
|
GetInterface()->fn_vLoadDisplayMode();
|
|
GetInterface()->fn_vLoadOptions();
|
|
}
|
|
// disable fog
|
|
GLI_vFogOff();
|
|
|
|
GLI_vResetTableOfActiveLightsForChar( GLI_C_ActivateLight );
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
Save
|
|
=========================================================================*/
|
|
void fn_vSaveMatrix (FILE *pFile, GEO_tdxHandleToMatrix hMatrix)
|
|
{
|
|
MTH3D_tdstVector stVecI,stVecJ,stVecK;
|
|
char szText[MAX_PATH];
|
|
|
|
// translation
|
|
POS_fn_vGetTranslationVector(hMatrix,&stVecI);
|
|
sprintf(szText, "\t Translation : ( %f, %f, %f )\n",
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecI)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecI)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecI)));
|
|
fputs(szText, pFile);
|
|
// rotation
|
|
POS_fn_vGetRotationMatrix (hMatrix,&stVecI,&stVecJ,&stVecK);
|
|
sprintf(szText, "\t Rotation : ( %f, %f, %f, %f, %f, %f, %f, %f, %f )\n",
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecI)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecI)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecI)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecJ)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecJ)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecJ)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecK)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecK)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecK)));
|
|
fputs(szText, pFile);
|
|
// scale
|
|
POS_fn_vGetScaleMatrix (hMatrix,&stVecI,&stVecJ,&stVecK);
|
|
sprintf(szText, "\t Scale : ( %f, %f, %f, %f, %f, %f, %f, %f, %f )\n",
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecI)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecI)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecI)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecJ)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecJ)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecJ)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecK)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecK)),
|
|
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecK)));
|
|
fputs(szText, pFile);
|
|
}
|
|
|
|
void EDT_HierarchyEditor::fn_vBeforeSaveAll (void)
|
|
{
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
if (m_pRegisteredCuttedObject)
|
|
{
|
|
if (m_bSpecialObject)
|
|
{
|
|
EDT_SuperObject * m_pParent;
|
|
|
|
m_pParent = m_pSpecificEditor->GetDefaultParentForPaste(m_pRegisteredCuttedObject);
|
|
M_GetEditManager()->AskFor (new EDT_ModifInsert
|
|
(this, m_pRegisteredCuttedObject, m_pParent, NULL));
|
|
m_pRegisteredCuttedObject=NULL;
|
|
m_bSpecialObject = FALSE;
|
|
};
|
|
};
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
return;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : fn_vAfterSaveAll
|
|
// Date : 98-03
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// Author : Stegaru Cristian - CPA2
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification :
|
|
// Date :
|
|
// By :
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void EDT_HierarchyEditor::fn_vAfterSaveAll (void)
|
|
{
|
|
char *szLevelsRelativePath = fn_szGetLevelsDataPath ();
|
|
char *szClassesRelativePath = fn_szGetGraphicsClassesDataPath ();
|
|
char *szBanksRelativePath = fn_szGetGraphicsBanksDataPath ();
|
|
char *szMaterialRelativePath = fn_szGetGameMaterialDataPath ();
|
|
char *szVisualRelativePath = fn_szGetVisualMaterialDataPath ();
|
|
|
|
char szBaseRoot [_MAX_PATH];
|
|
GetModuleFileName (NULL, szBaseRoot, _MAX_PATH);
|
|
CString csBaseRoot (szBaseRoot);
|
|
int iInx = csBaseRoot.ReverseFind ('\\');
|
|
ASSERT (-1 != iInx);
|
|
csBaseRoot = csBaseRoot.Left (iInx + 1);
|
|
CString csRootClasses, csRootBanks, csRootLevels, csRootMaterials, csRootVisuals;
|
|
csRootClasses = csBaseRoot + szClassesRelativePath + "\\";
|
|
csRootBanks = csBaseRoot + szBanksRelativePath + "\\";
|
|
csRootLevels = csBaseRoot + szLevelsRelativePath + "\\";
|
|
csRootMaterials = csBaseRoot + szMaterialRelativePath + "\\";
|
|
csRootVisuals = csBaseRoot + szVisualRelativePath + "\\";
|
|
|
|
CParseSection parseSection;
|
|
parseSection.AddRoot (csRootClasses);
|
|
parseSection.AddRoot (csRootBanks);
|
|
parseSection.AddRoot (csRootLevels);
|
|
parseSection.AddRoot (csRootMaterials);
|
|
parseSection.AddRoot (csRootVisuals);
|
|
parseSection.AddRoot (csBaseRoot);
|
|
|
|
EDT_SpecificEditor *pSpecificEditor = GetSpecificEditor ();
|
|
ASSERT (pSpecificEditor);
|
|
CString csStaticFileName = pSpecificEditor->GetStaticFileName ();
|
|
int iPos = csStaticFileName.ReverseFind ('.');
|
|
ASSERT (-1 != iPos);
|
|
|
|
CString csInitialMDFFile = csStaticFileName.Left (iPos) + szModifExt;
|
|
csInitialMDFFile = csRootLevels + csInitialMDFFile;
|
|
CString csFinalMDFFile = csStaticFileName.Left (iPos) + szFinalModifExt;
|
|
csFinalMDFFile = csRootLevels + csFinalMDFFile;
|
|
|
|
{
|
|
CWaitCursor wait;
|
|
parseSection.ParseFile (csInitialMDFFile, csFinalMDFFile);
|
|
}
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// ENGINE
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
accept to run engine
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bAcceptToRunEngine(void)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
//#################################################################################
|
|
// END APPLI
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
accept to close
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bAcceptToExit(void)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
before closing
|
|
=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vJustBeforeClosing(void)
|
|
{
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// KEYBOARD
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
KeyDown
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
if (!m_bHasCurrentWorld)
|
|
return FALSE;
|
|
|
|
unsigned short uwAction = m_p_oDevKeyboard->mfn_uwKeyToAction(nChar);
|
|
switch (uwAction)
|
|
{
|
|
// Begin Silviu Simen 01 september 1998 List of Objects in Sectors
|
|
case KA_ID_SELECTSECTOR:
|
|
fn_vSelectBySectorAndType();
|
|
return TRUE;
|
|
// End Silviu Simen 01 september 1998 List of Objects in Sectors
|
|
// memorise the selected object ( if there is one and only one )
|
|
case KA_ID_REGISTERSELECTION :
|
|
//CPA2 Corneliu Babiuc (multiple registration) 03-07-98
|
|
case KA_ID_ADDDELREGISTRATION :
|
|
if (nRepCnt >1 ) return TRUE;
|
|
// now allow to register a multiple selection
|
|
if (M_GetWorld()->GetCountSelected() > 0)
|
|
{
|
|
// m_pRegisteredObject = (EDT_SuperObject *) M_GetWorld()->GetSingleSelection();
|
|
// m_bIsASelection = TRUE;
|
|
//if user doesn't press the SHIFT key, then cancel previous registration
|
|
if (uwAction == KA_ID_REGISTERSELECTION)
|
|
GetInterface()->fn_vCancelCurrentRegistration();
|
|
//update registration list
|
|
GetInterface()->fn_vUpdateRegistrationFromSelection(M_GetWorld()->GetListSelected());
|
|
//set the cursor
|
|
SetEditorMode(E_em_RegisterSelection);
|
|
M_GetMainWnd()->UpdateStatus("Objects were registered ", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
|
}
|
|
//CPA2 Corneliu Babiuc TMS_0598 27-05-98
|
|
//if no selection, clear the registered object
|
|
else
|
|
// if (M_GetWorld()->GetCountSelected() == 0)
|
|
{
|
|
// m_pRegisteredObject = NULL;
|
|
// m_bIsASelection = FALSE;
|
|
GetInterface()->fn_vCancelCurrentRegistration();
|
|
SetEditorMode(E_em_ClearRegistration);
|
|
M_GetMainWnd()->UpdateStatus("The registration list was cleared", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
|
}
|
|
//END CPA2 Corneliu Babiuc TMS_0598 27-05-98
|
|
//END CPA2 Corneliu Babiuc (multiple registration) 03-07-98
|
|
return TRUE;
|
|
|
|
// delete selected objects
|
|
case KA_ID_DEL :
|
|
if (M_GetWorld()->GetCountSelected())
|
|
{
|
|
if (fn_bCanDeleteAllObjects())
|
|
M_GetEditManager()->AskFor (new EDT_ModifDelete
|
|
(this, M_GetWorld()->GetListOfListByDLL(), GetInterface()->GetSelectMode()));
|
|
else
|
|
m_eModifCanceled = E_cm_CancelDelete;
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
return TRUE;
|
|
|
|
// move to mode
|
|
case KA_ID_MOVETO:
|
|
SetEditorMode(E_em_MoveToMode);
|
|
return TRUE;
|
|
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
case KA_ID_CUT:
|
|
if (M_GetWorld()->GetCountSelected() == 1)
|
|
{
|
|
if (m_pRegisteredCuttedObject)
|
|
{
|
|
if (!m_bSpecialObject)
|
|
{
|
|
if (IDYES == MessageBox(NULL,
|
|
" You have registered an instance : " + m_pRegisteredCuttedObject ->GetName() + "\n"
|
|
" Do you want to loose it ? \n\n"
|
|
" If you press YES, instance will be lost.\n"
|
|
"If you press NO, the current selection will not be cut.\n"
|
|
,"Unregister or Keep Instance",
|
|
MB_YESNO | MB_ICONQUESTION ))
|
|
{
|
|
m_bSpecialObject = FALSE;
|
|
|
|
m_pRegisteredCuttedObject = (EDT_SuperObject *) M_GetWorld()->GetSingleSelection();
|
|
|
|
if (fn_bObjectIsSpecial())
|
|
m_bSpecialObject = TRUE;
|
|
M_GetEditManager()->AskFor (new EDT_ModifDelete
|
|
(this, M_GetWorld()->GetListOfListByDLL(),
|
|
GetInterface()->GetSelectMode(),TRUE,FALSE,TRUE,FALSE,m_bSpecialObject));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MessageBox(NULL,
|
|
"You have registered a special object: " + m_pRegisteredCuttedObject ->GetName() + "\n"
|
|
"The current selection cannot be cut before reinserting this special object.",
|
|
"Special Object Already Registered !",
|
|
MB_OK|MB_ICONINFORMATION);
|
|
|
|
m_csMessage = "A special object :" + m_pRegisteredCuttedObject -> GetName() + "is already registered";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_bSpecialObject = FALSE;
|
|
|
|
m_pRegisteredCuttedObject = (EDT_SuperObject *) M_GetWorld()->GetSingleSelection();
|
|
|
|
if (fn_bObjectIsSpecial())
|
|
m_bSpecialObject = TRUE;
|
|
M_GetEditManager()->AskFor (new EDT_ModifDelete
|
|
(this, M_GetWorld()->GetListOfListByDLL(),
|
|
GetInterface()->GetSelectMode(),TRUE,FALSE,TRUE,FALSE,m_bSpecialObject));
|
|
}
|
|
}
|
|
return TRUE;
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
|
|
|
|
//CPA2 Corneliu Babiuc 14-06-98
|
|
// specific teleportation
|
|
case KA_ID_MOVETOINSTANCE:
|
|
SetEditorMode(E_em_MoveToInstance);
|
|
return TRUE;
|
|
|
|
case KA_ID_MOVETOCAMERA:
|
|
// if there is an object selected or if there is an object registered
|
|
if ( ( M_GetWorld()->GetCountSelected() == 1 || /*m_bIsASelection CPA2 Corneliu Babiuc (multiple registration)*/
|
|
M_GetWorld()->GetCountRegistered() == 1) && nRepCnt ==1)
|
|
fn_vMoveToCameraPosition();
|
|
else
|
|
if (M_GetWorld()->GetCountSelected() > 1 ||/*CPA2 Corneliu Babiuc (multiple registration)*/
|
|
M_GetWorld()->GetCountRegistered()>1 )
|
|
{
|
|
m_csMessage = "Editor could not teleport multiple selection to camera position";
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
return TRUE;
|
|
// teleport camera
|
|
case KA_ID_MOVECAMERATOINSTANCE:
|
|
SetEditorMode(E_em_MoveCameraToInstance);
|
|
break;
|
|
case KA_ID_MOVECAMERACENTERED:
|
|
SetEditorMode(E_em_MoveCameraCentered);
|
|
break;
|
|
|
|
// choose translation vector
|
|
case KA_ID_CHOOSEVECTOR:
|
|
// if there is no selected object, do nothing
|
|
if ( M_GetWorld()->GetCountSelected() > 0 )
|
|
{
|
|
if ( !fn_bCanTranslateAllObjects() )
|
|
{
|
|
m_csMessage = "Some objects connot be moved";
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
return TRUE;
|
|
}
|
|
EDT_DialogVector dlg;
|
|
MTH3D_tdstVector stTranslation;
|
|
// Invoke the dialog box
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
// retrieve the dialog data
|
|
MTH3D_M_vSetVectorElements(&stTranslation, dlg.m_xComponentX, dlg.m_xComponentY, dlg.m_xComponentZ);
|
|
fn_vTranslateObjects(&stTranslation);
|
|
}
|
|
}
|
|
return TRUE;
|
|
//END CPA2 Corneliu Babiuc 17-06-98
|
|
|
|
// orient mode
|
|
case KA_ID_ORIENTINSTANCE:
|
|
if (fn_bCanOrientSelection())
|
|
{
|
|
SetEditorMode(E_em_OrientMode);
|
|
m_bKeepOrientMode = TRUE;
|
|
}
|
|
return TRUE;
|
|
|
|
case KA_ID_ORIENTVERTICAL:
|
|
if (fn_bCanOrientSelection())
|
|
{
|
|
SetEditorMode(E_em_VOrientMode);
|
|
m_bKeepOrientMode = TRUE;
|
|
}
|
|
return TRUE;
|
|
|
|
// Copy Instance
|
|
case KA_ID_ALONE :
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
if (m_pRegisteredCuttedObject)
|
|
{
|
|
if (! m_bSpecialObject)
|
|
{
|
|
if (IDYES == MessageBox(NULL,
|
|
" You have registered an instance : " + m_pRegisteredCuttedObject ->GetName() + "\n"
|
|
" Do you want to loose it ? \n\n"
|
|
" If you press YES, instance will be lost.\n"
|
|
"If you press NO, next Paste will apply to this instance.\n"
|
|
,"Unregister or Keep Instance",
|
|
MB_YESNO | MB_ICONQUESTION ))
|
|
m_pRegisteredCuttedObject = NULL;
|
|
}
|
|
else
|
|
{
|
|
MessageBox(NULL,
|
|
"You have registered an special object: " + m_pRegisteredCuttedObject ->GetName() + "\n"
|
|
"Next Paste will be applied to this object.",
|
|
"Special Object Already Registered !",
|
|
MB_OK|MB_ICONINFORMATION);
|
|
}
|
|
};
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
|
|
if (M_GetWorld()->GetCountSelected() == 1)
|
|
fn_vInitModifCopy(TRUE);
|
|
return TRUE;
|
|
// Copy Selection
|
|
case KA_ID_COPY :
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
if (m_pRegisteredCuttedObject)
|
|
{
|
|
if (! m_bSpecialObject)
|
|
{
|
|
if (IDYES == MessageBox(NULL,
|
|
" You have registered an instance : " + m_pRegisteredCuttedObject ->GetName() + "\n"
|
|
" Do you want to loose it ? \n\n"
|
|
" If you press YES, instance will be lost.\n"
|
|
"If you press NO, next Paste will apply to this instance.\n"
|
|
,"Unregister or Keep Instance",
|
|
MB_YESNO | MB_ICONQUESTION ))
|
|
m_pRegisteredCuttedObject = NULL;
|
|
}
|
|
else
|
|
{
|
|
MessageBox(NULL,
|
|
"You have registered an special object: " + m_pRegisteredCuttedObject ->GetName() + "\n"
|
|
"Next Paste will be applied to this object.",
|
|
"Special Object Already Registered !",
|
|
MB_OK|MB_ICONINFORMATION);
|
|
}
|
|
};
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
if (M_GetWorld()->GetCountSelected())
|
|
fn_vInitModifCopy(FALSE);
|
|
return TRUE;
|
|
// Paste under same parent
|
|
case KA_ID_PASTESAME :
|
|
if (m_stListToCopy.GetCount())
|
|
fn_vInitModifPaste (E_pm_PasteSame);
|
|
return TRUE;
|
|
// Paste under default parent
|
|
case KA_ID_PASTEDEFAULT :
|
|
if (m_stListToCopy.GetCount())
|
|
fn_vInitModifPaste (E_pm_PasteDefault);
|
|
return TRUE;
|
|
// Paste under chosen father
|
|
case KA_ID_PASTEFATHER :
|
|
if (m_stListToCopy.GetCount() == 1)
|
|
SetEditorMode(E_em_ParentMode);
|
|
return TRUE;
|
|
// Paste at chosen position
|
|
case KA_ID_PASTEPOS :
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
if (m_pRegisteredCuttedObject)
|
|
{
|
|
SetEditorMode(E_em_CutPasteMode);
|
|
}
|
|
else
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
if (m_stListToCopy.GetCount() == 1)
|
|
SetEditorMode(E_em_PositionMode);
|
|
return TRUE;
|
|
|
|
// Init parent mode
|
|
case KA_ID_PARENT :
|
|
if (M_GetWorld()->GetCountSelected())
|
|
{
|
|
if (fn_bCanChangeAllParents())
|
|
SetEditorMode(E_em_HierarchyMode);
|
|
else
|
|
m_eModifCanceled = E_cm_CancelParent;
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
return TRUE;
|
|
// Init selection mode
|
|
case KA_ID_MULTI :
|
|
if (fn_bCanEnterMultiMode())
|
|
m_bMultiSelectMode = TRUE;
|
|
return TRUE;
|
|
case KA_ID_PYRAMID :
|
|
if (fn_bCanEnterMultiMode())
|
|
SetEditorMode(E_em_PyramidMode);
|
|
return TRUE;
|
|
case KA_ID_MULTIPYRAMID :
|
|
if (fn_bCanEnterMultiMode())
|
|
{
|
|
SetEditorMode(E_em_PyramidMode);
|
|
m_bMultiSelectMode = TRUE;
|
|
}
|
|
return TRUE;
|
|
|
|
// move mode
|
|
case KA_ID_WARPOBJECTDEPTHMOVE: //this one is specific only for object move
|
|
case KA_ID_MOVEDEPTH:
|
|
{
|
|
if (!m_bAvoidKeyRepeat)
|
|
{
|
|
m_bAvoidKeyRepeat = TRUE;
|
|
MTH3D_tdstVector XAxe, YAxe;
|
|
MTH3D_M_vSetVectorElements(&XAxe, 1.0, 0.0, 0.0);
|
|
MTH3D_M_vSetVectorElements(&YAxe, 0.0, 0.0, 1.0);
|
|
GetInterface()->SetPlaneForMouseMove(&XAxe, &YAxe);
|
|
//Selection Pyramid Begin
|
|
GetInterface()->fn_vInitPyramidDepth(TRUE);
|
|
GetInterface()->fn_vSetMouseMovePlane((uwAction == KA_ID_WARPOBJECTDEPTHMOVE) ? E_mmp_Warped : E_mmp_Standard);
|
|
GetInterface()->SetPyramidDepthMode(TRUE);
|
|
}
|
|
}
|
|
return TRUE;
|
|
|
|
// mouse rotate object
|
|
case KA_ID_ROTATEOBJECTXY:
|
|
if ( m_eMouseMoveMode != E_mmm_MouseRotateXY)
|
|
{
|
|
if ( fn_bCanRotateAllObjects() && m_eMouseMoveMode )
|
|
m_eMouseMoveMode = E_mmm_MouseRotateXY;
|
|
else
|
|
m_eModifCanceled = E_cm_CancelMove;
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
return TRUE;
|
|
case KA_ID_ROTATEOBJECTXZ:
|
|
if ( m_eMouseMoveMode != E_mmm_MouseRotateXZ)
|
|
{
|
|
if ( fn_bCanRotateAllObjects() && m_eMouseMoveMode )
|
|
m_eMouseMoveMode = E_mmm_MouseRotateXZ;
|
|
else
|
|
m_eModifCanceled = E_cm_CancelMove;
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
return TRUE;
|
|
|
|
// camera moves
|
|
case KA_ID_MOVEDOBJECT:
|
|
if (! m_bMovedObjectStaysOnScreen)
|
|
{
|
|
m_bMovedObjectStaysOnScreen = TRUE;
|
|
}
|
|
return TRUE;
|
|
|
|
// rotations
|
|
case KA_ID_ROTX :
|
|
fn_vRotateObjects(AXE_X);
|
|
return TRUE;
|
|
case KA_ID_ROTY :
|
|
fn_vRotateObjects(AXE_Y);
|
|
return TRUE;
|
|
case KA_ID_ROTZ :
|
|
fn_vRotateObjects(AXE_Z);
|
|
return TRUE;
|
|
//CPA2 Corneliu Babiuc 18-05-98
|
|
//inverse rotation
|
|
case KA_ID_ROTINVX :
|
|
fn_vRotateObjects(AXE_X,1);
|
|
return TRUE;
|
|
case KA_ID_ROTINVY :
|
|
fn_vRotateObjects(AXE_Y,1);
|
|
return TRUE;
|
|
case KA_ID_ROTINVZ :
|
|
fn_vRotateObjects(AXE_Z,1);
|
|
return TRUE;
|
|
case KA_ID_INCROTATIONSTEP:
|
|
fn_vSetRotationStep(C_xRotationStep + fn_xGetRotationStep());
|
|
return TRUE;
|
|
case KA_ID_DECROTATIONSTEP:
|
|
fn_vSetRotationStep(fn_xGetRotationStep() - C_xRotationStep );
|
|
return TRUE;
|
|
case KA_ID_INCTRANSLATIONSTEP:
|
|
fn_vSetTranslationStep(C_xTranslationStep + fn_xGetTranslationStep());
|
|
return TRUE;
|
|
case KA_ID_DECTRANSLATIONSTEP:
|
|
fn_vSetTranslationStep(fn_xGetRotationStep() - C_xTranslationStep );
|
|
return TRUE;
|
|
//END CPA2 Corneliu Babiuc 20-05-98
|
|
|
|
// translations
|
|
case KA_ID_LEFT :
|
|
fn_vTranslateObjects(AXE_X, 1);
|
|
return TRUE;
|
|
case KA_ID_RIGHT :
|
|
fn_vTranslateObjects(AXE_X, 0);
|
|
return TRUE;
|
|
case KA_ID_UP :
|
|
fn_vTranslateObjects(AXE_Y, 1);
|
|
return TRUE;
|
|
case KA_ID_DOWN :
|
|
fn_vTranslateObjects(AXE_Y, 0);
|
|
return TRUE;
|
|
case KA_ID_ON :
|
|
fn_vTranslateObjects(AXE_Z, 1);
|
|
return TRUE;
|
|
case KA_ID_BACK :
|
|
fn_vTranslateObjects(AXE_Z, 0);
|
|
return TRUE;
|
|
|
|
// selection choice
|
|
case KA_ID_CHOICE :
|
|
SetEditorMode(E_em_ChoiceMode);
|
|
return TRUE;
|
|
|
|
// current sector
|
|
case KA_ID_SECTORSELECTION:
|
|
m_bSelectSector = !m_bSelectSector;
|
|
return TRUE;
|
|
|
|
case KA_ID_SECTORWITHMOUSE:
|
|
m_bSelectSectorWithMouse = TRUE;
|
|
return TRUE;
|
|
|
|
//CPA2 Corneliu Babiuc 15-05-98
|
|
// put on ground
|
|
case KA_ID_PUTONGROUND:
|
|
fn_vPutOnGround();
|
|
return TRUE;
|
|
|
|
//constraints on axis
|
|
case KA_ID_XCONSTRAINT:
|
|
GetInterface()->GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateConstraints(CPA_MASK_CONSTRAINTX);
|
|
return TRUE;
|
|
case KA_ID_YCONSTRAINT:
|
|
GetInterface()->GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateConstraints(CPA_MASK_CONSTRAINTY);
|
|
return TRUE;
|
|
case KA_ID_ZCONSTRAINT:
|
|
GetInterface()->GetFrameBase()->m_oGeneralDialogBar.fn_vUpdateConstraints(CPA_MASK_CONSTRAINTZ);
|
|
return TRUE;
|
|
// SuperObject Flags
|
|
case KA_ID_SUPEROBJECTFLAGS:
|
|
// get selected superobject
|
|
// the action will be performed if only one object is selected
|
|
if ( M_GetWorld()->GetCountSelected() == 1 )
|
|
fn_vDoDialogFlags( (EDT_SuperObject *) M_GetSingleSelection() );
|
|
return TRUE;
|
|
//END CPA2 Corneliu Babiuc 21-05-98
|
|
|
|
// not an editor key
|
|
default :
|
|
break;
|
|
}
|
|
|
|
if (m_bSelectSector)
|
|
{
|
|
tdeDisplayMode mode;
|
|
mode = GetInterface()->GetSpecificInterface()->GetDisplayMode();
|
|
if(mode == E_dm_DrawVisibleSectors || mode == E_dm_DrawOnlyCurrentSector)
|
|
{
|
|
DEV_ViewPort3D *pCurViewport;
|
|
CPA_BaseObject *p_oCamera;
|
|
CPA_CameraCoords oCoords;
|
|
CPA_CameraDLLBase *p_oCameraInterface;
|
|
POS_tdstCompletePosition stCameraMatrix;
|
|
MTH3D_tdstVector point;
|
|
|
|
pCurViewport = (DEV_ViewPort3D *)GetInterface()->GetMultiDevice3D()->GetFocusDevice()->GetViewPort();
|
|
p_oCamera = pCurViewport->GetCamera();
|
|
p_oCameraInterface = pCurViewport->GetCameraInterface();
|
|
POS_fn_vSetIdentityMatrix(&stCameraMatrix);
|
|
p_oCameraInterface->GetMatrix(p_oCamera, &stCameraMatrix);
|
|
point.xX = 0;
|
|
point.xY = 0;
|
|
point.xZ = 10;
|
|
POS_fn_vMulMatrixVertex(&point, &stCameraMatrix, &point);
|
|
|
|
CPA_SuperObject *sector = GetInterface()->GetSpecificInterface()->GetCurrentSectorFromPos(&point);
|
|
if (sector)
|
|
GetInterface()->GetSpecificInterface()->SetCurrentSector (sector);
|
|
}
|
|
}
|
|
|
|
//key not processed
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
KeyUp
|
|
=========================================================================*/
|
|
|
|
BOOL EDT_HierarchyEditor::_OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
if (!m_bHasCurrentWorld)
|
|
return FALSE;
|
|
|
|
switch (m_p_oDevKeyboard->mfn_uwKeyToAction(nChar))
|
|
{
|
|
// create the Modif corresponding to the last move
|
|
case KA_ID_RIGHT :
|
|
case KA_ID_BACK :
|
|
case KA_ID_DOWN :
|
|
case KA_ID_LEFT :
|
|
case KA_ID_ROTX :
|
|
case KA_ID_ROTY :
|
|
case KA_ID_ROTZ :
|
|
case KA_ID_ON :
|
|
case KA_ID_UP :
|
|
if ((M_GetWorld()->GetCountSelected()) && (m_pKeyMove))
|
|
{
|
|
fn_bDoOrCancelMove(m_pKeyMove);
|
|
m_pKeyMove = NULL;
|
|
}
|
|
return TRUE;
|
|
|
|
// update selection mode
|
|
case KA_ID_MULTI:
|
|
m_bMultiSelectMode = FALSE;
|
|
return TRUE;
|
|
case KA_ID_PYRAMID:
|
|
SetEditorMode(E_em_NoMode);
|
|
return TRUE;
|
|
case KA_ID_MULTIPYRAMID:
|
|
m_bMultiSelectMode = FALSE;
|
|
return TRUE;
|
|
|
|
// update mode
|
|
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
case KA_ID_CUT:
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
case KA_ID_CHOICE:
|
|
case KA_ID_PARENT:
|
|
case KA_ID_ALONE:
|
|
case KA_ID_COPY:
|
|
case KA_ID_PASTEFATHER:
|
|
case KA_ID_PASTEPOS:
|
|
case KA_ID_MOVETO:
|
|
//CPA2 Corneliu Babiuc 14-06-98
|
|
case KA_ID_MOVETOINSTANCE:
|
|
case KA_ID_MOVECAMERATOINSTANCE:
|
|
case KA_ID_MOVECAMERACENTERED:
|
|
case KA_ID_REGISTERSELECTION : //CPA2 Corneliu Babiuc (multiple registration) 07-06-98
|
|
//END CPA2 Corneliu Babiuc 17-06-98
|
|
SetEditorMode(E_em_NoMode);
|
|
return TRUE;
|
|
|
|
case KA_ID_ORIENTINSTANCE:
|
|
SetEditorMode(E_em_NoMode);
|
|
m_bKeepOrientMode = FALSE;
|
|
return TRUE;
|
|
|
|
case KA_ID_ORIENTVERTICAL:
|
|
SetEditorMode(E_em_NoMode);
|
|
m_bKeepOrientMode = FALSE;
|
|
return TRUE;
|
|
|
|
case KA_ID_WARPOBJECTDEPTHMOVE:
|
|
if ( GetInterface()->fn_eGetMouseMovePlane() == E_mmp_Warped )
|
|
GetInterface()->fn_vSetMouseMovePlane(E_mmp_Standard);
|
|
//fall through
|
|
|
|
case KA_ID_MOVEDEPTH:
|
|
m_bAvoidKeyRepeat = FALSE;
|
|
// Now, mouse will move back into default plane (X,Y) (related to camera)
|
|
//m_bMouseMoveInDepth = FALSE;
|
|
MTH3D_tdstVector XAxe, YAxe;
|
|
MTH3D_M_vSetVectorElements(&XAxe, 1.0, 0.0, 0.0);
|
|
MTH3D_M_vSetVectorElements(&YAxe, 0.0, 1.0, 0.0);
|
|
GetInterface()->SetPlaneForMouseMove(&XAxe, &YAxe);
|
|
// Selection Pyramid
|
|
GetInterface()->fn_vInitPyramidDepth(FALSE);
|
|
//GetInterface()->m_vSetMouseMovePlane(E_mmp_None);
|
|
//CPA_Ed_1 begin DCerbu
|
|
GetInterface()->SetPyramidDepthMode(FALSE);
|
|
//CPA_Ed_1 end DCerbu
|
|
|
|
return TRUE;
|
|
|
|
case KA_ID_MOVEDOBJECT:
|
|
m_bMovedObjectStaysOnScreen = FALSE;
|
|
return TRUE;
|
|
|
|
case KA_ID_ROTATEOBJECTXY:
|
|
case KA_ID_ROTATEOBJECTXZ:
|
|
if ( m_eMouseMoveMode )
|
|
m_eMouseMoveMode = E_mmm_MouseMove;
|
|
else
|
|
m_eMouseMoveMode = E_mmm_NoMouseMove;
|
|
return TRUE;
|
|
|
|
case KA_ID_SECTORWITHMOUSE:
|
|
m_bSelectSectorWithMouse = FALSE;
|
|
return TRUE;
|
|
default :
|
|
break;
|
|
}
|
|
|
|
|
|
//key not processed
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
//#################################################################################
|
|
// MOUSE
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
MouseMove
|
|
=========================================================================*/
|
|
|
|
BOOL EDT_HierarchyEditor::_OnMouseMove(UINT nFlags, tdstMousePos *p_stPos, MTH3D_tdstVector *p_stVector)
|
|
{
|
|
CPA_ObjectDLLBase *p_oDLL;
|
|
MTH3D_tdstVector stOrientPosition, stNewPos;
|
|
EDT_SuperObject *pSupObj;
|
|
CPA_SuperObject *pElem;
|
|
tdstPosition stPosition;
|
|
POSITION pos;
|
|
BOOL bRes = FALSE;
|
|
float fMoved, fRequest;
|
|
|
|
|
|
|
|
if (!m_bHasCurrentWorld)
|
|
return FALSE;
|
|
|
|
if (m_bDisableFirstMove)
|
|
{
|
|
m_bDisableFirstMove = FALSE;
|
|
return FALSE;
|
|
}
|
|
|
|
if (GetInterface()->fn_bDoSelectionPyramid(p_stPos))
|
|
return TRUE;
|
|
|
|
// orient mode
|
|
if ((m_eEditorMode == E_em_OrientMode)||(m_eEditorMode == E_em_VOrientMode))
|
|
{
|
|
// check selection
|
|
if (!m_pOrientedObject)
|
|
return TRUE;
|
|
// find position
|
|
stPosition.stPos.stPos2D = p_stPos->stPos2D;
|
|
if (!fn_bFindPickingPosition(&stPosition))
|
|
return TRUE;
|
|
|
|
// ask DLL for custom orientation
|
|
p_oDLL = m_pOrientedObject->GetObjectDLL();
|
|
if (p_oDLL)
|
|
bRes = p_oDLL->fn_bOnOrientingObject(m_pOrientedObject, &stPosition);
|
|
// get picking position
|
|
if ((!bRes)&&(m_pOrientMove))
|
|
{
|
|
// get picking position
|
|
stOrientPosition = stPosition.a_stPickInfo->stPickedObject.aDEF_stDataOfElement[0].stHit;
|
|
// orient object
|
|
if (m_eEditorMode == E_em_OrientMode)
|
|
fn_vOrientToPosition(m_pOrientedObject, &stOrientPosition);
|
|
else
|
|
fn_vOrientWithVertical(m_pOrientedObject, &stOrientPosition);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
// move the selected object
|
|
if ((m_eMouseMoveMode)&&(p_stVector)&&(M_GetWorld()->GetCountSelected() > 0))
|
|
{
|
|
// first call : init the parameters and check permission
|
|
if (!m_pMouseMove)
|
|
{
|
|
//remember the position of the mouse
|
|
if ((fn_bMouseRotatesObjects() && fn_bCanRotateAllObjects())
|
|
||(fn_bCanTranslateAllObjects()))
|
|
{
|
|
// tell Dlls
|
|
fn_vSendMessageBeginMove();
|
|
// create modif
|
|
m_pMouseMove = new EDT_ModifMove(this, M_GetWorld()->GetListOfListByDLL(), GetInterface()->GetSelectMode());
|
|
}
|
|
else
|
|
{
|
|
m_eModifCanceled = E_cm_CancelMove;
|
|
m_eMouseMoveMode = E_mmm_NoMouseMove;
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
// move is a rotation
|
|
if (fn_bMouseRotatesObjects())
|
|
{
|
|
POS_tdstCompletePosition stMatrix;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
|
|
//get the corresponding 2d movement in the camera's plane
|
|
GLI_tdst2DVertex stDelta2D;
|
|
p_stVector->xX = p_stPos->stPos3D.xX + p_stVector->xX * 10;
|
|
p_stVector->xY = p_stPos->stPos3D.xY + p_stVector->xY * 10;
|
|
p_stVector->xZ = p_stPos->stPos3D.xZ + p_stVector->xZ * 10;
|
|
// get the position after the mouse move
|
|
M_GetViewPort3d()->Convert3dTo2d(&stDelta2D, p_stVector);
|
|
// now we can compute the difference with the old position
|
|
stDelta2D.xX = (stDelta2D.xX - p_stPos->stPos2D.xX) / 10;
|
|
stDelta2D.xY = (stDelta2D.xY - p_stPos->stPos2D.xY) / 10;
|
|
|
|
// nullify the vector because the object won't move
|
|
MTH3D_M_vNullVector(p_stVector);
|
|
// update all objects in the list
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
if (abs((int) stDelta2D.xX) > abs((int) stDelta2D.xY))
|
|
fn_vRotateX(&stMatrix, (float) (M_xSgn(stDelta2D.xX) * 0.1));
|
|
else
|
|
{
|
|
if (m_eMouseMoveMode == E_mmm_MouseRotateXY)
|
|
fn_vRotateY(&stMatrix, (float) (M_xSgn(stDelta2D.xY) * 0.1));
|
|
else
|
|
fn_vRotateZ(&stMatrix, (float) (M_xSgn(stDelta2D.xY) * 0.1));
|
|
}
|
|
|
|
// update all objects in the list
|
|
for (pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
{
|
|
pSupObj = (EDT_SuperObject *) pElem;
|
|
pSupObj->fn_vRotate(&stMatrix);
|
|
}
|
|
// tell DLLs
|
|
fn_vSendMessageMoving();
|
|
}
|
|
|
|
// move is a translation
|
|
else
|
|
{
|
|
MTH3D_tdstVector stNewVector = *p_stVector;
|
|
|
|
// lock selection
|
|
if (GetInterface()->GetLockSelection())
|
|
{
|
|
MTH3D_tdstVector prj1, prj2;
|
|
// get first selected object
|
|
pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos);
|
|
if (pElem)
|
|
{
|
|
GetInterface()->fn_vGetScreenProjection(pElem, &prj1);
|
|
((EDT_SuperObject *)pElem)->fn_vTranslate(p_stVector, TRUE);
|
|
GetInterface()->fn_vGetScreenProjection(pElem, &prj2);
|
|
|
|
fMoved = sqr(prj1.xX - prj2.xX) + sqr(prj1.xY - prj2.xY);
|
|
fRequest = sqr(p_stPos->stPos2D.xX - m_stLBDownMousePos.stPos2D.xX) + sqr(p_stPos->stPos2D.xY - m_stLBDownMousePos.stPos2D.xY);
|
|
|
|
MTH3D_M_vMulScalarVector(&stNewVector, -1, &stNewVector);
|
|
((EDT_SuperObject *)pElem)->fn_vTranslate(&stNewVector, TRUE);
|
|
MTH3D_M_vMulScalarVector(&stNewVector, -(float)sqrt((fRequest + 1e-4f)/(fMoved + 1e-4f)), &stNewVector);
|
|
}
|
|
m_stLBDownMousePos.stPos2D = p_stPos->stPos2D;
|
|
}
|
|
// update all objects in the list
|
|
for (pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
{
|
|
pSupObj = (EDT_SuperObject *) pElem;
|
|
|
|
CPA_Interface *pInterface = GetInterface();
|
|
|
|
if(//one or two buttons was pressed
|
|
(//one pressed
|
|
(pInterface->fn_bConsX()) ||
|
|
(pInterface->fn_bConsY()) ||
|
|
(pInterface->fn_bConsZ())
|
|
) &&
|
|
!(//but not all tree
|
|
(pInterface->fn_bConsX())&&
|
|
(pInterface->fn_bConsY())&&
|
|
(pInterface->fn_bConsZ())
|
|
) &&
|
|
//not valid when move with plane(Q or W keys)
|
|
!(pInterface->GetPyramidDepthMode())
|
|
|
|
)
|
|
{
|
|
//the X button is not pressed
|
|
if(!pInterface->fn_bConsX())
|
|
stNewVector.xX=0;
|
|
|
|
//the Y button is not pressed
|
|
if(!pInterface->fn_bConsY())
|
|
stNewVector.xY=0;
|
|
|
|
//the Z button is not pressed
|
|
if(!pInterface->fn_bConsZ())
|
|
stNewVector.xZ=0;
|
|
}
|
|
|
|
pSupObj->fn_vTranslate(&stNewVector, TRUE);
|
|
}
|
|
// tell DLLs
|
|
fn_vSendMessageMoving();
|
|
M_GetViewPort3d()->AddtoMoveVector(&stNewVector);
|
|
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectMatrix(M_GetWorld()->GetSingleSelection()->GetStruct()), &stNewPos);
|
|
M_GetViewPort3d()->SetPosition(&stNewPos);
|
|
M_GetViewPort3d()->fn_vUpdateStatusBarMessage();
|
|
|
|
// In this mode, the object does not move on the screen : the camera moves
|
|
if (m_bMovedObjectStaysOnScreen)
|
|
{
|
|
// So, we get the camera
|
|
CPA_CameraDLLBase *p_oCameraInterface = M_GetViewPort3d()->GetCameraInterface();
|
|
CPA_BaseObject *p_oCamera = M_GetViewPort3d()->GetCamera();
|
|
CPA_CameraCoords oCoords;
|
|
|
|
oCoords.SetXYZ(p_stVector->xX,p_stVector->xY,p_stVector->xZ);
|
|
oCoords.SetAxisSystem(WorldCoordinates);
|
|
|
|
p_oCameraInterface->Translate(p_oCamera,&oCoords);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
m_eMouseMoveMode = E_mmm_NoMouseMove;
|
|
if (fn_bIsMoveToModeEnabled())
|
|
return TRUE;
|
|
}
|
|
|
|
// mousemove not processed
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
Left Button Double-Click -> Selection
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnLButtonDblClk(UINT nFlags, tdstMousePos *p_stPos, ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject)
|
|
{
|
|
CPA_SuperObject *pObjectToEdit;
|
|
|
|
if (!m_bHasCurrentWorld)
|
|
return FALSE;
|
|
|
|
// if dblclk on selected object, call corresponding DLL
|
|
pObjectToEdit = fn_pstIsMouseOnObject(xIndex, p_stObject);
|
|
if ((pObjectToEdit)&&(pObjectToEdit->GetObjectDLL()))
|
|
{
|
|
m_stListToEdit.RemoveAll();
|
|
m_stListToEdit.AddTail(pObjectToEdit);
|
|
GetMainWorld()->fn_bActivateEditor(pObjectToEdit->GetObjectDLL(), &m_stListToEdit);
|
|
}
|
|
|
|
// update all
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog);
|
|
|
|
// processed
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
Left Button Down -> depends on current Mode
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnLButtonDown(UINT nFlags, tdstMousePos *p_stPos, ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject)
|
|
{
|
|
GEO_tdxHandleToMatrix hGlobalMatrix;
|
|
CPA_ObjectDLLBase *p_oDLL;
|
|
EDT_SuperObject *pSelectedObject;
|
|
EDT_SuperObject *pPreviousSelection=NULL;
|
|
CPA_SuperObject *pPrevSelected;
|
|
MTH3D_tdstVector stPosition;
|
|
MTH3D_tdstVector stOrientPosition;
|
|
MTH3D_tdstVector stDistance, stPos1, stPos2;
|
|
MTH3D_tdstVector stNormal, stVector;
|
|
tdeSelectMode eModeSelect;
|
|
tdstPosition stClickPosition;
|
|
POSITION pos;
|
|
BOOL bUpdate;
|
|
BOOL bRes = FALSE;
|
|
|
|
|
|
if (!m_bHasCurrentWorld)
|
|
return FALSE;
|
|
|
|
if (m_bSelectSectorWithMouse)
|
|
{
|
|
tdeDisplayMode mode;
|
|
mode = GetInterface()->GetSpecificInterface()->GetDisplayMode();
|
|
if(mode == E_dm_DrawVisibleSectors || mode == E_dm_DrawOnlyCurrentSector && p_stObject)
|
|
{
|
|
CPA_SuperObject *sector = GetInterface()->GetSpecificInterface()->GetCurrentSectorFromPos(&p_stObject->stPickedObject.aDEF_stDataOfElement[0].stHit);
|
|
if(sector)
|
|
{
|
|
GetInterface()->GetSpecificInterface()->SetCurrentSector(sector);
|
|
CComboBox *cb = (CComboBox *)GetInterface()->GetFrameBase()->m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_CURRENTSECTOR);
|
|
cb->SelectString(-1, sector->GetObject()->GetName());
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
if (GetInterface()->GetLockSelection())
|
|
m_stLBDownMousePos.stPos2D = p_stPos->stPos2D;
|
|
|
|
// init flags
|
|
m_bCanDisplayPopup = FALSE;
|
|
m_bDisableFirstMove = TRUE;
|
|
bUpdate = FALSE;
|
|
|
|
// Select Parent (Hierarchy or Paste)
|
|
if ((m_eEditorMode == E_em_HierarchyMode)||(m_eEditorMode == E_em_ParentMode))
|
|
{
|
|
eModeSelect = (m_eEditorMode == E_em_HierarchyMode) ? E_sm_SelectParent : E_sm_SelectPFather;
|
|
// find selected objects
|
|
pSelectedObject = (EDT_SuperObject *) GetInterface()->GetPickingSelection(eModeSelect, xIndex, p_stObject, p_stPos, &m_bDoDialogSelect);
|
|
if (pSelectedObject)
|
|
{
|
|
// hierarchy mode => create modif parent
|
|
if (m_eEditorMode == E_em_HierarchyMode)
|
|
{
|
|
M_GetEditManager()->AskFor (new EDT_ModifParent (this,
|
|
M_GetWorld()->GetListOfListByDLL(),
|
|
(EDT_SuperObject *) pSelectedObject,
|
|
GetInterface()->GetSelectMode()));
|
|
}
|
|
|
|
// father for paste => init modif paste
|
|
else
|
|
fn_vInitModifPaste(E_pm_PasteChoice, pSelectedObject);
|
|
}
|
|
else if (!m_bDoDialogSelect)
|
|
{
|
|
m_csMessage = "There is no valid parent under the mouse";
|
|
m_eModifCanceled = E_cm_CancelParent;
|
|
}
|
|
}
|
|
|
|
// position mode
|
|
else if (m_eEditorMode == E_em_PositionMode)
|
|
{
|
|
if ((xIndex)&&(p_stObject))
|
|
{
|
|
// get new position and normal from picking
|
|
stPosition = p_stObject[0].stPickedObject.aDEF_stDataOfElement[0].stHit;
|
|
fn_vGetNormalFromPicking(p_stObject, &stNormal);
|
|
// update it according to instance bounding volume
|
|
pSelectedObject = (EDT_SuperObject *) m_stListToCopy.GetHeadElement()->m_pChild;
|
|
fn_vGetPositionFromBoundingVolume(pSelectedObject, &stNormal, &stVector);
|
|
MTH3D_M_vAddVector(&stPosition, &stPosition, &stVector);
|
|
// paste instance at given position
|
|
fn_vInitModifPaste(E_pm_PasteChoice, NULL, &stPosition);
|
|
}
|
|
else
|
|
// warn user
|
|
fn_vInitModifPaste(E_pm_PasteChoice, NULL, NULL);
|
|
}
|
|
|
|
// Pyramid Mode
|
|
else if (fn_bIsPyramidModeEnabled())
|
|
GetInterface()->fn_vInitSelectionPyramid(p_stPos);
|
|
|
|
// Choice Mode
|
|
else if (m_eEditorMode == E_em_ChoiceMode)
|
|
{
|
|
// if necessary, cancel current selection
|
|
if (!m_bMultiSelectMode)
|
|
{
|
|
GetInterface()->fn_vCancelCurrentSelection(FALSE);
|
|
bUpdate = TRUE;
|
|
}
|
|
// find selected objects
|
|
GetInterface()->GetPickingSelection(E_sm_SelectChoice, xIndex, p_stObject, p_stPos, &m_bDoDialogSelect);
|
|
}
|
|
|
|
// Mode To Mode
|
|
else if (m_eEditorMode == E_em_MoveToMode)
|
|
{
|
|
//CPA2 Corneliu Babiuc (TMS_0598) 25-05-98
|
|
// now allow to teleport multiple selection
|
|
/*
|
|
if (M_GetWorld()->GetCountSelected() != 1)
|
|
{
|
|
// reinit selection
|
|
GetInterface()->fn_vCancelCurrentSelection(FALSE);
|
|
// find selected objects
|
|
pSelectedObject = (EDT_SuperObject *) GetInterface()->GetPickingSelection(E_sm_SelectNormal, xIndex, p_stObject, p_stPos, &m_bDoDialogSelect);
|
|
if (pSelectedObject)
|
|
{
|
|
GetInterface()->fn_vAddSelectedObject(pSelectedObject, FALSE);
|
|
SetCurrentCursor(C_hc_MoveToCursor, FALSE);
|
|
}
|
|
bUpdate = TRUE;
|
|
}
|
|
*/
|
|
//END CPA2 Corneliu Babiuc (TMS_0598) 25-05-98
|
|
}
|
|
//CPA2 Corneliu Babiuc 15-06-98
|
|
// specific teleportation
|
|
else if (m_eEditorMode == E_em_MoveToInstance)
|
|
{
|
|
g_pReferenceInstance = (EDT_SuperObject *) GetInterface()->GetPickingSelection(E_sm_SelectNormal, xIndex, p_stObject, p_stPos, &m_bDoDialogSelect);
|
|
// don't allow to teleport multiple selection
|
|
if (M_GetWorld()->GetCountSelected() != 1 && /*! m_bIsASelection CPA2 Corneliu Babiuc (multiple teleportation)*/M_GetWorld()->GetCountRegistered()==0)
|
|
{
|
|
// reinit selection
|
|
GetInterface()->fn_vCancelCurrentSelection(FALSE);
|
|
// find selected objects
|
|
if (g_pReferenceInstance)
|
|
{
|
|
GetInterface()->fn_vAddSelectedObject(g_pReferenceInstance, FALSE);
|
|
SetCurrentCursor(C_hc_MoveToCursor, FALSE);
|
|
}
|
|
bUpdate = TRUE;
|
|
}
|
|
}
|
|
else if (m_eEditorMode == E_em_MoveCameraToInstance || m_eEditorMode == E_em_MoveCameraCentered)
|
|
{
|
|
g_pReferenceInstance = (EDT_SuperObject *) GetInterface()->GetPickingSelection(E_sm_SelectNormal, xIndex, p_stObject, p_stPos, &m_bDoDialogSelect);
|
|
}
|
|
//END CPA2 Corneliu Babiuc 17-06-98
|
|
|
|
// Orient Mode
|
|
else if ((m_eEditorMode == E_em_OrientMode)||(m_eEditorMode == E_em_VOrientMode))
|
|
{
|
|
// RAZ move
|
|
m_pOrientMove = NULL;
|
|
m_pOrientedObject = NULL;
|
|
|
|
if (M_GetWorld()->GetCountSelected() == 1)
|
|
{
|
|
if ((xIndex)&&(p_stObject))
|
|
{
|
|
m_pOrientedObject = (EDT_SuperObject *) M_GetWorld()->GetSingleSelection();
|
|
// ask DLL for custom orientation
|
|
p_oDLL = m_pOrientedObject->GetObjectDLL();
|
|
if (p_oDLL)
|
|
{
|
|
// MAJ position
|
|
stClickPosition.stPos.stPos2D = p_stPos->stPos2D;
|
|
fn_bFindPickingPosition(&stClickPosition);
|
|
// give info to DLL
|
|
bRes = p_oDLL->fn_bOnClickOrientPosition(m_pOrientedObject, &stClickPosition);
|
|
}
|
|
// get picking position
|
|
if (!bRes)
|
|
{
|
|
// get picking position
|
|
stOrientPosition = p_stObject->stPickedObject.aDEF_stDataOfElement[0].stHit;
|
|
// create modif
|
|
m_pOrientMove = new EDT_ModifMove(this, M_GetWorld()->GetListOfListByDLL(), GetInterface()->GetSelectMode());
|
|
// orient object
|
|
if (m_eEditorMode == E_em_OrientMode)
|
|
fn_vOrientToPosition(m_pOrientedObject, &stOrientPosition);
|
|
else
|
|
fn_vOrientWithVertical(m_pOrientedObject, &stOrientPosition);
|
|
}
|
|
}
|
|
else
|
|
m_csMessage = "Editor could not find a valid position";
|
|
}
|
|
}
|
|
|
|
// Distance
|
|
else if (GetInterface()->GetDisplayDistance())
|
|
{
|
|
// get first selected object;
|
|
pPrevSelected = M_GetWorld()->GetListSelected()->GetHeadElement(pos);
|
|
if (pPrevSelected)
|
|
M_GetViewPort3d()->SetSelectedInstance(pPrevSelected->GetObject() ? pPrevSelected->GetObject()->GetName() : pPrevSelected->GetName());
|
|
else
|
|
M_GetViewPort3d()->SetSelectedInstance("");
|
|
// find new selected object
|
|
pSelectedObject = (EDT_SuperObject *) GetInterface()->GetPickingSelection(E_sm_SelectNormal, xIndex, p_stObject, p_stPos, &m_bDoDialogSelect, pPreviousSelection);
|
|
if (pSelectedObject)
|
|
M_GetViewPort3d()->SetPickedInstance(pSelectedObject->GetObject() ? pSelectedObject->GetObject()->GetName() : pSelectedObject->GetName());
|
|
else
|
|
M_GetViewPort3d()->SetPickedInstance("");
|
|
|
|
if (!pPrevSelected || !pSelectedObject)
|
|
{
|
|
//now display the distance to static object
|
|
if (pPrevSelected)
|
|
{
|
|
stClickPosition.stPos.stPos2D = p_stPos->stPos2D;
|
|
if (fn_bFindPickingPosition(&stClickPosition))
|
|
{
|
|
M_GetViewPort3d()->SetPickedInstance("picking position");
|
|
// get first position
|
|
hGlobalMatrix = HIE_fn_hGetSuperObjectMatrix(pPrevSelected->GetStruct());
|
|
POS_fn_vGetTranslationVector(hGlobalMatrix, &stPos1);
|
|
// compute distance
|
|
MTH3D_M_vSubVector(&stDistance, &(stClickPosition.stPos.stPos3D), &stPos1);
|
|
M_GetViewPort3d()->SetDistanceVector(&stDistance);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MTH3D_M_vSetVectorElements(&stDistance, 0.0f, 0.0f, 0.0f);
|
|
M_GetViewPort3d()->SetDistanceVector(&stDistance);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// get first position
|
|
hGlobalMatrix = HIE_fn_hGetSuperObjectMatrix(pPrevSelected->GetStruct());
|
|
POS_fn_vGetTranslationVector(hGlobalMatrix, &stPos1);
|
|
// get second position
|
|
hGlobalMatrix = HIE_fn_hGetSuperObjectMatrix(pSelectedObject->GetStruct());
|
|
POS_fn_vGetTranslationVector(hGlobalMatrix, &stPos2);
|
|
// compute distance
|
|
MTH3D_M_vSubVector(&stDistance, &stPos2, &stPos1);
|
|
M_GetViewPort3d()->SetDistanceVector(&stDistance);
|
|
}
|
|
M_GetViewPort3d()->fn_vUpdateStatusBarMessage();
|
|
}
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
else if (m_eEditorMode == E_em_CutPasteMode) {
|
|
;
|
|
}
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
|
|
// Select Mode
|
|
else
|
|
{
|
|
// get previous selection
|
|
pPreviousSelection = (EDT_SuperObject *) fn_pstIsMouseOnObject(xIndex, p_stObject);
|
|
// find selected objects
|
|
pSelectedObject = (EDT_SuperObject *) GetInterface()->GetPickingSelection(E_sm_SelectNormal, xIndex, p_stObject, p_stPos, &m_bDoDialogSelect, pPreviousSelection);
|
|
if (pSelectedObject)
|
|
{
|
|
M_GetViewPort3d()->SetSelectedInstance(pSelectedObject->GetObject() ? pSelectedObject->GetObject()->GetName() : pSelectedObject->GetName());
|
|
MTH3D_M_vSetVectorElements(&stDistance, 0.0f, 0.0f, 0.0f);
|
|
M_GetViewPort3d()->SetMoveVector(&stDistance);
|
|
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectMatrix(pSelectedObject->GetStruct()), &stDistance);
|
|
M_GetViewPort3d()->SetPosition(&stDistance);
|
|
M_GetViewPort3d()->fn_vUpdateStatusBarMessage();
|
|
}
|
|
else
|
|
{
|
|
M_GetViewPort3d()->SetSelectedInstance("");
|
|
MTH3D_M_vSetVectorElements(&stDistance, 0.0f, 0.0f, 0.0f);
|
|
M_GetViewPort3d()->SetMoveVector(&stDistance);
|
|
M_GetViewPort3d()->SetPosition(&stDistance);
|
|
M_GetViewPort3d()->fn_vUpdateStatusBarMessage();
|
|
}
|
|
|
|
// mouse is not on a selected object
|
|
if ((!m_bMultiSelectMode)&&((!pPreviousSelection)||(pPreviousSelection != pSelectedObject)))
|
|
{
|
|
GetInterface()->fn_vCancelCurrentSelection(FALSE);
|
|
bUpdate = TRUE;
|
|
}
|
|
// select corresponding object
|
|
if (pSelectedObject)
|
|
{
|
|
// normal selection => select if not
|
|
if (!m_bMultiSelectMode)
|
|
{
|
|
if (pPreviousSelection != pSelectedObject)
|
|
{
|
|
GetInterface()->fn_vAddSelectedObject(pSelectedObject, FALSE);
|
|
bUpdate = TRUE;
|
|
}
|
|
}
|
|
// multiple selection
|
|
else
|
|
{
|
|
// object already selected ?
|
|
pPreviousSelection = (EDT_SuperObject *) GetInterface()->GetPreviousSelection(pSelectedObject);
|
|
if (pPreviousSelection)
|
|
GetInterface()->fn_vRemoveSelectedObject(pPreviousSelection, FALSE);
|
|
if (pPreviousSelection != pSelectedObject)
|
|
GetInterface()->fn_vAddSelectedObject(pSelectedObject, FALSE);
|
|
bUpdate = TRUE;
|
|
}
|
|
}
|
|
// init mousemove
|
|
if (!m_eMouseMoveMode)
|
|
{
|
|
if (pSelectedObject || GetInterface()->GetLockSelection())
|
|
m_eMouseMoveMode = E_mmm_MouseMove;
|
|
else
|
|
m_eMouseMoveMode = E_mmm_NoMouseMove;
|
|
}
|
|
}
|
|
|
|
// update all
|
|
if (bUpdate)
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateSelection);
|
|
|
|
// stick objects
|
|
if (GetDialogSelect()->fn_bIsSelecting())
|
|
GetDialogSelect()->fn_vSetPoint(p_stPos, p_stObject);
|
|
|
|
// key processed
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
Left Button Up -> depends on current Mode
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnLButtonUp(UINT nFlags, tdstMousePos *p_stPos)
|
|
{
|
|
CPA_ObjectDLLBase *p_oDLL;
|
|
MTH3D_tdstVector stDistance;
|
|
EDT_SuperObject *pSelected;
|
|
tdeSelectMode eModeSelect;
|
|
tdstPosition stPosition;
|
|
BOOL bRes = FALSE;
|
|
|
|
if (!m_bHasCurrentWorld)
|
|
return FALSE;
|
|
|
|
// if necessary, display the Selection Dialog
|
|
if (m_bDoDialogSelect)
|
|
{
|
|
// Parent Mode
|
|
if ((m_eEditorMode == E_em_HierarchyMode)||(m_eEditorMode == E_em_ParentMode))
|
|
{
|
|
// do modal dialog
|
|
eModeSelect = (m_eEditorMode == E_em_HierarchyMode) ? E_sm_SelectParent : E_sm_SelectPFather;
|
|
// get parent
|
|
pSelected = (EDT_SuperObject *) GetInterface()->GetDialogSelection(eModeSelect);
|
|
if (pSelected)
|
|
{
|
|
// hierarchy mode => create modif parent
|
|
if (m_eEditorMode == E_em_HierarchyMode)
|
|
{
|
|
M_GetEditManager()->AskFor (new EDT_ModifParent(this,
|
|
M_GetWorld()->GetListOfListByDLL(),
|
|
pSelected,
|
|
GetInterface()->GetSelectMode()));
|
|
}
|
|
// father for paste => init modif paste
|
|
else
|
|
fn_vInitModifPaste(E_pm_PasteChoice, pSelected);
|
|
}
|
|
}
|
|
// choice mode
|
|
else if (m_eEditorMode = E_em_ChoiceMode)
|
|
{
|
|
// get parent
|
|
pSelected = (EDT_SuperObject *) GetInterface()->GetDialogSelection(E_sm_SelectNormal);
|
|
// ask permission and set new selection
|
|
if (pSelected)
|
|
GetInterface()->fn_vAddSelectedObject(pSelected, FALSE);
|
|
}
|
|
// cancel mode
|
|
SetEditorMode(E_em_NoMode);
|
|
m_bMultiSelectMode = FALSE;
|
|
// update drawing
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog);
|
|
M_GetViewPort3d()->SetFocus();
|
|
}
|
|
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
if (m_eEditorMode == E_em_CutPasteMode)
|
|
{
|
|
if (m_pRegisteredCuttedObject)
|
|
{
|
|
stPosition.stPos.stPos2D = p_stPos->stPos2D;
|
|
if (!fn_bFindPickingPosition(&stPosition))
|
|
{
|
|
m_csMessage = "Editor could not find a valid position";
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
else
|
|
{
|
|
EDT_SuperObject *pParent;
|
|
|
|
|
|
pParent = m_pSpecificEditor->GetDefaultParentForPaste(m_pRegisteredCuttedObject);
|
|
|
|
M_GetEditManager()->AskFor (new EDT_ModifInsert
|
|
(this, m_pRegisteredCuttedObject, pParent, &stPosition,
|
|
NULL, TRUE, TRUE, FALSE, TRUE,m_bSpecialObject));
|
|
|
|
m_pRegisteredCuttedObject=NULL;
|
|
m_bSpecialObject = FALSE;
|
|
SetEditorMode(E_em_NoMode);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
|
|
// Move To Mode
|
|
if (m_eEditorMode == E_em_MoveToMode)
|
|
{
|
|
// if there is an object selected or if there is an object registered
|
|
if ( (M_GetWorld()->GetCountSelected() /*== 1*/>0) || /*m_bIsASelection */M_GetWorld()->GetCountRegistered()) //CPA2 Corneliu Babiuc (TMS_0598) 25-05-98
|
|
{
|
|
stPosition.stPos.stPos2D = p_stPos->stPos2D;
|
|
if (!fn_bFindPickingPosition(&stPosition))
|
|
{
|
|
m_csMessage = "Editor could not find a valid position";
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
else
|
|
fn_vMoveToNewPosition(&stPosition);
|
|
}
|
|
}
|
|
//CPA2 Corneliu Babiuc 15-06-98
|
|
else if (m_eEditorMode == E_em_MoveToInstance)
|
|
{
|
|
// if there is an object selected or if there is an object registered
|
|
if ( (M_GetWorld()->GetCountSelected() == 1) || /*m_bIsASelection*/M_GetWorld()->GetCountRegistered() ==1) //CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
{
|
|
if (!g_pReferenceInstance)
|
|
{
|
|
m_csMessage = "Editor could not find an instance";
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
else
|
|
{
|
|
fn_vMoveToInstancePosition(g_pReferenceInstance);
|
|
}
|
|
}
|
|
g_pReferenceInstance = NULL;
|
|
}
|
|
else if (m_eEditorMode == E_em_MoveCameraToInstance || m_eEditorMode == E_em_MoveCameraCentered)
|
|
{
|
|
if (!g_pReferenceInstance)
|
|
{
|
|
m_csMessage = "Editor could not find an instance";
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
else
|
|
{
|
|
if (m_eEditorMode == E_em_MoveCameraToInstance)
|
|
fn_vMoveCameraOrientedToInstance(g_pReferenceInstance);
|
|
else
|
|
{
|
|
// search for Rayman
|
|
CPA_List<CPA_SuperObject> * p_lstInstancesList;
|
|
CPA_SuperObject *pElem, * p_oRayman = NULL;
|
|
//get the list of actors, and search for Rayman base object
|
|
p_lstInstancesList = GetInterface()->GetObjectListByType(C_szActorInstanceTypeName);
|
|
POSITION Pos;
|
|
for( pElem = p_lstInstancesList->GetHeadElement(Pos);
|
|
pElem;
|
|
pElem = p_lstInstancesList->GetNextElement(Pos) )
|
|
{
|
|
//compare if the base object has name Rayman
|
|
if (pElem->GetObject()->GetName() == "Rayman")
|
|
{
|
|
p_oRayman = pElem;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!p_oRayman)
|
|
{
|
|
m_csMessage = "Editor could not find Rayman's instance";
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
else
|
|
{
|
|
fn_vMoveCameraToInstanceCenterOnInstance(g_pReferenceInstance, p_oRayman);
|
|
}
|
|
}
|
|
}
|
|
g_pReferenceInstance = NULL;
|
|
}
|
|
//END CPA2 Corneliu Babiuc 17-06-98
|
|
else
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
|
|
// Orient Mode
|
|
if ((m_eEditorMode == E_em_OrientMode)||(m_eEditorMode == E_em_VOrientMode))
|
|
{
|
|
// check selection
|
|
if (m_pOrientedObject)
|
|
{
|
|
// ask DLL for custom orientation
|
|
p_oDLL = m_pOrientedObject->GetObjectDLL();
|
|
if (p_oDLL)
|
|
{
|
|
// MAJ position
|
|
stPosition.stPos.stPos2D = p_stPos->stPos2D;
|
|
fn_bFindPickingPosition(&stPosition);
|
|
// give info to DLL
|
|
bRes = p_oDLL->fn_bOnEndOrientObject(m_pOrientedObject, &stPosition);
|
|
}
|
|
// do modif
|
|
if ((m_pOrientMove)&&(!bRes))
|
|
fn_bDoOrCancelMove(m_pOrientMove);
|
|
else
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
// if necessary, cancel mode
|
|
if (!m_bKeepOrientMode)
|
|
SetEditorMode(E_em_NoMode);
|
|
// raz move
|
|
m_pOrientMove = NULL;
|
|
m_pOrientedObject = NULL;
|
|
}
|
|
}
|
|
|
|
// if modif was canceled
|
|
if (m_eModifCanceled != E_cm_NoCancel)
|
|
{
|
|
// cancel all modes
|
|
SetEditorMode(E_em_NoMode);
|
|
m_bMultiSelectMode = FALSE;
|
|
}
|
|
// If selected objects have moved
|
|
else if ((M_GetWorld()->GetCountSelected()) && (m_pMouseMove))
|
|
{
|
|
fn_bDoOrCancelMove(m_pMouseMove);
|
|
|
|
pSelected = (EDT_SuperObject *) M_GetWorld()->GetSingleSelection();
|
|
if (pSelected)
|
|
{
|
|
M_GetViewPort3d()->SetSelectedInstance(pSelected->GetObject() ? pSelected->GetObject()->GetName() : pSelected->GetName());
|
|
MTH3D_M_vSetVectorElements(&stDistance, 0.0f, 0.0f, 0.0f);
|
|
M_GetViewPort3d()->SetMoveVector(&stDistance);
|
|
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectMatrix(pSelected->GetStruct()), &stDistance);
|
|
M_GetViewPort3d()->SetPosition(&stDistance);
|
|
M_GetViewPort3d()->fn_vUpdateStatusBarMessage();
|
|
}
|
|
else
|
|
{
|
|
M_GetViewPort3d()->SetSelectedInstance("");
|
|
MTH3D_M_vSetVectorElements(&stDistance, 0.0f, 0.0f, 0.0f);
|
|
M_GetViewPort3d()->SetMoveVector(&stDistance);
|
|
M_GetViewPort3d()->SetPosition(&stDistance);
|
|
}
|
|
m_pMouseMove = NULL;
|
|
m_eMouseMoveMode = E_mmm_NoMouseMove;
|
|
}
|
|
|
|
// Pyramid Selection
|
|
GetInterface()->fn_vEndSelectionPyramid();
|
|
|
|
m_bCanDisplayPopup = TRUE;
|
|
m_bDoDialogSelect = FALSE;
|
|
m_bDisableFirstMove = TRUE;
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
Right Button Down -> popup menu
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnRButtonDown(UINT nFlags, tdstMousePos *p_stCoords, ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject)
|
|
{
|
|
if (!m_bHasCurrentWorld)
|
|
return FALSE;
|
|
// show the cursor, in case a dialog appear!
|
|
if (!m_bCanDisplayPopup)
|
|
return FALSE;
|
|
|
|
// to select an object
|
|
_OnLButtonDown(nFlags, p_stCoords, xIndex, p_stObject);
|
|
_OnLButtonUp(nFlags, p_stCoords);
|
|
|
|
// cancel mode (for popup)
|
|
fn_vCancelAllModes();
|
|
// display popup
|
|
GetInterface()->fn_vDisplayPopupMenu(p_stCoords);
|
|
|
|
// command processed
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
Right Button Doubleclick
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnRButtonDblClk (UINT nFlags, tdstMousePos *p_stPos, ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
Right Button up
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnRButtonUp(UINT nFlags, tdstMousePos *p_stPos)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
//#################################################################################
|
|
// COMMANDS
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
on command
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnCommand (UINT IDCmdMsg)
|
|
{
|
|
// check if command comes from popupmenu
|
|
if ((IDCmdMsg >= C_EDTPopUpMenuIDStart) &&
|
|
(IDCmdMsg <= C_EDTPopUpMenuIDEnd))
|
|
{
|
|
// popupmenu command processed...
|
|
GetInterface()->fn_vDisplayMenuCommand(IDCmdMsg);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
on update command
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnUpdateCommandUI(UINT IDCmdMsg, CCmdUI *pCmdUI)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// DRAG & DROP
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: get minimal box
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vGetMinMaxPointsOfInstance (EDT_SuperObject *pEdObj, POS_tdxHandleToPosition hMatrix, MTH3D_tdstVector *p_stMinPoint, MTH3D_tdstVector *p_stMaxPoint,
|
|
/* CPA2 Corneliu Babiuc (TMS_0598) 13-06-98*/ BOOL bGlobal )
|
|
{
|
|
HIE_tdxHandleToSuperObject hSupObj;
|
|
POS_tdstCompletePosition stMatrix;
|
|
ACP_tdxHandleOfObject hPhysicalObject;
|
|
MTH3D_tdstVector stPoint;
|
|
EDT_SuperObject *pChild;
|
|
ACP_tdxIndex xNbPoints, xNumPoint;
|
|
MTH_tdxReal xTemp;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
hSupObj = pEdObj->GetStruct();
|
|
|
|
switch (HIE_fn_ulGetSuperObjectType(hSupObj))
|
|
{
|
|
// geometric object
|
|
case HIE_C_ulEDT_Geometric:
|
|
//Take the physical object
|
|
hPhysicalObject = (ACP_tdxHandleOfObject) HIE_fn_hGetSuperObjectObject(hSupObj);
|
|
break;
|
|
|
|
// instanciated physical object
|
|
case HIE_C_ulIPO:
|
|
case HIE_C_ulIPO_Mirror:
|
|
//Take the physical object
|
|
GLI_vGetVisualSetLOD(PO_fn_hGetVisualSet(IPO_fn_hGetPhysicalObject((IPO_tdxHandleToInstanciatedPhysicalObject)HIE_fn_hGetSuperObjectObject(hSupObj))),
|
|
0L,
|
|
&xTemp,
|
|
&hPhysicalObject);
|
|
break;
|
|
|
|
// physical object
|
|
case HIE_C_ulPO:
|
|
//Take the physical object
|
|
GLI_vGetVisualSetLOD(PO_fn_hGetVisualSet((PO_tdxHandleToPhysicalObject)HIE_fn_hGetSuperObjectObject(hSupObj)),
|
|
0L,
|
|
&xTemp,
|
|
&hPhysicalObject);
|
|
break;
|
|
|
|
default:
|
|
hPhysicalObject = NULL;
|
|
break;
|
|
}
|
|
|
|
// update min&max
|
|
if (hPhysicalObject)
|
|
{
|
|
// get number of points in the object
|
|
xNbPoints = GEO_xGetGeometricObjectNumberOfPoints(hPhysicalObject);
|
|
// check coordinates of each point
|
|
for (xNumPoint = 0; xNumPoint < xNbPoints; xNumPoint++)
|
|
{
|
|
// get point
|
|
GEO_vGetPointOfObject(hPhysicalObject, &stPoint, xNumPoint);
|
|
// update with matrix
|
|
POS_fn_vMulMatrixVertex(&stPoint, hMatrix, &stPoint);
|
|
//CPA2 Corneliu Babiuc (TMS_0598) 13-06-98
|
|
// transform in global coordinates if bGlobal is true
|
|
if (bGlobal)
|
|
POS_fn_vMulMatrixVertex(&stPoint, HIE_fn_hGetSuperObjectGlobalMatrix(pEdObj->GetStruct()), &stPoint);
|
|
//END CPA2 Corneliu Babiuc (TMS_0598) 13-06-98
|
|
// check x coordinate
|
|
if (stPoint.xX < p_stMinPoint->xX) p_stMinPoint->xX = stPoint.xX;
|
|
if (stPoint.xX > p_stMaxPoint->xX) p_stMaxPoint->xX = stPoint.xX;
|
|
// check y coordinate
|
|
if (stPoint.xY < p_stMinPoint->xY) p_stMinPoint->xY = stPoint.xY;
|
|
if (stPoint.xY > p_stMaxPoint->xY) p_stMaxPoint->xY = stPoint.xY;
|
|
// check z coordinate
|
|
if (stPoint.xZ < p_stMinPoint->xZ) p_stMinPoint->xZ = stPoint.xZ;
|
|
if (stPoint.xZ > p_stMaxPoint->xZ) p_stMaxPoint->xZ = stPoint.xZ;
|
|
}
|
|
}
|
|
|
|
// next level of hierarchy
|
|
for (pChild = (EDT_SuperObject *) pEdObj->GetSuperObjectFirstChild(); pChild;
|
|
pChild = (EDT_SuperObject *) pEdObj->GetSuperObjectNextChild(pChild))
|
|
{
|
|
// compute global matrix
|
|
POS_fn_vMulMatrixMatrix(&stMatrix, hMatrix, HIE_fn_hGetSuperObjectMatrix(pChild->GetStruct()));
|
|
// compute min & max
|
|
fn_vGetMinMaxPointsOfInstance(pChild, &stMatrix, p_stMinPoint, p_stMaxPoint,
|
|
/*CPA2 Corneliu Babiuc (TMS_0598) 13-06-98*/ bGlobal);
|
|
}
|
|
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: get normal from picking infos
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vGetPositionFromBoundingVolume (EDT_SuperObject *pSupObj, MTH3D_tdstVector *pNormal, MTH3D_tdstVector *pVector)
|
|
{
|
|
POS_tdstCompletePosition stMatrix;
|
|
MTH3D_tdstVector stMinPoint, stMaxPoint;
|
|
|
|
// compute min & max
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
stMinPoint.xX = stMinPoint.xY = stMinPoint.xZ = MTH_C_InfinitPlus;
|
|
stMaxPoint.xX = stMaxPoint.xY = stMaxPoint.xZ = MTH_C_InfinitMinus;
|
|
fn_vGetMinMaxPointsOfInstance(pSupObj, &stMatrix, &stMinPoint, &stMaxPoint);
|
|
|
|
// check normal
|
|
if (pNormal->xX > 0)
|
|
pVector->xX = (stMinPoint.xX < 0) ? - stMinPoint.xX : 0;
|
|
if (pNormal->xX < 0)
|
|
pVector->xX = (stMaxPoint.xX > 0) ? - stMaxPoint.xX : 0;
|
|
|
|
if (pNormal->xY > 0)
|
|
pVector->xY = (stMinPoint.xY < 0) ? - stMinPoint.xY : 0;
|
|
if (pNormal->xY < 0)
|
|
pVector->xY = (stMaxPoint.xY > 0) ? - stMaxPoint.xY : 0;
|
|
|
|
if (pNormal->xZ > 0)
|
|
pVector->xZ = (stMinPoint.xZ < 0) ? - stMinPoint.xZ : 0;
|
|
if (pNormal->xZ < 0)
|
|
pVector->xZ = (stMaxPoint.xZ > 0) ? - stMaxPoint.xZ : 0;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: get normal from picking infos
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vGetNormalFromPicking (HIE_aDEF_stTabOfPickInfo a_stPickInfo, MTH3D_tdstVector *pNormal)
|
|
{
|
|
IPO_tdxHandleToInstanciatedPhysicalObject hInstanciated;
|
|
PO_tdxHandleToPhysicalObject hPhysical;
|
|
GEO_tdstGeometricObject *p_stObj;
|
|
GLI_tdstDataOfElement *p_stData;
|
|
ACP_tdxHandleOfObject hGeomObj;
|
|
MTH_tdxReal xVoidReal;
|
|
|
|
// geometric object
|
|
if ( HIE_fn_ulGetSuperObjectType(a_stPickInfo[0].hSprObject) == HIE_C_ulEDT_Geometric)
|
|
p_stObj = (GEO_tdstGeometricObject *) HIE_fn_hGetSuperObjectObject(a_stPickInfo[0].hSprObject);
|
|
|
|
// physical object
|
|
if (HIE_fn_ulGetSuperObjectType(a_stPickInfo[0].hSprObject) & (HIE_C_ulPO | HIE_C_ulPO_Mirror))
|
|
{
|
|
hPhysical = (PO_tdxHandleToPhysicalObject) HIE_fn_hGetSuperObjectObject(a_stPickInfo[0].hSprObject);
|
|
GLI_vGetVisualSetLOD(PO_fn_hGetVisualSet(hPhysical), 0, &xVoidReal, &hGeomObj);
|
|
p_stObj = (GEO_tdstGeometricObject *) hGeomObj;
|
|
}
|
|
|
|
// instanciated physical object
|
|
if (HIE_fn_ulGetSuperObjectType(a_stPickInfo[0].hSprObject) & (HIE_C_ulIPO | HIE_C_ulIPO_Mirror))
|
|
{
|
|
hInstanciated = (IPO_tdxHandleToInstanciatedPhysicalObject) HIE_fn_hGetSuperObjectObject(a_stPickInfo[0].hSprObject);
|
|
hPhysical = IPO_fn_hGetPhysicalObject(hInstanciated);
|
|
GLI_vGetVisualSetLOD(PO_fn_hGetVisualSet(hPhysical), 0, &xVoidReal, &hGeomObj);
|
|
p_stObj = (GEO_tdstGeometricObject *) hGeomObj;
|
|
}
|
|
|
|
// get data
|
|
p_stData = &(a_stPickInfo[0].stPickedObject.aDEF_stDataOfElement[0]);
|
|
// get normal
|
|
GEO_vGetNormalOfGeometricObjectElement(p_stObj, p_stData->xElements, p_stData->xIndexOfFace, pNormal);
|
|
}
|
|
|
|
/*===========================================================================
|
|
on drag drop end
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnDragDropEnd(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CPA_ObjectDLLBase *p_oDLL;
|
|
EDT_SuperObject *pParent;
|
|
EDT_SuperObject *pNewInstance;
|
|
MTH3D_tdstVector stNormal, stVector;
|
|
MTH3D_tdstVector stSource, stResult;
|
|
MTH3D_tdstVector stTranslation;
|
|
POS_tdstCompletePosition *pParentMatrix, *pInstanceMatrix, *pGlobalMatrix;
|
|
POS_tdstCompletePosition stMatrix;
|
|
tdeSaveStatus eStatus;
|
|
tdstPosition stPosition;
|
|
tdeTypeSO eTypeInsert;
|
|
DD_Object *p_oDDObject;
|
|
EDT_Model *pModel;
|
|
CPoint point;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
if (!m_bHasCurrentWorld)
|
|
return FALSE;
|
|
|
|
p_oDDObject = (DD_Object *) lParam;
|
|
// check data type of dragged object
|
|
if (p_oDDObject->fn_uiGetDataType() != C_ucModel)
|
|
return FALSE;
|
|
|
|
// there must be a current model
|
|
pModel = GetInterface()->GetCurrentModel();
|
|
if (!pModel)
|
|
return FALSE;
|
|
p_oDLL = pModel->m_pObjectDLL;
|
|
|
|
// ask permission to the world
|
|
if (!M_GetWorld()->fn_bAcceptModifInsert(p_oDLL))
|
|
{
|
|
m_csMessage = "Instances created by this DLL cannot be inserted in this world";
|
|
fn_vDisplayCancelMessage(E_cm_CancelInsert);
|
|
return FALSE;
|
|
}
|
|
|
|
// init stMousePos
|
|
stPosition.stPos.stPos = p_oDDObject->m_stMousePos;
|
|
// modif position for GLIDE
|
|
M_GetViewPort3d()->ScreenToClient( &p_oDDObject->m_stMousePos);
|
|
//if (GLI_lWhatIsGLI () == GLI_C_VersionGlide )
|
|
if(1) //USE_DIRECTX: tjr entrer ici pour les deux modes
|
|
{
|
|
point = p_oDDObject->m_stMousePos;
|
|
M_GetViewPort3d()->ClientToVoodoo(point);
|
|
stPosition.stPos.stPos2D.xX = GLI_M_LongToValue(point.x);
|
|
stPosition.stPos.stPos2D.xY = GLI_M_LongToValue(point.y);
|
|
}
|
|
else
|
|
{
|
|
stPosition.stPos.stPos2D.xX = GLI_M_LongToValue(p_oDDObject->m_stMousePos.x);
|
|
stPosition.stPos.stPos2D.xY = GLI_M_LongToValue(p_oDDObject->m_stMousePos.y);
|
|
}
|
|
|
|
// Get Type
|
|
eTypeInsert = p_oDLL->GetTypeInstance(pModel->m_csTypeName, pModel->m_csName);
|
|
eStatus = p_oDLL->GetStatusInstance(pModel->m_csTypeName, pModel->m_csName);
|
|
// Get Parent for insertion
|
|
pParent = GetParentForInsertion(p_oDLL, pModel->m_csTypeName, pModel->m_csName, &stPosition, eTypeInsert, eStatus);
|
|
if (!pParent)
|
|
{
|
|
m_csMessage = "Editor could not find a valid parent for this model and position";
|
|
fn_vDisplayCancelMessage(E_cm_CancelInsert);
|
|
return FALSE;
|
|
}
|
|
|
|
// construct the new instance
|
|
pNewInstance = (EDT_SuperObject *) p_oDLL->GetNewInstance(pModel->m_csTypeName, pModel->m_csName, pParent);
|
|
if (!pNewInstance)
|
|
{
|
|
m_csMessage = "There is no instance to insert";
|
|
fn_vDisplayCancelMessage(E_cm_CancelInsert);
|
|
return FALSE;
|
|
}
|
|
|
|
// get position
|
|
pParentMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pParent->GetStruct());
|
|
pInstanceMatrix = HIE_fn_hGetSuperObjectMatrix(pNewInstance->GetStruct());
|
|
pGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pNewInstance->GetStruct());
|
|
// ask DLL
|
|
if (!p_oDLL->fn_bChooseInsertPosition(pNewInstance, pParent, &stPosition))
|
|
{
|
|
// set global matrix orientation
|
|
POS_fn_vMulMatrixMatrix(pGlobalMatrix, pParentMatrix, pInstanceMatrix);
|
|
POS_fn_vNormalizeMatrix(pGlobalMatrix);
|
|
// get real position
|
|
fn_vGetNormalFromPicking(stPosition.a_stPickInfo, &stNormal);
|
|
fn_vGetPositionFromBoundingVolume(pNewInstance, &stNormal, &stVector);
|
|
MTH3D_M_vAddVector(&stPosition.stPos.stPos3D, &stPosition.stPos.stPos3D, &stVector);
|
|
// correct position according to pParent's matrix
|
|
POS_fn_vInvertMatrix(&stMatrix, pParentMatrix);
|
|
POS_fn_vMulMatrixVertex(&stTranslation, &stMatrix, &stPosition.stPos.stPos3D);
|
|
POS_fn_vSetTranslationVector(pInstanceMatrix,&stTranslation);
|
|
POS_fn_vSetTranslationVector(pGlobalMatrix,&stPosition.stPos.stPos3D);
|
|
}
|
|
else
|
|
{
|
|
// set absolute translation
|
|
POS_fn_vGetTranslationVector(pInstanceMatrix, &stSource);
|
|
POS_fn_vMulMatrixVertex(&stResult, pParentMatrix, &stSource);
|
|
POS_fn_vSetTranslationVector(pGlobalMatrix, &stResult);
|
|
}
|
|
|
|
// insert object
|
|
if (fn_bCanInsert(pNewInstance, pParent))
|
|
M_GetEditManager()->AskFor (new EDT_ModifInsert (this, pNewInstance, pParent, &stPosition));
|
|
else
|
|
{
|
|
m_eModifCanceled = E_cm_CancelInsert;
|
|
pModel->m_pObjectDLL->fn_vOnCancelInsertion(pNewInstance);
|
|
}
|
|
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
// cancel current mode
|
|
if (m_eEditorMode == E_em_ChoiceMode)
|
|
SetEditorMode(E_em_NoMode);
|
|
// set focus to 3D View
|
|
M_GetViewPort3d()->SetFocus();
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
on drag drop Move
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnDragDropMove(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
on drag drop GainFocus
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnDragDropGainFocus(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// give it to current DLL
|
|
return FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
on drag drop LooseFocus
|
|
=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::_OnDragDropLooseFocus(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// ADD OBJECTS TO DRAW
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
add objects 1
|
|
=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vAddObjectsToDraw(GLD_tdstViewportAttributes *p1, GLI_tdxHandleToLight p2, DEV_ViewPort* p3)
|
|
{
|
|
GetInterface()->fn_vDrawSelectionFrame(p1);
|
|
GetInterface()->fn_vDrawMoveObjectFrame(p1);
|
|
GetInterface()->fn_vDrawSuperObjectsAxis(p1);
|
|
}
|
|
|
|
/*===========================================================================
|
|
add objects 2
|
|
=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vAddObjectsToDraw2 (GLD_tdstViewportAttributes *p1, GLI_tdxHandleToLight p2)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// GET FUNCTIONS
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: find the Editor Object corresponding to pSupObj.
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CPA_SuperObject * EDT_HierarchyEditor::GetEditorObject (HIE_tdxHandleToSuperObject hSupObj)
|
|
{
|
|
CPA_SuperObject *pElem;
|
|
POSITION pos = NULL;
|
|
|
|
return (CPA_SuperObject *) GetBaseObject(hSupObj, "", NO_CRITERIA, E_rc_AllObjects);
|
|
|
|
// test the structure
|
|
for (pElem = M_GetWorld()->GetListAllObjects()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListAllObjects()->GetNextElement(pos))
|
|
{
|
|
if (pElem->GetStruct() == hSupObj)
|
|
return pElem;
|
|
}
|
|
|
|
// check also hierarchy (during rebuild)
|
|
for (pElem = m_stListHierarchy.GetHeadElement(pos); pElem;
|
|
pElem = m_stListHierarchy.GetNextElement(pos))
|
|
{
|
|
if (pElem->GetStruct() == hSupObj)
|
|
return pElem;
|
|
}
|
|
|
|
// object was not found
|
|
return NULL;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Create new Editor Super-object from engine SO
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CPA_SuperObject * EDT_HierarchyEditor::GetNewSuperObject (HIE_tdxHandleToSuperObject hEngineSO,
|
|
tdeSaveStatus eStatus, tdeTypeSO eTypeSO,
|
|
CString csName , CString csEngineFileName)
|
|
{
|
|
EDT_SuperObject *pSupObj;
|
|
|
|
pSupObj = new EDT_SuperObject(this, hEngineSO, eStatus, eTypeSO, csName, csEngineFileName);
|
|
|
|
return pSupObj;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Create new Editor Super-object
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CPA_SuperObject * EDT_HierarchyEditor::GetNewSuperObject (tdeSaveStatus eStatus, tdeTypeSO eTypeSO,
|
|
CString csName, CString csEngineFileName)
|
|
{
|
|
EDT_SuperObject *pSupObj;
|
|
|
|
pSupObj = new EDT_SuperObject(this, eStatus, eTypeSO, csName, csEngineFileName);
|
|
|
|
return pSupObj;
|
|
}
|
|
/*===========================================================================
|
|
* Description: Create copy of super-object
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CPA_SuperObject * EDT_HierarchyEditor::GetCopyOfSuperObject (CPA_SuperObject *pModel)
|
|
{
|
|
EDT_SuperObject *pSupObj;
|
|
EDT_SuperObject *pMyModel;
|
|
|
|
pMyModel = (EDT_SuperObject *) pModel;
|
|
|
|
pSupObj = new EDT_SuperObject(*pMyModel);
|
|
|
|
return pSupObj;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Create a copy of a descriptor (instance alone or hierarchy tree)
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
EDT_SuperObject * EDT_HierarchyEditor::GetACopy(EDT_SuperObject *pDesc, BOOL bInstanceAlone, BOOL bFirstCopy)
|
|
{
|
|
EDT_SuperObject *pNewEdObj, *pNewOwner;
|
|
EDT_SuperObject *pEdChild, *pNewChild;
|
|
POSITION pos;
|
|
|
|
// New object to insert
|
|
pNewEdObj = (EDT_SuperObject *) GetCopyOfSuperObject(pDesc);
|
|
pNewEdObj->MyObjectIsAlsoACopy(pDesc);
|
|
if (bFirstCopy)
|
|
pNewEdObj->SetNameForCopy(pDesc);
|
|
else
|
|
pNewEdObj->SetNameForPaste(pDesc);
|
|
|
|
|
|
pNewEdObj->mfn_vSetInitialSPOName (pDesc->mfn_csGetInitialSPOName ());
|
|
// next level of the hierarchy
|
|
pEdChild = (EDT_SuperObject *) pDesc->GetSuperObjectFirstChild();
|
|
while (pEdChild)
|
|
{
|
|
// instance alone : copy only protected childs
|
|
if ((!bInstanceAlone)||(pEdChild->GetSuperObjectOwner()))
|
|
{
|
|
// create the new child
|
|
pNewOwner = (pEdChild->GetSuperObjectOwner() == pDesc) ? pNewEdObj : NULL;
|
|
pNewChild = GetRecursiveCopy(pEdChild, pNewOwner, bInstanceAlone, bFirstCopy);
|
|
// update the list of childs
|
|
pos = pNewEdObj->Find(pNewChild, NULL);
|
|
if (!pos)
|
|
pNewChild->fn_vInsertUnderParent(pNewEdObj);
|
|
}
|
|
pEdChild = (EDT_SuperObject *) pDesc->GetSuperObjectNextChild(pEdChild);
|
|
}
|
|
|
|
|
|
// new Editable Object
|
|
return pNewEdObj;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Create a a copy of a hierarchy tree
|
|
* (recursive function)
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
EDT_SuperObject * EDT_HierarchyEditor::GetRecursiveCopy(EDT_SuperObject *pDesc, EDT_SuperObject *pOwner, BOOL bInstanceAlone, BOOL bFirstCopy)
|
|
{
|
|
EDT_SuperObject *pNewEdObj, *pNewOwner;
|
|
EDT_SuperObject *pEdChild, *pNewChild;
|
|
POSITION pos;
|
|
|
|
// protected objet
|
|
if (pDesc->GetSuperObjectOwner())
|
|
{
|
|
pNewEdObj = (EDT_SuperObject *) pDesc->GetSuperObjectOwner()->GetObjectDLL()->GetCopyOfProtectedChild(pDesc, pOwner);
|
|
pNewEdObj->SetSuperObjectOwner(pOwner);
|
|
}
|
|
else
|
|
{
|
|
pNewEdObj = (EDT_SuperObject *) GetCopyOfSuperObject(pDesc);
|
|
pNewEdObj->MyObjectIsAlsoACopy(pDesc);
|
|
}
|
|
|
|
// set new name
|
|
if (bFirstCopy)
|
|
pNewEdObj->SetNameForCopy(pDesc);
|
|
|
|
// next level of the hierarchy
|
|
pEdChild = (EDT_SuperObject *) pDesc->GetSuperObjectFirstChild();
|
|
while (pEdChild)
|
|
{
|
|
// instance alone : copy only protected childs
|
|
if ((!bInstanceAlone)||(pEdChild->GetSuperObjectOwner()))
|
|
{
|
|
// get owner
|
|
if (pEdChild->GetSuperObjectOwner())
|
|
{
|
|
CPA_SuperObject *pNewOwn = (pEdChild->GetSuperObjectOwner()== pDesc) ? pNewEdObj : pNewEdObj->GetSuperObjectOwner();
|
|
pNewOwner = (EDT_SuperObject *) pNewOwn;
|
|
}
|
|
else
|
|
pNewOwner = NULL;
|
|
// create the new child
|
|
pNewChild = GetRecursiveCopy(pEdChild, pNewOwner, bInstanceAlone, bFirstCopy);
|
|
// update the list of childs
|
|
pos = pNewEdObj->Find(pNewChild, NULL);
|
|
if (!pos)
|
|
pNewChild->fn_vInsertUnderParent(pNewEdObj);
|
|
}
|
|
// next brother
|
|
pEdChild = (EDT_SuperObject *) pDesc->GetSuperObjectNextChild(pEdChild);
|
|
}
|
|
|
|
|
|
// new Editable Object
|
|
return pNewEdObj;
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// SET FUNCTIONS
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: Set cursor
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::SetCurrentCursor (int iNumCursor, BOOL bSaveCurrentCursor)
|
|
{
|
|
HCURSOR hCurrentCursor;
|
|
// set new cursor
|
|
hCurrentCursor = (HCURSOR) SetClassLong
|
|
(M_GetViewPort3d()->m_hWnd, GCL_HCURSOR, (LONG) m_a_hCursors[iNumCursor]);
|
|
SetCursor(m_a_hCursors[iNumCursor]);
|
|
|
|
// if necessary, register current one
|
|
if (bSaveCurrentCursor)
|
|
{
|
|
if ((iNumCursor != C_hc_CurrentCursor)&&(m_a_hCursors[C_hc_CurrentCursor] != hCurrentCursor))
|
|
m_a_hCursors[C_hc_CurrentCursor] = hCurrentCursor;
|
|
}
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Set editor mode and update cursor
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::SetEditorMode (tdeEditorMode eNewMode)
|
|
{
|
|
CPA_Interface *pInterface = GetInterface();
|
|
CPA_SuperObject *pElem;
|
|
POSITION pos;
|
|
|
|
// same mode => no change
|
|
if (m_eEditorMode == eNewMode)
|
|
return;
|
|
|
|
// set normal cursor
|
|
if (m_a_hCursors[C_hc_CurrentCursor])
|
|
SetCurrentCursor(C_hc_CurrentCursor);
|
|
// cancel parent mode => reinit drawing
|
|
if (m_eEditorMode == E_em_HierarchyMode)
|
|
{
|
|
// reinit engine selection
|
|
pInterface->fn_vSetLocalColor(M_GetWorld()->GetRoot(), E_lm_ShowNormal);
|
|
for (pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
pInterface->fn_vSetLocalColor(pElem, E_lm_ShowSelected);
|
|
}
|
|
|
|
// update cursor and multiselect
|
|
switch (eNewMode)
|
|
{
|
|
case E_em_HierarchyMode:
|
|
SetCurrentCursor(C_hc_HierarchyCursor);
|
|
for (pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
pInterface->fn_vSetLocalColor(pElem->GetSuperObjectFather(), E_lm_ShowParent);
|
|
m_bMultiSelectMode = FALSE;
|
|
break;
|
|
case E_em_ChoiceMode:
|
|
SetCurrentCursor(C_hc_ChoiceCursor);
|
|
break;
|
|
case E_em_ParentMode:
|
|
SetCurrentCursor(C_hc_PFatherCursor);
|
|
m_bMultiSelectMode = FALSE;
|
|
break;
|
|
case E_em_PositionMode:
|
|
SetCurrentCursor(C_hc_PPositionCursor);
|
|
break;
|
|
case E_em_CopyAllMode:
|
|
SetCurrentCursor(C_hc_CopyAllCursor);
|
|
break;
|
|
case E_em_CopyAloneMode:
|
|
SetCurrentCursor(C_hc_CopyAloneCursor);
|
|
break;
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
case E_em_CutPasteMode:
|
|
SetCurrentCursor(C_hc_MoveToCursor);
|
|
break;
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
//CPA2 Corneliu Babiuc (multiple registration) 07-07-98
|
|
case E_em_RegisterSelection:
|
|
SetCurrentCursor(C_hc_CopyAllCursor);
|
|
break;
|
|
case E_em_ClearRegistration:
|
|
SetCurrentCursor(C_hc_CopyAloneCursor);
|
|
break;
|
|
//END CPA2 Corneliu Babiuc (multiple registration) 07-07-98
|
|
case E_em_MoveToMode:
|
|
//CPA2 Corneliu Babiuc (TMS_0598) 25-05-98
|
|
// now allow to teleport multiple selection
|
|
// if ((M_GetWorld()->GetCountSelected() == 1) || m_bIsASelection)
|
|
if ((M_GetWorld()->GetCountSelected() >= 1) || /*m_bIsASelection CPA2 Corneliu Babiuc (multiple registration)*/
|
|
M_GetWorld()->GetCountRegistered())
|
|
//END CPA2 Corneliu Babiuc (TMS_0598) 25-05-98
|
|
SetCurrentCursor(C_hc_MoveToCursor);
|
|
else
|
|
SetCurrentCursor(C_hc_SelectToCursor);
|
|
break;
|
|
//CPA2 Corneliu Babiuc 14-06-98
|
|
case E_em_MoveToInstance:
|
|
if ((M_GetWorld()->GetCountSelected() == 1) || /*m_bIsASelection CPA2 Corneliu Babiuc (multiple registration)*/
|
|
M_GetWorld()->GetCountRegistered() == 1)
|
|
SetCurrentCursor(C_hc_MoveToCursor);
|
|
else
|
|
SetCurrentCursor(C_hc_SelectToCursor);
|
|
break;
|
|
case E_em_MoveCameraToInstance:
|
|
case E_em_MoveCameraCentered:
|
|
SetCurrentCursor(C_hc_MoveToCursor);
|
|
break;
|
|
//END CPA2 Corneliu Babiuc 15-06-98
|
|
|
|
case E_em_OrientMode:
|
|
if (M_GetWorld()->GetCountSelected() == 1)
|
|
SetCurrentCursor(C_hc_OrientCursor);
|
|
break;
|
|
case E_em_VOrientMode:
|
|
if (M_GetWorld()->GetCountSelected() == 1)
|
|
SetCurrentCursor(C_hc_VOrientCursor);
|
|
break;
|
|
}
|
|
// set new mode
|
|
m_eEditorMode = eNewMode;
|
|
// update drawing
|
|
pInterface->fn_vUpdateAll(E_mc_JustDraw);
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// REINIT
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: Update Editor and dispatch message when Device changes
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vOnChangeDevice (void)
|
|
{
|
|
|
|
// check if there is a world
|
|
m_bHasCurrentWorld = ((GetInterface()->GetMultiDevice())&&(M_GetWorld()));
|
|
|
|
// update dialogs
|
|
if (m_bHasCurrentWorld && m_pDialogList)
|
|
{
|
|
m_pDialogList->fn_vInitAllLists();
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateAll);
|
|
}
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Update Editor and dispatch message when World changes
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vOnChangeWorld (void)
|
|
{
|
|
// check if there is a world
|
|
m_bHasCurrentWorld = ((GetInterface()->GetMultiDevice())&&(M_GetWorld()));
|
|
|
|
// update all dialogs
|
|
if (m_bHasCurrentWorld && m_pDialogList)
|
|
{
|
|
m_pDialogList->fn_vInitAllLists();
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateAll);
|
|
}
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Update Editor and dispatch message when Root changes
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vOnChangeRoot (void)
|
|
{
|
|
// check if there is a world
|
|
m_bHasCurrentWorld = ((GetInterface()->GetMultiDevice())&&(M_GetWorld()));
|
|
|
|
// update all dialogs
|
|
if (m_bHasCurrentWorld && m_pDialogList)
|
|
{
|
|
m_pDialogList->fn_vInitAllLists();
|
|
if (!GetInterface()->fn_bIsLoadingWorld())
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateAll);
|
|
}
|
|
}
|
|
|
|
//#################################################################################
|
|
// PERMISSIONS
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: check if all selected objects can be moved
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanTranslateAllObjects (tdeList eList)
|
|
{
|
|
// CPA_SuperObject *pSupObj;
|
|
EDT_ListByDLL *pListSelect;
|
|
POSITION pos;
|
|
|
|
//CPA2 Corneliu Babiuc (multiple registration) 3-07-98
|
|
CPA_List<EDT_ListByDLL> *pListByDLL;
|
|
switch (eList)
|
|
{
|
|
case E_lst_SelectedList:
|
|
pListSelect = M_GetWorld()->GetListAllDLLs();
|
|
pListByDLL = M_GetWorld()->GetListOfListByDLL();
|
|
break;
|
|
case E_lst_RegisteredList:
|
|
pListSelect = M_GetWorld()->GetRegisterListAllDLLs();
|
|
pListByDLL = M_GetWorld()->GetListOfRegisteredListByDLL();
|
|
break;
|
|
default:
|
|
ASSERT (0);
|
|
}
|
|
//END CPA2 Corneliu Babiuc (multiple registration) 3-07-98
|
|
|
|
// check current editor for permission
|
|
if (!fn_bIsCurrentEditor())
|
|
{
|
|
pListSelect = M_GetWorld()->GetListAllDLLs();
|
|
if (pListSelect->m_stListSelected.GetCount())
|
|
{
|
|
if (!M_GetCurrentEditor()->fn_bAcceptModifTranslate(&pListSelect->m_stListSelected, C_AsCurrentEditor))
|
|
{
|
|
m_csMessage = "Current Editor does not allow you to translate these objects";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
// check all the DLLs for permission
|
|
//CPA2 Corneliu Babiuc (multiple registration) 03-07-98
|
|
// for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
// pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
for (pListSelect = pListByDLL->GetHeadElement(pos); pListSelect;
|
|
pListSelect = pListByDLL->GetNextElement(pos))
|
|
//END CPA2 Corneliu Babiuc (multiple registration) 03-07-98
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListSelected.GetCount())
|
|
{
|
|
// ask World permission
|
|
if (!M_GetWorld()->fn_bAcceptModifTranslate(pListSelect->GetDLL()))
|
|
{
|
|
m_csMessage.Format("Objects of DLL %s cannot be translated in this world.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifTranslate(&pListSelect->m_stListSelected, C_AsConcernedDLL))
|
|
{
|
|
m_csMessage.Format("DLL %s does not allow you to translate its objects.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
}
|
|
// if necessary, ask owner permission
|
|
if (pListSelect->m_stListProtectSelected.GetCount())
|
|
{
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifTranslate(&pListSelect->m_stListProtectSelected, C_AsChildOwner))
|
|
{
|
|
m_csMessage = "Some protected objets cannot be translated";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
// objects can be moved
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: check if all selected objects can be moved
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanRotateAllObjects (void)
|
|
{
|
|
CPA_SuperObject *pSupObj;
|
|
EDT_ListByDLL *pListSelect;
|
|
POSITION pos;
|
|
|
|
// check super-objects flags
|
|
for (pSupObj = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pSupObj;
|
|
pSupObj = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
{
|
|
if (HIE_fn_SO_bHasNoTransformationMatrix(pSupObj->GetStruct()))
|
|
{
|
|
m_csMessage = "Some super-objects have no transformation matrix";
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
// check current editor for permission
|
|
if (!fn_bIsCurrentEditor())
|
|
{
|
|
pListSelect = M_GetWorld()->GetListAllDLLs();
|
|
if (pListSelect->m_stListSelected.GetCount())
|
|
{
|
|
if (!M_GetCurrentEditor()->fn_bAcceptModifRotate(&pListSelect->m_stListSelected, C_AsCurrentEditor))
|
|
{
|
|
m_csMessage = "Current Editor does not allow you to rotate these objects";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListSelected.GetCount())
|
|
{
|
|
// ask World permission
|
|
if (!M_GetWorld()->fn_bAcceptModifRotate(pListSelect->GetDLL()))
|
|
{
|
|
m_csMessage.Format("Objects of DLL %s cannot be rotated in this world.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifRotate(&pListSelect->m_stListSelected, C_AsConcernedDLL))
|
|
{
|
|
m_csMessage.Format("DLL %s does not allow you to rotate its objects.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
}
|
|
// if necessary, ask owner
|
|
if (pListSelect->m_stListProtectSelected.GetCount())
|
|
{
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifRotate(&pListSelect->m_stListProtectSelected, C_AsChildOwner))
|
|
{
|
|
m_csMessage = "Some protected objets cannot be rotated";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// objects can be moved
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: check if all selected objects can be deleted
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanDeleteAllObjects (void)
|
|
{
|
|
CPA_SuperObject *pEdObj;
|
|
EDT_ListByDLL *pListSelect;
|
|
POSITION pos;
|
|
|
|
// ask for interface permission
|
|
pListSelect = M_GetWorld()->GetListAllDLLs();
|
|
for (pEdObj = pListSelect->m_stListConcerned.GetHeadElement(pos); pEdObj;
|
|
pEdObj = pListSelect->m_stListConcerned.GetNextElement(pos))
|
|
{
|
|
if (!GetInterface()->fn_bCanModifyObject(pEdObj))
|
|
{
|
|
m_csMessage = "You cannot modify objects created by this designer";
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
// check current editor for permission
|
|
if (!fn_bIsCurrentEditor())
|
|
{
|
|
pListSelect = M_GetWorld()->GetListAllDLLs();
|
|
if (pListSelect->m_stListConcerned.GetCount())
|
|
{
|
|
if (!M_GetCurrentEditor()->fn_bAcceptModifDelete(&pListSelect->m_stListConcerned, C_AsCurrentEditor))
|
|
{
|
|
m_csMessage = "Current Editor does not allow you to delete these objects";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
// check all the DLLs for permission
|
|
for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListConcerned.GetCount())
|
|
{
|
|
// ask World permission
|
|
if (!M_GetWorld()->fn_bAcceptModifDelete(pListSelect->GetDLL()))
|
|
{
|
|
m_csMessage.Format("Objects of DLL %s cannot be deleted in this world.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifDelete(&pListSelect->m_stListConcerned, C_AsConcernedDLL))
|
|
{
|
|
m_csMessage.Format("DLL %s does not allow you to delete its objects.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
}
|
|
// if necessary, ask owner
|
|
if (pListSelect->m_stListProtectSelected.GetCount())
|
|
{
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifDelete(&pListSelect->m_stListProtectSelected, C_AsChildOwner))
|
|
{
|
|
m_csMessage = "Some protected objets cannot be deleted";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
// objects can be moved
|
|
return TRUE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: check if all selected objects can change parent
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanChangeAllParents (void)
|
|
{
|
|
EDT_ListByDLL *pListSelect;
|
|
POSITION pos;
|
|
|
|
// check permissions
|
|
if (!fn_bCanChangeSelectedObjects())
|
|
return FALSE;
|
|
|
|
// check current editor for permission
|
|
if (!fn_bIsCurrentEditor())
|
|
{
|
|
pListSelect = M_GetWorld()->GetListAllDLLs();
|
|
if (pListSelect->m_stListSelected.GetCount())
|
|
{
|
|
if (!M_GetCurrentEditor()->fn_bAcceptModifParent(&pListSelect->m_stListSelected, C_AsCurrentEditor))
|
|
{
|
|
m_csMessage = "Current Editor does not allow you to change these objects' parent";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
// check all the DLLs for permission
|
|
for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListSelected.GetCount())
|
|
{
|
|
// ask World permission
|
|
if (!M_GetWorld()->fn_bAcceptModifParent(pListSelect->GetDLL()))
|
|
{
|
|
m_csMessage.Format("Parents of the objects of DLL %s cannot be changed in this world.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifParent(&pListSelect->m_stListSelected, C_AsConcernedDLL))
|
|
{
|
|
m_csMessage.Format("DLL %s does not allow you to change its objects' parent.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
}
|
|
// if necessary, ask owner
|
|
if (pListSelect->m_stListProtectSelected.GetCount())
|
|
{
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifParent(&pListSelect->m_stListProtectSelected, C_AsChildOwner))
|
|
{
|
|
m_csMessage = "Some protected objets cannot change their parent";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
// objects can be moved
|
|
return TRUE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: check if all selected objects can be copied
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanCopyAllObjects (void)
|
|
{
|
|
EDT_ListByDLL *pListSelect;
|
|
POSITION pos;
|
|
|
|
// check current editor for permission
|
|
if (!fn_bIsCurrentEditor())
|
|
{
|
|
pListSelect = M_GetWorld()->GetListAllDLLs();
|
|
if (pListSelect->m_stListConcerned.GetCount())
|
|
{
|
|
if (!M_GetCurrentEditor()->fn_bAcceptModifCopy(&pListSelect->m_stListConcerned, C_AsCurrentEditor))
|
|
{
|
|
m_csMessage = "Current Editor does not allow you to copy these objects";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
// check all the DLLs for permission
|
|
for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListConcerned.GetCount())
|
|
{
|
|
// ask World permission
|
|
if (!M_GetWorld()->fn_bAcceptModifCopy(pListSelect->GetDLL()))
|
|
{
|
|
m_csMessage.Format("Objects of DLL %s cannot be copied in this world.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifCopy(&pListSelect->m_stListConcerned, C_AsConcernedDLL))
|
|
{
|
|
m_csMessage.Format("DLL %s does not allow you to copy its objects.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
}
|
|
// if necessary, ask owner
|
|
if (pListSelect->m_stListProtectSelected.GetCount())
|
|
{
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifCopy(&pListSelect->m_stListProtectSelected, C_AsChildOwner))
|
|
{
|
|
m_csMessage = "Some protected objets cannot be copied";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
// objects can be moved
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: check if parent is coherent
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanBeParent (CPA_SuperObject *pParent, tdstPosition *p_stPosition, tdeTypeSO eTypeSO, tdeSaveStatus eStatus)
|
|
{
|
|
CPA_SuperObject *pSector;
|
|
|
|
// check type
|
|
switch (eTypeSO)
|
|
{
|
|
case C_Protected:
|
|
return TRUE;
|
|
|
|
case C_Dynamic:
|
|
return (pParent == GetInterface()->GetSpecificInterface()->GetDynamicRoot());
|
|
|
|
case C_Static:
|
|
pSector = GetInterface()->GetSpecificInterface()->GetCurrentSectorFromPos(&p_stPosition->stPos.stPos3D);
|
|
|
|
if (pParent->GetTypeSO() != C_Static)
|
|
return FALSE;
|
|
if (GetInterface()->GetSpecificInterface()->GetSuperObjectCurrentSector(pParent) != pSector)
|
|
return FALSE;
|
|
if (!GetSpecificEditor()->fn_bCheckSaveStatus(eStatus, (EDT_SuperObject *)pParent))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: check if pEdObj is accepted as parent for all
|
|
* selected objects
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanBeParentForAll (CPA_SuperObject *pNewParent)
|
|
{
|
|
CPA_SuperObject *pElem;
|
|
EDT_SuperObject *pSupObj;
|
|
EDT_SuperObject *pParent;
|
|
POSITION pos;
|
|
|
|
pParent = (EDT_SuperObject *) pNewParent;
|
|
|
|
// check specific editor
|
|
if (!m_pSpecificEditor->fn_bCanBeParent(pParent, M_GetWorld()->GetListSelected()))
|
|
return FALSE;
|
|
|
|
// check all the elements in the list
|
|
for (pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
{
|
|
pSupObj = (EDT_SuperObject *) pElem;
|
|
|
|
// hierarchy links must be coherent
|
|
if (pParent->fn_bIsUnderObject(pSupObj))
|
|
return FALSE;
|
|
// hierarchy links must be valid
|
|
if ((!pSupObj->fn_bAcceptAsParent(pParent))||(!pParent->fn_bAcceptAsChild(pSupObj)))
|
|
return FALSE;
|
|
}
|
|
// object can be parent
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: check if we can enter multi select mode
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanEnterMultiMode (void)
|
|
{
|
|
// parent selection => no multiselect
|
|
if ((m_eEditorMode == E_em_HierarchyMode)||(m_eEditorMode == E_em_ParentMode))
|
|
return FALSE;
|
|
|
|
// check current editor permission
|
|
if ((!fn_bIsCurrentEditor())&&(!M_GetCurrentEditor()->fn_bAcceptMultiSelect()))
|
|
return FALSE;
|
|
|
|
// check world permission
|
|
if (!M_GetWorld()->fn_bAcceptMultiSelect())
|
|
return FALSE;
|
|
|
|
// no objection
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
//#################################################################################
|
|
// INSERTION
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: find parent for insertion
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
EDT_SuperObject * EDT_HierarchyEditor::GetParentForInsertion (CPA_ObjectDLLBase *p_oDLL, CString csTypeName, CString csModelName, tdstPosition *p_stPosition, tdeTypeSO eTypeInsert, tdeSaveStatus eStatus)
|
|
{
|
|
EDT_SuperObject *pParent = NULL;
|
|
MTH3D_tdstVector stNormal;
|
|
BOOL bRes;
|
|
|
|
bRes = fn_bFindPickingPosition(p_stPosition);
|
|
|
|
// Ask DLL for a parent
|
|
pParent = (EDT_SuperObject *) p_oDLL->GetParentForInsertion(csTypeName, csModelName, p_stPosition);
|
|
|
|
// if necessary, try to find default parent
|
|
if (!pParent)
|
|
{
|
|
if (!bRes)
|
|
return NULL;
|
|
// move position to guarantee it is in a sector
|
|
fn_vGetNormalFromPicking(p_stPosition->a_stPickInfo, &stNormal);
|
|
MTH3D_M_vMulScalarVector(&stNormal, (float)0.1, &stNormal);
|
|
MTH3D_M_vAddVector(&p_stPosition->stPos.stPos3D, &p_stPosition->stPos.stPos3D, &stNormal);
|
|
// get corresponding default parent
|
|
pParent = (EDT_SuperObject *) GetInterface()->GetSpecificInterface()->GetDefaultParentFromPos(p_stPosition, eTypeInsert, eStatus);
|
|
// reinit position
|
|
MTH3D_M_vMulScalarVector(&stNormal, (float)-1.0, &stNormal);
|
|
MTH3D_M_vAddVector(&p_stPosition->stPos.stPos3D, &p_stPosition->stPos.stPos3D, &stNormal);
|
|
}
|
|
return pParent;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: check if all selected objects can be deleted
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanDelete (EDT_SuperObject *pEdObj)
|
|
{
|
|
CPA_List<CPA_SuperObject> stListDelete;
|
|
|
|
// there must be a world !
|
|
if ((!m_bHasCurrentWorld)||(!M_GetWorld()->GetRoot()))
|
|
return FALSE;
|
|
|
|
// object must be in the hierarchy
|
|
if (!pEdObj->fn_bIsUnderObject(M_GetWorld()->GetRoot()))
|
|
return FALSE;
|
|
|
|
// ask for interface permission
|
|
if (!GetInterface()->fn_bCanModifyObject(pEdObj))
|
|
return FALSE;
|
|
|
|
// ask DLLs for permission
|
|
stListDelete.RemoveAll();
|
|
stListDelete.AddTail(pEdObj);
|
|
|
|
// ask World
|
|
if (!M_GetWorld()->fn_bAcceptModifDelete(pEdObj->GetObjectDLL()))
|
|
return FALSE;
|
|
// ask current editor
|
|
if (!fn_bIsCurrentEditor())
|
|
{
|
|
if (!M_GetCurrentEditor()->fn_bAcceptModifDelete(&stListDelete, C_AsCurrentEditor))
|
|
return FALSE;
|
|
}
|
|
// ask concerned DLL
|
|
if (pEdObj->GetObjectDLL())
|
|
{
|
|
if (!pEdObj->GetObjectDLL()->fn_bAcceptModifDelete(&stListDelete, C_AsConcernedDLL))
|
|
return FALSE;
|
|
}
|
|
// if necessary, ask owner
|
|
if (pEdObj->GetSuperObjectOwner())
|
|
{
|
|
if (!pEdObj->GetSuperObjectOwner()->GetObjectDLL()->fn_bAcceptModifDelete(&stListDelete, C_AsChildOwner))
|
|
return FALSE;
|
|
}
|
|
|
|
// no objection
|
|
return TRUE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: check if object can be inserted in hierarchy
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanInsert (EDT_SuperObject *pEdObj, EDT_SuperObject *pParent)
|
|
{
|
|
// there must be a world !
|
|
if ((!m_bHasCurrentWorld)||(!M_GetWorld()->GetRoot()))
|
|
return FALSE;
|
|
|
|
// check the hierarchy
|
|
if ((pParent->fn_bIsUnderObject(pEdObj))||(pEdObj->fn_bIsUnderObject(M_GetWorld()->GetRoot()))
|
|
||(!pParent->fn_bIsUnderObject(M_GetWorld()->GetRoot())))
|
|
{
|
|
m_csMessage = "Hierarchy links are not coherent";
|
|
return FALSE;
|
|
}
|
|
|
|
// ask specific editor
|
|
if (!m_pSpecificEditor->fn_bCanBeParent(pParent, pEdObj))
|
|
{
|
|
m_csMessage = "Parent is not valid";
|
|
return FALSE;
|
|
}
|
|
// parent must be valid
|
|
if ((!pEdObj->fn_bAcceptAsParent(pParent))
|
|
||(!pParent->fn_bAcceptAsChild(pEdObj)))
|
|
{
|
|
m_csMessage = "Parent is not valid";
|
|
return FALSE;
|
|
}
|
|
|
|
// ask World
|
|
if (!M_GetWorld()->fn_bAcceptModifInsert(pEdObj->GetObjectDLL()))
|
|
{
|
|
m_csMessage = "Instances of DLL " + pEdObj->GetObjectDLL()->GetName() + " cannot be inserted in this world";
|
|
return FALSE;
|
|
}
|
|
// ask current editor
|
|
if (!fn_bIsCurrentEditor())
|
|
{
|
|
if (!M_GetCurrentEditor()->fn_bAcceptModifInsert(pEdObj, pParent, C_AsCurrentEditor))
|
|
{
|
|
m_csMessage = "Current Editor does not accept this insertion";
|
|
return FALSE;
|
|
}
|
|
}
|
|
// ask concerned DLL
|
|
if (pEdObj->GetObjectDLL())
|
|
{
|
|
if (!pEdObj->GetObjectDLL()->fn_bAcceptModifInsert(pEdObj, pParent, C_AsConcernedDLL))
|
|
{
|
|
m_csMessage = "DLL " + pEdObj->GetObjectDLL()->GetName() + " does not accept this insertion";
|
|
return FALSE;
|
|
}
|
|
}
|
|
// if necessary, ask owner
|
|
if (pEdObj->GetSuperObjectOwner())
|
|
{
|
|
if (!pEdObj->GetSuperObjectOwner()->GetObjectDLL()->fn_bAcceptModifInsert(pEdObj, pParent, C_AsChildOwner))
|
|
{
|
|
m_csMessage = "Owner of the new protected instance does not accept this insertion.";
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
// no objection
|
|
return TRUE;
|
|
}
|
|
|
|
//#################################################################################
|
|
// HIERARCHY
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: insert object in the hierarchy and update all lists
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bInsertObjectInHierarchy (CPA_SuperObject *pEdObj, CPA_SuperObject *pParent,
|
|
BOOL bUseEditManager, BOOL bUpdateDrawing, BOOL bSelect, BOOL pBlock)
|
|
|
|
{
|
|
EDT_SuperObject *pNewSO;
|
|
EDT_SuperObject *pNewParent;
|
|
EDT_ModifInsert *pModifInsert;
|
|
|
|
pNewSO = (EDT_SuperObject *) pEdObj;
|
|
pNewParent = (EDT_SuperObject *) pParent;
|
|
|
|
// check if parent is valid
|
|
if (!fn_bCanInsert(pNewSO, pNewParent))
|
|
return FALSE;
|
|
|
|
// create modif
|
|
pModifInsert = new EDT_ModifInsert
|
|
(this, pNewSO, pNewParent, NULL, NULL, bUpdateDrawing, bSelect, pBlock);
|
|
|
|
// insert object in hierarchy
|
|
if (bUseEditManager)
|
|
M_GetEditManager()->AskFor(pModifInsert);
|
|
else
|
|
{
|
|
pModifInsert->Do();
|
|
delete pModifInsert;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: insert object in the hierarchy and update all lists
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bInsertAsPreviousBrother (CPA_SuperObject *pEdObj, CPA_SuperObject *pBrother,
|
|
BOOL bUseEditManager, BOOL bUpdateDrawing, BOOL bSelect, BOOL pBlock)
|
|
{
|
|
EDT_SuperObject *pParent, *pNewSO, *pNewBrother;
|
|
EDT_ModifInsert *pModifInsert;
|
|
|
|
pNewBrother = (EDT_SuperObject *) pBrother;
|
|
pNewSO = (EDT_SuperObject *) pEdObj;
|
|
|
|
// check if parent is valid
|
|
pParent = (EDT_SuperObject *) pNewBrother->GetSuperObjectFather();
|
|
if ((!pParent)||(!fn_bCanInsert(pNewSO, pParent)))
|
|
return FALSE;
|
|
|
|
// create modif
|
|
pModifInsert = new EDT_ModifInsert
|
|
(this, pNewSO, pParent, NULL, pNewBrother, bUpdateDrawing, bSelect, pBlock);
|
|
|
|
// insert object in hierarchy
|
|
if (bUseEditManager)
|
|
M_GetEditManager()->AskFor(pModifInsert);
|
|
else
|
|
{
|
|
pModifInsert->Do();
|
|
delete pModifInsert;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: delete object in the hierarchy and update all lists
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bDeleteObjectInHierarchy (CPA_SuperObject *pEdObj, BOOL bUseEditManager,
|
|
BOOL bUpdateDrawing, BOOL bDestroySuperObject, BOOL bSelect, BOOL pBlock)
|
|
{
|
|
EDT_SuperObject *pOldSO;
|
|
EDT_ModifDelete *pModifDelete;
|
|
|
|
pOldSO = (EDT_SuperObject *) pEdObj;
|
|
// check permissions
|
|
if (!fn_bCanDelete(pOldSO))
|
|
return FALSE;
|
|
|
|
// create modif
|
|
pModifDelete = new EDT_ModifDelete (this, pOldSO, GetInterface()->GetSelectMode(),
|
|
bUpdateDrawing, bDestroySuperObject, bSelect, pBlock);
|
|
// insert object in hierarchy
|
|
if (bUseEditManager)
|
|
M_GetEditManager()->AskFor(pModifDelete);
|
|
else
|
|
{
|
|
pModifDelete->Do();
|
|
delete pModifDelete;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// MOVES
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: Find if the Mouse is on selected object
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CPA_SuperObject * EDT_HierarchyEditor::fn_pstIsMouseOnObject (ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject)
|
|
{
|
|
CPA_SuperObject *pCurChild, *pElem;
|
|
ACP_tdxIndex xInd = 0;
|
|
POSITION pos;
|
|
|
|
// if there's no selection
|
|
if (!M_GetWorld()->GetCountSelected())
|
|
return NULL;
|
|
|
|
while (xInd < xIndex)
|
|
{
|
|
// find the child corresponding to p_tIndex
|
|
pCurChild = GetEditorObject(p_stObject[xInd++].hSprObject);
|
|
if ( !pCurChild )
|
|
{
|
|
ASSERT(FALSE); //this should not occur, but continue anyway if you choose to ignore
|
|
return NULL;
|
|
}
|
|
|
|
// find the corresponding list
|
|
for (pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
{
|
|
if (pCurChild->fn_bIsUnderObject(pElem))
|
|
return pElem;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Rotate object around selected axis
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vRotateObjects (int iAxe, int iDirection )
|
|
{
|
|
CPA_SuperObject *pElem;
|
|
EDT_SuperObject *pSupObj;
|
|
POS_tdstCompletePosition stMatrix;
|
|
GLI_tdxValue xAngle;
|
|
POSITION pos;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
|
|
// First call : init the move or check permissions
|
|
if (!m_pKeyMove)
|
|
{
|
|
if (fn_bCanRotateAllObjects())
|
|
{
|
|
// create modif
|
|
m_pKeyMove = new EDT_ModifMove(this, M_GetWorld()->GetListOfListByDLL(), GetInterface()->GetSelectMode());
|
|
// tell DLLs
|
|
fn_vSendMessageBeginMove();
|
|
}
|
|
else
|
|
{
|
|
fn_vDisplayCancelMessage(E_cm_CancelMove);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Rotation matrix
|
|
xAngle = (iDirection) ? -m_xRotationStep : m_xRotationStep;
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
// Rotation around selected axis
|
|
if (iAxe == AXE_X)
|
|
fn_vRotateX(&stMatrix, xAngle);
|
|
else if (iAxe == AXE_Y)
|
|
fn_vRotateY(&stMatrix, xAngle);
|
|
else if (iAxe == AXE_Z)
|
|
fn_vRotateZ(&stMatrix, xAngle);
|
|
|
|
// update all objects in the list
|
|
for (pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
{
|
|
pSupObj = (EDT_SuperObject *) pElem;
|
|
pSupObj->fn_vRotate(&stMatrix);
|
|
}
|
|
// Tell Dlls
|
|
fn_vSendMessageMoving();
|
|
// Redraw the world
|
|
GetInterface()->fn_vUpdateAll(E_mc_JustDraw);
|
|
m_pDialogEdit->fn_vUpdateRotation();
|
|
}
|
|
|
|
|
|
/*==========================================================================
|
|
* Description: Translate the object
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vTranslateObjects (int iAxe, int iDirection)
|
|
{
|
|
MTH3D_tdstVector stVector;
|
|
CPA_SuperObject *pElem;
|
|
EDT_SuperObject *pSupObj;
|
|
DEV_ViewPort3D *pCurViewport;
|
|
POS_tdstCompletePosition stMatrix,stTempMatrix;
|
|
GLI_tdxValue xVal;
|
|
POSITION pos;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
POS_fn_vSetIdentityMatrix(&stTempMatrix);
|
|
|
|
// First call : init the move
|
|
if (!m_pKeyMove)
|
|
{
|
|
if (fn_bCanTranslateAllObjects())
|
|
{
|
|
// create modif
|
|
m_pKeyMove = new EDT_ModifMove(this, M_GetWorld()->GetListOfListByDLL(), GetInterface()->GetSelectMode());
|
|
// tell dlls
|
|
fn_vSendMessageBeginMove();
|
|
}
|
|
else
|
|
{
|
|
fn_vDisplayCancelMessage(E_cm_CancelMove);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// translation vector
|
|
xVal = (iDirection) ? m_xTranslationStep : -m_xTranslationStep;
|
|
MTH3D_M_vNullVector(&stVector);
|
|
// Translation on OBJECT's axis
|
|
if (m_bMultiSelectMode)
|
|
{
|
|
// select axis
|
|
if (iAxe == AXE_X)
|
|
{
|
|
MTH3D_M_vSetXofVector(&stVector, xVal);
|
|
}
|
|
else if (iAxe == AXE_Y)
|
|
{
|
|
MTH3D_M_vSetZofVector(&stVector, xVal);
|
|
}
|
|
else if (iAxe == AXE_Z)
|
|
{
|
|
MTH3D_M_vSetYofVector(&stVector, -xVal);
|
|
}
|
|
// update all objects in the list
|
|
for (pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
{
|
|
pSupObj = (EDT_SuperObject *) pElem;
|
|
pSupObj->fn_vTranslate(&stVector, FALSE);
|
|
}
|
|
}
|
|
// Translation on CAMERA's axis
|
|
else
|
|
{
|
|
// select axis
|
|
if (iAxe == AXE_X)
|
|
{
|
|
MTH3D_M_vSetXofVector(&stVector, xVal);
|
|
}
|
|
else if (iAxe == AXE_Y)
|
|
{
|
|
MTH3D_M_vSetYofVector(&stVector, xVal);
|
|
}
|
|
else if (iAxe == AXE_Z)
|
|
{
|
|
MTH3D_M_vSetZofVector(&stVector, xVal);
|
|
}
|
|
// update vector according to camera position
|
|
pCurViewport = M_GetViewPort3d();
|
|
GLI_xGetCameraMatrix(pCurViewport->GetEngineCamera(),&stTempMatrix);
|
|
POS_fn_vInvertMatrix(&stMatrix,&stTempMatrix);
|
|
|
|
MTH3D_tdstVector stVect;
|
|
|
|
MTH3D_M_vNullVector(&stVect);
|
|
POS_fn_vSetTranslationVector(&stMatrix,&stVect);
|
|
|
|
POS_fn_vMulMatrixVertex(&stVector, &stMatrix, &stVector);
|
|
for (pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
{
|
|
pSupObj = (EDT_SuperObject *) pElem;
|
|
pSupObj->fn_vTranslate(&stVector, TRUE);
|
|
}
|
|
}
|
|
|
|
// tell DLLs
|
|
fn_vSendMessageMoving();
|
|
// redraw the world
|
|
GetInterface()->fn_vUpdateAll(E_mc_JustDraw);
|
|
}
|
|
|
|
|
|
|
|
|
|
/*==========================================================================
|
|
* Description: check if move is available, and do or cancel it
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bDoOrCancelMove (EDT_ModifMove *pModifMove)
|
|
{
|
|
BOOL bRes = TRUE;
|
|
long lNbBreaks;
|
|
|
|
// check if objects can be modified
|
|
if (!fn_bCanChangeSelectedObjects())
|
|
{
|
|
m_csMessage = "You cannot modify objects created by this designer";
|
|
m_eModifCanceled = E_cm_CancelMove;
|
|
bRes = FALSE;
|
|
}
|
|
// check if move is available
|
|
lNbBreaks = m_pSpecificEditor->fn_lCanMoveObjects(M_GetWorld()->GetListSelected());
|
|
// move is not available
|
|
if (lNbBreaks == -1)
|
|
{
|
|
m_csMessage = "Some Objects are out of all sectors";
|
|
m_eModifCanceled = E_cm_CancelMove;
|
|
bRes = FALSE;
|
|
}
|
|
// broken links => dialog
|
|
if (lNbBreaks > 0)
|
|
{
|
|
bRes = m_pDialogMove->fn_bDoDialog(this);
|
|
M_GetViewPort3d()->SetFocus();
|
|
}
|
|
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
|
|
// if move is avalaible, do modif
|
|
if (bRes)
|
|
{
|
|
pModifMove->fn_vInitListModif(&m_stListOfModifParent);
|
|
M_GetEditManager()->AskFor(pModifMove);
|
|
}
|
|
// cancel the move
|
|
else
|
|
pModifMove->Cancel();
|
|
|
|
return bRes;
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// MESSAGES
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: dispatch message when moving
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vSendMessageMoving (void)
|
|
{
|
|
CPA_ToolDLLBase *pDLLTool;
|
|
EDT_ListByDLL *pListSelect;
|
|
POSITION pos;
|
|
|
|
// Tell current editor
|
|
if ((!fn_bIsCurrentEditor())&&(M_ListConcerned.GetCount()))
|
|
M_GetCurrentEditor()->fn_vOnMoving(&M_ListSelected, &M_ListConcerned, C_AsCurrentEditor);
|
|
// Tell all concerned DLLs
|
|
for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListConcerned.GetCount())
|
|
pListSelect->GetDLL()->fn_vOnMoving(&pListSelect->m_stListSelected, &pListSelect->m_stListConcerned, C_AsConcernedDLL);
|
|
}
|
|
// Tell all owner DLLs
|
|
for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListProtectConcerned.GetCount())
|
|
pListSelect->GetDLL()->fn_vOnMoving(&pListSelect->m_stListProtectSelected, &pListSelect->m_stListProtectConcerned, C_AsChildOwner);
|
|
}
|
|
// Tool DLLs
|
|
for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool;
|
|
pDLLTool = M_GetToolDLLs()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if ((M_ListConcerned.GetCount())&&(pDLLTool != M_GetCurrentEditor()))
|
|
pDLLTool->fn_vOnMoving(&M_ListSelected, &M_ListConcerned, C_AsToolDLL);
|
|
}
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: dispatch message when begin move
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vSendMessageBeginMove (void)
|
|
{
|
|
CPA_ToolDLLBase *pDLLTool;
|
|
EDT_ListByDLL *pListSelect;
|
|
POSITION pos;
|
|
|
|
// tell current editor
|
|
if ((!fn_bIsCurrentEditor())&&(M_ListConcerned.GetCount()))
|
|
M_GetCurrentEditor()->fn_vOnBeginMove(&M_ListSelected, &M_ListConcerned, C_AsCurrentEditor);
|
|
// tell concerned DLLs
|
|
for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListConcerned.GetCount())
|
|
pListSelect->GetDLL()->fn_vOnBeginMove(&pListSelect->m_stListSelected, &pListSelect->m_stListConcerned, C_AsConcernedDLL);
|
|
}
|
|
// tell owner DLLs
|
|
for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListProtectConcerned.GetCount())
|
|
pListSelect->GetDLL()->fn_vOnBeginMove(&pListSelect->m_stListProtectSelected, &pListSelect->m_stListProtectConcerned, C_AsChildOwner);
|
|
}
|
|
// Tool DLLs
|
|
for (pDLLTool = M_GetToolDLLs()->GetHeadElement(pos); pDLLTool;
|
|
pDLLTool = M_GetToolDLLs()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if ((M_ListConcerned.GetCount())&&(pDLLTool != M_GetCurrentEditor()))
|
|
pDLLTool->fn_vOnBeginMove(&M_ListSelected, &M_ListConcerned, C_AsToolDLL);
|
|
}
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: dispatch message when level changes
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vSendMessageChangeLevel (void)
|
|
{
|
|
CPA_DLLBase *pDLL;
|
|
POSITION pos;
|
|
|
|
// tell object DLLs
|
|
for (pDLL = GetMainWorld()->GetListOfObjectDLLBase()->GetHeadElement(pos); pDLL;
|
|
pDLL = GetMainWorld()->GetListOfObjectDLLBase()->GetNextElement(pos))
|
|
{
|
|
pDLL->fn_vLevelChanges();
|
|
}
|
|
// tell object DLLs
|
|
for (pDLL = GetMainWorld()->GetListOfToolDLLBase()->GetHeadElement(pos); pDLL;
|
|
pDLL = GetMainWorld()->GetListOfToolDLLBase()->GetNextElement(pos))
|
|
{
|
|
pDLL->fn_vLevelChanges();
|
|
}
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: dispatch message when level has changed
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vSendMessageLevelChanged (void)
|
|
{
|
|
CPA_DLLBase *pDLL;
|
|
POSITION pos;
|
|
|
|
// tell object DLLs
|
|
for (pDLL = GetMainWorld()->GetListOfObjectDLLBase()->GetHeadElement(pos); pDLL;
|
|
pDLL = GetMainWorld()->GetListOfObjectDLLBase()->GetNextElement(pos))
|
|
{
|
|
pDLL->fn_vLevelHasChanged();
|
|
}
|
|
// tell object DLLs
|
|
for (pDLL = GetMainWorld()->GetListOfToolDLLBase()->GetHeadElement(pos); pDLL;
|
|
pDLL = GetMainWorld()->GetListOfToolDLLBase()->GetNextElement(pos))
|
|
{
|
|
pDLL->fn_vLevelHasChanged();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//#################################################################################
|
|
// EDITOR
|
|
//#################################################################################
|
|
|
|
//===========================================================================
|
|
//===========================================================================
|
|
BOOL EDT_HierarchyEditor::fn_bHasGainedFocus (void)
|
|
{
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateAll);
|
|
|
|
// display Tip of the Day
|
|
GetInterface()->fn_vDisplayTipOfDay("Hierarchy", "EDT", g_bTipFirstTime);
|
|
g_bTipFirstTime = FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//===========================================================================
|
|
//===========================================================================
|
|
void EDT_HierarchyEditor::fn_vOnActivateEditor (CPA_List<CPA_BaseObject> *pParams, BOOL bBackActivated)
|
|
{
|
|
CPA_BaseObject *pElem;
|
|
CPA_SuperObject *pEdObj;
|
|
POSITION pos;
|
|
|
|
// if there is a list, select corresponding super-objects
|
|
if (pParams)
|
|
{
|
|
// cancel current selection
|
|
GetInterface()->fn_vCancelCurrentSelection(FALSE);
|
|
// select parameters
|
|
for (pElem = pParams->GetHeadElement(pos); pElem;
|
|
pElem = pParams->GetNextElement(pos))
|
|
{
|
|
// check if this is a super-object
|
|
if (pElem->GetType() == C_szSuperObjectTypeName)
|
|
{
|
|
// if possible, select it
|
|
pEdObj = (CPA_SuperObject *) pElem;
|
|
if (GetInterface()->fn_bCanSelect(pEdObj) == C_Accept)
|
|
GetInterface()->fn_vAddSelectedObject(pEdObj, FALSE);
|
|
}
|
|
}
|
|
}
|
|
// restore and update dialogs
|
|
fn_vRestoreDialogs();
|
|
}
|
|
|
|
//===========================================================================
|
|
//===========================================================================
|
|
void EDT_HierarchyEditor::fn_vOnCloseEditor (void)
|
|
{
|
|
fn_vCancelAllModes();
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: cancel all modes when changing editor
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vCancelAllModes (void)
|
|
{
|
|
// Init Mode
|
|
m_bMultiSelectMode= FALSE;
|
|
SetEditorMode(E_em_NoMode);
|
|
// Init Move
|
|
m_pOrientMove = NULL;
|
|
m_pOrientedObject = NULL;
|
|
m_pMouseMove = NULL;
|
|
m_pKeyMove = NULL;
|
|
m_eMouseMoveMode = E_mmm_NoMouseMove;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: restore all dialogs when changing editor
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vRestoreDialogs (void)
|
|
{
|
|
// activate editor frames
|
|
g_oFrameGest.mfn_vActivateWindow(m_pLeftFrame);
|
|
g_oFrameGest.mfn_vActivateWindow(m_pBottomFrame);
|
|
// update dialogs
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateAll);
|
|
}
|
|
|
|
//#################################################################################
|
|
// DIALOG LIST
|
|
//#################################################################################
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Give all the list to the dialog
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::GetListsForDialog (CPA_DialogList *pDialog)
|
|
{
|
|
EDT_ListByType *pListType;
|
|
EDT_ListByDLL *pListDLL;
|
|
POSITION pos, pos1;
|
|
|
|
if (!m_bHasCurrentWorld)
|
|
return;
|
|
|
|
// Hierarchy
|
|
if (M_GetWorld()->GetRoot())
|
|
pDialog->fn_vAddANewTree("Hierarchy", M_GetWorld()->GetRoot(), &m_oMainIconList, &m_oTreeIconList);
|
|
// List All Types
|
|
pDialog->fn_vAddANewList("All Types", GetInterface()->GetSortedListByType("All Types"),
|
|
&m_oMainIconList, &m_oTreeIconList,
|
|
E_lo_Alpha, TRUE, C_lDrawState | C_lDrawIcon | C_lDrawName, TRUE);
|
|
// Current Model
|
|
pDialog->fn_vAddANewList("Current Model", GetInterface()->GetSortedListByType("All Types"),
|
|
&m_oMainIconList, &m_oTreeIconList, E_lo_Alpha, TRUE,
|
|
C_lDrawState | C_lDrawName, TRUE);
|
|
// ListByType
|
|
for (pListDLL = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListDLL;
|
|
pListDLL = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
for (pListType = pListDLL->m_stListOfListByType.GetHeadElement(pos1); pListType;
|
|
pListType = pListDLL->m_stListOfListByType.GetNextElement(pos1))
|
|
pDialog->fn_vAddANewList(pListType->GetTypeName(), &pListType->m_stSortedList,
|
|
&m_oMainIconList, &m_oTreeIconList, E_lo_Alpha, TRUE,
|
|
C_lDrawState | C_lDrawName, TRUE);
|
|
}
|
|
|
|
// Begin Silviu Simen september 1998 List of Objects in Sectors
|
|
// initialize the lists
|
|
fn_vBuildListOfSectors();
|
|
|
|
CPA_List<CPA_SuperObject>* poList = GetInterface()->GetObjectListByType (C_szSectorTypeName);
|
|
CPA_SuperObject * pSector;
|
|
|
|
ASSERT (poList);
|
|
for (pSector = poList->GetHeadElement(pos); pSector;
|
|
pSector = poList->GetNextElement(pos))
|
|
{
|
|
pDialog->fn_vAddANewList(pSector->GetName(), M_GetMainWorld()->m_stListObjectsInSectors.GetListOfSector(pSector),
|
|
&m_oMainIconList, &m_oTreeIconList, E_lo_Alpha, TRUE,
|
|
C_lDrawState | C_lDrawIcon | C_lDrawName, TRUE);
|
|
}
|
|
// End Silviu Simen 01 september 1998 List of Objects in Sectors
|
|
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Give the list by default
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vInitDefaultParameters (CPA_DialogList *pDialog)
|
|
{
|
|
pDialog->SetDefaultTypeName("Hierarchy");
|
|
pDialog->SetDefaultTestName("No Test");
|
|
pDialog->SetDefaultButtonState(FALSE);
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Get info for list element
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CString EDT_HierarchyEditor::GetInfoForListItem (CPA_DialogList *pDialog, CString csListName, CPA_BaseObject *pObject)
|
|
{
|
|
return "";
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Get icon for list element
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
int EDT_HierarchyEditor::GetIconForListItem (CPA_DialogList *pDialog, CString csListName, CPA_BaseObject *pObject)
|
|
{
|
|
EDT_SuperObject *pSupObj;
|
|
|
|
if (fn_bIsHierarchyTree(csListName))
|
|
return 0;
|
|
|
|
pSupObj = (EDT_SuperObject *) pObject;
|
|
|
|
return GetNumIconFromObjectType(pSupObj->GetRealTypeName());
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Get icon for list element
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
int EDT_HierarchyEditor::GetStateForListItem (CPA_DialogList *pDialog, CString csListName, CPA_BaseObject *pObject)
|
|
{
|
|
EDT_SuperObject *pSupObj;
|
|
|
|
// find good icon
|
|
pSupObj = (EDT_SuperObject *) pObject;
|
|
// check state
|
|
return ( (GetInterface()->fn_bCanSelect(pSupObj) == C_Accept) ? 1 : 2);
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Get brother for tree element
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CPA_BaseObject * EDT_HierarchyEditor::GetTreeNodeNextChild (CPA_DialogList *pDialog, CString csListName, CPA_BaseObject *pParent, CPA_BaseObject *pCurrentChild)
|
|
{
|
|
EDT_SuperObject *pSupObj, *pChild;
|
|
|
|
pSupObj = (EDT_SuperObject *) pParent;
|
|
pChild = (EDT_SuperObject *) pCurrentChild;
|
|
|
|
if (pChild)
|
|
return pSupObj->GetSuperObjectNextChild(pChild);
|
|
else
|
|
return pSupObj->GetSuperObjectFirstChild();
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Get icon for tree element
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
int EDT_HierarchyEditor::GetIconForTreeItem (CPA_DialogList *pDialog, CString csListName, CPA_BaseObject *pObject)
|
|
{
|
|
EDT_SuperObject *pSupObj;
|
|
|
|
if (!fn_bIsHierarchyTree(csListName))
|
|
return 0;
|
|
|
|
pSupObj = (EDT_SuperObject *) pObject;
|
|
|
|
return GetNumIconFromObjectType(pSupObj->GetRealTypeName());
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Get icon for tree element
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
int EDT_HierarchyEditor::GetStateForTreeItem (CPA_DialogList *pDialog, CString csListName, CPA_BaseObject *pObject)
|
|
{
|
|
EDT_SuperObject *pSupObj;
|
|
|
|
// find good icon
|
|
pSupObj = (EDT_SuperObject *) pObject;
|
|
// check state
|
|
if (!pSupObj->GetSuperObjectOwner())
|
|
return ( (GetInterface()->fn_bCanSelect(pSupObj) == C_Accept) ? 1 : 2);
|
|
else
|
|
return ( (GetInterface()->fn_bCanSelect(pSupObj) == C_Accept) ? 3 : 4);
|
|
}
|
|
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Find icon corresponding to object's type
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
int EDT_HierarchyEditor::GetNumIconFromObjectType (CString csType)
|
|
{
|
|
// get icon
|
|
if (csType == C_szSuperObjectTypeName)
|
|
return 1;
|
|
if (csType == C_szActorInstanceTypeName)
|
|
return 2;
|
|
if (csType == C_szCameraObjectTypeName)
|
|
return 3;
|
|
if (csType == C_szGeometricObjectTypeName)
|
|
return 4;
|
|
if (csType == C_szInstanciatedPhysicalObjectTypeName)
|
|
return 5;
|
|
if (csType == C_szLightTypeName)
|
|
return 6;
|
|
if (csType == C_szPhysicalObjectTypeName)
|
|
return 7;
|
|
if (csType == C_szSectorTypeName)
|
|
return 8;
|
|
if (csType == C_szWayPointTypeName)
|
|
return 9;
|
|
if ((csType == C_szZddName) ||
|
|
(csType == C_szZdmName) ||
|
|
(csType == C_szZdeName) ||
|
|
(csType == C_szZdrName))
|
|
return 10;
|
|
|
|
// unknown
|
|
return 0;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Give the selection to the dialog
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CPA_BaseObject * EDT_HierarchyEditor::GetDialogSelection (CPA_DialogList *pDialog, CString csTypeName, tdeListDrawMode eDrawMode)
|
|
{
|
|
if (!m_bHasCurrentWorld)
|
|
return NULL;
|
|
|
|
if (M_GetWorld()->GetCountSelected() == 1)
|
|
return M_GetWorld()->GetSingleSelection();
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Update Editor when list changes
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bOnSelChangeComboList (CPA_DialogList *pDialog, CString csTypeName)
|
|
{
|
|
CPA_Interface *pInterface = GetInterface();
|
|
|
|
// link => update select mode
|
|
if (pInterface->GetLinkMode())
|
|
{
|
|
// hierarchy => all types
|
|
if (fn_bIsHierarchyTree(csTypeName))
|
|
pInterface->SetSelectMode("All Types");
|
|
// current model => corresponding type or all types
|
|
else if (csTypeName == "CurrentModel")
|
|
{
|
|
// update select mode
|
|
if (pInterface->GetCurrentModel())
|
|
pInterface->SetSelectMode(GetInterface()->GetCurrentModel()->m_csName);
|
|
else
|
|
pInterface->SetSelectMode("All Types");
|
|
}
|
|
// link => same type
|
|
else
|
|
pInterface->SetSelectMode(csTypeName);
|
|
}
|
|
// dialog default handling
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Update Editor when selection changes
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bOnSelChangeListObjects (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pSelectedObject, BOOL bUnselect)
|
|
{
|
|
if (!bUnselect)
|
|
return (!GetInterface()->fn_bSelectObject((CPA_SuperObject *)pSelectedObject, FALSE));
|
|
else
|
|
{
|
|
GetInterface()->fn_vRemoveSelectedObject((CPA_SuperObject *)pSelectedObject);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------
|
|
----------------------------------------*/
|
|
BOOL EDT_HierarchyEditor::fn_bOnDblClkListObjects (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pSelectedObject)
|
|
{
|
|
return (!GetInterface()->fn_bSelectObject((CPA_SuperObject *)pSelectedObject, TRUE));
|
|
}
|
|
|
|
/*----------------------------------------
|
|
----------------------------------------*/
|
|
BOOL EDT_HierarchyEditor::fn_bOnSelChangeHierarchyTree (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pSelectedObject, CPA_BaseObject *pSelectedParent)
|
|
{
|
|
return (!GetInterface()->fn_bSelectObject((CPA_SuperObject *)pSelectedObject, FALSE));
|
|
}
|
|
|
|
/*----------------------------------------
|
|
----------------------------------------*/
|
|
BOOL EDT_HierarchyEditor::fn_bOnDblClkHierarchyTree (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pSelectedObject, CPA_BaseObject *pSelectedParent)
|
|
{
|
|
return (!GetInterface()->fn_bSelectObject((CPA_SuperObject *)pSelectedObject, TRUE));
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Key Down in cpa_dialoglist
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bOnKeyDownInDialog (CPA_DialogList *pDialog, CString csTypeName, tdeListDrawMode eDraw,
|
|
CPA_BaseObject *pSelectedObject, UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
EDT_SuperObject *pSupObj;
|
|
CPA_SuperObject *pEdObj;
|
|
|
|
switch (m_p_oDevKeyboard->mfn_uwKeyToAction(nChar))
|
|
{
|
|
// delete selected object
|
|
case KA_ID_DEL :
|
|
if (pSelectedObject)
|
|
{
|
|
pEdObj = (CPA_SuperObject *) pSelectedObject;
|
|
pSupObj = (EDT_SuperObject *) pEdObj;
|
|
// if allowed, delete it
|
|
if (fn_bCanDelete(pSupObj))
|
|
M_GetEditManager()->AskFor(new EDT_ModifDelete (this, pSupObj, GetInterface()->GetSelectMode()));
|
|
else
|
|
m_eModifCanceled = E_cm_CancelDelete;
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Key Up in cpa_dialoglist
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bOnKeyUpInDialog (CPA_DialogList *pDialog, CString csTypeName, tdeListDrawMode eDraw,
|
|
CPA_BaseObject *pSelectedObject, UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Drag and Drop in Hierarchy Tree
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanDragItemInHierarchyTree (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pObjectToDrag)
|
|
{
|
|
CPA_SuperObject *pSupObj = (CPA_SuperObject *) pObjectToDrag;
|
|
|
|
if (fn_bCanChangeAllParents())
|
|
{
|
|
GetInterface()->fn_vSetLocalColor(pSupObj->GetSuperObjectFather(), E_lm_ShowParent);
|
|
GetInterface()->fn_vUpdateAll(E_mc_JustDraw);
|
|
return TRUE;
|
|
}
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Add Camera entries to popup
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bAddEntriesToTreePopup (CPA_DialogList *pDialog, CString csListName, CMenu *pMenu, UINT uiCustomEntriesStart)
|
|
{
|
|
DEV_ViewPort3D *pCurViewport;
|
|
CPA_DLLBase *p_oCameraInterface;
|
|
|
|
// get camera interface
|
|
pCurViewport = M_GetViewPort3d();
|
|
p_oCameraInterface = pCurViewport->GetCameraInterface();
|
|
|
|
return p_oCameraInterface->fn_bAddEntriesToTreePopup(pDialog, csListName, pMenu, uiCustomEntriesStart);
|
|
}
|
|
|
|
/*===========================================================================
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bAddEntriesToListPopup (CPA_DialogList *pDialog, CString csListName, CMenu *pMenu, UINT uiCustomEntriesStart)
|
|
{
|
|
DEV_ViewPort3D *pCurViewport;
|
|
CPA_DLLBase *p_oCameraInterface;
|
|
|
|
// get camera interface
|
|
pCurViewport = M_GetViewPort3d();
|
|
p_oCameraInterface = pCurViewport->GetCameraInterface();
|
|
|
|
return p_oCameraInterface->fn_bAddEntriesToListPopup(pDialog, csListName, pMenu, uiCustomEntriesStart);
|
|
}
|
|
|
|
/*===========================================================================
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vOnCommandInTreePopup (CPA_DialogList *pDialog, CString csListName, UINT uiCustomEntry)
|
|
{
|
|
DEV_ViewPort3D *pCurViewport;
|
|
CPA_DLLBase *p_oCameraInterface;
|
|
|
|
// get camera interface
|
|
pCurViewport = M_GetViewPort3d();
|
|
p_oCameraInterface = pCurViewport->GetCameraInterface();
|
|
|
|
p_oCameraInterface->fn_vOnCommandInTreePopup(pDialog, csListName, uiCustomEntry);
|
|
}
|
|
|
|
/*===========================================================================
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vOnCommandInListPopup (CPA_DialogList *pDialog, CString csListName, UINT uiCustomEntry)
|
|
{
|
|
DEV_ViewPort3D *pCurViewport;
|
|
CPA_DLLBase *p_oCameraInterface;
|
|
|
|
// get camera interface
|
|
pCurViewport = M_GetViewPort3d();
|
|
p_oCameraInterface = pCurViewport->GetCameraInterface();
|
|
|
|
p_oCameraInterface->fn_vOnCommandInListPopup(pDialog, csListName, uiCustomEntry);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
----------------------------------------*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanDropItemInHierarchyTree (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pObjectToDrop, CPA_BaseObject *pTarget)
|
|
{
|
|
return fn_bCanBeParentForAll((CPA_SuperObject *) pTarget);
|
|
}
|
|
|
|
/*----------------------------------------
|
|
----------------------------------------*/
|
|
BOOL EDT_HierarchyEditor::fn_bOnDragDropInHierarchyTree (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pObject, CPA_BaseObject *pTarget)
|
|
{
|
|
CPA_SuperObject *pSupObj;
|
|
|
|
pSupObj = (CPA_SuperObject *) pTarget;
|
|
|
|
// create modif
|
|
M_GetEditManager()->AskFor (new EDT_ModifParent
|
|
(this, M_GetWorld()->GetListOfListByDLL(), (EDT_SuperObject *) pSupObj, GetInterface()->GetSelectMode()));
|
|
// default handling
|
|
return FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Update Button Test
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bOnButtonTest (CPA_DialogList *pDialog, CString csCurrentType, tdeListDrawMode eMode)
|
|
{
|
|
CPA_Interface *pInterface = GetInterface();
|
|
|
|
// current model => nothing
|
|
if (csCurrentType == "Current Model")
|
|
return FALSE;
|
|
|
|
// otherwise => change link mode
|
|
pInterface->SetLinkMode(!pInterface->GetLinkMode());
|
|
fn_vSetANewTest(pDialog, csCurrentType);
|
|
// update interface
|
|
if (pInterface->GetLinkMode())
|
|
fn_bOnSelChangeComboList(NULL, csCurrentType);
|
|
else
|
|
pInterface->fn_vOnChangeLinkMode();
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Test function
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bTestFunction (CString csCurrentType, CString csTestName, CPA_BaseObject *pElem)
|
|
{
|
|
CPA_SuperObject *pEdObj;
|
|
|
|
// current model => only instances of the model
|
|
if ((csTestName.Left(7)) == "Model =")
|
|
{
|
|
pEdObj = (CPA_SuperObject *)pElem;
|
|
if ((GetInterface()->GetCurrentModel())&&(pEdObj->GetModelName() == GetInterface()->GetCurrentModel()->m_csName))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
// other => no test
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: set the test corresponding to the current list
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vSetANewTest (CPA_DialogList *pDialog, CString csCurrentType)
|
|
{
|
|
CString csNewTest;
|
|
BOOL bCustomTest = FALSE;
|
|
|
|
// Current Model => set corresponding name and test
|
|
if (csCurrentType == "Current Model")
|
|
{
|
|
if (GetInterface()->GetCurrentModel())
|
|
csNewTest.Format("Model = %s", GetInterface()->GetCurrentModel()->m_csName);
|
|
else
|
|
csNewTest = "Model = NULL";
|
|
pDialog->fn_vInitButtonTest(csNewTest, FALSE, TRUE);
|
|
return;
|
|
}
|
|
|
|
// Otherwise set link test
|
|
else
|
|
{
|
|
if (GetInterface()->GetLinkMode())
|
|
pDialog->fn_vInitButtonTest("Linked Selection", TRUE, FALSE);
|
|
else
|
|
pDialog->fn_vInitButtonTest("Free Selection", TRUE, FALSE);
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Test if dialog list is a hierarchy tree
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bIsHierarchyTree (CString oCurrentType)
|
|
{
|
|
// global hierarchy
|
|
if (oCurrentType == "Hierarchy")
|
|
return TRUE;
|
|
// static hierarchy
|
|
if (oCurrentType == "Static")
|
|
return TRUE;
|
|
// dynamic hierarchy
|
|
if (oCurrentType == "Dynamic")
|
|
return TRUE;
|
|
|
|
// not a hierarchy
|
|
return FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Test if dialog list is a hierarchy tree
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vUpdateDialogList (CString csMode)
|
|
{
|
|
if (!m_pDialogList)
|
|
return;
|
|
|
|
// update current model
|
|
if (csMode.IsEmpty())
|
|
{
|
|
if (m_pDialogList->GetCurrentType() == "Current Model")
|
|
{
|
|
fn_vSetANewTest(m_pDialogList, "Current Model");
|
|
m_pDialogList->fn_vUpdateSelection(E_lrm_ReinitList);
|
|
GetInterface()->fn_vUpdateLink("Current Model");
|
|
}
|
|
}
|
|
|
|
else if (m_pDialogList->GetCurrentType() != csMode)
|
|
{
|
|
m_pDialogList->SetCurrentType(csMode);
|
|
fn_vSetANewTest(m_pDialogList, csMode);
|
|
}
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// REBUILD HIERARCHY
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: Load editor infos corresponding to engine current map
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bLoadEditorMap (void)
|
|
{
|
|
HIE_tdxHandleToSuperObject hRoot;
|
|
CPA_SuperObject *pRoot;
|
|
CPA_Interface *pInterface = GetInterface();
|
|
CString csLevels;
|
|
BOOL bMustLoad;
|
|
|
|
// check if load is necessary
|
|
bMustLoad = ((!M_GetEditorRoot()) || (M_GetEditorRoot()->GetStruct() != M_GetEngineRoot()));
|
|
|
|
// init parameters
|
|
if (bMustLoad)
|
|
{
|
|
// init Super-Object Path
|
|
csLevels = fn_szGetLevelsDataPath();
|
|
m_csSOReferencePath = csLevels + "\\";
|
|
//GetReferencePath("Super-Object Reference Path");
|
|
// for rename during loading
|
|
pInterface->SetLoadingWorld(TRUE);
|
|
pInterface->SetNbObjectsRenamed(0);
|
|
// update frame
|
|
g_oBaseFrame.mfnv_UpdateTitle("Loading Editor datas...");
|
|
// send message
|
|
fn_vSendMessageChangeLevel();
|
|
// update list
|
|
m_pDialogList->fn_vInitAllLists();
|
|
// update modifs
|
|
if (m_pListOfTempModifs)
|
|
{
|
|
delete m_pListOfTempModifs;
|
|
m_pListOfTempModifs = NULL;
|
|
}
|
|
// load editor world
|
|
hRoot = M_GetEngineRoot();
|
|
pRoot = m_pSpecificEditor->fn_pInitEditorMap(hRoot);
|
|
M_GetWorld()->fn_vSetRoot(pRoot);
|
|
// send message
|
|
fn_vSendMessageLevelChanged();
|
|
pInterface->SetLoadingWorld(FALSE);
|
|
// for objects renamed during loading
|
|
if (pInterface->GetNbObjectsRenamed() > 0)
|
|
{
|
|
m_csLoadingMessage.Format("%ld object(s) were renamed : your changes will not be saved", GetInterface()->GetNbObjectsRenamed());
|
|
m_iLoadingStatus = C_STATUS_ERROR;
|
|
g_oNameManager.fn_vWriteNameConflicts();
|
|
}
|
|
else if (m_lNbUnknown)
|
|
{
|
|
m_csLoadingMessage.Format("%ld object(s) were created by default", m_lNbUnknown);
|
|
m_iLoadingStatus = C_STATUS_WARNING;
|
|
}
|
|
else
|
|
{
|
|
m_csLoadingMessage = "Editor Hierarchy Updated";
|
|
m_iLoadingStatus = C_STATUS_NORMAL;
|
|
}
|
|
}
|
|
// update frame
|
|
pInterface->GetSpecificInterface()->fn_vSetFrameTitle();
|
|
return (bMustLoad);
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Build Editor Hierarchy from Engine Hierarchy.
|
|
* (recursive function)
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vReinitEditorMap (BOOL bReinitLoad)
|
|
{
|
|
CPA_Interface *pInterface = GetInterface();
|
|
|
|
// if this is a reinitialisation, raz.
|
|
if (bReinitLoad)
|
|
{
|
|
m_lNbUnknown = 0;
|
|
// Update the Hierarchy
|
|
M_GetMainWnd()->UpdateStatus("Updating Editor Hierarchy", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
|
fn_vBuildEditorHierarchy(M_GetEditorRoot(), M_GetEngineRoot());
|
|
fn_vDoDialogUpdate();
|
|
// Reinit the lists
|
|
M_GetWorld()->fn_vReinitListObjects();
|
|
M_GetWorld()->fn_vFillListObjects(M_GetEditorRoot());
|
|
M_GetWorld()->fn_vReinitSortedList();
|
|
// initialize the lists
|
|
//fn_vBuildListOfSectors();
|
|
}
|
|
m_stListHierarchy.RemoveAll();
|
|
|
|
// update specific editor
|
|
pInterface->GetSpecificInterface()->fn_vSpecificUpdate();
|
|
pInterface->GetSpecificInterface()->fn_vInitCurrentSector();
|
|
// update lights
|
|
M_GetMainApp()->fn_vUpdateDynamicLights();
|
|
|
|
// update all dialogs
|
|
pInterface->GetDialogInsert()->fn_vInitComboType();
|
|
m_pDialogList->fn_vReinitDialog();
|
|
m_pDialogEdit->fn_vUpdateDialog();
|
|
m_pDialogSelect->fn_vUpdateDialog();
|
|
|
|
// dialog bar
|
|
pInterface->fn_vInitSelectMode();
|
|
|
|
// Update the drawing (hierarchy changed !)
|
|
pInterface->fn_vSetLocalColor(M_GetWorld()->GetRoot(), E_lm_ShowNormal);
|
|
pInterface->fn_vUpdateAll(E_mc_UpdateDialog);
|
|
// update frame
|
|
M_GetMainWnd()->UpdateStatus((char*)(LPCSTR)m_csLoadingMessage, C_STATUSPANE_INFOS, m_iLoadingStatus);
|
|
if (pInterface->GetNbObjectsRenamed() > 0)
|
|
MessageBox (AfxGetMainWnd()->m_hWnd, "Objects were renamed during loading : \nyour changes in all editors cannot be saved", "PROBLEM !", MB_OK|MB_ICONEXCLAMATION);
|
|
// set focus to 3D View
|
|
M_GetMainDevice()->SetFocusDevice(0);
|
|
|
|
}
|
|
|
|
// Begin Silviu Simen 01 september 1998 List of Objects in Sectors
|
|
|
|
void EDT_HierarchyEditor::fn_vBuildListOfSectors(void)
|
|
{
|
|
if (GetInterface()->GetSpecificInterface()->fn_bHasValidWorld(FALSE))
|
|
{
|
|
M_GetMainWorld()->m_stListObjectsInSectors.fn_vCleanAllListsOfSectors();
|
|
fn_vDoBuildListOfSectors(M_GetEditorRoot(), M_GetEngineRoot());
|
|
|
|
}
|
|
}
|
|
|
|
void EDT_HierarchyEditor::fn_vDoBuildListOfSectors(CPA_SuperObject *pEdObj, HIE_tdxHandleToSuperObject hSupObj)
|
|
{
|
|
HIE_tdxHandleToSuperObject hChild;
|
|
HIE_tdxHandleToSuperObject hBrother;
|
|
CPA_SuperObject *pEdChild;
|
|
// CString objectType;
|
|
unsigned long ulType;
|
|
|
|
MTH3D_tdstVector stObjectPosition;
|
|
CPA_SuperObject * pSector;
|
|
|
|
if (!pEdObj)
|
|
return;
|
|
|
|
// save the childs of current SuperObject
|
|
hChild = HIE_fn_hGetSuperObjectFirstChild(hSupObj);
|
|
while (hChild)
|
|
{
|
|
pEdChild = GetEditorObject(hChild);
|
|
stObjectPosition = HIE_fn_hGetSuperObjectMatrix(pEdChild->GetStruct())->stTranslationVector;
|
|
pSector = GetInterface()->GetSpecificInterface()->GetCurrentSectorFromPos(&stObjectPosition);
|
|
|
|
// objectType = pEdChild ->GetType();
|
|
ulType = HIE_fn_ulGetSuperObjectType(pEdChild->GetStruct());
|
|
switch (ulType)
|
|
{
|
|
case HIE_C_ulSuperObject :
|
|
case HIE_C_ulSector:
|
|
break;
|
|
default:
|
|
M_GetMainWorld()->m_stListObjectsInSectors.AddElement(pEdChild, pSector);
|
|
}
|
|
hBrother = HIE_fn_hGetSuperObjectNextBrother(hChild);
|
|
fn_vDoBuildListOfSectors(pEdChild, hChild);
|
|
hChild = hBrother;
|
|
}
|
|
}
|
|
// End Silviu Simen 01 september 1998 List of Objects in Sectors
|
|
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Build Editor Hierarchy from Engine Hierarchy.
|
|
* (recursive function)
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vBuildEditorHierarchy (CPA_SuperObject *pEdObj, HIE_tdxHandleToSuperObject hSupObj)
|
|
{
|
|
HIE_tdxHandleToSuperObject hChild;
|
|
HIE_tdxHandleToSuperObject hBrother;
|
|
CPA_ObjectDLLBase *p_oDLL;
|
|
CPA_SuperObject *pEdChild;
|
|
// POSITION pos;
|
|
CString csName;
|
|
|
|
if (!pEdObj)
|
|
return;
|
|
|
|
// save the childs of current SuperObject
|
|
hChild = HIE_fn_hGetSuperObjectFirstChild(hSupObj);
|
|
// isolate current Object to avoid interferences
|
|
pEdObj->RemoveAllChilds(FALSE);
|
|
// construct the child's level
|
|
while (hChild)
|
|
{
|
|
// find the corresponding Editable Object
|
|
pEdChild = GetEditorObject(hChild);
|
|
// new object => create editor instance
|
|
if (!pEdChild)
|
|
{
|
|
// try to find super object in link-table
|
|
pEdChild = GetSuperObjectFromLinkTable(hChild, (EDT_SuperObject *)pEdObj);
|
|
// find super-objet type
|
|
p_oDLL = GetMainWorld()->GetObjectDLLWithType(HIE_fn_ulGetSuperObjectType(hChild));
|
|
if (p_oDLL)
|
|
{
|
|
if (pEdChild)
|
|
p_oDLL->fn_vBuildNewEditorInstance(pEdChild, hChild);
|
|
else
|
|
pEdChild = p_oDLL->GetNewEditorInstance(hChild);
|
|
}
|
|
// no DLL can build it => default SO
|
|
if (!pEdChild)
|
|
{
|
|
csName.Format("SO_Unknown%ld", m_lNbUnknown++);
|
|
pEdChild = GetNewSuperObject(hChild, E_ss_NoSave, C_NoType, csName, "");
|
|
}
|
|
// init hierarchy parameters
|
|
m_pSpecificEditor->fn_vInitTypeSO((EDT_SuperObject *) pEdChild, (EDT_SuperObject *) pEdObj);
|
|
}
|
|
// object already present => update
|
|
else
|
|
{
|
|
p_oDLL = pEdChild->GetObjectDLL();
|
|
if ((p_oDLL)&&(!pEdChild->GetSuperObjectOwner()))
|
|
p_oDLL->fn_vUpdateEditorInstance(pEdChild, hChild);
|
|
}
|
|
// update lists (for protected childs)
|
|
fn_vUpdateHierarchyList(pEdChild);
|
|
// Editor Object MUST exist
|
|
ASSERT(pEdChild);
|
|
// save the next brother
|
|
hBrother = HIE_fn_hGetSuperObjectNextBrother(hChild);
|
|
// next level of the hierarchy
|
|
fn_vBuildEditorHierarchy(pEdChild, hChild);
|
|
// add the Editor Object in the hierarchy
|
|
pEdChild->SetList(NULL, FALSE);
|
|
pEdObj->AddANewChild(pEdChild, FALSE);
|
|
// next Child
|
|
hChild = hBrother;
|
|
}
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: destroy editor super object
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vUpdateHierarchyList (CPA_SuperObject *pEdObj)
|
|
{
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: destroy editor super object
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vDestroySuperObject (CPA_SuperObject *pEdObj, BOOL bDestroyEngineStruct, BOOL bUpdateLists)
|
|
{
|
|
EDT_ListByDLL *pListDLL;
|
|
|
|
if (!pEdObj)
|
|
return;
|
|
|
|
// temporary => when engine struct is no more valid
|
|
if (!bDestroyEngineStruct)
|
|
((EDT_SuperObject *) pEdObj)->SetEngineStruct(HIE_fn_hCreateSuperObject());
|
|
|
|
// update sorted lists
|
|
if (bUpdateLists)
|
|
{
|
|
// update corresponding list
|
|
pListDLL = M_GetWorld()->GetListFromObject(pEdObj);
|
|
if (pListDLL)
|
|
pListDLL->fn_vUpdateListObject(pEdObj, E_lum_Delete);
|
|
// update list all DLLs
|
|
M_GetWorld()->GetListAllDLLs()->fn_vUpdateListObject(pEdObj, E_lum_Delete);
|
|
}
|
|
|
|
// delete super object
|
|
delete pEdObj;
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// DIALOGS
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: Update all dialogs
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vUpdateEditor (tdeModeChange eMode)
|
|
{
|
|
if (!m_bHasCurrentWorld)
|
|
return;
|
|
|
|
switch (eMode)
|
|
{
|
|
case E_mc_JustDraw:
|
|
break;
|
|
|
|
case E_mc_UpdateSelection:
|
|
// update dialog list
|
|
m_pDialogList->fn_vUpdateSelection(E_lrm_ChangeSelection);
|
|
// update edit dialog
|
|
m_pDialogEdit->fn_vUpdateDialog();
|
|
m_pDialogSelect->fn_vUpdateDialog();
|
|
break;
|
|
|
|
case E_mc_UpdateAll:
|
|
case E_mc_UpdateDialog:
|
|
// update dialog list
|
|
fn_vSetANewTest(m_pDialogList, m_pDialogList->GetCurrentType());
|
|
m_pDialogList->fn_vUpdateSelection(E_lrm_ReinitList);
|
|
// update edit dialog
|
|
m_pDialogEdit->fn_vUpdateDialog();
|
|
m_pDialogSelect->fn_vUpdateDialog();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Check if Editable Objects have been destroyed, and
|
|
* ask user for confirmation
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vDoDialogUpdate (void)
|
|
{
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: update link between dialoglist and select mode
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vUpdateLink (CString csCurrentMode)
|
|
{
|
|
EDT_ListByType *pListType = NULL;
|
|
CComboBox *pCombo;
|
|
EDT_Model *pModel;
|
|
CString csCurrentType;
|
|
int iInd;
|
|
|
|
// get parameters
|
|
csCurrentType = m_pDialogList->GetCurrentType();
|
|
pCombo = GetInterface()->GetComboSelectMode();
|
|
pModel = GetInterface()->GetCurrentModel();
|
|
// hierarchy => all types
|
|
if (fn_bIsHierarchyTree(csCurrentType))
|
|
{
|
|
iInd = pCombo->FindStringExact(-1, "All Types");
|
|
pCombo->SetCurSel(iInd);
|
|
pCombo->EnableWindow(FALSE);
|
|
}
|
|
// current model => corresponding type or all types
|
|
else if (csCurrentType == "Current Model")
|
|
{
|
|
if (pModel)
|
|
pListType = GetInterface()->GetListWithTypeName(pModel->m_csTypeName);
|
|
if (pListType)
|
|
iInd = pCombo->FindStringExact(-1, pListType->GetTypeName());
|
|
else
|
|
iInd = pCombo->FindStringExact(-1, "All Types");
|
|
pCombo->SetCurSel(iInd);
|
|
pCombo->EnableWindow(FALSE);
|
|
}
|
|
// link => same type
|
|
else
|
|
{
|
|
if (csCurrentType != csCurrentMode)
|
|
fn_vUpdateDialogList(csCurrentMode);
|
|
pCombo->EnableWindow(TRUE);
|
|
}
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: update dialoglist when current model changes
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vUpdateModel (void)
|
|
{
|
|
fn_vUpdateDialogList("");
|
|
}
|
|
|
|
//#################################################################################
|
|
// COPY / PASTE
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: Init modif for copy
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vInitModifCopy (BOOL bInstanceAlone)
|
|
{
|
|
if (fn_bCanCopyAllObjects())
|
|
{
|
|
SetEditorMode((bInstanceAlone) ? E_em_CopyAloneMode : E_em_CopyAllMode);
|
|
fn_vInitListToCopy(M_GetWorld()->GetListSelected(), bInstanceAlone);
|
|
m_lNbCopy = 0;
|
|
}
|
|
else
|
|
m_eModifCanceled = E_cm_CancelCopy;
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Init modif for paste
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vInitModifPaste (tdePasteMode eMode, EDT_SuperObject *pNewParent, MTH3D_tdstVector *pNewPosition)
|
|
{
|
|
if (fn_bCanPasteAllObjects(eMode, pNewParent, pNewPosition))
|
|
M_GetEditManager()->AskFor(new EDT_ModifPaste
|
|
(this, &m_stListToCopy, GetInterface()->GetSelectMode(), ++m_lNbCopy));
|
|
else
|
|
{
|
|
m_eModifCanceled = E_cm_CancelPaste;
|
|
fn_vCancelAllModes();
|
|
}
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Init the lists of objects to copy
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vInitListToCopy (CPA_List<CPA_SuperObject> *pListObjects, BOOL bInstanceAlone)
|
|
{
|
|
CPA_SuperObject *pElem;
|
|
EDT_SuperObject *pNewElem;
|
|
POSITION pos;
|
|
|
|
// reinit the list
|
|
while (!m_stListToCopy.IsEmpty())
|
|
delete (m_stListToCopy.RemoveHead());
|
|
// fill the list with selected objects
|
|
for (pElem = pListObjects->GetHeadElement(pos); pElem;
|
|
pElem = pListObjects->GetNextElement(pos))
|
|
{
|
|
// create new elem
|
|
pNewElem = GetACopy((EDT_SuperObject *)pElem, bInstanceAlone, TRUE);
|
|
//CPA2 Stegaru Cristian 98-03
|
|
ASSERT (pNewElem);
|
|
pNewElem->mfn_vSetInitialSPOName (((EDT_SuperObject *)pElem)->GetName ());
|
|
//End CPA2 Stegaru Cristian 98-03
|
|
// notify unsave (not in hierarchy)
|
|
UnSaveAllElement(pNewElem);
|
|
pNewElem->fn_vUpdateValidity(FALSE);
|
|
m_stListToCopy.AddTail(new EDT_SaveParents(pNewElem, (EDT_SuperObject *) pElem->GetSuperObjectFather(), NULL));
|
|
}
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: Init the lists of objects to copy
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::UnSaveAllElement (EDT_SuperObject *pSupObj)
|
|
{
|
|
CPA_SuperObject *pChild;
|
|
CPA_BaseObject *pObject;
|
|
|
|
// unsave superobject
|
|
pSupObj->fn_vNotifyUnSave();
|
|
|
|
// if necessary, unsave object
|
|
pObject = pSupObj->GetObject();
|
|
if ((pObject)&&(pObject->fn_bCanBeSaved()))
|
|
((CPA_SaveObject *)pObject)->fn_vNotifyUnSave();
|
|
|
|
// unsave all childs
|
|
for (pChild = pSupObj->GetSuperObjectFirstChild(); pChild;
|
|
pChild = pSupObj->GetSuperObjectNextChild(pChild))
|
|
UnSaveAllElement((EDT_SuperObject *)pChild);
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: Init parents for paste.
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bInitParentAndPos (tdePasteMode eMode, EDT_SuperObject *pNewParent, MTH3D_tdstVector *pNewPosition)
|
|
{
|
|
EDT_SuperObject *pEdObj;
|
|
EDT_SaveParents *pElem;
|
|
DEV_ViewPort3D *pCurViewport;
|
|
MTH3D_tdstVector stRefVector;
|
|
MTH3D_tdstVector stTranslation;
|
|
POS_tdstCompletePosition stRefMatrix,stCamMatrix;
|
|
POS_tdstCompletePosition *pRefMatrix;
|
|
POSITION pos;
|
|
|
|
MTH3D_tdstVector stVect;
|
|
POS_tdxHandleToPosition hMatrix;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stRefMatrix);
|
|
POS_fn_vSetIdentityMatrix(&stCamMatrix);
|
|
// init vector for position
|
|
pCurViewport = M_GetViewPort3d();
|
|
MTH3D_M_vSetVectorElements(&stRefVector, (GLI_tdxValue)0.02, (GLI_tdxValue)0.02, (GLI_tdxValue)0.0);
|
|
// correct it according to camera
|
|
GLI_xGetCameraMatrix(pCurViewport->GetEngineCamera(),&stCamMatrix);
|
|
POS_fn_vInvertMatrix(&stRefMatrix,&stCamMatrix);
|
|
MTH3D_M_vNullVector(&stVect);
|
|
POS_fn_vSetTranslationVector(&stRefMatrix,&stVect);
|
|
POS_fn_vMulMatrixVertex(&stRefVector, &stRefMatrix, &stRefVector);
|
|
|
|
// check all objects in the list
|
|
for (pElem = m_stListToCopy.GetHeadElement(pos); pElem;
|
|
pElem = m_stListToCopy.GetNextElement(pos))
|
|
{
|
|
// init parameters
|
|
pEdObj = (EDT_SuperObject *) pElem->m_pChild;
|
|
// init global position
|
|
hMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pEdObj->GetStruct());
|
|
POS_fn_vGetTranslationVector(hMatrix,&stTranslation);
|
|
MTH3D_M_vAddVector(&stTranslation, &stTranslation, &stRefVector);
|
|
POS_fn_vSetTranslationVector(hMatrix,&stTranslation);
|
|
// default parent
|
|
if (eMode == E_pm_PasteDefault)
|
|
pNewParent = m_pSpecificEditor->GetDefaultParentForPaste(pEdObj);
|
|
// same parent
|
|
else if (eMode == E_pm_PasteSame)
|
|
{
|
|
pNewParent = (EDT_SuperObject *) pElem->m_pInitialParent;
|
|
// if parent was removed from hierarchy, get default one
|
|
if (!pNewParent->fn_bIsUnderObject(M_GetWorld()->GetRoot()))
|
|
pNewParent = m_pSpecificEditor->GetDefaultParentForPaste(pEdObj);
|
|
}
|
|
// chosen parent
|
|
else if ((eMode == E_pm_PasteChoice)&&(pNewParent))
|
|
{
|
|
// paste close to parent
|
|
pRefMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pNewParent->GetStruct());
|
|
POS_fn_vGetTranslationVector(pRefMatrix,&stVect);
|
|
MTH3D_M_vAddVector(&stTranslation, &stVect, &stRefVector);
|
|
POS_fn_vSetTranslationVector(hMatrix,&stTranslation);
|
|
}
|
|
// chosen position
|
|
else if ((eMode == E_pm_PasteChoice)&&(pNewPosition))
|
|
{
|
|
// init position
|
|
MTH3D_M_vCopyVector(&stTranslation, pNewPosition);
|
|
POS_fn_vSetTranslationVector(hMatrix,&stTranslation);
|
|
// get corresponding default parent
|
|
pNewParent = m_pSpecificEditor->GetDefaultParentForPaste(pEdObj);
|
|
}
|
|
// there must be a parent
|
|
if ((!pNewParent)||(pNewParent->fn_bIsUnderObject(pEdObj)))
|
|
return FALSE;
|
|
// ask specific editor
|
|
if (!m_pSpecificEditor->fn_bCanBeParent(pNewParent, pEdObj))
|
|
return FALSE;
|
|
// parent must be valid
|
|
if ((!pEdObj->fn_bAcceptAsParent(pNewParent))||(!pNewParent->fn_bAcceptAsChild(pEdObj)))
|
|
return FALSE;
|
|
// init parent
|
|
pElem->m_pFinalParent = pNewParent;
|
|
}
|
|
|
|
// all parents were found
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: check permission for paste.
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanPasteAllObjects (tdePasteMode eMode, CPA_SuperObject *pNewParent, MTH3D_tdstVector *pNewPosition)
|
|
{
|
|
// check parents
|
|
if (!fn_bInitParentAndPos(eMode, (EDT_SuperObject *)pNewParent, pNewPosition))
|
|
{
|
|
m_csMessage = "There is no valid parent to paste these objects";
|
|
return FALSE;
|
|
}
|
|
// check permissions with DLLs ??
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************************
|
|
//Begin Mircea Dunka 31 Aug 1998 - DialogBar interface
|
|
void EDT_HierarchyEditor::fn_vDefineDlgBarBtnIcon (tde_DlgBarCategory wCategory, tds_DlgBarBtn *_pDlgBarBtn)
|
|
{
|
|
if(wCategory == C_DlgBarCategoryEditor)
|
|
{
|
|
_pDlgBarBtn->hIcon = ::LoadIcon((HINSTANCE)(GetDLLIdentity()->hModule), MAKEINTRESOURCE(IDI_EDT_DLGBAR_ICON));
|
|
|
|
CString oCst;
|
|
oCst = "Hierarchy";
|
|
if( (M_GetMainApp()) && (M_GetMainApp()->mp_oAppKeyboard) )
|
|
{
|
|
oCst += " (";
|
|
oCst += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate Hierarchy Editor"));
|
|
oCst += ")";
|
|
}
|
|
strcpy(_pDlgBarBtn->szToolTip, (char*)(LPCTSTR)oCst);
|
|
_pDlgBarBtn->uID = (UINT)this;
|
|
}
|
|
}
|
|
//end Mircea Dunka 31 Aug 1998
|
|
|
|
//#################################################################################
|
|
// SUBMENUS AND POPUPMENUS
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: add entries to given submenu.
|
|
* Creation date:
|
|
* Author: Marc Trabucato
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author: Shaitan
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bDefineSubMenu(EDT_SubMenu *p_oEDTSubMenu)
|
|
{
|
|
CString oCst;
|
|
BOOL bEnable;
|
|
|
|
// submenu "Edit"
|
|
if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEdit)
|
|
{
|
|
// Full selection
|
|
p_oEDTSubMenu->AddASeparator();
|
|
// copy instance
|
|
//CPA2 Corneliu Babiuc 13-05-98
|
|
// oCst = "Copy Instance Alone";
|
|
oCst = "Copy instance alone";
|
|
oCst += "\t";
|
|
// oCst += m_p_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Copy Instance Alone"));
|
|
oCst += m_p_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Copy instance alone"));
|
|
//END CPA2 Corneliu Babiuc 13-05-98
|
|
bEnable = ((M_GetWorld()->GetCountSelected() == 1)&&(fn_bCanCopyAllObjects()));
|
|
p_oEDTSubMenu->AddAnEntry(this, (char*)(LPCTSTR)oCst, C_ui_CopyInstanceAction, FALSE, bEnable);
|
|
// copy selection
|
|
//CPA2 Corneliu Babiuc 13-05-98
|
|
// oCst = "Copy selected Objects";
|
|
oCst = "Copy instance with Branch";
|
|
oCst += "\t";
|
|
// oCst += m_p_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Copy selected Objects"));
|
|
oCst += m_p_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("copy instance with Branch"));
|
|
//END CPA2 Corneliu Babiuc 13-05-98
|
|
bEnable = ((M_GetWorld()->GetCountSelected() > 0)&&(fn_bCanCopyAllObjects()));
|
|
p_oEDTSubMenu->AddAnEntry(this, (char*)(LPCTSTR)oCst, C_ui_CopyObjectAction, FALSE, bEnable);
|
|
// paste (same parent)
|
|
oCst = "Paste under Same parent";
|
|
oCst += "\t";
|
|
oCst += m_p_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("paste under same parent"));
|
|
bEnable = (m_stListToCopy.GetCount() && fn_bCanPasteAllObjects(E_pm_PasteSame));
|
|
p_oEDTSubMenu->AddAnEntry(this, (char*)(LPCTSTR)oCst, C_ui_PasteSameAction, FALSE, bEnable);
|
|
// paste (default parent)
|
|
oCst = "Paste under Default parent";
|
|
oCst += "\t";
|
|
oCst += m_p_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("paste under Default parent"));
|
|
bEnable = (m_stListToCopy.GetCount() && fn_bCanPasteAllObjects(E_pm_PasteDefault));
|
|
p_oEDTSubMenu->AddAnEntry(this, (char*)(LPCTSTR)oCst, C_ui_PasteDefaultAction, FALSE, bEnable);
|
|
// RAZ message
|
|
m_csMessage.Empty();
|
|
// message processed
|
|
return TRUE;
|
|
}
|
|
|
|
// submenu "Editor"
|
|
else if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEditor)
|
|
{
|
|
// build text
|
|
oCst = "Hierarchy";
|
|
oCst += "\t";
|
|
oCst += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate Hierarchy Editor"));
|
|
// open or close editor
|
|
p_oEDTSubMenu->AddAnEntry(this, (char*)(LPCTSTR)oCst, C_ui_EditorAction, fn_bIsCurrentEditor(), !fn_bIsCurrentEditor());
|
|
return TRUE;
|
|
}
|
|
|
|
// submenu "Preference"
|
|
else if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuPreference)
|
|
{
|
|
// preferences
|
|
p_oEDTSubMenu->AddAnEntry(this, "User Mode (Next Session)", C_ui_SaveStatusAction, FALSE, TRUE);
|
|
p_oEDTSubMenu->AddAnEntry(this, "Save User Identity", C_ui_SavePrefixAction, FALSE, TRUE);
|
|
p_oEDTSubMenu->AddAnEntry(this, "Save Authorized Modifs", C_ui_SavePermissions, FALSE, TRUE);
|
|
p_oEDTSubMenu->AddAnEntry(this, "Save Prohibited Modifs", C_ui_SaveInterdictions, FALSE, TRUE);
|
|
p_oEDTSubMenu->AddAnEntry(this, "Save Dialogs Dimensions", C_ui_SaveDialogsAction, FALSE, TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
// no entry
|
|
return FALSE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: execute action according submenu entry.
|
|
* Creation date:
|
|
* Author: Marc Trabucato
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author: Shaitan
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::_OnSubMenuCommand(EDT_SubMenu *p_oEDTSubMenu, UINT uiMsgID)
|
|
{
|
|
// Submenu "Edit"
|
|
if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEdit)
|
|
{
|
|
switch (uiMsgID)
|
|
{
|
|
// copy instance alone
|
|
case C_ui_CopyInstanceAction:
|
|
fn_vInitListToCopy(M_GetWorld()->GetListSelected(), TRUE);
|
|
m_lNbCopy = 0;
|
|
break;
|
|
// copy objects and all childs
|
|
case C_ui_CopyObjectAction:
|
|
fn_vInitListToCopy(M_GetWorld()->GetListSelected(), FALSE);
|
|
m_lNbCopy = 0;
|
|
break;
|
|
|
|
// paste under same parent
|
|
case C_ui_PasteSameAction:
|
|
fn_vInitModifPaste (E_pm_PasteSame);
|
|
break;
|
|
// paste under default parent
|
|
case C_ui_PasteDefaultAction:
|
|
fn_vInitModifPaste (E_pm_PasteDefault);
|
|
break;
|
|
}
|
|
// specific action
|
|
if ((uiMsgID >= C_ui_DisplaySpecificAction)
|
|
&&(uiMsgID < C_ui_DisplaySpecificAction + (unsigned int) m_lNbSpecificActions))
|
|
m_pSpecificEditor->fn_vOnSubmenuCommand(uiMsgID - C_ui_DisplaySpecificAction);
|
|
}
|
|
|
|
// SubMenu "Editor"
|
|
else if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEditor)
|
|
{
|
|
// if possible, activate hierarchy editor
|
|
if ((uiMsgID == C_ui_EditorAction)&&(!fn_bIsCurrentEditor()))
|
|
GetMainWorld()->fn_bActivateEditor(this, NULL);
|
|
}
|
|
|
|
// SubMenu "Preferences"
|
|
else if (p_oEDTSubMenu->GetSubMenuType() == C_SubMenuPreference)
|
|
{
|
|
switch (uiMsgID)
|
|
{
|
|
// preference => status
|
|
case C_ui_SaveStatusAction:
|
|
GetInterface()->GetSpecificInterface()->GetDialogStatus()->fn_vDoDialog(GetInterface()->GetSpecificInterface(), FALSE);
|
|
break;
|
|
// preference => prefix
|
|
case C_ui_SavePrefixAction:
|
|
GetInterface()->fn_vSaveUserPrefix(GetInterface()->GetUserPrefix().Left(3));
|
|
break;
|
|
// preference => prefix
|
|
case C_ui_SavePermissions:
|
|
GetInterface()->fn_vSaveAuthorizations();
|
|
break;
|
|
// preference => prefix
|
|
case C_ui_SaveInterdictions:
|
|
GetInterface()->fn_vSaveProhibitions();
|
|
break;
|
|
// preference => dialogs
|
|
case C_ui_SaveDialogsAction:
|
|
fn_vSaveDialogsPreferences();
|
|
break;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: add entries to popupmenu.
|
|
* Creation date:
|
|
* Author: Marc Trabucato
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author: Shaitan
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bDefinePopupMenu(EDT_PopUpMenu *p_oPopup, CPA_List<CPA_SuperObject> *pSelection, BOOL bAsCurrentEditor)
|
|
{
|
|
EDT_SubMenu *p_oSubMenu;
|
|
CString csText;
|
|
BOOL bResult = FALSE;
|
|
|
|
p_oSubMenu = p_oPopup->fn_p_oGetNewSubMenu("Edit Super-Object");
|
|
|
|
if (fn_bIsCurrentEditor())
|
|
{
|
|
// edit flags
|
|
if (M_GetWorld()->GetCountSelected() == 1)
|
|
{
|
|
if (M_GetSingleSelection()->GetSuperObjectOwner())
|
|
{
|
|
p_oSubMenu->AddAnEntry(this, "Unprotect Child", C_ui_ChangeOwner, FALSE, TRUE);
|
|
bResult = TRUE;
|
|
}
|
|
else if (M_GetSingleSelection()->GetSuperObjectFather()->GetObjectDLL())
|
|
{
|
|
p_oSubMenu->AddAnEntry(this, "Protect Child", C_ui_ChangeOwner, FALSE, TRUE);
|
|
bResult = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// orient instance
|
|
if (fn_bCanOrientSelection())
|
|
{
|
|
p_oSubMenu->AddAnEntry(this, "Orient Instance", C_ui_OrientInstanceAction, FALSE, TRUE);
|
|
bResult = TRUE;
|
|
}
|
|
if (M_GetWorld()->GetCountSelected() == 1)
|
|
{
|
|
//CPA2 Corneliu Babiuc 18-05-98
|
|
csText = "Put on Ground";
|
|
csText += "\t";
|
|
csText += m_p_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("put on Ground"));
|
|
|
|
// p_oSubMenu->AddAnEntry(this, "Put On Ground", C_ui_PutOnGroundAction);
|
|
p_oSubMenu->AddAnEntry(this, (char*)(LPCTSTR)csText, C_ui_PutOnGroundAction);
|
|
//END CPA2 Corneliu Babiuc 18-05-98
|
|
bResult = TRUE;
|
|
}
|
|
|
|
// copy instance
|
|
if ((M_GetWorld()->GetCountSelected() == 1)&&(fn_bCanCopyAllObjects()))
|
|
{
|
|
//CPA2 Corneliu Babiuc 13-05-98
|
|
csText = "Copy instance alone";
|
|
csText += "\t";
|
|
csText += m_p_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Copy instance alone"));
|
|
|
|
// p_oSubMenu->AddAnEntry(this, "Copy Instance Alone", C_ui_CopyInstanceAction, FALSE, TRUE);
|
|
p_oSubMenu->AddAnEntry(this, (char*)(LPCTSTR)csText, C_ui_CopyInstanceAction, FALSE, TRUE);
|
|
//END CPA2 Corneliu Babiuc 13-05-98
|
|
bResult = TRUE;
|
|
}
|
|
// copy object
|
|
if ((M_GetWorld()->GetCountSelected() > 0)&&(fn_bCanCopyAllObjects()))
|
|
{
|
|
//CPA2 Corneliu Babiuc 13-05-98
|
|
csText = "Copy instance with Branch";
|
|
csText += "\t";
|
|
csText += m_p_oDevKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("copy instance with Branch"));
|
|
|
|
// p_oSubMenu->AddAnEntry(this, "Copy selected Objects", C_ui_CopyObjectAction, FALSE, TRUE);
|
|
p_oSubMenu->AddAnEntry(this, (char*)(LPCTSTR)csText, C_ui_CopyObjectAction, FALSE, TRUE);
|
|
//END CPA2 Corneliu Babiuc 13-05-98
|
|
bResult = TRUE;
|
|
}
|
|
m_csMessage.Empty();
|
|
|
|
if (bResult)
|
|
p_oPopup->AddASubMenu(p_oSubMenu);
|
|
|
|
// entries ?
|
|
return bResult;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: execute action according popupmenu entry.
|
|
* Creation date:
|
|
* Author: Marc Trabucato
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author: Shaitan
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::_OnPopUpMenuCommand(UINT _IDCmdMsg)
|
|
{
|
|
CPA_SuperObject *pSelected;
|
|
|
|
switch (_IDCmdMsg)
|
|
{
|
|
// orient instance
|
|
case C_ui_OrientInstanceAction:
|
|
// change mode
|
|
SetEditorMode(E_em_OrientMode);
|
|
break;
|
|
// copy instance
|
|
case C_ui_CopyInstanceAction:
|
|
fn_vInitListToCopy(M_GetWorld()->GetListSelected(), TRUE);
|
|
m_lNbCopy = 0;
|
|
break;
|
|
// copy selection
|
|
case C_ui_CopyObjectAction:
|
|
fn_vInitListToCopy(M_GetWorld()->GetListSelected(), FALSE);
|
|
m_lNbCopy = 0;
|
|
break;
|
|
|
|
// Put on Ground
|
|
case C_ui_PutOnGroundAction:
|
|
fn_vPutOnGround();
|
|
return;
|
|
|
|
case C_ui_ChangeOwner:
|
|
pSelected = M_GetWorld()->GetSingleSelection();
|
|
// update owner
|
|
if (pSelected->GetSuperObjectOwner())
|
|
pSelected->SetSuperObjectOwner(NULL);
|
|
else
|
|
pSelected->SetSuperObjectOwner(pSelected->GetSuperObjectFather());
|
|
// update editor
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateDialog);
|
|
}
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// MESSAGE
|
|
//#################################################################################
|
|
/*===========================================================================
|
|
* Description: Display a message when a modif is canceled
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vDisplayCancelMessage (tdeCancelMode eModif)
|
|
{
|
|
CString csMessage;
|
|
|
|
// switch modif type to find the reight message
|
|
switch (eModif)
|
|
{
|
|
case E_cm_CancelInsert:
|
|
csMessage = "Instance could not be inserted in hierarchy";
|
|
break;
|
|
case E_cm_CancelParent :
|
|
csMessage = "Hierarchy links cannot be changed";
|
|
break;
|
|
case E_cm_CancelCopy :
|
|
csMessage = "Selected Objects cannot be copied";
|
|
break;
|
|
case E_cm_CancelPaste :
|
|
csMessage = "Selected Objects cannot be paste";
|
|
break;
|
|
case E_cm_CancelDelete :
|
|
csMessage = "Selected Objects cannot be removed from Hierarchy";
|
|
break;
|
|
case E_cm_CancelMove :
|
|
csMessage = "Selected Objects cannot be moved";
|
|
break;
|
|
default:
|
|
csMessage = "";
|
|
}
|
|
|
|
// if there is an explanation, display it
|
|
if (!m_csMessage.IsEmpty())
|
|
{
|
|
csMessage += " : ";
|
|
csMessage += m_csMessage;
|
|
}
|
|
else if (m_eModifCanceled != E_cm_NoCancel)
|
|
csMessage += ".";
|
|
|
|
// display message box
|
|
M_GetMainWnd()->UpdateStatus((char*)(LPCSTR)csMessage, C_STATUSPANE_INFOS, C_STATUS_ERROR);
|
|
|
|
// RAZ Message
|
|
m_csMessage.Empty();
|
|
m_eModifCanceled = E_cm_NoCancel;
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// PREFERENCES
|
|
//#################################################################################
|
|
/*===========================================================================
|
|
* Description: get dialogs dimensions and save in .ini file
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vSaveDialogsPreferences (void)
|
|
{
|
|
CString csFileName;
|
|
CString csDimension;
|
|
BOOL bRes = TRUE;
|
|
|
|
csFileName = M_GetMainApp()->m_csEditorDataPath + C_szHierarchyIniFile;
|
|
// left frame width
|
|
csDimension.Format("%ld", m_pLeftFrame->m_oCurPos.right - m_pLeftFrame->m_oCurPos.left);
|
|
bRes &= WritePrivateProfileString ("Preference", "Left Frame Width", (char*)(LPCSTR)csDimension, (char*)(LPCSTR)csFileName);
|
|
// dialogs dimensions
|
|
csDimension.Format("%ld", m_pLeftFrame->GetPaneSize(0));
|
|
bRes &= WritePrivateProfileString ("Preference", "DialogList Dimension", (char*)(LPCSTR)csDimension, (char*)(LPCSTR)csFileName);
|
|
csDimension.Format("%ld", m_pLeftFrame->GetPaneSize(1));
|
|
bRes &= WritePrivateProfileString ("Preference", "DialogEdit Dimension", (char*)(LPCSTR)csDimension, (char*)(LPCSTR)csFileName);
|
|
// bottom frame width
|
|
csDimension.Format("%ld", m_pBottomFrame->m_oCurPos.bottom - m_pBottomFrame->m_oCurPos.top);
|
|
bRes &= WritePrivateProfileString ("Preference", "Bottom Frame Height", (char*)(LPCSTR)csDimension, (char*)(LPCSTR)csFileName);
|
|
|
|
// if necessary, display error message
|
|
if (!bRes)
|
|
M_GetMainWnd()->UpdateStatus("Hierarchy Editor cannot save your preferences. EDTKeys.ini may have a ReadOnly status ?", C_STATUSPANE_INFOS, C_STATUS_WARNING);
|
|
else
|
|
M_GetMainWnd()->UpdateStatus("Preferences saved", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
|
}
|
|
|
|
//#################################################################################
|
|
// SECTION
|
|
//#################################################################################
|
|
/*===========================================================================
|
|
* Description: retrieve or create super-objet coresponding to section name
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
EDT_SuperObject * EDT_HierarchyEditor::GetOrLoadSuperObject (CString csSectionName)
|
|
{
|
|
HIE_tdxHandleToSuperObject hSupObj;
|
|
SCR_tdst_Link_Value *pLinkValue;
|
|
SCR_tdst_Cxt_Values *p_stValues ;
|
|
CPA_ObjectDLLBase *p_oDLL;
|
|
EDT_SuperObject *pSupObj = NULL;
|
|
tdeSaveStatus eSaveStatus;
|
|
CString csName, csEngineFileName;
|
|
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szName[SCR_CV_ui_Cfg_MaxLenName];
|
|
|
|
// get value from coresponding link-table
|
|
pLinkValue = SCR_fnp_st_Link_SearchKey(HIE_fn_p_stGetSuperObjectLinkTable(), (char*)(LPCSTR) csSectionName);
|
|
SCR_fn_v_RdL0_SplitSectionName((char*)(LPCSTR) csSectionName, szFileName, szActionName, szName);
|
|
csName = szName;
|
|
csEngineFileName = szFileName;
|
|
|
|
// key in link table => engine super-object already exists
|
|
if ((pLinkValue)&&(SCR_M_e_Link_GetState(pLinkValue) == SCR_ELS_Link_Initialized))
|
|
hSupObj = (HIE_tdxHandleToSuperObject) SCR_M_ul_Link_GetValue(pLinkValue);
|
|
// else load engine super-object
|
|
else
|
|
{
|
|
p_stValues = SCR_fnp_st_RdL0_AnalyseSection((char*)(LPCSTR) csSectionName, SCR_CDF_uw_Anl_Normal);
|
|
if (p_stValues)
|
|
hSupObj = (HIE_tdxHandleToSuperObject) p_stValues->a_ulValues[0];
|
|
}
|
|
|
|
// get or create corresponding super-object
|
|
pSupObj = (EDT_SuperObject *) GetEditorObject(hSupObj);
|
|
// new object => create editor instance
|
|
if (!pSupObj)
|
|
{
|
|
// create super-objet
|
|
eSaveStatus = (m_pSpecificEditor->fn_bIsValidType(C_Static)) ? E_ss_Responsible : E_ss_Modify;
|
|
pSupObj = (EDT_SuperObject *) GetNewSuperObject(hSupObj, eSaveStatus, C_Static, csName, csEngineFileName);
|
|
|
|
// if necessary, ask DLL to initialise its objet
|
|
p_oDLL = GetMainWorld()->GetObjectDLLWithType(HIE_fn_ulGetSuperObjectType(hSupObj));
|
|
if (p_oDLL)
|
|
p_oDLL->fn_vBuildNewEditorInstance(pSupObj, hSupObj);
|
|
}
|
|
return pSupObj;
|
|
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: check if engine struct is in link table, and find corresponding section
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
EDT_SuperObject * EDT_HierarchyEditor::GetSuperObjectFromLinkTable (HIE_tdxHandleToSuperObject hEngineSO, EDT_SuperObject *pParent)
|
|
{
|
|
EDT_SuperObject *pEdObj;
|
|
tdeSaveStatus eSaveStatus;
|
|
tdeTypeSO eTypeSO;
|
|
CString csSectionName;
|
|
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szName[SCR_CV_ui_Cfg_MaxLenName];
|
|
|
|
// try to find super-object in link table
|
|
csSectionName = GetEngineSectionName(hEngineSO);
|
|
if (csSectionName.IsEmpty())
|
|
return NULL;
|
|
|
|
// get parameters and create super-object
|
|
SCR_fn_v_RdL0_SplitSectionName((char*)(LPCSTR) csSectionName, szFileName, szActionName, szName);
|
|
eTypeSO = (pParent) ? pParent->GetTypeSO() : C_Static;
|
|
eSaveStatus = (m_pSpecificEditor->fn_bIsValidType(eTypeSO)) ? E_ss_Responsible : E_ss_Modify;
|
|
// init type from hierarchy position
|
|
pEdObj = (EDT_SuperObject *) GetNewSuperObject(hEngineSO, eSaveStatus, eTypeSO, szName, szFileName);
|
|
|
|
return pEdObj;
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: check if engine struct is in link table, and find corresponding section
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CString EDT_HierarchyEditor::GetEngineSectionName (HIE_tdxHandleToSuperObject hEngineSO)
|
|
{
|
|
SCR_tdst_Link_Value *pLinkValue;
|
|
CString csSectionName, csCompleteName;
|
|
int iPos;
|
|
|
|
// init name
|
|
csSectionName.Empty();
|
|
|
|
// search link table for engine struct
|
|
pLinkValue = SCR_fnp_st_Link_SearchValue(HIE_fn_p_stGetSuperObjectLinkTable(), (unsigned long) hEngineSO);
|
|
if ((pLinkValue)&&(SCR_M_e_Link_GetState(pLinkValue) == SCR_ELS_Link_Initialized))
|
|
csCompleteName = SCR_M_p_sz_Link_GetKey(pLinkValue);
|
|
// compute minimal file name
|
|
// temp
|
|
iPos = csCompleteName.Find(m_csSOReferencePath);
|
|
if (iPos != -1)
|
|
csSectionName = csCompleteName.Mid(m_csSOReferencePath.GetLength());
|
|
else
|
|
csSectionName = csCompleteName;
|
|
return csSectionName;
|
|
}
|
|
|
|
|
|
//#################################################################################
|
|
// MODIFICATIONS
|
|
//#################################################################################
|
|
|
|
/*===========================================================================
|
|
* Description: add a modif to global list for super-objects
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vAddTemporaryModif (EDT_SuperObject *pSupObj)
|
|
{
|
|
EDT_TempModif *pTempSO;
|
|
|
|
// check if super-object is temporary
|
|
pTempSO = pSupObj->GetTemporaryModif();
|
|
if (!pTempSO)
|
|
return;
|
|
|
|
// if no list, create it
|
|
if (!m_pListOfTempModifs)
|
|
m_pListOfTempModifs = new EDT_TempList(this, FALSE);
|
|
|
|
// add temporary modif to the list
|
|
m_pListOfTempModifs->fn_vAddTemporaryModif(pTempSO);
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: remove a modif from global list for super-objects
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vRemoveTemporaryModif (EDT_SuperObject *pSupObj)
|
|
{
|
|
EDT_TempModif *pTempSO;
|
|
|
|
// check if super-object is temporary
|
|
pTempSO = pSupObj->GetTemporaryModif();
|
|
if ((!pTempSO)||(!m_pListOfTempModifs))
|
|
return;
|
|
|
|
// remove temporary modif from the list
|
|
m_pListOfTempModifs->fn_vRemoveTemporaryModif(pTempSO);
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: remove a modif from global list for super-objects
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vChangeTemporaryModif (EDT_SuperObject *pSupObj)
|
|
{
|
|
EDT_TempModif *pTempSO;
|
|
|
|
// check if super-object is temporary
|
|
pTempSO = pSupObj->GetTemporaryModif();
|
|
if ((!pTempSO)||(!m_pListOfTempModifs))
|
|
return;
|
|
|
|
// remove temporary modif from the list
|
|
m_pListOfTempModifs->fn_vChangeTemporaryModif(pTempSO);
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: get section name correspinding to list of modifications
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
CString EDT_HierarchyEditor::GetTempListSectionName (void)
|
|
{
|
|
return GetSpecificEditor()->GetModifSectionName();
|
|
}
|
|
|
|
//#################################################################################
|
|
// TEMPORARY MODIFICATIONS
|
|
//#################################################################################
|
|
/*===========================================================================
|
|
Load list of modifications
|
|
=========================================================================*/
|
|
SCR_tde_Anl_ReturnValue EDT_HierarchyEditor::CallBackLoadListModif (SCR_tdst_File_Description *p_fFile, char *szSectionName, char *szParams[], SCR_tde_Anl_Action eAction)
|
|
{
|
|
SCR_tdst_Cxt_Values *p_stValues ;
|
|
EDT_SuperObject *pSupObj;
|
|
EDT_TempModif *pTempSO;
|
|
EDT_TempList *pTempList;
|
|
EDT_HierarchyEditor *pEditor;
|
|
char szSupObjName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
|
|
CString csOrigFileName;
|
|
char szModifObjName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szModifSectionName[SCR_CV_ui_Cfg_MaxLenName];
|
|
|
|
switch (eAction)
|
|
{
|
|
case SCR_EA_Anl_BeginSection:
|
|
// get corresponding super-object
|
|
SCR_M_RdL0_GetContextLong(0, 0, EDT_HierarchyEditor *, pEditor);
|
|
pTempList = new EDT_TempList(pEditor, TRUE);
|
|
pEditor->SetListOfTempModifs(pTempList);
|
|
// create modification
|
|
SCR_M_RdL0_SetSectionLong(0, 0, (long) pTempList);
|
|
break;
|
|
|
|
case SCR_EA_Anl_Entry:
|
|
// load each modif
|
|
if (strcmp(szSectionName, "Modification") == 0)
|
|
{
|
|
SCR_M_RdL0_GetSectionLong(0, 0, EDT_TempList *, pTempList);
|
|
pEditor = pTempList->GetEditor();
|
|
|
|
// get corresponding super-object
|
|
SCR_fn_v_RdL0_SplitSectionName(szParams[1], szFileName, szSectionName, szSupObjName);
|
|
BOOL bUseTheSameFile = (1 == strlen (szFileName) && '*' == szFileName [0]);
|
|
if (bUseTheSameFile)
|
|
strcpy (szFileName, SCR_M_RdL0_GetFileNameR(0));
|
|
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, szFileName, "SuperObject", szSupObjName);
|
|
pSupObj = pEditor->GetOrLoadSuperObject(szSectionName);
|
|
ASSERT (pSupObj);
|
|
// load corresponding temporary modif
|
|
SCR_M_RdL0_SetContextLong(1, 0, (long) pSupObj);
|
|
//get the modif section name
|
|
csOrigFileName = szFileName;
|
|
SCR_fn_v_RdL0_SplitSectionName(szParams[2], szFileName, szSectionName, szModifObjName);
|
|
BOOL bUseTheMDFFile = (1 == strlen (szFileName) && '*' == szFileName [0]);
|
|
if (bUseTheMDFFile)
|
|
{
|
|
int iPos = csOrigFileName.ReverseFind ('.');
|
|
ASSERT (-1 != iPos);
|
|
csOrigFileName = csOrigFileName.Left (iPos) + szModifExt;
|
|
}
|
|
else
|
|
csOrigFileName = szFileName;
|
|
|
|
SCR_fn_v_RdL0_ComputeSectionName(szModifSectionName, (char*)(LPCSTR)csOrigFileName, szSectionName, szModifObjName);
|
|
pSupObj->mfn_vSetTempModifSectionName (szModifSectionName);
|
|
p_stValues = SCR_fnp_st_RdL0_AnalyseSection(szParams[2], SCR_CDF_uw_Anl_Normal);
|
|
if (p_stValues)
|
|
pTempSO = (EDT_TempModif *) p_stValues->a_ulValues[0];
|
|
|
|
// check coherence
|
|
ASSERT (pSupObj == pTempSO->GetOriginalSO());
|
|
//load the original super object name
|
|
pTempSO->mfn_vSetOriginalSOName (szParams[0]);
|
|
// update superobject
|
|
pSupObj->SetTemporaryModif(pTempSO);
|
|
|
|
// add modif to the list
|
|
pTempList->fn_vAddTemporaryModif(pTempSO, FALSE);
|
|
}
|
|
|
|
case SCR_EA_Anl_EndSection:
|
|
break;
|
|
}
|
|
return SCR_ERV_Anl_NormalReturn;
|
|
}
|
|
|
|
//#################################################################################
|
|
// POSITION
|
|
//#################################################################################
|
|
/*===========================================================================
|
|
* Description: get position from picking
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bFindPickingPosition (tdstPosition *p_stPosition)
|
|
{
|
|
HIE_tdxHandleToSuperObject hSupObj;
|
|
HIE_aDEF_stTabOfPickInfo a_stPickInfo;
|
|
CPA_SuperObject *pParent = NULL;
|
|
DEV_ViewPort3D *pCurViewport;
|
|
ACP_tdxIndex xNbPicked, xInd;
|
|
|
|
// init parameters
|
|
pCurViewport = M_GetViewPort3d();
|
|
hSupObj = M_GetEngineRoot();
|
|
xNbPicked = 0;
|
|
|
|
// try to pick an object
|
|
if (hSupObj != NULL)
|
|
{
|
|
// picking
|
|
xNbPicked = HIE_xIsSuperObjectPick(GLI_C_ModePickingFace, pCurViewport->m_hDisplayDevice,
|
|
pCurViewport->m_hDisplayViewport, &p_stPosition->stPos.stPos2D, hSupObj, a_stPickInfo);
|
|
}
|
|
|
|
// update picking info
|
|
p_stPosition->xIndex = xNbPicked;
|
|
|
|
// if there is no picking, insertion is canceled
|
|
if (xNbPicked == 0)
|
|
return FALSE;
|
|
|
|
// MAJ position
|
|
p_stPosition->stPos.stPos3D = (a_stPickInfo[0].stPickedObject.aDEF_stDataOfElement[0].stHit);
|
|
for (xInd = 0; xInd < xNbPicked; xInd++)
|
|
p_stPosition->a_stPickInfo[xInd] = a_stPickInfo[xInd];
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: get position from picking
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vMoveToNewPosition (tdstPosition *p_stPosition)
|
|
{
|
|
EDT_SuperObject *pParent, *pObjectToMove;
|
|
MTH3D_tdstVector stTranslation;
|
|
MTH3D_tdstVector stNormal, stVector;
|
|
POS_tdstCompletePosition *pParentMatrix, *pObjectMatrix, *pGlobalMatrix;
|
|
POS_tdstCompletePosition stMatrix;
|
|
EDT_ModifMove *pMouseMove;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
//CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
CPA_List<EDT_ListByDLL> * pObjectsListByDLL;
|
|
CPA_List<CPA_SuperObject> * pSOList;
|
|
long x;
|
|
|
|
if (x=M_GetWorld()->GetCountRegistered() )
|
|
{
|
|
if ( !fn_bCanTranslateAllObjects(E_lst_RegisteredList) )
|
|
{
|
|
fn_vDisplayCancelMessage(E_cm_CancelMove);
|
|
return;
|
|
}
|
|
pObjectsListByDLL = M_GetWorld()->GetListOfRegisteredListByDLL();
|
|
pSOList = M_GetWorld()->GetListRegistered();
|
|
}
|
|
else
|
|
{
|
|
if ( !fn_bCanTranslateAllObjects(E_lst_SelectedList) )
|
|
{
|
|
fn_vDisplayCancelMessage(E_cm_CancelMove);
|
|
return;
|
|
}
|
|
pObjectsListByDLL = M_GetWorld()->GetListOfListByDLL();
|
|
pSOList = M_GetWorld()->GetListSelected();
|
|
}
|
|
//END CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
|
|
// init mousemove
|
|
//CPA2 Corneliu Babiuc (teleport bug) 24-06-98
|
|
// pMouseMove = new EDT_ModifMove(this, M_GetWorld()->GetListOfListByDLL(), GetInterface()->GetSelectMode());
|
|
//CPA2 Corneliu Babiuc (teleport bug) 24-06-98
|
|
|
|
// init parameters
|
|
//CPA2 Corneliu Babiuc (TMS_0598) 25-05-98
|
|
//CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
/* // if there is a registration then uses it
|
|
if ( m_bIsASelection )
|
|
{
|
|
// pObjectToMove = (EDT_SuperObject *) M_GetWorld()->GetSingleSelection();
|
|
// else
|
|
pObjectToMove = m_pRegisteredObject;
|
|
//END CPA2 Corneliu Babiuc (TMS_0598) 25-05-98
|
|
//CPA2 Corneliu Babiuc (teleport bug) 24-06-98
|
|
// construct a list containing a single element: the registered object
|
|
CPA_List<EDT_ListByDLL> lstSingleList;
|
|
fn_vAddObjectRecursiveToList((CPA_SuperObject*)pObjectToMove, &lstSingleList, TRUE);
|
|
pMouseMove = new EDT_ModifMove(this, &lstSingleList, GetInterface()->GetSelectMode());
|
|
//END CPA2 Corneliu Babiuc (teleport bug) 24-06-98
|
|
pParent = (EDT_SuperObject *) pObjectToMove->GetSuperObjectFather();
|
|
// init position
|
|
fn_vGetNormalFromPicking(p_stPosition->a_stPickInfo, &stNormal);
|
|
fn_vGetPositionFromBoundingVolume(pObjectToMove, &stNormal, &stVector);
|
|
MTH3D_M_vAddVector(&p_stPosition->stPos.stPos3D, &p_stPosition->stPos.stPos3D, &stVector);
|
|
// get position
|
|
pParentMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pParent->GetStruct());
|
|
pObjectMatrix = HIE_fn_hGetSuperObjectMatrix(pObjectToMove->GetStruct());
|
|
pGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pObjectToMove->GetStruct());
|
|
// correct position according to pParent's matrix
|
|
POS_fn_vInvertMatrix(&stMatrix, pParentMatrix);
|
|
POS_fn_vMulMatrixVertex(&stTranslation, &stMatrix, &p_stPosition->stPos.stPos3D);
|
|
POS_fn_vSetTranslationVector(pObjectMatrix,&stTranslation);
|
|
POS_fn_vSetTranslationVector(pGlobalMatrix,&p_stPosition->stPos.stPos3D);
|
|
// update global matrices
|
|
GetInterface()->fn_vUpdatePositions();
|
|
//CPA2 Corneliu Babiuc (TMS_0598) 25-05-98
|
|
}
|
|
else // move selected objects
|
|
{
|
|
*/
|
|
//CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
//CPA2 Corneliu Babiuc (teleport bug) 24-06-98
|
|
// init mousemove
|
|
pMouseMove = new EDT_ModifMove(this, /*M_GetWorld()->GetListOfListByDLL()*/pObjectsListByDLL, GetInterface()->GetSelectMode());
|
|
//CPA2 Corneliu Babiuc (teleport bug) 24-06-98
|
|
// for each selected object
|
|
POSITION stPos;
|
|
long lIndex = 1;
|
|
for( pObjectToMove = (EDT_SuperObject *) /*M_GetWorld()->GetListSelected()*/pSOList->GetHeadElement(stPos);
|
|
pObjectToMove;
|
|
pObjectToMove = (EDT_SuperObject *) /*M_GetWorld()->GetListSelected()*/pSOList->GetNextElement(stPos), lIndex++ )
|
|
{
|
|
|
|
MTH3D_tdstVector stNewPosition;
|
|
pParent = (EDT_SuperObject *) pObjectToMove->GetSuperObjectFather();
|
|
|
|
MTH3D_M_vCopyVector(&stNewPosition, &p_stPosition->stPos.stPos3D);
|
|
// init position
|
|
fn_vGetNormalFromPicking(p_stPosition->a_stPickInfo, &stNormal);
|
|
fn_vGetPositionFromBoundingVolume(pObjectToMove, &stNormal, &stVector);
|
|
// now the moving position is the new position added with vector for object BV
|
|
MTH3D_M_vAddVector(&stNewPosition, &stNewPosition, &stVector);
|
|
// get position
|
|
pParentMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pParent->GetStruct());
|
|
pObjectMatrix = HIE_fn_hGetSuperObjectMatrix(pObjectToMove->GetStruct());
|
|
pGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pObjectToMove->GetStruct());
|
|
// correct position according to pParent's matrix
|
|
POS_fn_vInvertMatrix(&stMatrix, pParentMatrix);
|
|
POS_fn_vMulMatrixVertex(&stTranslation, &stMatrix, &stNewPosition);
|
|
POS_fn_vSetTranslationVector(pObjectMatrix,&stTranslation);
|
|
POS_fn_vSetTranslationVector(pGlobalMatrix,&stNewPosition);
|
|
// update global matrices
|
|
GetInterface()->fn_vUpdatePositions();
|
|
|
|
//move object to avoid collision
|
|
fn_vMoveObjectFromMultipleSelection(pObjectToMove, (CPA_List<EDT_SuperObject> *)M_GetWorld()->GetListSelected(), lIndex, &p_stPosition->stPos.stPos3D, &stNormal);
|
|
} // for all selected objects
|
|
// }
|
|
//CPA2 Corneliu Babiuc (TMS_0598) 25-05-98
|
|
// ask for move
|
|
fn_bDoOrCancelMove(pMouseMove);
|
|
}
|
|
|
|
//CPA2 Corneliu Babiuc (specific teleportation) 15-06-98
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : EDT_HierarchyEditor::fn_vMoveToInstancePosition
|
|
// Date : 15-06-1998
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// It telports the selected object to the position of a reference instance
|
|
// Parameters:
|
|
// pReferenceInstance - reference instance where object has to be teleported
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Author : Corneliu Babiuc
|
|
// Modification:
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
void EDT_HierarchyEditor::fn_vMoveToInstancePosition(EDT_SuperObject * pReferenceInstance)
|
|
{
|
|
EDT_SuperObject *pParent, *pObjectToMove;
|
|
MTH3D_tdstVector stTranslation, stGlobalTranslation;
|
|
MTH3D_tdstVector stVectI, stVectJ, stVectK;
|
|
POS_tdstCompletePosition *pParentMatrix, *pObjectMatrix, *pGlobalMatrix;
|
|
POS_tdstCompletePosition stMatrix, stRotationMatrix;
|
|
EDT_ModifMove *pMouseMove;
|
|
|
|
//CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
if (M_GetWorld()->GetCountRegistered() )
|
|
{
|
|
if ( !fn_bCanTranslateAllObjects(E_lst_RegisteredList) )
|
|
{
|
|
fn_vDisplayCancelMessage(E_cm_CancelMove);
|
|
return;
|
|
}
|
|
pObjectToMove = (EDT_SuperObject *)M_GetWorld()->GetSingleRegistration();
|
|
}
|
|
else
|
|
{
|
|
if ( !fn_bCanTranslateAllObjects(E_lst_SelectedList) )
|
|
{
|
|
fn_vDisplayCancelMessage(E_cm_CancelMove);
|
|
return;
|
|
}
|
|
pObjectToMove = (EDT_SuperObject *)M_GetWorld()->GetSingleSelection();
|
|
}
|
|
//END CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
|
|
//CPA2 Corneliu Babiuc (teleport bug) 25-06-98
|
|
// construct a list containing a single element: the registered object
|
|
CPA_List<EDT_ListByDLL> lstSingleList;
|
|
fn_vAddObjectRecursiveToList((CPA_SuperObject*)pObjectToMove, &lstSingleList, TRUE);
|
|
pMouseMove = new EDT_ModifMove(this, &lstSingleList, GetInterface()->GetSelectMode());
|
|
//END CPA2 Corneliu Babiuc (teleport bug) 25-06-98
|
|
// now move the object
|
|
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(pReferenceInstance->GetStruct()),&stGlobalTranslation);
|
|
pParent = (EDT_SuperObject *) pObjectToMove->GetSuperObjectFather();
|
|
// get position
|
|
pParentMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pParent->GetStruct());
|
|
pObjectMatrix = HIE_fn_hGetSuperObjectMatrix(pObjectToMove->GetStruct());
|
|
pGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pObjectToMove->GetStruct());
|
|
// correct position according to pParent's matrix
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
POS_fn_vInvertMatrix(&stMatrix, pParentMatrix);
|
|
POS_fn_vMulMatrixVertex(&stTranslation, &stMatrix, &stGlobalTranslation);
|
|
POS_fn_vSetTranslationVector(pObjectMatrix,&stTranslation);
|
|
POS_fn_vSetTranslationVector(pGlobalMatrix,&stGlobalTranslation);
|
|
// rotate object
|
|
POS_fn_vGetRotationMatrix(HIE_fn_hGetSuperObjectGlobalMatrix(pReferenceInstance->GetStruct()),&stVectI,&stVectJ,&stVectK);
|
|
//set the global rotation matrix
|
|
POS_fn_vSetRotationMatrix(pGlobalMatrix,&stVectI,&stVectJ,&stVectK);
|
|
//set local rotation matrix
|
|
POS_fn_vSetIdentityMatrix(&stRotationMatrix);
|
|
POS_fn_vSetRotationMatrix(&stRotationMatrix,&stVectI,&stVectJ,&stVectK);
|
|
POS_fn_vMulMatrixMatrix(&stRotationMatrix, &stMatrix, &stRotationMatrix);
|
|
POS_fn_vGetRotationMatrix(&stRotationMatrix,&stVectI,&stVectJ,&stVectK);
|
|
POS_fn_vSetRotationMatrix(pObjectMatrix,&stVectI,&stVectJ,&stVectK);
|
|
POS_fn_vNormalizeMatrix(pObjectMatrix);
|
|
// update global matrices
|
|
GetInterface()->fn_vUpdatePositions();
|
|
// ask for move
|
|
fn_bDoOrCancelMove(pMouseMove);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : EDT_HierarchyEditor::fn_vMoveToCameraPosition
|
|
// Date : 15-06-1998
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// It telports the registered or selected object to the position of editor camera
|
|
// Parameters:
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Author : Corneliu Babiuc
|
|
// Modification:
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void EDT_HierarchyEditor::fn_vMoveToCameraPosition()
|
|
{
|
|
POS_tdstCompletePosition stMatrix, stCameraMatrix;
|
|
POS_tdstCompletePosition *pObjectMatrix, *pGlobalMatrix, *pParentMatrix;
|
|
EDT_ModifMove *pMouseMove;
|
|
EDT_SuperObject *pObjectToMove, *pParent;
|
|
MTH3D_tdstVector stTranslation, stGlobalTranslation;
|
|
MTH3D_tdstVector stVectI, stVectJ, stVectK;
|
|
|
|
//CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
if (M_GetWorld()->GetCountRegistered() )
|
|
{
|
|
if ( !fn_bCanTranslateAllObjects(E_lst_RegisteredList) )
|
|
{
|
|
fn_vDisplayCancelMessage(E_cm_CancelMove);
|
|
return;
|
|
}
|
|
pObjectToMove = (EDT_SuperObject *)M_GetWorld()->GetSingleRegistration();
|
|
}
|
|
else
|
|
{
|
|
if ( !fn_bCanTranslateAllObjects(E_lst_SelectedList) )
|
|
{
|
|
fn_vDisplayCancelMessage(E_cm_CancelMove);
|
|
return;
|
|
}
|
|
pObjectToMove = (EDT_SuperObject *)M_GetWorld()->GetSingleSelection();
|
|
}
|
|
//END CPA2 Corneliu Babiuc (multiple registration) 06-07-98
|
|
|
|
// init mousemove
|
|
//CPA2 Corneliu Babiuc (teleport bug) 25-06-98
|
|
// construct a list containing a single element: the registered object
|
|
CPA_List<EDT_ListByDLL> lstSingleList;
|
|
fn_vAddObjectRecursiveToList((CPA_SuperObject*)pObjectToMove, &lstSingleList, TRUE);
|
|
pMouseMove = new EDT_ModifMove(this, &lstSingleList, GetInterface()->GetSelectMode());
|
|
//END CPA2 Corneliu Babiuc (teleport bug) 25-06-98
|
|
|
|
DEV_ViewPort3D *pCurViewport;
|
|
CPA_BaseObject *p_oCamera;
|
|
|
|
pCurViewport = (DEV_ViewPort3D *)GetInterface()->GetMultiDevice3D()->GetFocusDevice()->GetViewPort();
|
|
p_oCamera = pCurViewport->GetCamera();
|
|
POS_fn_vSetIdentityMatrix(&stCameraMatrix);
|
|
pCurViewport->GetCameraInterface()->GetMatrix(p_oCamera, &stCameraMatrix);
|
|
POS_fn_vGetTranslationVector(&stCameraMatrix, &stGlobalTranslation);
|
|
|
|
// now move the object to the editor camera position
|
|
pParent = (EDT_SuperObject *) pObjectToMove->GetSuperObjectFather();
|
|
// get position
|
|
pParentMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pParent->GetStruct());
|
|
pObjectMatrix = HIE_fn_hGetSuperObjectMatrix(pObjectToMove->GetStruct());
|
|
pGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pObjectToMove->GetStruct());
|
|
// correct position according to pParent's matrix
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
POS_fn_vInvertMatrix(&stMatrix, pParentMatrix);
|
|
POS_fn_vMulMatrixVertex(&stTranslation, &stMatrix, &stGlobalTranslation);
|
|
POS_fn_vSetTranslationVector(pObjectMatrix,&stTranslation);
|
|
POS_fn_vSetTranslationVector(pGlobalMatrix,&stGlobalTranslation);
|
|
// rotate object
|
|
POS_fn_vGetRotationMatrix(&stCameraMatrix,&stVectI,&stVectJ,&stVectK);
|
|
//set the global rotation matrix
|
|
POS_fn_vSetRotationMatrix(pGlobalMatrix,&stVectI,&stVectK,&stVectJ);
|
|
//set the local rotation matrix
|
|
POS_fn_vSetIdentityMatrix(&stCameraMatrix);
|
|
POS_fn_vSetRotationMatrix(&stCameraMatrix,&stVectI,&stVectJ,&stVectK);
|
|
POS_fn_vMulMatrixMatrix(&stCameraMatrix, &stMatrix, &stCameraMatrix);
|
|
POS_fn_vGetRotationMatrix(&stCameraMatrix,&stVectI,&stVectK,&stVectJ);
|
|
POS_fn_vSetRotationMatrix(pObjectMatrix,&stVectI,&stVectJ,&stVectK);
|
|
POS_fn_vNormalizeMatrix(pObjectMatrix);
|
|
// update global matrices
|
|
GetInterface()->fn_vUpdatePositions();
|
|
// ask for move
|
|
fn_bDoOrCancelMove(pMouseMove);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : EDT_HierarchyEditor::fn_vMoveCameraOrientedToInstance
|
|
// Date : 18-06-1998
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// It moves the editor camera to have the same position and orientation as a reference
|
|
// instance. Set the camera translation and rotation according to reference instance
|
|
// Parameters:
|
|
// p_oReference - reference instance
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Author : Corneliu Babiuc
|
|
// Modification:
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
void EDT_HierarchyEditor::fn_vMoveCameraOrientedToInstance(EDT_SuperObject * p_oReference)
|
|
{
|
|
POS_tdstCompletePosition *pGlobalPosition, stCameraMatrix;
|
|
MTH3D_tdstVector stTranslation, stVectI, stVectJ, stVectK;
|
|
DEV_ViewPort3D *pCurViewport;
|
|
CPA_BaseObject *p_oCamera;
|
|
|
|
ASSERT(p_oReference);
|
|
// get the reference object translation vector
|
|
pGlobalPosition = HIE_fn_hGetSuperObjectGlobalMatrix(p_oReference->GetStruct());
|
|
POS_fn_vGetTranslationVector(pGlobalPosition, &stTranslation);
|
|
// set position
|
|
pCurViewport = (DEV_ViewPort3D *)GetInterface()->GetMultiDevice3D()->GetFocusDevice()->GetViewPort();
|
|
p_oCamera = pCurViewport->GetCamera();
|
|
POS_fn_vSetIdentityMatrix(&stCameraMatrix);
|
|
pCurViewport->GetCameraInterface()->GetMatrix(p_oCamera, &stCameraMatrix);
|
|
POS_fn_vSetTranslationVector(&stCameraMatrix, &stTranslation);
|
|
// set the rotation matrix of camera
|
|
POS_fn_vGetRotationMatrix(pGlobalPosition,&stVectI,&stVectJ,&stVectK);
|
|
//set the global rotation matrix
|
|
MTH3D_M_vNegVector(&stVectJ, &stVectJ);
|
|
POS_fn_vSetRotationMatrix(&stCameraMatrix,&stVectI,&stVectK,&stVectJ);
|
|
pCurViewport->GetCameraInterface()->SetMatrix(p_oCamera, &stCameraMatrix);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : EDT_HierarchyEditor::fn_vMoveCameraToInstanceCenterOnInstance
|
|
// Date : 18-06-1998
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// It moves the editor camera to have the same position as a reference instance and
|
|
// centered to another instance. Set the camera translation and rotation according to reference instance
|
|
// Parameters:
|
|
// p_oReference - reference instance
|
|
// p_oCenterObject - instance where camera should to be centered
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Author : Corneliu Babiuc
|
|
// Modification:
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
void EDT_HierarchyEditor::fn_vMoveCameraToInstanceCenterOnInstance(EDT_SuperObject * p_oReference, CPA_SuperObject * p_oCenterObject)
|
|
{
|
|
POS_tdstCompletePosition *pGlobalPosition;
|
|
MTH3D_tdstVector stTranslation;
|
|
CPA_CameraCoords oPosition;
|
|
DEV_ViewPort3D *pCurViewport;
|
|
CPA_BaseObject *p_oCamera;
|
|
CPA_CameraDLLBase *p_CameraInterface;
|
|
|
|
// check if the instance is Rayman:
|
|
if ( p_oReference == p_oCenterObject )
|
|
{
|
|
m_csMessage = "Cannot move and center camera to Rayman's position";
|
|
fn_vDisplayCancelMessage(m_eModifCanceled);
|
|
return;
|
|
}
|
|
ASSERT(p_oReference);
|
|
ASSERT(p_oCenterObject);
|
|
// get the reference object translation vector
|
|
pGlobalPosition = HIE_fn_hGetSuperObjectGlobalMatrix(p_oReference->GetStruct());
|
|
POS_fn_vGetTranslationVector(pGlobalPosition, &stTranslation);
|
|
oPosition.SetCoords(&stTranslation);
|
|
oPosition.SetAxisSystem(WorldCoordinates);
|
|
// set position
|
|
pCurViewport = (DEV_ViewPort3D *)GetInterface()->GetMultiDevice3D()->GetFocusDevice()->GetViewPort();
|
|
p_oCamera = pCurViewport->GetCamera();
|
|
p_CameraInterface = pCurViewport->GetCameraInterface();
|
|
p_CameraInterface->SetPosition(p_oCamera, &oPosition);
|
|
// center on instance
|
|
p_CameraInterface->SetTargetSuperObject(p_oCamera, p_oCenterObject);
|
|
p_CameraInterface->SetTargetType(p_oCamera, tSuperObject);
|
|
p_CameraInterface->Update(p_oCamera);
|
|
p_CameraInterface->SetTargetType(p_oCamera, tNone);
|
|
GetInterface()->fn_vUpdateAll(E_mc_JustDraw);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : EDT_HierarchyEditor::fn_vTranslateObjects
|
|
// Date : 15-06-1998
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// It translates all selected objects with a specified translation vector
|
|
// Parameters:
|
|
// pTranslation - translation vector
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Author : Corneliu Babiuc
|
|
// Modification:
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void EDT_HierarchyEditor::fn_vTranslateObjects(MTH3D_tdstVector * pTranslation)
|
|
{
|
|
EDT_SuperObject * pSupObj;
|
|
POSITION pos;
|
|
EDT_ModifMove *pObjectsMove;
|
|
|
|
// create modif
|
|
pObjectsMove = new EDT_ModifMove(this, M_GetWorld()->GetListOfListByDLL(), GetInterface()->GetSelectMode());
|
|
|
|
// apply translation vector
|
|
for (pSupObj = (EDT_SuperObject *) M_GetWorld()->GetListSelected()->GetHeadElement(pos); pSupObj;
|
|
pSupObj = (EDT_SuperObject *) M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
{
|
|
pSupObj->fn_vTranslate(pTranslation, TRUE);
|
|
}
|
|
// ask for move
|
|
fn_bDoOrCancelMove(pObjectsMove);
|
|
}
|
|
//END CPA2 Corneliu Babiuc (specific teleportation) 19-06-98
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method :fn_vMoveToNewPosition (MTH3D_tdstVector* p_stPosition)
|
|
// Date : 98-01-28
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description : this function is called in the PutOnGround function in order to implement Undo/Redo
|
|
// functionality
|
|
// Author : Gabi Dumitrascu - CPA2
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification :
|
|
// Date :
|
|
// By :
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void EDT_HierarchyEditor::fn_vMoveToNewPosition (MTH3D_tdstVector* p_stPosition)
|
|
{
|
|
EDT_SuperObject *pParent, *pObjectToMove;
|
|
MTH3D_tdstVector stTranslation;
|
|
POS_tdstCompletePosition *pParentMatrix, *pObjectMatrix, *pGlobalMatrix;
|
|
POS_tdstCompletePosition stMatrix;
|
|
EDT_ModifMove *pMouseMove;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
if (!fn_bCanTranslateAllObjects())
|
|
{
|
|
fn_vDisplayCancelMessage(E_cm_CancelMove);
|
|
return;
|
|
}
|
|
|
|
// init mousemove
|
|
pMouseMove = new EDT_ModifMove(this, M_GetWorld()->GetListOfListByDLL(), GetInterface()->GetSelectMode());
|
|
|
|
// init parameters
|
|
pObjectToMove = (EDT_SuperObject *) M_GetWorld()->GetSingleSelection();
|
|
pParent = (EDT_SuperObject *) pObjectToMove->GetSuperObjectFather();
|
|
// get position
|
|
pParentMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pParent->GetStruct());
|
|
pObjectMatrix = HIE_fn_hGetSuperObjectMatrix(pObjectToMove->GetStruct());
|
|
pGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pObjectToMove->GetStruct());
|
|
// correct position according to pParent's matrix
|
|
POS_fn_vInvertMatrix(&stMatrix, pParentMatrix);
|
|
POS_fn_vMulMatrixVertex(&stTranslation, &stMatrix, p_stPosition);
|
|
POS_fn_vSetTranslationVector(pObjectMatrix,&stTranslation);
|
|
POS_fn_vSetTranslationVector(pGlobalMatrix,p_stPosition);
|
|
// update global matrices
|
|
GetInterface()->fn_vUpdatePositions();
|
|
// ask for move
|
|
fn_bDoOrCancelMove(pMouseMove);
|
|
}
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: get position from picking
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vApplyGravityToInstance (EDT_SuperObject *pSupObj, MTH3D_tdstVector *p_stMove, MTH3D_tdstVector *p_stVertical)
|
|
{
|
|
HIE_aDEF_stTabOfPickInfo a_stPickInfo;
|
|
POS_tdxHandleToPosition hMatrix, hLocal, hParent;
|
|
MTH3D_tdstVector stRealPosition, stTempPosition;
|
|
MTH3D_tdstVector stRealLocal, stTempLocal;
|
|
MTH3D_tdstVector stPosition, stDest;
|
|
MTH3D_tdstVector stNormal, stVector;
|
|
MTH3D_tdstVector stLocalVector, stLocalMove;
|
|
ACP_tdxIndex xNbPicked;
|
|
|
|
// register superobject position
|
|
hMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pSupObj->GetStruct());
|
|
POS_fn_vGetTranslationVector(hMatrix, &stRealPosition);
|
|
hLocal = HIE_fn_hGetSuperObjectMatrix(pSupObj->GetStruct());
|
|
POS_fn_vGetTranslationVector(hLocal, &stRealLocal);
|
|
// get new position
|
|
MTH3D_M_vAddVector(&stPosition, &stRealPosition, p_stMove);
|
|
MTH3D_M_vAddVector(&stDest, &stPosition, p_stVertical);
|
|
// set it at temporary position to avoid picking
|
|
MTH3D_M_vMulScalarVector(&stNormal, (float) -1.2, p_stVertical);
|
|
fn_vGetPositionFromBoundingVolume(pSupObj, &stNormal, &stVector);
|
|
MTH3D_M_vAddVector(&stTempPosition, &stPosition, &stVector);
|
|
POS_fn_vSetTranslationVector(hMatrix, &stTempPosition);
|
|
// same operation for local matrix
|
|
hParent = HIE_fn_hGetSuperObjectGlobalMatrix(pSupObj->GetSuperObjectFather()->GetStruct());
|
|
POS_fn_vMulMatrixVertex(&stLocalMove, hParent, p_stMove);
|
|
POS_fn_vMulMatrixVertex(&stLocalVector, hParent, &stVector);
|
|
MTH3D_M_vAddVector(&stTempLocal, &stRealLocal, &stLocalMove);
|
|
MTH3D_M_vAddVector(&stTempLocal, &stTempLocal, &stLocalVector);
|
|
POS_fn_vSetTranslationVector(hLocal, &stTempLocal);
|
|
// get picking info
|
|
xNbPicked = HIE_bIntersectSemiAxeWithSuperObject(GLI_C_ModePickingFace, &stPosition, &stDest,
|
|
p_stVertical, M_GetEngineRoot(), a_stPickInfo);
|
|
if (xNbPicked > 0)
|
|
{
|
|
// get real final position
|
|
fn_vGetNormalFromPicking(a_stPickInfo, &stNormal);
|
|
fn_vGetPositionFromBoundingVolume(pSupObj, &stNormal, &stVector);
|
|
stDest = a_stPickInfo[0].stPickedObject.aDEF_stDataOfElement[0].stHit;
|
|
MTH3D_M_vAddVector(&stDest, &stDest, &stVector);
|
|
// update move
|
|
MTH3D_M_vSubVector(&stDest, &stDest, &stPosition);
|
|
MTH3D_M_vAddVector(p_stMove, p_stMove, &stDest);
|
|
}
|
|
// set at real position
|
|
POS_fn_vSetTranslationVector(hMatrix, &stRealPosition);
|
|
POS_fn_vSetTranslationVector(hLocal, &stRealLocal);
|
|
}
|
|
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: test if parent can be changed
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanChangeSelectedObjects (void)
|
|
{
|
|
CPA_SuperObject *pElem;
|
|
POSITION pos;
|
|
|
|
// check all the elements in the list
|
|
for (pElem = M_GetWorld()->GetListSelected()->GetHeadElement(pos); pElem;
|
|
pElem = M_GetWorld()->GetListSelected()->GetNextElement(pos))
|
|
{
|
|
if (!GetInterface()->fn_bCanModifyObject(pElem))
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
//#################################################################################
|
|
// MOVES
|
|
//#################################################################################
|
|
/*===========================================================================
|
|
* Description: rotate matrix
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vRotateX (POS_tdstCompletePosition *p_stMatrix, GLI_tdxValue xXAngle)
|
|
{
|
|
MTH3D_tdstVector stVectI,stVectJ,stVectK;
|
|
|
|
POS_fn_vGetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
|
|
MTH3D_M_vSetYofVector(&stVectJ,GLI_M_Cos(xXAngle)) ;
|
|
MTH3D_M_vSetZofVector(&stVectJ,GLI_M_Sin(xXAngle)) ;
|
|
MTH3D_M_vSetYofVector(&stVectK,GLI_M_Neg(GLI_M_Sin(xXAngle))) ;
|
|
MTH3D_M_vSetZofVector(&stVectK,GLI_M_Cos(xXAngle)) ;
|
|
|
|
POS_fn_vSetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
}
|
|
|
|
//===========================================================================
|
|
//===========================================================================
|
|
|
|
void EDT_HierarchyEditor::fn_vRotateY (POS_tdstCompletePosition *p_stMatrix, GLI_tdxValue xYAngle)
|
|
{
|
|
MTH3D_tdstVector stVectI,stVectJ,stVectK;
|
|
|
|
POS_fn_vGetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
|
|
MTH3D_M_vSetXofVector(&stVectI,GLI_M_Cos(xYAngle)) ;
|
|
MTH3D_M_vSetZofVector(&stVectI,GLI_M_Sin(xYAngle)) ;
|
|
MTH3D_M_vSetXofVector(&stVectK,GLI_M_Neg(GLI_M_Sin(xYAngle))) ;
|
|
MTH3D_M_vSetZofVector(&stVectK,GLI_M_Cos(xYAngle)) ;
|
|
|
|
POS_fn_vSetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
}
|
|
|
|
//===========================================================================
|
|
//===========================================================================
|
|
|
|
void EDT_HierarchyEditor::fn_vRotateZ (POS_tdstCompletePosition *p_stMatrix, GLI_tdxValue xZAngle)
|
|
{
|
|
MTH3D_tdstVector stVectI,stVectJ,stVectK;
|
|
|
|
POS_fn_vGetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
|
|
MTH3D_M_vSetXofVector(&stVectI,GLI_M_Cos(xZAngle));
|
|
MTH3D_M_vSetYofVector(&stVectI,GLI_M_Sin(xZAngle));
|
|
MTH3D_M_vSetXofVector(&stVectJ,GLI_M_Neg(GLI_M_Sin(xZAngle)));
|
|
MTH3D_M_vSetYofVector(&stVectJ,GLI_M_Cos(xZAngle));
|
|
|
|
POS_fn_vSetRotationMatrix(p_stMatrix,&stVectI,&stVectJ,&stVectK);
|
|
}
|
|
|
|
|
|
|
|
//#################################################################################
|
|
// ORIENT
|
|
//#################################################################################
|
|
/*===========================================================================
|
|
* Description: check if object can be oriented
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
BOOL EDT_HierarchyEditor::fn_bCanOrientSelection (void)
|
|
{
|
|
EDT_SuperObject *pEdObj;
|
|
EDT_ListByDLL *pListSelect;
|
|
POSITION pos;
|
|
|
|
// only one instance
|
|
if (M_GetWorld()->GetCountSelected() != 1)
|
|
return FALSE;
|
|
|
|
// ask dll
|
|
pEdObj = (EDT_SuperObject *) M_GetWorld()->GetSingleSelection();
|
|
if (pEdObj->GetObjectDLL() && !pEdObj->GetObjectDLL()->fn_bAcceptOrientInstance(pEdObj))
|
|
{
|
|
m_csMessage = "This object cannot be oriented";
|
|
return FALSE;
|
|
}
|
|
|
|
// check current editor for permission
|
|
if (!fn_bIsCurrentEditor())
|
|
{
|
|
pListSelect = M_GetWorld()->GetListAllDLLs();
|
|
if (pListSelect->m_stListSelected.GetCount())
|
|
{
|
|
if (!M_GetCurrentEditor()->fn_bAcceptModifRotate(&pListSelect->m_stListSelected, C_AsCurrentEditor))
|
|
{
|
|
m_csMessage = "Current Editor does not allow you to rotate these objects";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListSelected.GetCount())
|
|
{
|
|
// ask World permission
|
|
if (!M_GetWorld()->fn_bAcceptModifRotate(pListSelect->GetDLL()))
|
|
{
|
|
m_csMessage.Format("Objects of DLL %s cannot be rotated in this world.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifRotate(&pListSelect->m_stListSelected, C_AsConcernedDLL))
|
|
{
|
|
m_csMessage.Format("DLL %s does not allow you to rotate its objects.", pListSelect->GetDLL()->GetName());
|
|
return FALSE;
|
|
}
|
|
}
|
|
// if necessary, ask owner
|
|
if (pListSelect->m_stListProtectSelected.GetCount())
|
|
{
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifRotate(&pListSelect->m_stListProtectSelected, C_AsChildOwner))
|
|
{
|
|
m_csMessage = "Some protected objets cannot be rotated";
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// objects can be moved
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: orient object to picking position
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vOrientToPosition (EDT_SuperObject *pEdObj, MTH3D_tdstVector *pOrientPosition)
|
|
{
|
|
GEO_tdxHandleToMatrix hGlobalMatrix;
|
|
GEO_tdxHandleToMatrix hInstanceMatrix;
|
|
GEO_tdxHandleToMatrix hParentMatrix;
|
|
MTH3D_tdstVector stGlobalPosition;
|
|
MTH3D_tdstVector stVectI, stVectJ, stVectK;
|
|
CPA_SuperObject *pParent;
|
|
MTH_tdxReal xX, xY,xZ;
|
|
|
|
|
|
// get parameters
|
|
pParent = pEdObj->GetSuperObjectFather();
|
|
hInstanceMatrix = HIE_fn_hGetSuperObjectMatrix(pEdObj->GetStruct());
|
|
hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (pEdObj->GetStruct());
|
|
POS_fn_vGetTranslationVector (hGlobalMatrix, &stGlobalPosition);
|
|
// get X vector
|
|
MTH3D_M_vSubVector(&stVectI, pOrientPosition, &stGlobalPosition);
|
|
MTH3D_M_vNormalizeVector(&stVectI, &stVectI);
|
|
// get Y vector
|
|
xX = MTH3D_M_xGetXofVector(&stVectI);
|
|
xY = MTH3D_M_xGetYofVector(&stVectI);
|
|
xZ = MTH3D_M_xGetZofVector(&stVectI);
|
|
if ((xX != 0)||(xY != 0))
|
|
{
|
|
MTH3D_M_vSetVectorElements(&stVectJ, -xY, xX, 0.0);
|
|
}
|
|
else
|
|
{
|
|
MTH3D_M_vSetVectorElements(&stVectJ, 0.0, -xZ, xY);
|
|
}
|
|
MTH3D_M_vNormalizeVector(&stVectJ, &stVectJ);
|
|
// get Z vector
|
|
MTH3D_M_vCrossProductVector(&stVectK, &stVectI, &stVectJ);
|
|
|
|
// calculate the new rotation matrix
|
|
POS_fn_vSetRotationMatrix(hGlobalMatrix, &stVectJ, &stVectI, &stVectK);
|
|
// set local matrix orientation
|
|
hParentMatrix = GEO_fn_hCreateMatrix();
|
|
POS_fn_vInvertMatrix(hParentMatrix, HIE_fn_hGetSuperObjectGlobalMatrix(pParent->GetStruct()));
|
|
POS_fn_vMulMatrixMatrix(hInstanceMatrix, hParentMatrix, hGlobalMatrix);
|
|
POS_fn_vNormalizeMatrix(hInstanceMatrix);
|
|
// update drawing
|
|
GetInterface()->fn_vUpdatePositions();
|
|
GetInterface()->fn_vUpdateAll(E_mc_JustDraw);
|
|
}
|
|
|
|
|
|
|
|
/*===========================================================================
|
|
* Description: orient object to picking position, keeping axis orientation
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vOrientWithSelectedAxis (EDT_SuperObject *pEdObj, MTH3D_tdstVector *pOrientPosition, MTH3D_tdstVector *pAxis)
|
|
{
|
|
GEO_tdxHandleToMatrix hGlobalMatrix;
|
|
MTH3D_tdstVector stGlobalPosition, stVector, stFullAxis;
|
|
MTH_tdxReal xCoeff;
|
|
|
|
// get superobject position
|
|
hGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix(pEdObj->GetStruct());
|
|
POS_fn_vGetTranslationVector(hGlobalMatrix, &stGlobalPosition);
|
|
// changement de l'orientation
|
|
MTH3D_M_vSubVector(&stVector, pOrientPosition, &stGlobalPosition);
|
|
xCoeff = MTH3D_M_xDotProductVector(&stVector, pAxis);
|
|
MTH3D_M_vMulScalarVector(&stFullAxis, xCoeff, pAxis);
|
|
MTH3D_M_vSubVector(&stVector, &stVector, &stFullAxis);
|
|
MTH3D_M_vAddVector(pOrientPosition, &stGlobalPosition, &stVector);
|
|
|
|
// orient instance
|
|
fn_vOrientToPosition(pEdObj, pOrientPosition);
|
|
}
|
|
|
|
void EDT_HierarchyEditor::fn_vOrientWithVertical (EDT_SuperObject *pEdObj, MTH3D_tdstVector *pOrientPosition)
|
|
{
|
|
MTH3D_tdstVector stAxis;
|
|
|
|
MTH3D_M_vSetVectorElements(&stAxis, 0.f, 0.f, 1.f);
|
|
fn_vOrientWithSelectedAxis(pEdObj, pOrientPosition, &stAxis);
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: dialog to update super-object flags
|
|
* Creation date:
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vDoDialogFlags (EDT_SuperObject *pSuperObject)
|
|
{
|
|
HINSTANCE hOldInst = AfxGetResourceHandle();
|
|
|
|
AfxSetResourceHandle (GetDLLIdentity()->hModule);
|
|
|
|
m_pDialogFlag->fn_vDoDialog(this, pSuperObject);
|
|
|
|
AfxSetResourceHandle(hOldInst);
|
|
}
|
|
|
|
/*===========================================================================
|
|
* Description: put on ground effect
|
|
* Creation date: 19/03/98
|
|
* Author: Shaitan
|
|
*---------------------------------------------------------------------------
|
|
* Revision date: Author:
|
|
*=========================================================================*/
|
|
void EDT_HierarchyEditor::fn_vPutOnGround (void)
|
|
{
|
|
HIE_aDEF_stTabOfPickInfo a_stPickInfo;
|
|
MTH3D_tdstVector stInitialPosition;
|
|
MTH3D_tdstVector stFinalPosition;
|
|
MTH3D_tdstVector stVertical;
|
|
CPA_SuperObject *pSelected;
|
|
CPA_SuperObject *pGround = NULL;
|
|
ACP_tdxIndex xNbPicked, xIndex;
|
|
BOOL bFirstPicking;
|
|
|
|
|
|
// get object to move
|
|
pSelected = M_GetWorld()->GetSingleSelection();
|
|
if (!pSelected)
|
|
return;
|
|
|
|
// init vertical & picking parameters
|
|
MTH3D_M_vSetVectorElements(&stVertical, 0.0, 0.0, -20.0);
|
|
xNbPicked = HIE_C_DepthPickingObjects;
|
|
bFirstPicking = TRUE;
|
|
|
|
// if there are too many object between instance and ground, we may need several picking
|
|
while (!pGround && (xNbPicked >= HIE_C_DepthPickingObjects))
|
|
{
|
|
// get initial position
|
|
if (bFirstPicking)
|
|
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectMatrix(pSelected->GetStruct()), &stInitialPosition);
|
|
else
|
|
stInitialPosition = a_stPickInfo[xNbPicked-1].stPickedObject.aDEF_stDataOfElement[0].stHit;
|
|
// reinit parameters
|
|
MTH3D_M_vAddVector(&stFinalPosition, &stInitialPosition, &stVertical);
|
|
xIndex = 0;
|
|
// perform another picking
|
|
xNbPicked = HIE_bIntersectSemiAxeWithSuperObject(GLI_C_ModePickingFace, &stInitialPosition, &stFinalPosition,
|
|
&stVertical, M_GetEngineRoot(), a_stPickInfo);
|
|
while ((xIndex < xNbPicked) && (pGround == NULL))
|
|
{
|
|
// check type (want only IPO)
|
|
if (HIE_fn_ulGetSuperObjectType(a_stPickInfo[xIndex].hSprObject) & (HIE_C_ulIPO | HIE_C_ulIPO_Mirror))
|
|
pGround = GetInterface()->GetEditorObject(a_stPickInfo[xIndex].hSprObject);
|
|
else
|
|
xIndex++;
|
|
}
|
|
bFirstPicking = FALSE;
|
|
}
|
|
|
|
// if no ground was found, cannot put on ground !
|
|
if (!pGround)
|
|
{
|
|
M_GetMainWnd()->UpdateStatus("There is no ground under this instance", C_STATUSPANE_INFOS, C_STATUS_ERROR);
|
|
return;
|
|
}
|
|
|
|
// move object to its new position
|
|
stFinalPosition = a_stPickInfo[xIndex].stPickedObject.aDEF_stDataOfElement[0].stHit;
|
|
fn_vMoveToNewPosition(&stFinalPosition);
|
|
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateAll);
|
|
}
|
|
|
|
//CPA2 Corneliu Babiuc (TMS_0598) 26-05-98
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : EDT_HierarchyEditor::fn_vMoveObjectFromMultipleSelection
|
|
// Date : 26-05-1998
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// Used by teleport function, to position an object in case of multiple selection in order to
|
|
// avoid objects collision. It is done calculating the bounding parallel box of already
|
|
// teleported objects and then move the current object to avoid collision
|
|
// Parameters:
|
|
// pSuperObject - object which has to be repositioned
|
|
// p_oList - list of already moved objects (unused now, maybe in future, who knows?)
|
|
// lIndex - the number of current object in the p_oList
|
|
// pSelectedPoint - teleportation point
|
|
// pNormal - normal from picking
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Author : Corneliu Babiuc
|
|
// Modification:
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void EDT_HierarchyEditor::fn_vMoveObjectFromMultipleSelection (
|
|
EDT_SuperObject * pSuperObject,
|
|
CPA_List<EDT_SuperObject> * p_oList,
|
|
long lIndex,
|
|
MTH3D_tdstVector * pSelectedPoint,
|
|
MTH3D_tdstVector * pNormal)
|
|
{
|
|
POS_tdstCompletePosition stMatrix;
|
|
MTH3D_tdstVector stTranslation, stTemp;
|
|
GLI_tdxValue xNormFactor;
|
|
MTH3D_tdstVector stMinPoint, stMaxPoint;
|
|
MTH3D_tdstVector stGlobalCenter, stCenter;
|
|
// these two vectors contain the minimal and maximal vertices of
|
|
// the parallel box that covers all the others parallel boxes
|
|
static MTH3D_tdstVector stGlobalMinPoint, stGlobalMaxPoint;
|
|
|
|
//we consider the object size being the parallel box having min and max
|
|
//point of object as vertices
|
|
|
|
// if the object is not the first in the list we'll just translate it tanget
|
|
// to the plan perpendicular to the normal
|
|
if ( lIndex > 1 )
|
|
{
|
|
// compute min & max in global coordinates
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
stMinPoint.xX = stMinPoint.xY = stMinPoint.xZ = MTH_C_InfinitPlus;
|
|
stMaxPoint.xX = stMaxPoint.xY = stMaxPoint.xZ = MTH_C_InfinitMinus;
|
|
fn_vGetMinMaxPointsOfInstance(pSuperObject, &stMatrix, &stMinPoint, &stMaxPoint, TRUE);
|
|
//get the centers of the global and current box
|
|
MTH3D_M_vAddVector(&stCenter, &stMinPoint, &stMaxPoint);
|
|
MTH3D_M_vMulScalarVector(&stCenter, (GLI_tdxValue)0.5, &stCenter);
|
|
MTH3D_M_vAddVector(&stGlobalCenter, &stGlobalMinPoint, &stGlobalMaxPoint);
|
|
MTH3D_M_vMulScalarVector(&stGlobalCenter, (GLI_tdxValue)0.5, &stGlobalCenter);
|
|
|
|
MTH3D_M_vSubVector(&stTranslation, &stGlobalCenter, pSelectedPoint);
|
|
// we'll project this vector on the plane perpendicular to the normal
|
|
MTH3D_M_vMulScalarVector(&stTemp, MTH3D_M_xDotProductVector( pNormal, &stTranslation), pNormal);
|
|
MTH3D_M_vSubVector(&stTranslation, &stTemp, &stTranslation);
|
|
// now we have to move the object, on the stTranslation direction
|
|
// as it doesn't intersect the global parallel box
|
|
|
|
//compute the vector between two centers
|
|
MTH3D_M_vSubVector(&stTemp, &stCenter, &stGlobalCenter);
|
|
// we'll choose the minimal deplacement
|
|
if (GLI_M_Abs(stTranslation.xX) >= GLI_M_Abs(stTranslation.xY) &&
|
|
GLI_M_Abs(stTranslation.xX) >= GLI_M_Abs(stTranslation.xZ) )
|
|
{
|
|
xNormFactor = (GLI_M_Sgn(stTranslation.xX)*((stGlobalMaxPoint.xX - stGlobalMinPoint.xX) +
|
|
(stMaxPoint.xX - stMinPoint.xX))/2 - stTemp.xX)/stTranslation.xX;
|
|
}
|
|
else
|
|
{
|
|
if (GLI_M_Abs(stTranslation.xY) > GLI_M_Abs(stTranslation.xX) &&
|
|
GLI_M_Abs(stTranslation.xY) >= GLI_M_Abs(stTranslation.xZ) )
|
|
{
|
|
xNormFactor = (GLI_M_Sgn(stTranslation.xY)*((stGlobalMaxPoint.xY - stGlobalMinPoint.xY) +
|
|
(stMaxPoint.xY - stMinPoint.xY))/2 - stTemp.xY)/stTranslation.xY;
|
|
}
|
|
else
|
|
{
|
|
xNormFactor = (GLI_M_Sgn(stTranslation.xZ)*((stGlobalMaxPoint.xZ - stGlobalMinPoint.xZ) +
|
|
(stMaxPoint.xZ - stMinPoint.xZ))/2 - stTemp.xZ)/stTranslation.xZ;
|
|
}
|
|
}
|
|
// we assure the distance between the two boxes to avoid collision
|
|
MTH3D_M_vMulScalarVector(&stTranslation, xNormFactor, &stTranslation);
|
|
// update global matrices
|
|
GetInterface()->fn_vUpdatePositions();
|
|
}
|
|
// recompute min & max in global coordinates
|
|
POS_fn_vSetIdentityMatrix(&stMatrix);
|
|
stMinPoint.xX = stMinPoint.xY = stMinPoint.xZ = MTH_C_InfinitPlus;
|
|
stMaxPoint.xX = stMaxPoint.xY = stMaxPoint.xZ = MTH_C_InfinitMinus;
|
|
fn_vGetMinMaxPointsOfInstance(pSuperObject, &stMatrix, &stMinPoint, &stMaxPoint, TRUE);
|
|
|
|
if ( lIndex == 1 )
|
|
{
|
|
//just initialize the points
|
|
MTH3D_M_vCopyVector(&stGlobalMinPoint, &stMinPoint);
|
|
MTH3D_M_vCopyVector(&stGlobalMaxPoint, &stMaxPoint);
|
|
}
|
|
else
|
|
{
|
|
stGlobalMinPoint.xX = (stGlobalMinPoint.xX < stMinPoint.xX) ? stGlobalMinPoint.xX : stMinPoint.xX;
|
|
stGlobalMinPoint.xY = (stGlobalMinPoint.xY < stMinPoint.xY) ? stGlobalMinPoint.xY : stMinPoint.xY;
|
|
stGlobalMinPoint.xZ = (stGlobalMinPoint.xZ < stMinPoint.xZ) ? stGlobalMinPoint.xZ : stMinPoint.xZ;
|
|
stGlobalMaxPoint.xX = (stGlobalMaxPoint.xX > stMaxPoint.xX) ? stGlobalMaxPoint.xX : stMaxPoint.xX;
|
|
stGlobalMaxPoint.xY = (stGlobalMaxPoint.xY > stMaxPoint.xY) ? stGlobalMaxPoint.xY : stMaxPoint.xY;
|
|
stGlobalMaxPoint.xZ = (stGlobalMaxPoint.xZ > stMaxPoint.xZ) ? stGlobalMaxPoint.xZ : stMaxPoint.xZ;
|
|
}
|
|
|
|
}
|
|
//END CPA2 Corneliu Babiuc (TMS_0598) 13-05-98
|
|
|
|
//CPA2 Corneliu Babiuc (teleportation bug) 24-06-98
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : EDT_HierarchyEditor::fn_vAddObjectRecursiveToList
|
|
// Date : 26-05-1998
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// It appends an object and all its children to a list
|
|
// Parameters:
|
|
// pSuperObject - object has to be appended
|
|
// p_lstListByDLL - list
|
|
// bSelected - add or not the object to selected list
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Author : Corneliu Babiuc
|
|
// Modification:
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void EDT_HierarchyEditor::fn_vAddObjectRecursiveToList(CPA_SuperObject * pSuperObject, CPA_List<EDT_ListByDLL> * p_lstListByDLL, BOOL bSelected)
|
|
{
|
|
EDT_ListByDLL *pObjectList = NULL, *pListDLL;
|
|
POSITION pos;
|
|
|
|
ASSERT(pSuperObject);
|
|
//find the corresponding DLL for the object
|
|
for (pListDLL = p_lstListByDLL->GetHeadElement(pos); pListDLL;
|
|
pListDLL = p_lstListByDLL->GetNextElement(pos))
|
|
{
|
|
if (pSuperObject->GetObjectDLL() == pListDLL->GetDLL())
|
|
{
|
|
pObjectList = pListDLL;
|
|
break;
|
|
}
|
|
}
|
|
// if the object DLL list wasn't found then add a new element
|
|
if (!pObjectList)
|
|
{
|
|
// create the corresponding ListByType
|
|
p_lstListByDLL->AddTail(new EDT_ListByDLL(pSuperObject->GetObjectDLL()));
|
|
pObjectList = p_lstListByDLL->GetTail();
|
|
}
|
|
// add the object
|
|
pObjectList->fn_vUpdateListSelect(pSuperObject, E_lum_Insert, bSelected);
|
|
// next level of the hierarchy
|
|
CPA_SuperObject * pChild = pSuperObject->GetSuperObjectFirstChild();
|
|
while (pChild)
|
|
{
|
|
fn_vAddObjectRecursiveToList(pChild, p_lstListByDLL, FALSE);
|
|
pChild = pSuperObject->GetSuperObjectNextChild(pChild);
|
|
}
|
|
}
|
|
//END CPA2 Corneliu Babiuc (teleportation bug) 24-06-98
|
|
|
|
|
|
// Begin Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
BOOL EDT_HierarchyEditor::fn_bObjectIsSpecial()
|
|
{
|
|
// this code assumes that object is selected
|
|
EDT_ListByDLL *pListSelect;
|
|
POSITION pos;
|
|
|
|
for (pListSelect = M_GetWorld()->GetListOfListByDLL()->GetHeadElement(pos); pListSelect;
|
|
pListSelect = M_GetWorld()->GetListOfListByDLL()->GetNextElement(pos))
|
|
{
|
|
// if there are selected objects of this type
|
|
if (pListSelect->m_stListConcerned.GetCount())
|
|
{
|
|
// ask the DLL for permission
|
|
if (!pListSelect->GetDLL()->fn_bAcceptModifCut(&pListSelect->m_stListConcerned, C_AsConcernedDLL))
|
|
{
|
|
m_csMessage.Format("%s is a Special Object and must be reinserted in Hierarchy", m_pRegisteredCuttedObject->GetName());
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// object is not special
|
|
return FALSE;
|
|
}
|
|
// End Silviu Simen 18 August 1998 Cut/Paste Mechanism
|
|
|
|
// Begin Silviu Simen september 1998 Select By Sector and Type
|
|
void EDT_HierarchyEditor::fn_vSelectBySectorAndType(void)
|
|
{
|
|
HINSTANCE hOldInst = AfxGetResourceHandle();
|
|
AfxSetResourceHandle (GetDLLIdentity()->hModule);
|
|
|
|
EDT_DialogSelectType oDialogBox(GetInterface());
|
|
|
|
// do not allow selection outside Hierarchy Editor
|
|
/*
|
|
if (GetInterface()->GetEvtEditor() != M_GetCurrentEditor())
|
|
{
|
|
M_GetMainWnd()->UpdateStatus("Not in Hierarchy Editor", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
|
return ;
|
|
}
|
|
*/
|
|
|
|
oDialogBox.DoModal();
|
|
if (oDialogBox.m_bWasOK)
|
|
{
|
|
fn_vDoSelectBySectorAndType(oDialogBox.m_csSelSector, oDialogBox.m_ulSelType);
|
|
}
|
|
|
|
AfxSetResourceHandle (hOldInst);
|
|
}
|
|
|
|
void EDT_HierarchyEditor::fn_vDoSelectBySectorAndType (CString csSector, unsigned long ulType)
|
|
{
|
|
Position pos;
|
|
CPA_BaseObjectList *pList;
|
|
CPA_BaseObject *pBaseObj;
|
|
CPA_SuperObject *pSObj;
|
|
unsigned long ulObjType ;
|
|
char szMessage[100];
|
|
int iNumberSelected;
|
|
|
|
iNumberSelected = 0;
|
|
M_GetWorld()->GetListSelected()->RemoveAll();
|
|
pList = M_GetMainWorld()->m_stListObjectsInSectors.GetListOfSectorByName(csSector);
|
|
|
|
|
|
// set multi select mode
|
|
m_bMultiSelectMode = TRUE;
|
|
for (pBaseObj = pList->GetHeadElement(pos); pBaseObj;
|
|
pBaseObj = pList->GetNextElement(pos))
|
|
{
|
|
// check type
|
|
pSObj = (CPA_SuperObject *) pBaseObj;
|
|
ulObjType = HIE_fn_ulGetSuperObjectType(pSObj->GetStruct());
|
|
|
|
if ((pSObj->GetType() == C_szSuperObjectTypeName) && (ulObjType == ulType))
|
|
{
|
|
// if possible, select it
|
|
if (GetInterface()->fn_bCanSelect(pSObj) == C_Accept)
|
|
{
|
|
GetInterface()->fn_vAddSelectedObject(pSObj, FALSE);
|
|
++ iNumberSelected;
|
|
}
|
|
}
|
|
}
|
|
// unset multi select mode
|
|
m_bMultiSelectMode = FALSE;
|
|
|
|
// update status bar
|
|
M_GetViewPort3d()->fn_vUpdateStatusBarMessage();
|
|
sprintf(szMessage,"Selected %d objects",iNumberSelected);
|
|
if (iNumberSelected)
|
|
M_GetMainWnd()->UpdateStatus(szMessage, C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
|
else
|
|
M_GetMainWnd()->UpdateStatus("No object selected", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
|
|
|
// make the update of the selection
|
|
GetInterface()->fn_vUpdateAll(E_mc_UpdateSelection);
|
|
|
|
M_GetViewPort3d()->SetFocus();
|
|
}
|
|
// End Silviu Simen september 1998 Select By Sector and Type
|
|
|
|
#endif // ACTIVE_EDITOR
|