reman3/Rayman_X/cpa/tempgrp/OZO/Src/_zInterf.cpp

2894 lines
129 KiB
C++

//*****************************************************************************
//* _zInterf.cpp *
//*****************************************************************************
//* *
//* This file contains all the functions of the ZDx_Interface class *
//* which is the base class of the dll interface *
//* *
//*****************************************************************************
//* Author : Alexis Vaisse *
//*****************************************************************************
// "standard" include
#include "stdafx.h"
#include "ACP_Base.h"
#include "TFA.h" // Family dll include
#define HieFriend
#include "IncGAM.h"
#include "DPT.h"
#include "..\Main\Inc\_EditID.h"
// personal include
//ROMTEAM WorldEditor (Cristi Petrescu 12/12/97)
#include "ozo.h"
//#include "Ozo\_zQuery.hpp"
//ENDROMTEAM WorldEditor (Cristi Petrescu)
#include "_zInterf.hpp"
#include "_zObject.hpp"
#include "_zModif.hpp"
#include "_zWEdit.hpp"
#include "_zWList1.hpp"
#include "_zWList2.hpp"
#include "OGD.h" // 3dGeom dll include
#include "OAC.h" // Actors dll include
#include "OPD.h" // Physical Object dll include
#include "TUT.h" // Tutorial dll include
//CPA2 Stegaru Cristian 98-06
#include "..\inc\checkzones.h"
//End CPA2 Stegaru Cristian 98-06
class EdActors_EditorActorInstance;
class EdActors_EditorActorModel;
class CPA_Family;
// infos
static CString g_csOZOName = "Zone";
static CString g_csOZOAuthor = "Alexis Vaisse";
static CString g_csOZOVersion = "V 5.0.2 31/03/99";
static CString g_csOZOFrenchHelpFile = "Zone.hlp";
static CString g_csOZOEnglishHelpFile = "Zdd_Us.hlp";
BOOL g_bTipFirstTime = TRUE;
//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
#define ID_ZDxMenuEditor 1 // Private ID for entry in menu
#define ID_ZDxMenuPreference 2
#define ID_ZDxMenuEditGlobalZone 3
#define ID_ZDxMenuEditModuleZone 4
#define ID_ZDxMenuShowGlobalZone 5
#define ID_ZDxMenuHideGlobalZone 6
#define ID_ZDxMenuShowModuleZone 7
#define ID_ZDxMenuHideModuleZone 8
#define ID_ZDxMenuShowZoneOfOneModule 9
#define ID_ZDxMenuHideZoneOfOneModule 10
#define ID_ZDxMenuShowZoneOfAllModule 11
#define ID_ZDxMenuHideZoneOfAllModule 12
#define ID_ZDxMenuLeave 13
//Stefan Dumitrean 8-07-98 ( zone types )
#define NumberOfZDxModels 3
//End Stefan Dumitrean 8-07-98 ( zone types )
#define C_szActorZDxFileExtension ".ZDx" // Extension of the file for the ZDx of actor
#define C_szModuleZDxFileExtension ".Zoo" // Extension of the file for the ZDx of module
#define C_szBoundingVolumeFileExtension ".Bdv" // Extension of the file for the bounding volume
typedef struct stZDxModel
{
char * szZDxModelName;
char * szBitmapName;
tdeZDxGeometricType eZDxGeometricType;
} tdstZDxModel;
// List of models
const tdstZDxModel ListOfZDxModels [NumberOfZDxModels] =
{
{"Sphere" , "Objects\\Zdd\\zSphere.bmp" , eSphere } ,
{"Box" , "Objects\\Zdd\\zBox.bmp" , eBox } ,
//Stefan Dumitrean 8-07-98 ( zone types )
// {"Point" , "Objects\\Zdd\\zPoint.bmp" , ePoint } ,
//End Stefan Dumitrean 8-07-98 ( zone types )
{"Cone" , "Objects\\Zdd\\zCone.bmp" , eCone }
};
// the dll global definition
tdstDLLIdentity g_stZDxDllIdentity;
// Keyboard configuration
#define C_szZDxIniFileName "Objects\\Zdd\\Zdd.ini"
#define KA_CHANGE_ZDX_SIZE 1
//CPA2 (Corneliu Babiuc) 13-04-97
#define KA_MOVE_ONLY_ACTOR 2
//END CPA2 (Corneliu Babiuc) 13-04-97
static tdstKeyboardActionDef gs_a_stZDxKeys [] =
{
{"ChangeZoneSize" , KA_CHANGE_ZDX_SIZE},
//CPA2 (Corneliu Babiuc) 13-04-97
{"MoveOnlyActor" , KA_MOVE_ONLY_ACTOR},
//END CPA2 (Corneliu Babiuc) 13-04-97
{NULL , 0}
};
//CPA2 Corneliu Babiuc 30-04-98
static BOOL gbMoveWasOnlyActor;
//END CPA2 Corneliu Babiuc 30-04-98
#include "_zInterf.inc" // Internal functions of the ZDx_Interface class
//-----------------------------------------------------------------------------
// Class ZDx_Interface - Constructor
// Here are all the DLL interface properties
//-----------------------------------------------------------------------------
ZDx_Interface::ZDx_Interface (void)
{
// Identity of the DLL
m_p_stDLLIdentity = & g_stZDxDllIdentity;
// Can the DLL output in main game view ?
m_stBaseDLLDefinition.bCanOutputIn3DView = FALSE;
// Can the DLL be refreshed by engine ?
m_stBaseDLLDefinition.bCanBeRefreshedByEngine = FALSE;
SetEditorInfo(g_csOZOName, g_csOZOAuthor, g_csOZOVersion, g_csOZOFrenchHelpFile, g_csOZOEnglishHelpFile);
// Init the variables
SetCurrent (FALSE);
m_bSizeKeyPressed = FALSE;
//CPA2 (Corneliu Babiuc) 13-04-1997
m_bMoveOnlyActorKeyPressed = FALSE;
m_bMoveOnlyActor = FALSE;
//CPA2 (Corneliu Babiuc) 13-04-1997
m_bMoveHasBegun = FALSE;
m_stSizeChangingMode . bActiveMode = FALSE;
m_bIsSelectingObject = FALSE;
m_bIsAskingToSelectObject = FALSE;
m_bIsShowingOrHidingZDx = FALSE;
m_bIsInsertingZDxObject = FALSE;
m_bIsDeletingZDxObject = FALSE;
m_bIsInsideOnModifInsertDelete = FALSE;
m_bAskToEditModuleZone = FALSE;
m_pActorSuperObjectToUnselect = NULL;
m_pModuleSuperObjectToUnselect = NULL;
m_lRefreshDisplayCallerID = 0;
//ANNECY TQ 18/06/98{
m_GlobalBoundingVolume = GEO_fn_hCreateGeometricSphere();
//ENDANNECY TQ}
m_stSizeChangingMode.pZDxModif = NULL;
}
//*****************************************************************************
// Virtual functions of the base class : general functions for editor
//*****************************************************************************
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vJustAfterRegistered
// This function is called for the first initializations
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vJustAfterRegistered (void)
{
// Register the ZDx object type
// ANNECY AV CLEAN_MEC {
CString Name [/* 6 */ 5] = { C_szZddName , C_szZdeName , C_szZdmName , C_szZdrName , C_szBoundingVolumeName /* , C_szTestPointName */ };
fn_vRegisterObjectsType (Name , /* 6 */ 5);
// END ANNECY AV }
// Init the keyboard
m_pZDxKeyActionConfiguration = new CPA_KeyActionConfiguration (C_szZDxIniFileName , gs_a_stZDxKeys);
m_pZDxKeyActionConfiguration -> mfn_vSetObjectName ("Zone Editor");
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vConstruct
// Fonction called at the end of the initialization of the program
// we create the ZDx info window (here because the main window must be initialized)
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vConstruct (void)
{
#ifndef __INACTIVE_INTERFACE__
// We want the resources to be searched into the DLL and not into the program
HINSTANCE hOldInst = AfxGetResourceHandle ();
AfxSetResourceHandle (GetDLLIdentity () -> hModule);
// Look into .INI file
CString csFileName = M_GetMainApp () -> m_csEditorDataPath + "Objects\\Zdd\\Zdd.ini";
char szFrameWidth [256];
GetPrivateProfileString ("Preference" , "Frame Width" , "228" , szFrameWidth , 256 , (char *) (LPCSTR) csFileName);
// Create a splitter frame
m_pSplitFrame = new CSplitFrame;
m_pSplitFrame -> CreateBase ("ZDx LIST FRAME" , 1 , 2 , GetMainWorld ()); // Col=1, Row=2
m_pSplitFrame -> mfn_vEnableCaption (FALSE);
m_pSplitFrame -> CreateSplitter (C_cVerticalSplitter , 4);
m_pSplitFrame -> m_iInitWidth = atoi (szFrameWidth);
// Register the frame to the tutorial
TUT_M_vGetTutDll ();
TUT_M_vRegisterControl (m_pSplitFrame -> m_hWnd , "TUT_FrameBase" , TUT_e_Window);
// Get the size of the screen
RECT FrameSize;
::GetClientRect (GetDesktopWindow () , & FrameSize);
long Width = FrameSize . bottom - 32;
// Create the four views
m_pSplitFrame -> CreateView (1 , RUNTIME_CLASS (CDisplayControlWindow) , "Display control" , 104);
m_pSplitFrame -> CreateView (3 , RUNTIME_CLASS (CZDxInfoWindow ) , "Zone edit" , 275);
m_pSplitFrame -> CreateView (0 , RUNTIME_CLASS (CList1Window ) , "General list" , (Width - 104 - 275) * 55 / 100);
m_pSplitFrame -> CreateView (2 , RUNTIME_CLASS (CList2Window ) , "Zones list" , (Width - 104 - 275) * 45 / 100);
// Get the adresses of the windows and store them
m_pDisplayControlWindow = (CDisplayControlWindow *) m_pSplitFrame -> m_fn_p_oGetPane (1);
m_pList1Window = (CList1Window *) m_pSplitFrame -> m_fn_p_oGetPane (0);
m_pList2Window = (CList2Window *) m_pSplitFrame -> m_fn_p_oGetPane (2);
m_pEditWindow = (CZDxInfoWindow *) m_pSplitFrame -> m_fn_p_oGetPane (3);
m_pDisplayControlWindow -> SetZDxInterface (this);
m_pList1Window -> SetZDxInterface (this);
m_pList2Window -> SetZDxInterface (this);
AfxSetResourceHandle (hOldInst);
#endif // __INACTIVE_INTERFACE__
// Init the ZDx objects
ZDx_Object::InitZDxObject ();
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vBeforeEditor ()
// This function is called just before entering editor mode
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vBeforeEditor ()
{
// If we are the current editor, we open the windows
if (fn_bIsCurrentEditor ())
{
CPA_SuperObject * pSelectedActorSuperObject = GetSelectedActorSuperObject ();
if (! pSelectedActorSuperObject) pSelectedActorSuperObject = m_pList2Window -> GetActorSuperObject ();
if (pSelectedActorSuperObject)
ShowZDxOfActor (pSelectedActorSuperObject , m_pList2Window -> GetZDxTypeToShow () , m_pList2Window -> GetSelectedZDx ());
g_oFrameGest . mfn_vActivateWindow (m_pSplitFrame);
g_oFrameGest . mfn_vActivateWindow (GetInterface () -> GetModelFrame ());
}
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vBeforeEngine ()
// This function is called just before leaving editor mode
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vBeforeEngine ()
{
m_pEditWindow -> Apply (); // clic on the Apply button
// If we are the current editor, we close the windows
if (fn_bIsCurrentEditor ())
{
if (m_pList1Window -> IsEditingBoundingVolume ()) m_pList1Window -> LeaveEditionOfBoundingVolume ();
// ANNECY AV CLEAN_MEC {
// else
// if (m_pList1Window -> IsEditingTestPoint ()) m_pList1Window -> LeaveEditionOfTestPoint ();
// END ANNECY AV }
CPA_SuperObject * pSelectedActorSuperObject = GetSelectedActorSuperObject ();
if (! pSelectedActorSuperObject) pSelectedActorSuperObject = m_pList2Window -> GetActorSuperObject ();
if (pSelectedActorSuperObject)
{
CPA_Actor * pSelectedActor = (CPA_Actor *) pSelectedActorSuperObject -> GetObject ();
if (pSelectedActor)
{
unsigned char ucZDxToShow;
tdeDisplayType eDisplayForAllActors = m_pDisplayControlWindow -> GetDisplayForAllActors ();
switch (eDisplayForAllActors)
{
case eNoZone :
case eOff : ucZDxToShow = C_ucHideAllZDx; break;
case eOn : ucZDxToShow = C_ucShowAllZDx; break;
case eSelected : if (pSelectedActor -> GetDisplayZone ()) ucZDxToShow = C_ucShowAllZDx;
else ucZDxToShow = C_ucHideAllZDx;
break;
}
ShowZDxOfActor (pSelectedActorSuperObject , ucZDxToShow , NULL ,
eDisplayForAllActors == eSelected ? (int) pSelectedActor -> GetDisplayZone () == 2 : FALSE);
}
}
g_oFrameGest.mfn_vDisactivateWindow (m_pSplitFrame);
}
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vOnActivateEditor
// This function is called when somebody wants to open the ZDx editor
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vOnActivateEditor (CPA_List<CPA_BaseObject> * pSelectedObjectList , BOOL bBackActivated /* = FALSE */)
{
// Get the given super object, if any
POSITION Pos;
CPA_SuperObject * pSelectedSuperObject = pSelectedObjectList
? (CPA_SuperObject*) pSelectedObjectList -> GetHeadElement (Pos)
: NULL;
// If no given super object, get the first selected super object
if (! pSelectedSuperObject) pSelectedSuperObject = GetInterface () -> GetCurrentWorld () -> GetListSelected () -> GetHeadElement (Pos);
CPA_ToolDLLBase * pT3DDll = GetMainWorld () -> GetToolDLLWithName (C_szDLLTool3DName);
if (pT3DDll)
{
// Check if the grid is displayed
long lTypeOfDisplay = pT3DDll -> OnQueryInfos (this , C_wTool3D_QI_GetState , 0);
if (lTypeOfDisplay == C_wTool3D_Mod_Object || lTypeOfDisplay == C_wTool3D_Mod_List ||
lTypeOfDisplay == C_wTool3D_Table)
{
m_bAskToEditModuleZone = TRUE;
// Get the displayed actor
CPA_World * pWorld = (CPA_World *) pT3DDll -> OnQueryInfos (this , C_wTool3D_QI_GetWorld , NULL);
CPA_SuperObject * pRoot = pWorld ? pWorld -> GetRoot () : NULL;
CPA_SuperObject * pGridSuperObject = (CPA_SuperObject *) (pRoot ? pRoot -> GetHeadElement () : NULL);
if (pGridSuperObject) pSelectedSuperObject = pGridSuperObject; // Ne marche pas ???
}
}
if (pSelectedSuperObject) fn_vOnSelect (pSelectedSuperObject , C_EDTDo , C_AsCurrentEditor);
// Add the models of ZDx into the model window and show them
AddModelOfZDx ();
GetInterface () -> GetDialogInsert () -> fn_vSetCurrentListModel (C_szZDxListName);
// If one asks to edit the zones of module, and if there is an instance to edit, we open the list of modules
if (m_bAskToEditModuleZone && m_pList1Window -> GetSelectedActor ())
m_pList1Window -> CreateListOfModule (m_pList1Window -> GetSelectedActorSuperObject ());
m_bAskToEditModuleZone = FALSE;
// show the editor window and the model window
g_oFrameGest . mfn_vActivateWindow (m_pSplitFrame);
g_oFrameGest . mfn_vActivateWindow (GetInterface () -> GetModelFrame ());
// display Tip of the Day
GetInterface()->fn_vDisplayTipOfDay("Zones", "OZO", g_bTipFirstTime);
g_bTipFirstTime = FALSE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vOnCloseEditor
// This function is called when somebody wants to close the ZDx editor
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vOnCloseEditor (void)
{
m_pEditWindow -> Apply (); // We clic on the Apply button of the window
// Remove the models of ZDx from the model window
GetInterface () -> GetDialogInsert () -> fn_vSetCurrentListModel ("All Types");
RemoveModelOfZDx ();
// If we are editing the ZDx of module, we close the T3D grid
if (m_pList1Window -> IsEditingZDxOfModule ()) m_pList1Window -> CreateListOfFamily ();
if (m_pList1Window -> IsEditingBoundingVolume ()) m_pList1Window -> LeaveEditionOfBoundingVolume ();
// ANNECY AV CLEAN_MEC {
// else
// if (m_pList1Window -> IsEditingTestPoint ()) m_pList1Window -> LeaveEditionOfTestPoint ();
// END ANNECY AV }
// We show or hide the ZDx of the selected actor
CPA_SuperObject * pSelectedActorSuperObject = GetSelectedActorSuperObject ();
if (! pSelectedActorSuperObject) pSelectedActorSuperObject = m_pList2Window -> GetActorSuperObject ();
if (pSelectedActorSuperObject)
{
CPA_Actor * pSelectedActor = (CPA_Actor *) pSelectedActorSuperObject -> GetObject ();
if (pSelectedActor)
{
unsigned char ucZDxToShow;
tdeDisplayType eDisplayForAllActors = m_pDisplayControlWindow -> GetDisplayForAllActors ();
switch (eDisplayForAllActors)
{
case eNoZone :
case eOff : ucZDxToShow = C_ucHideAllZDx; break;
case eOn : ucZDxToShow = C_ucShowAllZDx; break;
case eSelected : if (pSelectedActor -> GetDisplayZone ()) ucZDxToShow = C_ucShowAllZDx;
else ucZDxToShow = C_ucHideAllZDx;
break;
}
ShowZDxOfActor (pSelectedActorSuperObject , ucZDxToShow , NULL ,
eDisplayForAllActors == eSelected ? (int) pSelectedActor -> GetDisplayZone () == 2 : FALSE);
}
}
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vHasGainFocus
// This function is called when the dll becomes the current dll
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::fn_bHasGainedFocus (void)
{
// Refresh the list
m_pList1Window -> ReCreateCurrentList ();
return TRUE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vHasLostFocus
// This function is called when the dll is no longer the current dll
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vHasLostFocus (void)
{
// If the editor is open, we close it
if (fn_bIsCurrentEditor ()) GetMainWorld () -> fn_bCloseEditor (this);
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnQueryAction
// To communicate with the dll
//-----------------------------------------------------------------------------
long ZDx_Interface::OnQueryAction (CPA_EditorBase * pCallingDll , WPARAM wParam , LPARAM lParam)
{
switch (wParam)
{
case C_uiQueryCreateZDxObject : return (long) CreateZdxObject (lParam);
// ANNECY AV CLEAN_MEC {
case C_uiQueryCreateZDxTestPoints : //CreateZdxTestPoints ((CPA_TestPointsList *) lParam);
// END ANNECY AV }
return 0;
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
case C_uiQueryTypeOfZoneByGeometricObject:
return m_lGetTypeOfZoneByGeometricObject ((Geometry3D *) lParam);
//ENDROMTEAM WorldEditor (Cristi Petrescu)
//CPA2 Stegaru Cristian 98-04
case C_uiQueryCreateBoundingVolumeObject :
{
ZDx_Object *pObject = CreateZdxObject (lParam);
ASSERT (pObject);
Shape3D *pShape = (Shape3D *)pObject->GetZDxShape ()->GetGeometric3dObject ();
if (((Sphere3D *)pShape)->GetRadius() <= 0)
{
GLI_tdxValue fRadius = 1.0f;
((Sphere3D *)pShape)->SetRadius(&fRadius);
((Sphere3D *)pShape)->SetCenterX(0.0f);
((Sphere3D *)pShape)->SetCenterY(0.0f);
((Sphere3D *)pShape)->SetCenterZ(0.0f);
}
pShape->SetExistingSection (FALSE);
CString csElementSectionName = pShape->GetReferencedSectionName ();
int iFileDelimitInx = csElementSectionName.Find (SCR_CC_c_Cfg_NameSeparator);
ASSERT (-1 != iFileDelimitInx);
CString csElementFile = csElementSectionName.Left (iFileDelimitInx + 1);
int iSectionDelimInx = csElementSectionName.Find (SCR_CC_c_Cfg_SectionIdMark);
ASSERT (-1 != iSectionDelimInx);
CString csSectionName = csElementSectionName.Mid (iSectionDelimInx);
csSectionName += "Element00";
csElementSectionName.Empty ();
csElementSectionName = csElementFile + "ElementSpheres";
csElementSectionName += csSectionName;
pShape->mfn_vInitElement ((char*)(LPCTSTR)csElementSectionName, pShape->GetDataPath ());
pObject->fn_vNotifySave ();
return (long)pObject;
}
case C_uiQueryCheckZonesAgainstBV:
{
mfn_vCheckActorsZonesAndBV ((CPA_SuperObject *)lParam);
return 0;
}
//End CPA2 Stegaru Cristian 98-04
//CPA2 Corneliu Babiuc 24-04-1998
case C_uiQueryActorWasMoved:
//if is not the current editor does nothing
if ( !fn_bIsCurrentEditor() || !gbMoveWasOnlyActor) return 0;
// in this case LPARAM parameter is a pointer to a tdstMoveZoneMess structure
tdstMoveZoneMess * pstZoneMess = (tdstMoveZoneMess *) lParam;
// We look for all ZDx children of the actors :
// For each ZDx, we will set its translation vesctor
CPA_SuperObject * pSuperObject = pstZoneMess->pActorSuperObject->GetSuperObjectFirstChild ();
CPA_SuperObject * pNextChild;
while (pSuperObject)
{
pNextChild = pstZoneMess->pActorSuperObject->GetSuperObjectNextChild (pSuperObject);
// No object or not a ZDx -> go to the next child
CPA_BaseObject * pObject = pSuperObject -> GetObject ();
if (pObject == NULL || ! M_bIsThisObjectAZDx (pObject))
{
pSuperObject = pNextChild;
continue;
}
//set the translation vector
MoveBackZone(pSuperObject, &(pstZoneMess->stTranslation));
//refresh geometric data
ZDx_Object * pZDxObject = (ZDx_Object *) pSuperObject->GetObject();
pZDxObject -> GetZDxShape () -> RefreshData (pSuperObject);
// ANNECY AV CLEAN_MEC {
// if (pZDxObject -> GetZDxType () == eTestPoint) m_pList2Window -> GetListOfTestPoint () -> fn_vNotifySave ();
// else pZDxObject -> fn_vNotifySave ();
pZDxObject -> fn_vNotifySave ();
// END ANNECY AV }
pSuperObject = pNextChild;
}
return 0;
//END CPA2 Corneliu Babiuc 27-04-1998
}
if (wParam == C_uiQueryEditAnObject || wParam == C_uiQueryEditAnObjectList || wParam == C_uiQueryAnObjectHasBeenChanged
//CPA2 Stegaru Cristian 98-04
|| C_uiQueryEditBoundingVolume == wParam)
//End CPA2 Stegaru Cristian 98-04
{
tdstEdtListMess * pEdtListMess = (tdstEdtListMess *) lParam;
CPA_BaseObject * pActorSuperObject = pEdtListMess -> pActor;
tdeZDxType eZDxType = ConvertListTypeToZDxType (pEdtListMess -> csListType);
CPA_List<CPA_BaseObject> ListOfObject;
if (pActorSuperObject) ListOfObject . AddTail (pActorSuperObject);
switch (wParam)
{
case C_uiQueryEditAnObject : GetMainWorld () -> fn_bActivateEditor (this , & ListOfObject);
return 0;
case C_uiQueryEditAnObjectList : GetMainWorld () -> fn_bActivateEditor (this , & ListOfObject);
m_pList2Window -> SelectZDx (eZDxType , 0);
return 0;
case C_uiQueryAnObjectHasBeenChanged : AZDxHasBeenChangedInList (pEdtListMess);
return 0;
//CPA2 Stegaru Cristian 98-04
case C_uiQueryEditBoundingVolume : GetMainWorld () -> fn_bActivateEditor (this , & ListOfObject);
return 0;
//End CPA2 Stegaru Cristian 98-04
}
}
ASSERT (0); // Unknown command
return 0;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnQueryInfos
// To communicate with the dll
//-----------------------------------------------------------------------------
long ZDx_Interface::OnQueryInfos (CPA_EditorBase * pCallingDll , WPARAM wParam , LPARAM lParam)
{
if (wParam == C_uiQueryInfoT3DStateChange)
{
if (! fn_bIsCurrentEditor ()) return 0; // We used the message only if we are the current editor
if (pCallingDll == this) return 0; // If we made the change, we do nothing else
// Set the aspect of the "Show actor" button
m_pList1Window -> SetShowActorButtonState (lParam == C_wTool3D_Char || lParam == C_wTool3D_Mod_Object);
CPA_SuperObject * pActorSuperObject = m_pList2Window -> GetActorSuperObject ();
if (pActorSuperObject) HIE_fn_vSetSuperObjectDrawMask (pActorSuperObject -> GetStruct () ,
GLI_C_lAllIsEnable ^ GLI_C_lIsNotDrawCollideInformation);
switch (lParam)
{
case C_wTool3D_None :
case C_wTool3D_Char :
case C_wTool3D_Geom_Object :
case C_wTool3D_Viewer : if (m_pList1Window -> IsEditingZDxOfModule ())
{
CPA_SuperObject * pSelectedActorSuperObject = m_pList1Window -> GetSelectedActorSuperObject ();
if (pSelectedActorSuperObject)
{
CPA_BaseObject * pSelectedActor = pSelectedActorSuperObject -> GetObject ();
m_pList1Window -> CreateListOfInstance (pSelectedActor -> GetOwner () , pSelectedActor);
}
else m_pList1Window -> CreateListOfFamily ();
}
break;
case C_wTool3D_Mod_Object :
case C_wTool3D_Mod_List :
case C_wTool3D_Table : if (! m_pList1Window -> IsEditingZDxOfModule ())
{
CPA_SuperObject * pSelectedActorSuperObject = m_pList1Window -> GetSelectedActorSuperObject ();
if (pSelectedActorSuperObject)
{
// We hide the zones of the selected actor, so they will be able to be shown again later
ShowZDxOfActor (pSelectedActorSuperObject , C_ucHideAllZDx);
HideModuleZDxOfActor (pSelectedActorSuperObject);
m_pList1Window -> CreateListOfModule (pSelectedActorSuperObject , NULL , FALSE);
}
}
break;
}
}
else
if (wParam == C_uiQueryGetZDxType)
{
CPA_SuperObject * pSuperObject = (CPA_SuperObject *) lParam;
CPA_BaseObject * pObject = pSuperObject -> GetObject ();
if (pObject == NULL || ! pObject -> fn_bIsOfType (C_szGeometricObjectTypeName)) return C_lNotAZone;
CPA_SuperObject * pFatherSuperObject = pSuperObject -> GetSuperObjectFather ();
if (! pFatherSuperObject) return C_lNotAZone;
CPA_BaseObject * pFather = pFatherSuperObject -> GetObject ();
if (pObject == NULL) return C_lNotAZone;
if (pFather -> fn_bIsOfType (C_szActorInstanceTypeName))
{
CPA_Actor * pActor = (CPA_Actor *) pFather;
if (IsObjectInList (pObject , pActor , eZdd)) return C_lZddOfActor;
if (IsObjectInList (pObject , pActor , eZde)) return C_lZdeOfActor;
if (IsObjectInList (pObject , pActor , eZdm)) return C_lZdmOfActor;
if (IsObjectInList (pObject , pActor , eZdr)) return C_lZdrOfActor;
return C_lNotAZone;
}
else
if (pFather -> fn_bIsOfType (C_szPhysicalObjectTypeName))
{
EditorPO * pModule = (EditorPO *) pFather;
if (pModule -> GetZone (C_ucTypeZdd) == pObject) return C_lZddOfModule;
if (pModule -> GetZone (C_ucTypeZde) == pObject) return C_lZdeOfModule;
if (pModule -> GetZone (C_ucTypeZdm) == pObject) return C_lZdmOfModule;
if (pModule -> GetZone (C_ucTypeZdr) == pObject) return C_lZdrOfModule;
return C_lNotAZone;
}
else return C_lNotAZone;
}
else ASSERT (0);
return 0;
}
//*****************************************************************************
// Virtual functions of the base class : menu
//*****************************************************************************
//**************************************************************************************
//Begin Mircea Dunka 3 Sept 1998 - DialogBar interface
void ZDx_Interface::fn_vDefineDlgBarBtnIcon (tde_DlgBarCategory wCategory, tds_DlgBarBtn *_pDlgBarBtn)
{
if(wCategory == C_DlgBarCategoryEditor)
{
_pDlgBarBtn->hIcon = ::LoadIcon((HINSTANCE)(GetDLLIdentity()->hModule), MAKEINTRESOURCE(IDI_ZDX_DLGBAR_ICON));
CString oCst;
oCst = "Zone";
if( (M_GetMainApp()) && (M_GetMainApp()->mp_oAppKeyboard) )
{
oCst += " (";
oCst += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate Zone Editor"));
oCst += ")";
}
strcpy(_pDlgBarBtn->szToolTip, (char*)(LPCTSTR)oCst);
_pDlgBarBtn->uID = (UINT)this;
}
}
//end Mircea Dunka 3 Sept 1998
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vDefineSubMenu
// This function lets the dll add an entry in a sub menu
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::fn_bDefineSubMenu (EDT_SubMenu * _p_oEDTSubMenu)
{
// if we are in the "Editor" sub menu
if (_p_oEDTSubMenu -> GetSubMenuType () == C_SubMenuEditor)
{
// we add a entry to open the ZDx editor with the short cut
CString sEntry = "&Zone\t" + M_GetMainApp () -> mp_oAppKeyboard -> mfn_oConvertIniStringToKeyString
((const CString *) & CString ("Activate Zone Editor"));
_p_oEDTSubMenu -> AddAnEntry (this , (char *) (LPCTSTR) sEntry , ID_ZDxMenuEditor , fn_bIsCurrentEditor ()); // Check if current editor
return TRUE;
}
else
// if we are in the "Preference" sub menu
if (_p_oEDTSubMenu -> GetSubMenuType () == C_SubMenuSpecific)
{
// we add an entry to save the dimension of the dialog
_p_oEDTSubMenu -> AddAnEntry (this , "Save Dialog Dimensions" , ID_ZDxMenuPreference);
return TRUE;
}
return FALSE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - _OnSubMenuCommand
// This function is called when the user clics on the entry
//-----------------------------------------------------------------------------
void ZDx_Interface::_OnSubMenuCommand (EDT_SubMenu * _p_oEDTSubMenu , UINT uiMsgID)
{
// if the user has cliqued on the entry to open the ZDx editor
if (_p_oEDTSubMenu -> GetSubMenuType () == C_SubMenuEditor && uiMsgID == ID_ZDxMenuEditor)
{
if (fn_bIsCurrentEditor ())
{
GetMainWorld () -> fn_bCloseEditor (this);
}
else
{
// Take the selected object
CPA_SuperObject * pSelectedSuperObject = M_GetSingleSelection ();
// If there is a selected object, we send it
if (pSelectedSuperObject)
{
// Create a list with the selected object
CPA_List<CPA_BaseObject> List;
List . AddTail (pSelectedSuperObject);
GetMainWorld () -> fn_bActivateEditor (this , & List);
}
else
{
GetMainWorld () -> fn_bActivateEditor (this , NULL);
}
}
}
else
if (_p_oEDTSubMenu -> GetSubMenuType () == C_SubMenuSpecific && uiMsgID == ID_ZDxMenuPreference)
{
// Save frame dimension in .INI file
CString csFileName = M_GetMainApp () -> m_csEditorDataPath + "Objects\\Zdd\\Zdd.ini";
char * szFileName = (char *) (LPCSTR) csFileName;
CString csDimension;
csDimension . Format ("%ld" , m_pSplitFrame -> m_oCurPos . right - m_pSplitFrame -> m_oCurPos . left);
WritePrivateProfileString ("Preference" , "Frame Width" , (char *) (LPCSTR) csDimension , szFileName);
WritePrivateProfileString (NULL , NULL , NULL , szFileName); // Flush buffer
}
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vDefinePopupMenu
// This function lets the dll add an entry in the popup menu
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::fn_bDefinePopupMenu (EDT_PopUpMenu * pPopup , CPA_List<CPA_SuperObject> * pSelection ,
BOOL bAsCurrentEditor)
{
if (bAsCurrentEditor) // If the zone editor is open, we add an entry into the popup menu to close it
{
pPopup -> AddAnEntry (this , "Exit Zone editor" , ID_ZDxMenuLeave);
return TRUE;
}
else
if (! fn_bIsCurrentEditor ()) // If the editor is not open, we add an entry to open it, only if an actor is selected
{
CPA_SuperObject * pSelectedSuperObject = M_GetSingleSelection ();
CPA_BaseObject * pSelectedObject = pSelectedSuperObject ? pSelectedSuperObject -> GetObject () : NULL;
CPA_SuperObject * pFatherSuperObject = pSelectedSuperObject ? pSelectedSuperObject -> GetSuperObjectFather () : NULL;
CPA_BaseObject * pFatherObject = pFatherSuperObject ? pFatherSuperObject -> GetObject () : NULL;
// We try to find a selected actor
CPA_BaseObject * pSelectedActor = NULL;
CPA_SuperObject * pSelectedActorSuperObject;
if (pSelectedObject && pSelectedObject -> fn_bIsOfType (C_szActorInstanceTypeName))
{
pSelectedActor = pSelectedObject;
pSelectedActorSuperObject = pSelectedSuperObject;
}
else
if (pFatherObject && pFatherObject -> fn_bIsOfType (C_szActorInstanceTypeName))
{
pSelectedActor = pFatherObject;
pSelectedActorSuperObject = pFatherSuperObject;
}
if (pSelectedActor)
{
// edit zones
CString csMessage = "Edit Zones of actor \"";
csMessage += pSelectedActor -> GetName () + "\"";
EDT_SubMenu * pSubMenu = pPopup -> fn_p_oGetNewSubMenu ((char *) (LPCTSTR) csMessage);
pSubMenu -> AddAnEntry (this , "Global zones" , ID_ZDxMenuEditGlobalZone);
pSubMenu -> AddAnEntry (this , "Module zones" , ID_ZDxMenuEditModuleZone);
pPopup -> AddASubMenu (pSubMenu);
// show zones
csMessage = "Show Zones of actor \"";
csMessage += pSelectedActor -> GetName () + "\"";
pSubMenu = pPopup -> fn_p_oGetNewSubMenu ((char *) (LPCTSTR) csMessage);
if (DoesActorHaveZDx (pSelectedActor))
{
if (AreZDxOfActorDisplayed (pSelectedActorSuperObject))
pSubMenu -> AddAnEntry (this , "Global zones" , ID_ZDxMenuHideGlobalZone, TRUE);
else pSubMenu -> AddAnEntry (this , "Global zones" , ID_ZDxMenuShowGlobalZone, FALSE);
}
if (DoesActorHaveModuleZDx (pSelectedActorSuperObject))
{
if (AreModuleZDxOfActorDisplayed (pSelectedActorSuperObject))
pSubMenu -> AddAnEntry (this , "Module zones" , ID_ZDxMenuHideModuleZone, TRUE);
else pSubMenu -> AddAnEntry (this , "Module zones" , ID_ZDxMenuShowModuleZone, FALSE);
}
pPopup -> AddASubMenu (pSubMenu);
return TRUE;
}
// We try to find a selected module
CPA_SuperObject * pSelectedModuleSuperObject = NULL;
if (pSelectedObject && pSelectedObject -> fn_bIsOfType (C_szPhysicalObjectTypeName)) pSelectedModuleSuperObject = pSelectedSuperObject;
else
if (pFatherObject && pFatherObject -> fn_bIsOfType (C_szPhysicalObjectTypeName)) pSelectedModuleSuperObject = pFatherSuperObject;
if (pSelectedModuleSuperObject && DoesAtLeastOneModuleHaveZDx ())
{
if (DoesModuleHaveZDx ((EditorPO *) pSelectedModuleSuperObject -> GetObject ()))
{
if (AreZDxOfModuleDisplayed (pSelectedModuleSuperObject))
pPopup -> AddAnEntry (this , "Hide zones of module" , ID_ZDxMenuHideZoneOfOneModule);
else pPopup -> AddAnEntry (this , "Show zones of module" , ID_ZDxMenuShowZoneOfOneModule);
}
if (AreZDxOfAllModuleDisplayed ())
pPopup -> AddAnEntry (this , "Hide zones of all modules" , ID_ZDxMenuHideZoneOfAllModule);
else pPopup -> AddAnEntry (this , "Show zones of all modules" , ID_ZDxMenuShowZoneOfAllModule);
return TRUE;
}
}
return FALSE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - _OnPopUpMenuCommand
// This function is called when the user clics on the entry
//-----------------------------------------------------------------------------
void ZDx_Interface::_OnPopUpMenuCommand (UINT m_IDCmdMsg)
{
CPA_SuperObject * pSelectedActorSuperObject = GetSelectedActorSuperObject ();
switch (m_IDCmdMsg)
{
case ID_ZDxMenuEditModuleZone : m_bAskToEditModuleZone = TRUE; // no break, it is not an error
case ID_ZDxMenuEditGlobalZone : {
// Take the selected object
CPA_SuperObject * pSelectedSuperObject = M_GetSingleSelection ();
// If there is a selected object, we send it
if (pSelectedSuperObject)
{
// Create a list with the selected object
CPA_List<CPA_BaseObject> List;
List . AddTail (pSelectedSuperObject);
GetMainWorld () -> fn_bActivateEditor (this , & List);
}
else GetMainWorld () -> fn_bActivateEditor (this , NULL);
}
break;
case ID_ZDxMenuShowGlobalZone : if (pSelectedActorSuperObject)
{
IWillRefreshDisplay (C_lPopupMenuShowZone);
ShowZDxOfActor (pSelectedActorSuperObject , C_ucShowAllZDx);
RefreshDisplay (C_lPopupMenuShowZone);
}
break;
case ID_ZDxMenuHideGlobalZone : if (pSelectedActorSuperObject)
{
IWillRefreshDisplay (C_lPopupMenuShowZone);
ShowZDxOfActor (pSelectedActorSuperObject , C_ucHideAllZDx);
RefreshDisplay (C_lPopupMenuShowZone);
}
break;
case ID_ZDxMenuShowModuleZone : if (pSelectedActorSuperObject)
{
IWillRefreshDisplay (C_lPopupMenuShowZone);
ShowModuleZDxOfActor (pSelectedActorSuperObject);
RefreshDisplay (C_lPopupMenuShowZone);
}
break;
case ID_ZDxMenuHideModuleZone : if (pSelectedActorSuperObject)
{
IWillRefreshDisplay (C_lPopupMenuShowZone);
HideModuleZDxOfActor (pSelectedActorSuperObject);
RefreshDisplay (C_lPopupMenuShowZone);
}
break;
case ID_ZDxMenuShowZoneOfOneModule :
case ID_ZDxMenuHideZoneOfOneModule : {
IWillRefreshDisplay (C_lShowZDxOfOneModule);
// The selected object or its father must be a module
CPA_SuperObject * pSelectedModuleSuperObject = M_GetSingleSelection ();
if (! pSelectedModuleSuperObject -> GetObject () -> fn_bIsOfType (C_szPhysicalObjectTypeName))
{
pSelectedModuleSuperObject = pSelectedModuleSuperObject -> GetSuperObjectFather ();
ASSERT (pSelectedModuleSuperObject -> GetObject () -> fn_bIsOfType (C_szPhysicalObjectTypeName));
}
ShowZDxOfModule (pSelectedModuleSuperObject ,
m_IDCmdMsg == ID_ZDxMenuShowZoneOfOneModule ? C_ucShowAllZDx : C_ucHideAllZDx);
RefreshDisplay (C_lShowZDxOfOneModule);
}
break;
case ID_ZDxMenuShowZoneOfAllModule : ShowZDxOfAllModule (C_ucShowAllZDx);
break;
case ID_ZDxMenuHideZoneOfAllModule : ShowZDxOfAllModule (C_ucHideAllZDx);
break;
case ID_ZDxMenuLeave : GetMainWorld () -> fn_bCloseEditor (this); break;
default : ASSERT (0);
}
}
//*****************************************************************************
// Virtual functions of the base class : questions to manage ZDx objects
//*****************************************************************************
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_bCanActivateEditor
// Return if the editor can be activated
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::fn_bCanActivateEditor (CPA_List<CPA_BaseObject> * _pParams)
{
#ifdef __INACTIVE_INTERFACE__
return FALSE;
#endif
return CPA_ObjectDLLBase::fn_bCanActivateEditor (_pParams);
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_bCanHandleThisType
// The type of the objects we can handle
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::fn_bCanHandleThisType (long lEngineType)
{
return lEngineType == C_lZDD
|| lEngineType == C_lZDE
|| lEngineType == C_lZDM
|| lEngineType == C_lZDR
|| lEngineType == C_lBoundingVolume
|| lEngineType == C_lTestPoint;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_bAcceptModifParent
// One cannot change the parent of a zone
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::fn_bAcceptModifParent (CPA_List<CPA_SuperObject> * pListObjects , tdeStatus eStatus)
{
if (eStatus != C_AsConcernedDLL) return TRUE;
for (CPA_SuperObject * pSuperObject = pListObjects -> GetHeadElement () ; pSuperObject ;
pSuperObject = pListObjects -> GetNextElement (pSuperObject))
{
CPA_BaseObject * pObject = pSuperObject ? pSuperObject -> GetObject () : NULL;
if (pObject && M_bIsThisObjectAZDx (pObject)) return FALSE; // A zone -> we don't accept
}
return TRUE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_bAcceptModifCopy
// A ZDx object can be copied
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::fn_bAcceptModifCopy (CPA_List<CPA_SuperObject> * pListObjects , tdeStatus eStatus)
{
// If we are not called to copy a ZDx object, it is OK
if (eStatus != C_AsConcernedDLL) return TRUE;
// We cannot copy a bounding volume or a test point
// ANNECY AV CLEAN_MEC {
if (m_pList1Window -> IsEditingBoundingVolume () /* || m_pList1Window -> IsEditingTestPoint () */) return FALSE;
// END ANNECY AV }
// Here, we are asked if a ZDx object can be copied
// We answer YES only if the ZDx object is alone
return pListObjects -> GetCount () == 1;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_bAcceptAsParent
// Only actors can be parent for a ZDx object
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::fn_bAcceptAsParent (CPA_BaseObject * pChild , CPA_BaseObject * pParent)
{
if (m_bIsShowingOrHidingZDx) return TRUE;
if (m_pList1Window -> IsEditingBoundingVolume ()) return m_pList2Window -> GetSelectedZDx () == NULL;
// ANNECY AV CLEAN_MEC {
// if (m_pList1Window -> IsEditingTestPoint ()) return m_pList2Window -> GetNumberOfUnusedPosition () > 0;
// END ANNECY AV }
if (m_pList1Window -> IsEditingZDxOfModule ()) // Zone of module
{
// The parent must be a module
if (! pParent -> fn_bIsOfType (C_szPhysicalObjectTypeName)) return FALSE;
EditorPO * pModule = (EditorPO *) pParent;
tdeZDxType eZDxType = ((ZDx_Object *) pChild) -> GetZDxType ();
return GetZDxOfPhysicalObject (pModule , eZDxType) == NULL;
}
else // Zone of actor
{
// The parent must be an actor
if (! pParent -> fn_bIsOfType (C_szActorInstanceTypeName)) return FALSE;
// We get the list of ZDx
EdtList * pEdtList = GetZDxList (pParent , ((ZDx_Object *) pChild) -> GetZDxType ());
if (! pEdtList) return FALSE;
POSITION Pos = pEdtList -> GetHeadPosition ();
while (Pos)
{
// One unused position => OK
if (pEdtList -> GetNext (Pos) == NULL) return TRUE;
}
// No unused position => not OK
return FALSE;
}
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_bAcceptModifInsert
// This function is called before a object is inserted into the hierarchy
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::fn_bAcceptModifInsert (CPA_SuperObject * pSuperObjectToInsert ,
CPA_SuperObject * pParent, tdeStatus eStatus)
{
// if we receive this message because we are the current editor, we don't treat it, because
// we will receive this message again if it concerns a ZDx
if (eStatus != C_AsConcernedDLL) return TRUE;
// We do nothing when showing or hiding a ZDx or when inserting a ZDx object
if (m_bIsShowingOrHidingZDx || m_bIsInsertingZDxObject) return TRUE;
// The zone editor must be open
if (! fn_bIsCurrentEditor ())
{
MessageBox (NULL , "You must open the zone editor before you can drop a zone onto it" , "Warning" , MB_OK + MB_ICONSTOP + MB_TASKMODAL);
return FALSE;
}
if (m_pList1Window -> IsEditingBoundingVolume ()) return AcceptModifInsertBoundingVolume (pSuperObjectToInsert , pParent);
else
// ANNECY AV CLEAN_MEC {
// if (m_pList1Window -> IsEditingTestPoint ()) return AcceptModifInsertTestPoint (pSuperObjectToInsert , pParent);
// END ANNECY AV }
if (m_pList1Window -> IsEditingZDxOfModule ()) return AcceptModifInsertZDxOfModule (pSuperObjectToInsert , pParent);
else return AcceptModifInsertZDxOfActor (pSuperObjectToInsert , pParent);
}
//*****************************************************************************
// Virtual functions of the base class : functions to manage ZDx objects
//*****************************************************************************
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vInitListByType
// This function is called once to load all ZDx types
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vInitListByType (CPA_World * pWorld)
{
pWorld -> fn_vAddANewListByType (C_szZddName , this);
pWorld -> fn_vAddANewListByType (C_szZdeName , this);
pWorld -> fn_vAddANewListByType (C_szZdmName , this);
pWorld -> fn_vAddANewListByType (C_szZdrName , this);
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vInitListsOfModels
// This function is called once to load all model names of the ZDx object
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vInitListsOfModels (void)
{
// Create a list of ZDx models
GetInterface () -> fn_bAddANewModelList (C_szZDxListName , this);
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - GetNewInstance
// Create a new instance of a given ZDx model
//-----------------------------------------------------------------------------
CPA_SuperObject * ZDx_Interface::GetNewInstance (CString _csZDxGeometricTypeName , CString _csZDxModelName ,
CPA_SuperObject * pParent)
{
if (_csZDxGeometricTypeName != _csZDxModelName) return NULL; // csZDxTypeName and csZDxModelName must be the same
// Search the selected model
int ModelNumber = 0;
while (_csZDxModelName != ListOfZDxModels [ModelNumber] . szZDxModelName)
{
if (++ ModelNumber >= NumberOfZDxModels) return NULL; // If we reach the end of the list -> not found -> return NULL
}
// We check if the selected position in the list of zones is empty
tdeZDxType eZDxType;
long lPosition;
if (m_pList2Window -> GetSelectedZDx (& eZDxType , & lPosition) != NULL || lPosition == -1)
{
if (! m_pList2Window -> SelectZDx (NULL , TRUE)) return NULL; // if not, we select a empty position
m_pList2Window -> GetSelectedZDx (& eZDxType , & lPosition);
}
tdeZDxGeometricType eZDxGeometricType = ListOfZDxModels [ModelNumber] . eZDxGeometricType;
if (m_pList1Window -> IsEditingBoundingVolume () && eZDxGeometricType != eSphere)
{
MessageBox (NULL , "A bounding volume must be a sphere" , "Warning" , MB_OK + MB_ICONSTOP + MB_TASKMODAL);
return NULL;
}
// ANNECY AV CLEAN_MEC {
/*
if (m_pList1Window -> IsEditingTestPoint () && eZDxGeometricType != ePoint)
{
MessageBox (NULL , "A test point must be a point" , "Warning" , MB_OK + MB_ICONSTOP + MB_TASKMODAL);
return NULL;
}
*/
// END ANNECY AV }
//ANNECY Shaitan Correction (15/04/98) {
if ((eZDxType == eZdr) && (eZDxGeometricType == eBox))
{
MessageBox (NULL , "Box cannot be used for the Zdr" , "Warning" , MB_OK + MB_ICONSTOP + MB_TASKMODAL);
return NULL;
}
//ENDANNECY Shaitan Correction }
//Stefan Dumitrean 8-07-98 ( zone types )
if ((eZDxType == eZdm) && (eZDxGeometricType == eCone))
{
MessageBox (NULL , "Cone cannot be used for the Zdm" , "Warning" , MB_OK + MB_ICONSTOP + MB_TASKMODAL);
return NULL;
}
if ((eZDxType == eZde) && (eZDxGeometricType == eCone))
{
MessageBox (NULL , "Cone cannot be used for the Zde" , "Warning" , MB_OK + MB_ICONSTOP + MB_TASKMODAL);
return NULL;
}
if ((eZDxType == eZdr) && (eZDxGeometricType == eCone))
{
MessageBox (NULL , "Cone cannot be used for the Zdr" , "Warning" , MB_OK + MB_ICONSTOP + MB_TASKMODAL);
return NULL;
}
//End Stefan Dumitrean 8-07-98 ( zone types )
// Create a graphic super object (this also create a graphic object)
char * szDataPath;
CString csReferenceSectionName;
ComputeSectionNameForNewInstance (& szDataPath , & csReferenceSectionName , pParent -> GetObject ());
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
//ACP_tdxHandleOfElement HandleOfElement;
CPA_SuperObject * pGraphicSuperObject = CreateGraphicSuperObject (eZDxGeometricType /*, & HandleOfElement */, szDataPath , csReferenceSectionName);
Shape3D * pGraphicObject = (Shape3D *) pGraphicSuperObject -> GetObject ();
//ENDROMTEAM WorldEditor (Cristi Petrescu)
// Create a super object
CPA_SuperObject * pSuperObject = CreateSuperObject ();
// Give it the graphic super object as child
pGraphicSuperObject -> SetEditProtected (TRUE); // So the user cannot move it
pGraphicSuperObject -> SetSuperObjectOwner (pSuperObject);
pSuperObject -> AddTail (pGraphicSuperObject);
// set the model name of the super object
pSuperObject -> SetModelName (_csZDxModelName);
// Get the family of the actor which will be the owner of the ZDx object
CPA_BaseObject * pFamily = GetFamilyForNewInstance (pParent -> GetObject ());
// Create a ZDx Object with the loaded 3D geometric object
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
ZDx_Object * pObject = new ZDx_Object (this , GetZDxTypeName (eZDxType) , eZDxType ,
eZDxGeometricType , "" , pFamily , pGraphicObject /*, pGraphicObject->GetEngineHandle ()*/);//HandleOfElement);
//ENDROMTEAM WorldEditor (Cristi Petrescu)
// Give to the geometric object the same name as the ZDx object, and it must be valid
if (pObject -> fn_bCanBeNotified ()) pGraphicObject -> fn_vNotifySave (); // Must be done before a fn_eRename
tdeMissingCriteria eResult = pGraphicObject -> fn_eRename (pObject -> GetName ());
ASSERT (eResult == E_mc_None);
//ANNECY TQ 29/04/98{
pGraphicSuperObject -> fn_vHasALinkedZDM(FALSE);
//ENDANNECY TQ}
// Set the correct size depending on the size of the parent
switch (eZDxGeometricType)
{
case eSphere : {
MTH3D_tdstVector Center;
MTH_tdxReal Radius = ComputeInitialSizeOfSphere (pParent , & Center);
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
ZDx_Shape * pSphere = (ZDx_Shape*) pObject -> GetZDxShape ();
((Sphere3D *)pGraphicObject) -> SetRadius (& Radius);
((Sphere3D *)pGraphicObject) -> SetCenter (& Center);
/*
pSphere -> SetRadius (& Radius);
pSphere -> SetCenter (& Center);
*/
//ENDROMTEAM WorldEditor (Cristi Petrescu)
}
break;
case eBox : {
MTH3D_tdstVector MinPoint , MaxPoint;
ComputeInitialSizeOfBox (pParent , & MinPoint , & MaxPoint);
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
ZDx_Shape * pBox = (ZDx_Shape *) pObject -> GetZDxShape ();
/*
pBox -> SetMinPoint (& MinPoint);
pBox -> SetMaxPoint (& MaxPoint);
pBox -> SetMinPoint (& MinPoint); // Necessary because one must have Min < Max
*/
((Box3D *)pGraphicObject) -> SetMinPoint (& MinPoint);
((Box3D *)pGraphicObject) -> SetMaxPoint (& MaxPoint);
((Box3D *)pGraphicObject) -> SetMinPoint (& MinPoint); // Necessary because one must have Min < Max
//ENDROMTEAM WorldEditor (Cristi Petrescu)
//ANNECY TQ 29/04/98{
if (eZDxType == eZdm)
pGraphicSuperObject -> fn_vHasALinkedZDM(TRUE);
//ENDANNECY TQ}
}
break;
}
pSuperObject -> SetObject (pObject); // Super object points to object
pSuperObject -> SetTypeSO (C_Protected); // Set the type of the super object
pObject -> fn_vNotifySave ();
return pSuperObject; // Return the created super object
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_bChooseInsertPosition
// Fill the matrix of the super object of the zone to insert
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::fn_bChooseInsertPosition (CPA_SuperObject * pNewInstance , CPA_SuperObject * pParent ,
tdstPosition * pPosition)
{
// The matrix is always the identity
POS_fn_vSetIdentityMatrix(HIE_fn_hGetSuperObjectMatrix (pNewInstance -> GetStruct ()));
// We set the position for zde, zdm, zdr, bounding volume of type sphere or box , but not zdd
// But when there is no picking information available, we must set the position too
ZDx_Object * pZDxObject = (ZDx_Object *) pNewInstance -> GetObject ();
tdeZDxGeometricType eZDxGeometricType = pZDxObject -> GetZDxGeometricType ();
return pPosition -> xIndex == 0 ||
(pZDxObject -> GetZDxType () != eZdd && (eZDxGeometricType == eSphere || eZDxGeometricType == eBox));
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - GetParentForInsertion
// This function is called when a ZDx object is inserted into the hierarchy :
// We have to select the parent
//-----------------------------------------------------------------------------
CPA_SuperObject * ZDx_Interface::GetParentForInsertion (CString csTypeName , CString csModelName ,
tdstPosition * pPosition)
{
if (m_pList1Window -> IsEditingZDxOfModule ()) // We ask for a ZDx of module
{
if (m_pList1Window -> GetShowActorButtonState () == FALSE) // Drag&drop into the grid : we send the position
{ // to the T3D tool dll, and it give the picked super object
CPA_ToolDLLBase * pT3DDll = GetMainWorld () -> GetToolDLLWithName (C_szDLLTool3DName);
ASSERT (pT3DDll);
return (CPA_SuperObject *) pT3DDll -> OnQueryInfos (this , C_wTool3D_QI_GetSOOnGrid , (LPARAM) & pPosition -> stPos);
}
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
//return (CPA_SuperObject *) pT3DDll -> OnQueryInfos (this , C_wTool3D_QI_GetSOOnGrid , (LPARAM) & pPosition -> stPos);
return m_pList1Window -> GetSelectedModuleSuperObject (); // Return the selected module
/*
// Return the first super object of type Physical, null if none
CPA_SuperObject * pSelectedSuperObject =
GetInterface () -> GetUserMouseSelection (pPosition -> xIndex , pPosition -> a_stPickInfo , C_szPhysicalObjectTypeName);
if (pSelectedSuperObject == NULL)
{
MessageBox (NULL , "A ZDx of module can only be dropped onto a module of an actor !" , "Warning" , MB_OK + MB_ICONSTOP + MB_TASKMODAL);
return NULL;
}
else return pSelectedSuperObject;
*/
//ENDROMTEAM WorldEditor (Cristi Petrescu)
}
else return m_pList2Window -> GetActorSuperObject (); // We ask for a ZDx of actor, a bounding volume or a test point
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - Duplicate
// This function is called to duplicate a ZDx object
//-----------------------------------------------------------------------------
CPA_BaseObject * ZDx_Interface::Duplicate (CPA_BaseObject * pOldObject, CPA_SuperObject * pSuperObject)
{
if (m_pList1Window -> IsEditingZDxOfModule ()) // Zone of module -> we return the same zone
return pOldObject;
else return new ZDx_Object (* (ZDx_Object *) pOldObject); // Zone of actor : call the ZDx_Object copy constructor to make a copy
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - GetCopyOfProtectedChild
// This function is called to duplicate a protected child of a ZDx object
// In fact, we return te Geometric 3d object of the new parent
//-----------------------------------------------------------------------------
CPA_SuperObject * ZDx_Interface::GetCopyOfProtectedChild (CPA_SuperObject * pInitialChild,
CPA_SuperObject * pNewOwner)
{
CPA_SuperObject * pSuperObject = CreateSuperObject ();
CPA_BaseObject * pObject = ((ZDx_Object *) pNewOwner -> GetObject ()) -> GetZDxShape () -> GetGeometric3dObject ();
pSuperObject -> SetObject (pObject);
pSuperObject -> SetTypeSO (C_Protected);
return pSuperObject;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vComputeBoundingVolume
// Compute the bounding volume of a ZDx object
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vComputeBoundingVolume (CPA_BaseObject * _pObject)
{
// We do nothing
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_hGetBoundingVolume
// Return the bounding volume of a ZDx object
//-----------------------------------------------------------------------------
ACP_tdxHandleOfObject ZDx_Interface::fn_hGetBoundingVolume (CPA_BaseObject * _pObject)
{
MTH3D_tdstVector stCenter;
MTH_tdxReal xRadius;
ZDx_Object * pZDxObject = (ZDx_Object *) _pObject;
MTH3D_M_vNullVector(&stCenter);
xRadius = NULL;
//ANNECY TQ 18/06/98{
GEO_fn_vAddObjectToSphere(pZDxObject -> GetZDxShape () -> GetGeometric3dObject () -> GetStruct (), &stCenter, &xRadius);
GEO_fn_vSetGeometricSphere(&stCenter, xRadius, m_GlobalBoundingVolume);
//ENDANNECY TQ}
return m_GlobalBoundingVolume;
}
//*****************************************************************************
// Virtual functions of the base class : modifications
//*****************************************************************************
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vOnModifInsert
// This function is called when a ZDx object is inserted
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vOnModifInsert (CPA_SuperObject * pSuperObject, CPA_SuperObject * pParent,
tdstPosition * p_stPosition, tdeTypeModif eType, tdeStatus eStatus)
{
// We do nothing when showing, hiding or inserting a ZDx object
if (m_bIsShowingOrHidingZDx || m_bIsInsertingZDxObject) return;
CPA_BaseObject * pObject = pSuperObject -> GetObject ();
if (! pObject) return;
m_bIsInsideOnModifInsertDelete = TRUE;
// If we are called because we are the current editor
switch (eStatus)
{
case C_AsCurrentEditor : { // We see if the created object is an actor
if (pObject -> fn_bIsOfType (C_szActorInstanceTypeName))
{
if (eType == C_EDTUndo) OnDeleteActor (pSuperObject);
else OnInsertActor (pSuperObject);
}
}
break;
case C_AsConcernedDLL : { // The inserted object must be a ZDx object
ASSERT (M_bIsThisObjectAZDx (pObject));
ZDx_Object * pZDxObject = (ZDx_Object *) pObject;
CPA_BaseObject * pObjectParent = pParent -> GetObject ();
if (m_pList1Window -> IsEditingBoundingVolume ())
{
if (eType == C_EDTUndo) OnDeleteBoundingVolume (pSuperObject , pParent);
else OnInsertBoundingVolume (pSuperObject , pParent, FALSE);
}
else
// ANNECY AV CLEAN_MEC {
/*
if (m_pList1Window -> IsEditingTestPoint ())
{
if (eType == C_EDTUndo) OnDeleteTestPoint (pSuperObject , pParent);
else OnInsertTestPoint (pSuperObject , pParent);
}
else
*/
// END ANNECY AV }
if (m_pList1Window -> IsEditingZDxOfModule ())
{
if (eType == C_EDTUndo) OnDeleteZDxOfModule (pSuperObject , pParent);
else OnInsertZDxOfModule (pSuperObject , pParent);
}
else
{
if (eType == C_EDTUndo) OnDeleteZDxOfActor (pSuperObject , pParent);
else OnInsertZDxOfActor (pSuperObject , pParent);
}
// Notify to delete the section (for Undo)
if (eType == C_EDTUndo) pZDxObject -> fn_vNotifyUnSave ();
}
break;
}
m_bIsInsideOnModifInsertDelete = FALSE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vOnModifDelete
// This function is called when a ZDx object is deleted
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vOnModifDelete (CPA_List<EDT_SaveParents> * pListObjects , tdeTypeModif eType , tdeStatus eStatus)
{
// We do nothing when showing, hiding or deleting a ZDx
if (m_bIsShowingOrHidingZDx || m_bIsDeletingZDxObject) return;
m_bIsInsideOnModifInsertDelete = TRUE;
// If we are called because we are the current editor
if (eStatus == C_AsCurrentEditor)
{
for (EDT_SaveParents * pSaveParents = pListObjects -> GetHead () ; pSaveParents ;
pSaveParents = pListObjects -> GetNextElement (pSaveParents))
{
CPA_SuperObject * pSuperObject = pSaveParents -> m_pChild;
CPA_BaseObject * pObject = pSuperObject -> GetObject ();
// We see if the deleted object is an actor
if (pObject && pObject -> fn_bIsOfType (C_szActorInstanceTypeName))
{
if (eType == C_EDTUndo) OnInsertActor (pSuperObject);
else OnDeleteActor (pSuperObject);
}
}
}
else
// If we are not called because we are the current editor, the deleted object is a ZDx
{
for (EDT_SaveParents * pSaveParents = pListObjects -> GetHead () ; pSaveParents ;
pSaveParents = pListObjects -> GetNextElement (pSaveParents))
{
CPA_SuperObject * pSuperObject = pSaveParents -> m_pChild;
CPA_BaseObject * pObject = pSuperObject -> GetObject ();
// The inserted object must be a ZDx object
ASSERT (M_bIsThisObjectAZDx (pObject));
ZDx_Object * pZDxObject = (ZDx_Object *) pObject;
CPA_SuperObject * pParent = pSaveParents -> m_pInitialParent;
CPA_BaseObject * pObjectParent = pParent -> GetObject ();
if (m_pList1Window -> IsEditingBoundingVolume ())
{
if (eType == C_EDTUndo) OnInsertBoundingVolume (pSuperObject , pParent, FALSE);
else OnDeleteBoundingVolume (pSuperObject , pParent);
}
else
// ANNECY AV CLEAN_MEC {
/*
if (m_pList1Window -> IsEditingTestPoint ())
{
if (eType == C_EDTUndo) OnInsertTestPoint (pSuperObject , pParent);
else OnDeleteTestPoint (pSuperObject , pParent);
}
else
*/
// END ANNECY AV }
if (m_pList1Window -> IsEditingZDxOfModule ())
{
if (eType == C_EDTUndo) OnInsertZDxOfModule (pSuperObject , pParent);
else OnDeleteZDxOfModule (pSuperObject , pParent);
}
else
{
if (eType == C_EDTUndo) OnInsertZDxOfActor (pSuperObject , pParent);
else OnDeleteZDxOfActor (pSuperObject , pParent);
}
// We notify to delete the ZDx object from file, or to cancel the deletion
if (eType == C_EDTUndo) pZDxObject -> fn_vNotifyRestore ();
else pZDxObject -> fn_vNotifyUnSave ();
}
}
m_bIsInsideOnModifInsertDelete = FALSE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vOnCancelInsertion
// This function is called when a insertion of a ZDx is canceled
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vOnCancelInsertion (CPA_SuperObject * _pSuperObject)
{
ZDx_Object * pZDxObject = (ZDx_Object *) _pSuperObject -> GetObject ();
pZDxObject -> fn_vNotifyUnSave ();
delete pZDxObject;
//??? A FAIRE QUAND CA NE PLANTERA PLUS delete _pSuperObject;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vOnModifCopy
// This function is called when an object has been copied and pasted
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vOnModifCopy (CPA_List<EDT_SaveParents> *pListObjects, tdeTypeModif eType, tdeStatus eStatus)
{
if (eStatus != C_AsConcernedDLL) return;
// Only one ZDx object can be copied at once
ASSERT (pListObjects -> GetCount () == 1);
ZDx_Object * pZDxObject = (ZDx_Object *) pListObjects -> GetHead () -> m_pChild -> GetObject ();
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
Shape3D * pGeometric3dObject = pZDxObject -> GetZDxShape () -> GetGeometric3dObject ();
//ENDROMTEAM WorldEditor (Cristi Petrescu)
if (m_pList1Window -> IsEditingZDxOfModule ()) // Copy of a zone of module
{
EditorPO * pModule = (EditorPO *) pListObjects -> GetHead () -> m_pFinalParent -> GetObject (); // We get the module
if (eType == C_EDTUndo)
{
// We remove the ZDx object from the physical object
SetZDxOfPhysicalObject (pModule , NULL , pZDxObject -> GetZDxType ());
m_pList1Window -> SelectModule (pModule , TRUE);
}
else
{
// We put the ZDx object into the physical object
SetZDxOfPhysicalObject (pModule , pZDxObject , pZDxObject -> GetZDxType ());
// We refresh the current list
m_pList1Window -> SelectZDxOfModule (pModule , pZDxObject , TRUE);
}
}
else // Copy of a zone of actor
{
// We get the actor and the family
CPA_BaseObject * pActor = pListObjects -> GetHead () -> m_pFinalParent -> GetObject ();
ASSERT (pActor);
CPA_BaseObject * pFamily = pActor -> GetOwner () -> GetOwner ();
ASSERT (pFamily);
if (eType == C_EDTUndo)
{
// Remove the ZDx object from the list of ZDx
EdtList * pEdtList = GetZDxList (pActor , pZDxObject -> GetZDxType ());
RemoveZDxFromList (pEdtList , pZDxObject , pActor);
// Refresh the list
m_pList1Window -> ReCreateCurrentList ();
}
else
{
EdtList * pEdtList = GetZDxList (pActor , pZDxObject -> GetZDxType ());
long lIndexInList = pZDxObject -> GetIndexInList ();
// If the specified position is used, select the first unused position (-1)
if (lIndexInList != -1 && pEdtList -> FindElementFromIndex (lIndexInList) != NULL) lIndexInList = -1;
// Put the ZDx object into the list of ZDx
InsertZDxIntoList (pEdtList , pZDxObject , & lIndexInList , pActor , eZDxNormal);
// Refresh the lists
m_pList1Window -> SelectZDxOfActor (pActor , pZDxObject , TRUE);
}
}
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vOnBeginMove
// This function is called just before a move
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vOnBeginMove (CPA_List<CPA_SuperObject> *pListObjects,
CPA_List<CPA_SuperObject> *pListConcerned, tdeStatus eStatus)
{
// if we receive this message because we are the current editor, we don't treat it, because
// we will receive this message again if it concerns a ZDx
if (eStatus != C_AsConcernedDLL) return;
// A ZDx object is moving : we save the modifications (if any) on the edited ZDx object (even if it is not
// the one that is moving) by cliquing on the Apply button
// m_pEditWindow -> Apply ();
m_bMoveHasBegun = TRUE;
//CPA2 (Corneliu Babiuc) 27-04-1998
m_bMoveOnlyActor = m_bMoveOnlyActorKeyPressed;
//END CPA2 (Corneliu Babiuc) 15-04-1998
}
//CPA2 (Corneliu Babiuc) 15-04-1998
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vOnMoving
// This function is called when a ZDx object is moved
// For each moved ZDx object, we refresh the graphic data
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vOnMoving (CPA_List<CPA_SuperObject> * pListObjects ,
CPA_List<CPA_SuperObject> * pListConcerned ,
tdeStatus eStatus)
{
// we'll treat this message if the zones are moved as child of an actor
// in this case we have to move them back
if (eStatus != C_AsConcernedDLL) return;
// if the special move mode is not activated we do nothing
if (!m_bMoveOnlyActor ) return;
POSITION Position = pListObjects -> GetHeadPosition ();
//if the user has selected a zone there is nothing to do
if (Position) return;
Position = pListConcerned -> GetHeadPosition ();
while (Position)
{
//we'll translate the zone with father deplacement to keep the initial position
CPA_SuperObject * pZDxSuperObject = pListConcerned -> GetNext (Position);
MoveBackZone (pZDxSuperObject);
}
// Refresh the data of the window without redrawing the world
m_pEditWindow -> RefreshData (FALSE);
}
//END CPA2 (Corneliu Babiuc) 17-04-1998
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vOnModifMove
// This function is called after a ZDx object has been moved
// For each moved ZDx object, we refresh the graphic data
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vOnModifMove (CPA_List<EDT_SavePos> * pListObjects ,
CPA_List<EDT_SaveGlobalPos> * pListConcerned ,
tdeTypeModif eType, tdeStatus eStatus)
{
//CPA2 (Corneliu Babiuc) 16-04-1998
//this code is intended to set gbMoveWasOnlyActor global variable in case of move only actor
if ((eStatus == C_AsCurrentEditor) && (eType != C_EDTCancel))
{
gbMoveWasOnlyActor = FALSE;
POSITION Pos = pListConcerned -> GetHeadPosition ();
while (Pos)
{
EDT_SaveGlobalPos * pSaveGlobalPos = pListConcerned -> GetNext (Pos);
CPA_SuperObject * pSuperObject = pSaveGlobalPos -> m_pObject;
//test if the object is a ZDx
CPA_BaseObject * pObject = pSuperObject -> GetObject ();
if (pObject != NULL && M_bIsThisObjectAZDx (pObject))
{
MTH3D_tdstVector InitialTranslation , FinalTranslation ;
POS_fn_vGetTranslationVector (pSaveGlobalPos -> m_hInitialGlobalMatrix , & InitialTranslation);
POS_fn_vGetTranslationVector (pSaveGlobalPos -> m_hFinalGlobalMatrix , & FinalTranslation);
BOOL bMoveToMode = (eType == C_EDTDo) && (m_bMoveHasBegun == FALSE) && m_bMoveOnlyActorKeyPressed;
//if the initial position is the same with final position then the move was 'Move Only Actor'
if ( MTH3D_M_bEqualVector (& InitialTranslation , & FinalTranslation)
|| bMoveToMode)
gbMoveWasOnlyActor = TRUE;
return;
}
}
}
//this code will ensure that un ReDo/UnDo action in case of MoveTo mode could be distinguished
if ((eStatus == C_AsConcernedDLL) && (eType != C_EDTCancel))
{
gbMoveWasOnlyActor = FALSE;
POSITION Pos = pListConcerned -> GetHeadPosition ();
BOOL bMoveToMode = (eType == C_EDTDo) && (m_bMoveHasBegun == FALSE) && m_bMoveOnlyActorKeyPressed;
if (bMoveToMode)
{
while (Pos)
{
EDT_SaveGlobalPos * pSaveGlobalPos = pListConcerned -> GetNext (Pos);
MTH3D_tdstVector InitialTranslation , FinalTranslation;
POS_fn_vGetTranslationVector (pSaveGlobalPos -> m_hInitialGlobalMatrix , & InitialTranslation);
POS_fn_vGetTranslationVector (pSaveGlobalPos -> m_hFinalGlobalMatrix , & FinalTranslation);
//set the final Global matrix the initial one
POS_fn_vSetTranslationVector(pSaveGlobalPos -> m_hFinalGlobalMatrix , & InitialTranslation);
}
}
}
m_bMoveOnlyActor = FALSE;
//END CPA2 (Corneliu Babiuc) 30-04-1998
// if we receive this message because we are the current editor, we don't treat it, because
// we will receive this message again if it concerns a ZDx
if (eStatus != C_AsConcernedDLL) return;
// if the operation was canceled, we do nothing
if (eType == C_EDTCancel)
{
m_bMoveHasBegun = FALSE;
return;
}
POSITION Position = pListObjects -> GetHeadPosition ();
while (Position)
{
EDT_SavePos * pSavePos = pListObjects -> GetNext (Position);
CPA_SuperObject * pZDxSuperObject = pSavePos -> m_pObject;
ZDx_Object * pZDxObject = (ZDx_Object *) pZDxSuperObject -> GetObject ();
MTH3D_tdstVector InitialTranslation , FinalTranslation , NewTranslation;
POS_fn_vGetTranslationVector (pSavePos -> m_hInitialMatrix , & InitialTranslation);
POS_fn_vGetTranslationVector (pSavePos -> m_hFinalMatrix , & FinalTranslation);
if (! MTH3D_M_bEqualVector (& InitialTranslation , & FinalTranslation))
{
BOOL bMoveToMode = (eType == C_EDTDo) && (m_bMoveHasBegun == FALSE);
if (bMoveToMode)
{
MTH3D_tdstVector stCenter = pZDxObject -> GetZDxShape () -> GetCenter ();
MTH3D_M_vSubVector (& FinalTranslation , & FinalTranslation , & stCenter);
POS_fn_vSetTranslationVector(pSavePos -> m_hFinalMatrix , & FinalTranslation);
}
if (eType != C_EDTUndo) { MTH3D_M_vSubVector (& NewTranslation , & FinalTranslation , & InitialTranslation); }
else { MTH3D_M_vSubVector (& NewTranslation , & InitialTranslation , & FinalTranslation); }
POS_fn_vSetTranslationVector(HIE_fn_hGetSuperObjectMatrix (pZDxSuperObject -> GetStruct ()) ,
& NewTranslation);
pZDxObject -> GetZDxShape () -> RefreshData (pZDxSuperObject);
// ANNECY AV CLEAN_MEC {
// if (pZDxObject -> GetZDxType () == eTestPoint) m_pList2Window -> GetListOfTestPoint () -> fn_vNotifySave ();
// else pZDxObject -> fn_vNotifySave ();
pZDxObject -> fn_vNotifySave ();
// END ANNECY AV }
}
}
m_bMoveHasBegun = FALSE;
// Refresh the data of the window without redrawing the world
m_pEditWindow -> RefreshData (FALSE);
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - fn_vOnSelect
// This function is called when a ZDx Object is selected or deselected
//-----------------------------------------------------------------------------
void ZDx_Interface::fn_vOnSelect (CPA_SuperObject * pSuperObject, tdeTypeModif eType, tdeStatus eStatus)
{
if (m_bIsShowingOrHidingZDx || eStatus != C_AsCurrentEditor) return;
CPA_BaseObject * pObject = pSuperObject -> GetObject ();
if (! pObject) return;
// We see if an actor object is selected
if (pObject -> fn_bIsOfType (C_szActorInstanceTypeName)) OnSelectActor (pSuperObject , eType); else
// We see if a ZDx is selected
if (M_bIsThisObjectAZDx (pObject))
{
ZDx_Object * pZDxObject = (ZDx_Object *) pObject;
CPA_SuperObject * pParent = pSuperObject -> GetSuperObjectFather ();
// If pParent is NULL, it means that the ZDx object is not in the hierarchy (this can happen because of a Undo delete
// of a zone of an actor while another actor is edited). In this case, we do nothing
if (! pParent) return;
if (m_pList1Window -> IsEditingBoundingVolume ()) OnSelectBoundingVolume (pSuperObject , pParent , eType);
else
// ANNECY AV CLEAN_MEC {
/*
if (m_pList1Window -> IsEditingTestPoint ()) OnSelectTestPoint (pSuperObject , pParent , eType);
else
*/
// END ANNECY AV }
if (m_pList1Window -> IsEditingZDxOfModule ()) OnSelectZDxOfModule (pSuperObject , pParent , eType);
else OnSelectZDxOfActor (pSuperObject , pParent , eType);
}
else
// We see if a module is selected
if (m_pList1Window -> IsEditingZDxOfModule () && pObject -> fn_bIsOfType (C_szPhysicalObjectTypeName))
OnSelectModule (pSuperObject , eType);
else
// We see if the parent of the selected object is an actor
{
CPA_SuperObject * pParent = pSuperObject -> GetSuperObjectFather ();
CPA_BaseObject * pObjectParent = pParent ? pParent -> GetObject () : NULL;
if (pObjectParent && pObjectParent -> fn_bIsOfType (C_szActorInstanceTypeName)) OnSelectActor (pParent , eType);
}
}
//*****************************************************************************
// Virtual functions of the base class : Windows messages
//*****************************************************************************
//-----------------------------------------------------------------------------
// Class ZDx_Interface - _OnKeyDown
// This function is called when a key is pressed
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::_OnKeyDown (UINT _nChar , UINT , UINT)
{
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
//CPA2 (Corneliu Babiuc) 13-04-1997
if (m_pZDxKeyActionConfiguration -> mfn_uwKeyToAction (_nChar) == KA_MOVE_ONLY_ACTOR)
{
m_bMoveOnlyActorKeyPressed = TRUE;
return FALSE; // We have used the message
}
//CPA2 (Corneliu Babiuc) 13-04-1997//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
/*
if (m_pZDxKeyActionConfiguration -> mfn_uwKeyToAction (_nChar) == KA_CHANGE_ZDX_SIZE)
m_bSizeKeyPressed = TRUE;
return FALSE; // We have used the message
*/
return Shape3D::_OnKeyDown (_nChar);
//ENDROMTEAM WorldEditor (Cristi Petrescu)
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - _OnKeyUp
// This function is called when a key is released
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::_OnKeyUp (UINT _nChar , UINT , UINT)
{
//CPA2 (Corneliu Babiuc) 13-04-1997
if (m_pZDxKeyActionConfiguration -> mfn_uwKeyToAction (_nChar) == KA_MOVE_ONLY_ACTOR)
{
m_bMoveOnlyActorKeyPressed = FALSE;
return FALSE; // We have used the message
}
//CPA2 (Corneliu Babiuc) 13-04-1997
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
/*
if (m_pZDxKeyActionConfiguration -> mfn_uwKeyToAction (_nChar) == KA_CHANGE_ZDX_SIZE)
m_bSizeKeyPressed = FALSE;
return FALSE; // We have used the message
*/
return Shape3D::_OnKeyUp (_nChar);
//ENDROMTEAM WorldEditor (Cristi Petrescu)
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnMouseMove
// Used when one changes the size of the ZDx object
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::_OnMouseMove (UINT nFlags , tdstMousePos * p_stMousePos , MTH3D_tdstVector * pDeplacement)
{
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
/*
// If we are not in "size changing" mode, we don't use the message
if (m_stSizeChangingMode . bActiveMode == FALSE )//|| m_bSizeKeyPressed == FALSE)
return FALSE;
*/
ZDx_Object *pZDxObject = m_pEditWindow -> GetZDxObjectEdited ();
/*
ZDx_Object *pZDxObject = (ZDx_Object *)m_stSizeChangingMode . pSelectedZDxSuperObject -> GetObject ();
-> GetObject ()
*/
if (pZDxObject && pZDxObject -> GetZDxShape () -> GetGeometric3dObject () -> _OnMouseMove (nFlags, p_stMousePos, pDeplacement))
{
// we made the resizing
IWillRefreshDisplay (C_lOnMouseMove);
/*
// Change the size of the ZDx object
switch (((ZDx_Object *) m_stSizeChangingMode . pSelectedZDxSuperObject -> GetObject ()) -> GetZDxGeometricType ())
{
case eSphere : ChangeSizeZDxSphereObject (pDeplacement); break;
case eBox : ChangeSizeZDxBoxObject (pDeplacement); break;
case eCone : ChangeSizeZDxConeObject (pDeplacement); break;
default: ASSERT (0); break;
}
*/
m_pEditWindow -> RefreshData (FALSE); // Refresh the data of the window without redrawing the ZDx object
m_pEditWindow -> RefreshModif (); // Reinitialize the modif for the ZDx object
RefreshDisplay (C_lOnMouseMove); // Redraw the world
return TRUE;
}
else
return FALSE;
//ENDROMTEAM WorldEditor (Cristi Petrescu)
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnLButtonDown
// Clic on the left button + Ctrl : we change the size of the ZDx object
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::_OnLButtonDown (UINT nFlags , tdstMousePos * p_stMousePos , ACP_tdxIndex xIndex , HIE_tdstPickInfo * p_stObject)
{
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
/*
// If the key to change the size is not pressed, we don't use the message
if (! m_bSizeKeyPressed) return FALSE;
// We begin the change of the size of a ZDx object
OnBeginChangingSize (xIndex , p_stObject);
*/
// we ask if there is a pointed zdd, zde, zdm, zdr or bounding volume
CString TypeList [5] = { C_szZddName , C_szZdeName , C_szZdmName , C_szZdrName , C_szBoundingVolumeName};
CPA_List<CPA_SuperObject> * pSelectedSuperObjectList = GetInterface () -> GetMouseSelection (xIndex , p_stObject , TypeList , 5);
// if the list is empty, we do nothing
if (pSelectedSuperObjectList -> IsEmpty ())
return FALSE;
// else, we select the first super object in the list
CPA_SuperObject * pSelectedSuperObject = pSelectedSuperObjectList -> GetHeadElement ();
ZDx_Object * pZDxObject = (ZDx_Object *) pSelectedSuperObject -> GetObject ();
/*
// one can only change the size of a sphere, box or cone ZDx object
tdeZDxGeometricType eZDxType = pZDxObject -> GetZDxGeometricType ();
if (eZDxType != eSphere && eZDxType != eBox && eZDxType != eCone)
return;
*/
// if the pointed ZDx object is not the actual selected ZDx object, we select it
if (pZDxObject != m_pEditWindow -> GetZDxObjectEdited ())
{
GetInterface () -> fn_vCancelCurrentSelection (FALSE);
GetInterface () -> fn_vAddSelectedObject (pSelectedSuperObject , TRUE);
}
// enter the "size changing" mode
//m_stSizeChangingMode . bActiveMode = TRUE;
//m_stSizeChangingMode . pSelectedZDxSuperObject = pSelectedSuperObject;
//m_stSizeChangingMode . GlobalSelectedPoint = p_stObject->stPickedObject.aDEF_stDataOfElement->stHit;
/*
switch (pZDxObject -> GetZDxGeometricType ())
{
case eSphere:
{
// Get the center of the sphere
ZDx_Sphere * pSphere = (ZDx_Sphere *) pZDxObject -> GetZDxShape ();
MTH3D_tdstVector SphereCenter;
// Compute coordinates in the global repere
ConvertPointLocalToGlobal (& SphereCenter ,
HIE_fn_hGetSuperObjectGlobalMatrix (m_stSizeChangingMode .
pSelectedZDxSuperObject -> GetStruct ()) , & pSphere -> GetCenter ());
// Get the matrix of the camera
GLI_tdxHandleToCamera hHandleToCamera = GetInterface () -> GetMultiDevice () -> GetFocusDevice () -> GetCamera ();
POS_tdstCompletePosition CameraMatrix , InvMatrix;
GLI_xGetCameraMatrix (hHandleToCamera , & CameraMatrix);
POS_fn_vInvertIsoMatrix(& InvMatrix , & CameraMatrix);
// Get the coordinates of the Z axe
MTH3D_tdstVector ZAxe , DummyVector;
POS_fn_vGetRotationMatrix(& InvMatrix , & DummyVector , & DummyVector , & ZAxe);
// Compute the sphere center, projected into the plane where the mouse moves into
MTH3D_M_vSubVector (& SphereCenter , & SphereCenter , & m_stSizeChangingMode . GlobalSelectedPoint);
GLI_tdxValue DotProduct = MTH3D_M_xDotProductVector (& ZAxe , & SphereCenter);
MTH3D_M_vMulScalarVector (& ZAxe , DotProduct , & ZAxe);
MTH3D_M_vSubVector (& SphereCenter , & SphereCenter , & ZAxe);
MTH3D_M_vAddVector (& m_stSizeChangingMode . CenterInMousePlane ,
& SphereCenter , & m_stSizeChangingMode . GlobalSelectedPoint);
}
break;
case eBox:
{
ZDx_Box * pBox = (ZDx_Box *) pZDxObject -> GetZDxShape ();
ConvertPointGlobalToLocal (& m_stSizeChangingMode . LocalSelectedPoint ,
HIE_fn_hGetSuperObjectGlobalMatrix (pSelectedSuperObject -> GetStruct ()) ,
& m_stSizeChangingMode . GlobalSelectedPoint);
MTH3D_M_vSubVector (& m_stSizeChangingMode . LocalSelectedPoint , & m_stSizeChangingMode . LocalSelectedPoint ,
& pBox -> GetCenter ());
m_stSizeChangingMode . LocalSelectedPoint . xX /= pBox -> GetLength ();
m_stSizeChangingMode . LocalSelectedPoint . xY /= pBox -> GetWidth ();
m_stSizeChangingMode . LocalSelectedPoint . xZ /= pBox -> GetHeight ();
}
break;
case eCone:
{
ZDx_Cone * pCone = (ZDx_Cone *) pZDxObject -> GetZDxShape ();
ConvertPointGlobalToLocal (& m_stSizeChangingMode . LocalSelectedPoint ,
HIE_fn_hGetSuperObjectGlobalMatrix (pSelectedSuperObject -> GetStruct ()) ,
& m_stSizeChangingMode . GlobalSelectedPoint);
// We see if we must change the top point or the radius of the cone
MTH3D_tdstVector TopPoint = pCone -> GetTopPoint ();
MTH3D_tdstVector BasePoint = pCone -> GetBasePoint ();
MTH_tdxReal SquareDistanceToTopPoint = MTH3D_M_xVectorGapSqr (& m_stSizeChangingMode . LocalSelectedPoint , & TopPoint);
MTH_tdxReal SquareDistanceToBasePoint = MTH3D_M_xVectorGapSqr (& m_stSizeChangingMode . LocalSelectedPoint , & BasePoint);
if (SquareDistanceToTopPoint < SquareDistanceToBasePoint)
{
m_stSizeChangingMode . bChangeTopPointOfCone = TRUE;
}
else
{
m_stSizeChangingMode . bChangeTopPointOfCone = FALSE;
// We project the picked point into the base plane
MTH3D_tdstVector BaseTopVector;
MTH3D_M_vSubVector (& BaseTopVector , & TopPoint , & BasePoint);
MTH3D_tdstVector BasePointVector;
MTH3D_M_vSubVector (& BasePointVector , & m_stSizeChangingMode . LocalSelectedPoint , & BasePoint);
MTH_tdxReal DotProduct = MTH3D_M_xDotProductVector (& BaseTopVector , & BasePointVector);
MTH3D_tdstVector ProjectedVector;
MTH3D_M_vMulScalarVector (& ProjectedVector , DotProduct , & BaseTopVector);
MTH3D_M_vDivScalarVector (& ProjectedVector , & ProjectedVector , MTH3D_M_xSqrVector (& BaseTopVector));
MTH3D_M_vAddVector (& m_stSizeChangingMode . LocalSelectedPoint ,
& m_stSizeChangingMode . LocalSelectedPoint , & ProjectedVector);
}
break;
}
default:
ASSERT (0);
break;
}
*/
if (pZDxObject -> GetZDxShape () -> GetGeometric3dObject () -> _OnLButtonDown (nFlags, p_stMousePos, xIndex, p_stObject))
{
// we create a modif for the Undo
if (m_pEditWindow -> GetZDxObjectEdited ())
{
m_stSizeChangingMode.pZDxModif =
new ZDx_Modif (/*(ZDx_Object *) m_stSizeChangingMode . pSelectedZDxSuperObject -> GetObject ()*/m_pEditWindow -> GetZDxObjectEdited () , "Changing ZDx size");
}
}
return FALSE; // We do not use the message, so the hierarchy editor can make its initialization for moving the oject
//ENDROMTEAM WorldEditor (Cristi Petrescu)
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnLButtonUp
// End of the clic on the right button : end of the changement of the size of the ZDx object
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::_OnLButtonUp (UINT nFlags , tdstMousePos * p_stPos)
{
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
// if we are not in "size changing" mode, we don't use the message
/*
if (! m_stSizeChangingMode . bActiveMode) return FALSE;
OnEndChangingSize (); // We end the change of the size of a ZDx object
*/
ZDx_Object * pZDxObject = m_pEditWindow -> GetZDxObjectEdited ();
pZDxObject && pZDxObject -> GetZDxShape () -> GetGeometric3dObject () -> _OnLButtonUp (nFlags, p_stPos);
if (m_stSizeChangingMode.pZDxModif)
{
m_stSizeChangingMode . pZDxModif -> Undo (FALSE);
// ... because the edit manager redoes them
GetInterface () -> GetMultiDevice () -> GetEditManager () -> AskFor (m_stSizeChangingMode . pZDxModif);
}
m_stSizeChangingMode.pZDxModif = NULL;
return FALSE; // We do not use the message, so the hierarchy editor can make the end of a move
//ENDROMTEAM WorldEditor (Cristi Petrescu)
}
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnLButtonDblClk
// Double clic on the left button : we launch the dialog for changing the objects
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::_OnLButtonDblClk (UINT nFlags, tdstMousePos *p_stPos, ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stPickInfo)
{
// BEGIN CPA2 Cristi Petrescu 97-11-18
CString TypeList [5] = { C_szZddName , C_szZdeName , C_szZdmName , C_szZdrName , C_szBoundingVolumeName};
CPA_List<CPA_SuperObject> * pSelectedSuperObjectList = GetInterface () -> GetMouseSelection (xIndex , p_stPickInfo , TypeList , 5);
// if the list is empty, we do nothing
if (pSelectedSuperObjectList -> IsEmpty ())
return FALSE;
// else, we select the first super object in the list
CPA_SuperObject * pSelectedSuperObject = pSelectedSuperObjectList -> GetHeadElement ();
ZDx_Object * pZDxObject = (ZDx_Object *) pSelectedSuperObject -> GetObject ();
// if the pointed ZDx object is not the actual selected ZDx object, we select it
if (pZDxObject != m_pEditWindow -> GetZDxObjectEdited ())
{
GetInterface () -> fn_vCancelCurrentSelection (FALSE);
GetInterface () -> fn_vAddSelectedObject (pSelectedSuperObject , TRUE);
}
// we will make a modification, so we might wanna undo it
ZDx_Modif *pZDxModif = new ZDx_Modif (m_pEditWindow -> GetZDxObjectEdited () , "Edit ZDx");
if (pZDxObject -> GetZDxShape () -> GetGeometric3dObject () -> _OnLButtonDblClk (nFlags, p_stPos, xIndex, p_stPickInfo))
{
pZDxModif -> Undo (FALSE);
// ... because the edit manager redoes them
GetInterface () -> GetMultiDevice () -> GetEditManager () -> AskFor (pZDxModif);
}
return FALSE;
}
//ENDROMTEAM WorldEditor (Cristi Petrescu)
//*****************************************************************************
// Internal functions for questions
//*****************************************************************************
//-----------------------------------------------------------------------------
// Class ZDx_Interface - AcceptModifInsertZDxOfActor
// This function is called before a ZDx of actor is inserted into the hierarchy
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::AcceptModifInsertZDxOfActor (CPA_SuperObject * pSuperObjectToInsert , CPA_SuperObject * pParent)
{
// The parent must be an actor
CPA_BaseObject * pActor = pParent -> GetObject ();
ASSERT (pActor -> fn_bIsOfType (C_szActorInstanceTypeName));
// We check if the selected position in the list of zones is empty
tdeZDxType eZDxType;
long lPosition;
if (m_pList2Window -> GetSelectedZDx (& eZDxType , & lPosition) != NULL || lPosition == -1)
{
// if not, we try to select a empty position. If there is not, don't accept the insertion
if (! m_pList2Window -> SelectZDx (NULL , TRUE)) return FALSE;
m_pList2Window -> GetSelectedZDx (& eZDxType , & lPosition);
}
// Insert the ZDx into the selected position
ZDx_Object * pZDxObject = (ZDx_Object *) pSuperObjectToInsert -> GetObject ();
ASSERT (eZDxType == pZDxObject -> GetZDxType ());
SetZDxObjectInList (pActor , eZDxType , lPosition , pZDxObject , eZDxNormal);
return TRUE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - AcceptModifInsertZDxOfModule
// This function is called before a ZDx of module is inserted into the hierarchy
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::AcceptModifInsertZDxOfModule (CPA_SuperObject * pSuperObjectToInsert , CPA_SuperObject * pParent)
{
// The parent must be a Physical Object
ASSERT (pParent -> GetObject () -> fn_bIsOfType (C_szPhysicalObjectTypeName));
EditorPO * pPhysicalObject = (EditorPO *) pParent -> GetObject ();
ZDx_Object * pZDxObject = (ZDx_Object *) pSuperObjectToInsert -> GetObject ();
tdeZDxType eZDxType = pZDxObject -> GetZDxType ();
// We see if the physical object already has a ZDx with the same type
if (GetZDxOfPhysicalObject (pPhysicalObject , eZDxType))
{
CString Message = "The module already has a ";
Message += GetZDxTypeName (eZDxType);
MessageBox (NULL , Message , "Warning" , MB_OK + MB_ICONSTOP + MB_TASKMODAL);
return FALSE;
}
// We set the ZDx into the physical object
SetZDxOfPhysicalObject (pPhysicalObject , pZDxObject , eZDxType);
return TRUE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - AcceptModifInsertBoundingVolume
// This function is called before a ZDx which is a bounding volume is inserted into the hierarchy
//-----------------------------------------------------------------------------
BOOL ZDx_Interface::AcceptModifInsertBoundingVolume (CPA_SuperObject * pSuperObjectToInsert , CPA_SuperObject * pParent)
{
// The parent must be an actor
CPA_BaseObject * pActor = pParent -> GetObject ();
ASSERT (pActor -> fn_bIsOfType (C_szActorInstanceTypeName));
// The selected position in list 2 must be empty
return m_pList2Window -> GetSelectedZDx () == NULL;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - AcceptModifInsertTestPoint
// This function is called before a ZDx which is a test point is inserted into the hierarchy
//-----------------------------------------------------------------------------
// ANNECY AV CLEAN_MEC {
/*
BOOL ZDx_Interface::AcceptModifInsertTestPoint (CPA_SuperObject * pSuperObjectToInsert , CPA_SuperObject * pParent)
{
// The parent must be an actor
CPA_BaseObject * pActor = pParent -> GetObject ();
ASSERT (pActor -> fn_bIsOfType (C_szActorInstanceTypeName));
// We check if the selected position in the list of zones is empty
if (m_pList2Window -> GetSelectedZDx () != NULL)
{
// if not, we try to select a empty position. If there is not, don't accept the insertion
if (! m_pList2Window -> SelectZDx (NULL , TRUE)) return FALSE;
}
return TRUE;
}
*/
// END ANNECY AV }
//*****************************************************************************
// Internal functions for modifications
//*****************************************************************************
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnInsertActor
// Called when an actor is inserted into the hierarchy
//-----------------------------------------------------------------------------
void ZDx_Interface::OnInsertActor (CPA_SuperObject * _pActorSuperObject)
{
IWillRefreshDisplay (C_lOnInsertActor);
m_pList1Window -> ReCreateCurrentList ();
RefreshDisplay (C_lOnInsertActor , FALSE); // Hierarchy editor will refresh the display
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnDeleteActor
// Called when an actor is deleted from the hierarchy
//-----------------------------------------------------------------------------
void ZDx_Interface::OnDeleteActor (CPA_SuperObject * _pActorSuperObject)
{
IWillRefreshDisplay (C_lOnDeleteActor);
m_pList1Window -> ReCreateCurrentList ();
RefreshDisplay (C_lOnDeleteActor , FALSE); // Hierarchy editor will refresh the display
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnInsertZDxOfActor
// Called when a ZDx of actor is inserted into the hierarchy
//-----------------------------------------------------------------------------
void ZDx_Interface::OnInsertZDxOfActor (CPA_SuperObject * _pZDxSuperObject , CPA_SuperObject * _pActorSuperObject)
{
IWillRefreshDisplay (C_lOnInsertZDxOfActor);
// We refresh the position of the ZDx object
ZDx_Object * pZDxObject = (ZDx_Object *) _pZDxSuperObject -> GetObject ();
pZDxObject -> GetZDxShape () -> RefreshData (_pZDxSuperObject);
//CPA2 Stegaru Cristian 98-04
//if necessary, add new zone to the bounding volume
if ((pZDxObject->GetZDxType() == eZdm) ||(pZDxObject->GetZDxType() == eZdr))
{
ACP_tdxHandleOfObject hGeomObject = (ACP_tdxHandleOfObject)pZDxObject->GetData ();
CPA_Actor *pActor = (CPA_Actor *)_pActorSuperObject->GetObject ();
CPA_Family *pFamily = pActor->m_pub_fn_pclGetFamily();
CPA_BaseObject *pBVolume = pFamily->mfn_p_oGetBoundingVolume ();
MTH3D_tdstVector stCenter;
MTH_tdxReal xRadius;
if (NULL != pBVolume) //the actor has a bounding volume
{
ACP_tdxHandleOfObject hBoundingVolume = (ACP_tdxHandleOfObject)pBVolume->GetData ();
if (mfn_bObjectIsOutsideTheBV ((ZDx_Object *)pBVolume, pZDxObject))
{
if (IDYES == AfxMessageBox ("New zone is outside the bounding volume. Do you want to adjust the bounding volume?", MB_YESNO | MB_ICONQUESTION))
{
GEO_fn_vAddObjectToSphere(hGeomObject, &stCenter, &xRadius);
//ANNECY TQ 19/06/98{
GEO_fn_vSetGeometricSphere(&stCenter, xRadius, hBoundingVolume);
((ZDx_Object *)pBVolume)->fn_vNotifySave ();
//ENDANNECY TQ}
}
}
}
}
//End CPA2 Stegaru Cristian 98-04
// We put the ZDx object at its correct position into the list of zone
SetZDxObjectInList (_pActorSuperObject -> GetObject () , pZDxObject -> GetZDxType () , pZDxObject -> GetIndexInList () ,
pZDxObject , eZDxModifyAllActors);
// We refresh the current list
m_pList1Window -> SelectZDxOfActor (_pActorSuperObject -> GetObject () , pZDxObject , TRUE);
RefreshDisplay (C_lOnInsertZDxOfActor , FALSE); // Hierarchy editor will refresh the display
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnDeleteZDxOfActor
// Called when a ZDx of actor is deleted from the hierarchy
//-----------------------------------------------------------------------------
void ZDx_Interface::OnDeleteZDxOfActor (CPA_SuperObject * _pZDxSuperObject , CPA_SuperObject * _pActorSuperObject)
{
// check if this is really an actor
if (_pActorSuperObject->GetObject() && _pActorSuperObject->GetObject()->fn_bIsOfType (C_szActorInstanceTypeName))
{
IWillRefreshDisplay (C_lOnDeleteZDxOfActor);
// We get the list of ZDx of the actor
ZDx_Object * pZDxObject = (ZDx_Object *) _pZDxSuperObject -> GetObject ();
CPA_BaseObject * pActor = _pActorSuperObject -> GetObject ();
EdtList * pListOfZDx = GetZDxList (pActor , pZDxObject -> GetZDxType ());
ASSERT (pListOfZDx);
// We remove the ZDx object from the list
RemoveZDxFromList (pListOfZDx , pZDxObject , pActor , TRUE);
tdeZDxType eZDxType;
long lPosition;
m_pList2Window -> GetSelectedZDx (& eZDxType , & lPosition);
m_pList1Window -> ReCreateCurrentList ();
m_pList2Window -> SelectZDx (eZDxType , lPosition);
RefreshDisplay (C_lOnDeleteZDxOfActor , FALSE); // Hierarchy editor will refresh the display
}
else
OnDeleteZDxOfModule(_pZDxSuperObject, _pActorSuperObject);
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnInsertZDxOfModule
// Called when a ZDx of module is inserted into the hierarchy
//-----------------------------------------------------------------------------
void ZDx_Interface::OnInsertZDxOfModule (CPA_SuperObject * _pZDxSuperObject , CPA_SuperObject * _pModuleSuperObject)
{
IWillRefreshDisplay (C_lOnInsertZDxOfModule);
ZDx_Object * pZDxObject = (ZDx_Object *) _pZDxSuperObject -> GetObject ();
EditorPO * pModule = (EditorPO *) _pModuleSuperObject -> GetObject ();
// We refresh the position of the ZDx object
pZDxObject -> GetZDxShape () -> RefreshData (_pZDxSuperObject);
// We put the ZDx object into the physical object
SetZDxOfPhysicalObject (pModule , pZDxObject , pZDxObject -> GetZDxType ());
// We refresh the current list
m_pList1Window -> SelectZDxOfModule (pModule , pZDxObject , TRUE);
RefreshDisplay (C_lOnInsertZDxOfModule , FALSE); // Hierarchy editor will refresh the display
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnDeleteZDxOfModule
// Called when a ZDx of module is deleted from the hierarchy
//-----------------------------------------------------------------------------
void ZDx_Interface::OnDeleteZDxOfModule (CPA_SuperObject * _pZDxSuperObject , CPA_SuperObject * _pModuleSuperObject)
{
IWillRefreshDisplay (C_lOnDeleteZDxOfModule);
ZDx_Object * pZDxObject = (ZDx_Object *) _pZDxSuperObject -> GetObject ();
EditorPO * pModule = (EditorPO *) _pModuleSuperObject -> GetObject ();
// We remove the ZDx object from the physical object
SetZDxOfPhysicalObject (pModule , NULL , pZDxObject -> GetZDxType ());
ShowZDxOfModule (_pModuleSuperObject , C_ucHideAllZDx , NULL);
m_pList1Window -> ReCreateCurrentList ();
RefreshDisplay (C_lOnDeleteZDxOfModule , FALSE); // Hierarchy editor will refresh the display
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnInsertBoundingVolume
// Called when a ZDx that is a bounding volume is inserted into the hierarchy
//-----------------------------------------------------------------------------
void ZDx_Interface::OnInsertBoundingVolume (CPA_SuperObject * _pBoundingVolumeSuperObject , CPA_SuperObject * _pActorSuperObject, BOOL bCreateBdV)
{
IWillRefreshDisplay (C_lOnInsertBV);
ZDx_Object * pBoundingVolume = (ZDx_Object *) _pBoundingVolumeSuperObject -> GetObject ();
CPA_BaseObject * pActor = _pActorSuperObject -> GetObject ();
// We get the family of the actor
CPA_Family * pFamily = (CPA_Family *) pActor -> GetOwner () -> GetOwner ();
// We set the reference to the new bounding volume
pFamily -> mfn_vSetBoundingVolume (pBoundingVolume);
m_pList2Window -> CreateBoundingVolume (_pActorSuperObject , pBoundingVolume, TRUE, bCreateBdV);
SetAspectOfZDx (_pBoundingVolumeSuperObject , TRUE);
RefreshDisplay (C_lOnInsertBV , FALSE); // Hierarchy editor will refresh the display
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnDeleteBoundingVolume
// Called when a ZDx that is a bounding volume is deleted from the hierarchy
//-----------------------------------------------------------------------------
void ZDx_Interface::OnDeleteBoundingVolume (CPA_SuperObject * _pBoundingVolumeSuperObject , CPA_SuperObject * _pActorSuperObject)
{
IWillRefreshDisplay (C_lOnDeleteBV);
ZDx_Object * pBoundingVolume = (ZDx_Object *) _pBoundingVolumeSuperObject -> GetObject ();
CPA_BaseObject * pActor = _pActorSuperObject -> GetObject ();
// We get the family of the actor
CPA_Family * pFamily = (CPA_Family *) pActor -> GetOwner () -> GetOwner ();
// We set the reference of the bounding volume to NULL
pFamily -> mfn_vSetBoundingVolume (NULL);
m_pList2Window -> CreateBoundingVolume (_pActorSuperObject , NULL);
RefreshDisplay (C_lOnDeleteBV , FALSE); // Hierarchy editor will refresh the display
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnInsertTestPoint
// Called when a ZDx that is a test point is inserted into the hierarchy
//-----------------------------------------------------------------------------
// ANNECY AV CLEAN_MEC {
/*
void ZDx_Interface::OnInsertTestPoint (CPA_SuperObject * _pTestPointSuperObject , CPA_SuperObject * _pActorSuperObject)
{
IWillRefreshDisplay (C_lOnInsertTestPoint);
ZDx_Object * pZDxObject = (ZDx_Object *) _pTestPointSuperObject -> GetObject ();
CPA_TestPointsList * pListOfTestPoint = m_pList2Window -> GetListOfTestPoint ();
CPA_TestPointNode * pTestPoint;
if (pZDxObject -> GetTestPoint ())
{
pTestPoint = pZDxObject -> GetTestPoint ();
// Reinsert the test point into the list of test points
pListOfTestPoint -> m_oListOfTestPoints . AddTail (pTestPoint);
}
else
{
// We ask the Family tool dll to create a new test point
CPA_ToolDLLBase * pFamilyDll = GetMainWorld () -> GetToolDLLWithName (C_szDLLFamilyName);
ASSERT (pFamilyDll);
// This create a new test point and put it into the current list of test points
pTestPoint = (CPA_TestPointNode *) pFamilyDll -> OnQueryAction (this , C_uiGetTestPoint , (LPARAM) pListOfTestPoint);
pTestPoint -> SetZdxObject (pZDxObject);
pTestPoint -> SetKindOfPoint (m_pList2Window -> GetTypeOfSelectedTestPoint ());
pZDxObject -> SetTestPoint (pTestPoint);
}
// We refresh the position of the ZDx object
pZDxObject -> GetZDxShape () -> RefreshData (_pTestPointSuperObject);
MTH3D_tdstVector stPosition = pZDxObject -> GetZDxShape () -> GetCenter ();
pTestPoint -> SetPosition (& stPosition);
m_pList2Window -> CreateListOfTestPoint (_pActorSuperObject , pListOfTestPoint);
pListOfTestPoint -> fn_vNotifySave ();
RefreshDisplay (C_lOnInsertTestPoint , FALSE); // Hierarchy editor will refresh the display
}
*/
// END ANNECY AV }
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnDeleteTestPoint
// Called when a ZDx that is a test point is deleted from the hierarchy
//-----------------------------------------------------------------------------
// ANNECY AV CLEAN_MEC {
/*
void ZDx_Interface::OnDeleteTestPoint (CPA_SuperObject * _pTestPointSuperObject , CPA_SuperObject * _pActorSuperObject)
{
IWillRefreshDisplay (C_lOnDeleteTestPoint);
// We get the ZDx object
ZDx_Object * pZDxObject = (ZDx_Object *) _pTestPointSuperObject -> GetObject ();
// We get the current list of test points
CPA_TestPointsList * pListOfTestPoint = m_pList2Window -> GetListOfTestPoint ();
// We find the test point of the list that have this ZDx object
POSITION PosTestPoint = pListOfTestPoint -> m_oListOfTestPoints . GetHeadPosition ();
CPA_TestPointNode * pTestPoint;
while (PosTestPoint)
{
pTestPoint = pListOfTestPoint -> m_oListOfTestPoints . GetAt (PosTestPoint);
if (pTestPoint -> mfn_p_oGetZdxObject () == pZDxObject) break;
pListOfTestPoint -> m_oListOfTestPoints . GetNext (PosTestPoint);
}
ASSERT (PosTestPoint); // PosTestPoint == NULL --> not found -> error
// Remove the test point from the list but do not delete it (in case of Undo)
pListOfTestPoint -> m_oListOfTestPoints . RemoveAt (PosTestPoint);
m_pList2Window -> CreateListOfTestPoint (_pActorSuperObject , pListOfTestPoint);
pListOfTestPoint -> fn_vNotifySave ();
RefreshDisplay (C_lOnDeleteTestPoint , FALSE); // Hierarchy editor will refresh the display
}
*/
// END ANNECY AV }
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnSelectActor
// Called when an actor is selected or unselected
//-----------------------------------------------------------------------------
void ZDx_Interface::OnSelectActor (CPA_SuperObject * _pActorSuperObject , tdeTypeModif eType)
{
// If we are editing a bounding volume, we do nothing
if (m_pList1Window -> IsEditingBoundingVolume ()) return;
CPA_BaseObject * pActor = _pActorSuperObject -> GetObject ();
m_bIsSelectingObject = TRUE;
if (eType != C_EDTUndo) // Selection of an actor
{
IWillRefreshDisplay (C_lOnSelectActor);
ShowZDxOfActor (_pActorSuperObject , m_pList2Window -> GetZDxTypeToShow ());
if (! m_bIsAskingToSelectObject) m_pList1Window -> SelectInstance (pActor , FALSE);
RefreshDisplay (C_lOnSelectActor , FALSE); // Interface will refresh the display
}
else m_pActorSuperObjectToUnselect = _pActorSuperObject; // Unselection of an actor
m_bIsSelectingObject = FALSE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnSelectZDxOfActor
// Called when a ZDx of actor is selected or unselected
//-----------------------------------------------------------------------------
void ZDx_Interface::OnSelectZDxOfActor (CPA_SuperObject * _pZDxSuperObject , CPA_SuperObject * _pActorSuperObject , tdeTypeModif eType)
{
m_bIsSelectingObject = TRUE;
ZDx_Object * pZDxObject = (ZDx_Object *) _pZDxSuperObject -> GetObject ();
CPA_BaseObject * pActor = _pActorSuperObject -> GetObject ();
if (eType != C_EDTUndo) // Selection of a ZDx of an actor
{
IWillRefreshDisplay (C_lOnSelectZDxOfActor);
if (! m_bIsAskingToSelectObject) m_pList1Window -> SelectZDxOfActor (pActor , pZDxObject , FALSE);
ShowZDxOfActor (_pActorSuperObject , m_pList2Window -> GetZDxTypeToShow () , pZDxObject);
RefreshDisplay (C_lOnSelectZDxOfActor , FALSE); // Interface will refresh the display
}
else m_pActorSuperObjectToUnselect = _pActorSuperObject; // Unselection of a ZDx of an actor
m_bIsSelectingObject = FALSE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnSelectedModule
// Called when a module is selected or unselected
//-----------------------------------------------------------------------------
void ZDx_Interface::OnSelectModule (CPA_SuperObject * _pModuleSuperObject , tdeTypeModif eType)
{
m_bIsSelectingObject = TRUE;
if (eType != C_EDTUndo) // Selection of a module
{
ShowZDxOfModule (_pModuleSuperObject , m_pList2Window -> GetZDxTypeToShow ());
if (! m_bIsAskingToSelectObject) m_pList1Window -> SelectModule (_pModuleSuperObject -> GetObject () , FALSE);
}
else m_pModuleSuperObjectToUnselect = _pModuleSuperObject; // Unselection of a module
m_bIsSelectingObject = FALSE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnSelectZDxOfModule
// Called when a ZDx of a module is selected or unselected
//-----------------------------------------------------------------------------
void ZDx_Interface::OnSelectZDxOfModule (CPA_SuperObject * _pZDxSuperObject , CPA_SuperObject * _pModuleSuperObject , tdeTypeModif eType)
{
m_bIsSelectingObject = TRUE;
ZDx_Object * pZDxObject = (ZDx_Object *) _pZDxSuperObject -> GetObject ();
EditorPO * pModule = (EditorPO *) _pModuleSuperObject -> GetObject ();
if (eType != C_EDTUndo) // Selection of a ZDx of a module
{
ShowZDxOfModule (_pModuleSuperObject , m_pList2Window -> GetZDxTypeToShow () , pZDxObject);
if (! m_bIsAskingToSelectObject) m_pList1Window -> SelectZDxOfModule (pModule , pZDxObject , FALSE);
}
else m_pModuleSuperObjectToUnselect = _pModuleSuperObject; // Unselection of a ZDx of a module
m_bIsSelectingObject = FALSE;
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnSelectBoundingVolume
// Called when a ZDx that is a bounding volume is selected or unselected
//-----------------------------------------------------------------------------
void ZDx_Interface::OnSelectBoundingVolume (CPA_SuperObject * _pZDxSuperObject , CPA_SuperObject * _pModuleSuperObject , tdeTypeModif eType)
{
// We do nothing when the user tries to select or unselect a bounding volume
}
//-----------------------------------------------------------------------------
// Class ZDx_Interface - OnSelectTestPoint
// Called when a ZDx that is a test point is selected or unselected
//-----------------------------------------------------------------------------
// ANNECY AV CLEAN_MEC {
/*
void ZDx_Interface::OnSelectTestPoint (CPA_SuperObject * _pZDxSuperObject , CPA_SuperObject * _pModuleSuperObject , tdeTypeModif eType)
{
//???
}
*/
// END ANNECY AV }
//ROMTEAM WorldEditor (Cristi Petrescu 12/97)
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : long ZDx_Interface::m_lGetTypeOfZoneByGeometricObject(Geometry3D * pGeometry3D)
// Date : 97.12.12
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Tells the type of the zone which have its geometric3d member equal with the supplied geometric object
// Done by searching the list of zones. Hmmm, not very efficient
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
long ZDx_Interface::m_lGetTypeOfZoneByGeometricObject(Geometry3D * pGeometry3D)
{
Position xPos;
ZDx_Object *poZoneObject;
int iZoneType;
// ANNECY AV CLEAN_MEC {
char *a6szZoneTypeName[6] = {C_szZddName,
C_szZdeName,
C_szZdrName,
C_szZdmName,
C_szBoundingVolumeName/*,
C_szTestPointName*/};
// search in all six lists
// it seems that is no ForEach implemented for the objects in a editor
for (iZoneType = 0; iZoneType < 5/*6*/; iZoneType++)
// END ANNECY AV }
{
CPA_BaseObjectList *poZoneObjectList = GetBaseObjectList (a6szZoneTypeName [iZoneType]);
for (xPos = poZoneObjectList -> GetHeadPosition (); xPos; poZoneObjectList -> GetNext(xPos))
{
poZoneObject = (ZDx_Object *) poZoneObjectList -> GetAt (xPos);
if (poZoneObject -> GetZDxShape () -> GetGeometric3dObject () == pGeometry3D)
// this is the one
return poZoneObject -> GetDataType ();
}
}
return -1;
}
//ENDROMTEAM WorldEditor (Cristi Petrescu)
//CPA2 (Corneliu Babiuc) 15-04-1998
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : void ZDx_Interface::MoveBackZone(CPA_SuperObject * pZDxSuperObject,
// MTH3D_tdstVector * p_stVector)
// Date : 15-04-1998
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Sets the local translation vector of a zone to keep unchanged its global position
// This is done recalculating the local translation from its father global move
// Parameters:
// _pZDxSuperObject - pointer to zone superobjects who has to be moved
// p_stVector - pointer to MTH3D_tdstVector representing the global deplacement
// if it is NULL recompute the position
// Author : Corneliu Babiuc
//////////////////////////////////////////////////////////////////////////////////////////////////////
void ZDx_Interface::MoveBackZone(CPA_SuperObject * _pZDxSuperObject, MTH3D_tdstVector * p_stVector)
{
ZDx_Object * pZDxObject = (ZDx_Object *) _pZDxSuperObject -> GetObject();
CPA_SuperObject * pActorSuperObject = _pZDxSuperObject->GetSuperObjectFather();
MTH3D_tdstVector stFatherVector, stCurrentVector, stTempVector, stVector;
POS_tdstCompletePosition * p_stMatrix,stMatrix;
if (!p_stVector)
{
//get the global translation of super object
//in this moment it is supposed to not be calculated to the new position!
POS_fn_vGetTranslationVector (HIE_fn_hGetSuperObjectGlobalMatrix(_pZDxSuperObject->GetStruct()),
&stFatherVector);
//get the local translation of super object father
//it is recalculated acording to the new position
POS_fn_vGetTranslationVector (HIE_fn_hGetSuperObjectMatrix(pActorSuperObject->GetStruct()),
&stCurrentVector);
//recalculate the new global position of father and get the deplacement substracting the two vectors
ConvertVectorLocalToGlobal(&stTempVector, HIE_fn_hGetSuperObjectGlobalMatrix(HIE_fn_hGetSuperObjectFather(pActorSuperObject->GetStruct())),
&stCurrentVector);
MTH3D_M_vSubVector(&stTempVector, &stFatherVector, &stTempVector);
}
else MTH3D_M_vCopyVector(&stTempVector, p_stVector);
POS_fn_vSetIdentityMatrix(&stMatrix);
// update vector according to object's position
POS_fn_vInvertMatrix(&stMatrix,HIE_fn_hGetSuperObjectGlobalMatrix(
HIE_fn_hGetSuperObjectFather(_pZDxSuperObject->GetStruct())));
MTH3D_M_vNullVector(&stVector);
POS_fn_vSetTranslationVector(&stMatrix, &stVector);
POS_fn_vMulMatrixVertex(&stVector, &stMatrix, &stTempVector);
// update the translation vector of the object
p_stMatrix = HIE_fn_hGetSuperObjectMatrix(_pZDxSuperObject->GetStruct());
POS_fn_vSetTranslationVector(p_stMatrix, &stVector);
POS_fn_vNormalizeMatrix(p_stMatrix);
//the global matrix of zone must not be set to the new position.
//This will be done when the move has finished
}
//END CPA2 (Corneliu Babiuc) 23-04-1998
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_bObjectIsOutsideTheBV
// Date : 98-04
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ZDx_Interface::mfn_bObjectIsOutsideTheBV (ZDx_Object *pBVolume, ZDx_Object *pZDxObject)
{
GLI_tdxValue tdxMasterRadius, tdxSlaveRadius;
MTH3D_tdstVector tdstMasterCenter, tdstSlaveCenter;
ZDx_Shape *pBVShape = pBVolume->GetZDxShape ();
Sphere3D *pBVSphere = (Sphere3D *)pBVShape->GetGeometric3dObject ();
tdeZDxGeometricType eBVGeometricType = pBVolume->GetZDxGeometricType ();
if (eSphere == eBVGeometricType)
{
tdxMasterRadius = pBVSphere->GetRadius ();
tdstMasterCenter = pBVSphere->GetCenter ();
}
else //treat the case as it is a sphere
{
ACP_tdxHandleOfObject hBoundingVolume = (ACP_tdxHandleOfObject)pBVolume->GetData ();
//ANNECY TQ 22/06/98{
GEO_fn_vGetInfoFromGeometricSphere(&tdstMasterCenter, &tdxMasterRadius, hBoundingVolume );
//ENDANNECY TQ}
}
ZDx_Shape *pZDxShape = pZDxObject->GetZDxShape ();
Shape3D *pZDxGeometric3dObject = pZDxShape->GetGeometric3dObject ();
tdeZDxGeometricType eZDxGeometricType = pZDxObject->GetZDxGeometricType ();
switch (eZDxGeometricType)
{
case eSphere:
tdxSlaveRadius = ((Sphere3D *)pZDxGeometric3dObject)->GetRadius ();
tdstSlaveCenter = ((Sphere3D *)pZDxGeometric3dObject)->GetCenter ();
break;
case eBox:
{
MTH3D_tdstVector tdstMaxPoint = ((Box3D *)pZDxGeometric3dObject)->GetMaxPoint ();
MTH3D_tdstVector tdstMinPoint = ((Box3D *)pZDxGeometric3dObject)->GetMinPoint ();
GEO_fn_vGetSphereFromParallelBox(&tdstSlaveCenter, &tdxSlaveRadius, &tdstMaxPoint, &tdstMinPoint);
}
break;
case eCone:
{
Cone3D *pCone = (Cone3D *)pZDxGeometric3dObject;
MTH3D_tdstVector tdstTop = pCone->GetTopPoint ();
MTH3D_tdstVector tdstBase = pCone->GetBasePoint ();
GLI_tdxValue tdxCRadius = pCone->GetRadius ();
//cone height
GLI_tdxValue tdxCHeight = (GLI_tdxValue)sqrt (pow (tdstTop.xX - tdstBase.xX, 2) +
pow (tdstTop.xY - tdstBase.xY, 2) +
pow (tdstTop.xZ - tdstBase.xZ, 2));
//sphere radius
GLI_tdxValue tdxSRadius = (GLI_tdxValue)(pow (tdxCHeight, 2) + pow (tdxCRadius, 2)) / (2 * tdxCHeight);
//sphere center coordinates
GLI_tdxValue tdxCt = tdxSRadius / tdxCHeight;
tdstSlaveCenter.xX = tdstTop.xX + tdxCt * (tdstBase.xX - tdstTop.xX);
tdstSlaveCenter.xY = tdstTop.xY + tdxCt * (tdstBase.xY - tdstTop.xY);
tdstSlaveCenter.xZ = tdstTop.xZ + tdxCt * (tdstBase.xZ - tdstTop.xZ);
tdxSlaveRadius = tdxSRadius;
}
break;
case ePoint:
tdstSlaveCenter = ((Point3D *)pZDxGeometric3dObject)->GetPoint ();
tdxSlaveRadius = 0;
break;
default:
ASSERT (FALSE);
}
return mfn_bIs1SphereOutsideThe2Sphere (&tdstMasterCenter, tdxMasterRadius, &tdstSlaveCenter, tdxSlaveRadius);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_bIs1SphereOutsideThe2Sphere
// Date : 98-04
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL ZDx_Interface::mfn_bIs1SphereOutsideThe2Sphere (MTH3D_tdstVector *ptdstMasterCenter, GLI_tdxValue tdxMasterRadius, MTH3D_tdstVector *ptdstSlaveCenter, GLI_tdxValue tdxSlaveRadius)
{
ASSERT (ptdstMasterCenter);
ASSERT (ptdstSlaveCenter);
GLI_tdxValue tdxDistanceBetweenSpheres = (GLI_tdxValue)sqrt (pow (ptdstMasterCenter->xX - ptdstSlaveCenter->xX, 2) +
pow (ptdstMasterCenter->xY - ptdstSlaveCenter->xY, 2) +
pow (ptdstMasterCenter->xZ - ptdstSlaveCenter->xZ, 2));
return (tdxDistanceBetweenSpheres + tdxSlaveRadius) > tdxMasterRadius;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_vCheckActorsZonesAndBV
// Date : 98-06
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void ZDx_Interface::mfn_vCheckActorsZonesAndBV (CPA_SuperObject * pActorSuperObject)
{
//add new zone to the bounding volume
if (!pActorSuperObject)
return;
CPA_Actor *pActor = (CPA_Actor *)pActorSuperObject->GetObject ();
if (FALSE == pActor->mfn_bGet_CheckZonesAgainstBV ())
return;
HINSTANCE hOldInst = AfxGetResourceHandle ();
AfxSetResourceHandle (GetDLLIdentity () -> hModule);
CPA_Family *pFamily = pActor->m_pub_fn_pclGetFamily();
CPA_BaseObject *pBVolume = pFamily->mfn_p_oGetBoundingVolume ();
CStringList lstZonesList;
for (int eType = eZdm; eType <= eZdr; eType++)
{
EdtList *pZDxList = GetZDxList (pActor, (eZDxType_)eType);
if (pZDxList)
{
CPA_SaveObject *pZoneObject = NULL;
POSITION pos = pZDxList->GetHeadPosition ();
while (pos)
{
pZoneObject = pZDxList->GetNext (pos);
if (pZoneObject && mfn_bObjectIsOutsideTheBV ((ZDx_Object *)pBVolume, (ZDx_Object *)pZoneObject))
lstZonesList.AddTail (pZoneObject->GetName ());
}
}
}
if (!lstZonesList.IsEmpty ())
{
CCheckZones dlg (pActor, &lstZonesList);
if (IDOK == dlg.DoModal ()) //edit the bounding volume
{
CPA_List<CPA_BaseObject> ListOfObject;
ListOfObject.AddTail (pActorSuperObject);
pActorSuperObject->SetDrawingFlag(E_df_BoundingV);
GetMainWorld ()->fn_bActivateEditor (this , &ListOfObject);
}
}
AfxSetResourceHandle (hOldInst);
}