reman3/Rayman_X/cpa/tempgrp/OSC/Src/SECTobj.cpp

1411 lines
47 KiB
C++

/*=========================================================================
*
* SECTobj.cpp : Implementation of Sector Object
*
*
* Version 1.0
* Creation date
* Revision date
*
* Shaitan
*=======================================================================*/
#include "stdafx.h"
#include "acp_base.h"
#include "SECTint.hpp"
//Shaitan Clean Env
//#include "SEClEnvs.hpp"
#include "DPT.h"
#include "OGD.h"
/*=============================================================================
Defines
=============================================================================*/
#define C_szSectorActionName "Sector"
/*=============================================================================
Engine struct
=============================================================================*/
DeclareTemplateStatic(SECT_tdxHandleOfSectorObject);
void del(SECT_tdxHandleOfSectorObject h) { };
//Shaitan Clean Env
/*
void del(ENV_tdxHandleToEnvironment h) { };
void del(DNM_tdxHandleToMecEnvironment h) { };
void del(ACP_tdxHandleToVisualEnvironment h) { };
void del(SRF_tdxHandleToSurface h) { };
*/
void del(SECT_tdxHandleOfElementLstCollisionInteraction h) { };
void del(SECT_tdxHandleOfElementLstActivityInteraction h) { };
void del(SECT_tdxHandleOfElementLstGraphicInteraction h) { };
void del(SECT_tdxHandleOfElementLstSoundInteraction h) { };
void del(SCT_tdxHandleOfLstSoundEvent h) { };
//Shaitan Clean Env
/*
void del(SECT_tdxHandleOfElementLstEnvironment h) { };
void del(SCT_tdxHandleOfElementLstSurface h) { };
*/
//#################################################################################
// CONSTRUCTOR & DESTRUCTOR
//#################################################################################
/*===========================================================================
* Description: Constructor
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
Sector_Object::Sector_Object(CPA_ObjectDLLBase *p_oDLL,
SECT_tdxHandleOfSectorObject hObj,
CString csName,
CString csFileName
)
: CPA_SaveObject (p_oDLL, // owner editor
C_szSectorTypeName, // type
E_ss_Responsible, // status
NULL, // owner
TRUE, // validity
fn_szGetLevelsDataPath(), // data path
Sector_Object::CallBackSaveName // callback for save
),
CPA_EdMot<SECT_tdxHandleOfSectorObject> (hObj)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
// section object
SetSectionData(this);
// section name
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, (char *)(LPCSTR)csFileName, C_szSectorActionName, " ");
SetReferencedSectionName(szSectionName);
// name
if (fn_eRename(csName ) != E_mc_None)
SetDefaultValidName();
fn_vUpdateSectionName();
// existence
SetExistingSection(TRUE);
// init superobject
m_pSuperObject = NULL;
m_pBorder = NULL;
m_pBorderSection = NULL;
m_pVirtualSection = new SECT_ElementBase(this);
m_pCameraSection = new SECT_ElementBase(this);
m_pPrioritySection = new SECT_ElementBase(this);
// init lists
fn_vInitEngineAnchors();
m_oCollisionList.SetOwnerSector(this);
m_oActivityList.SetOwnerSector(this);
m_oGraphicList.SetOwnerSector(this);
m_oSoundList.SetOwnerSector(this);
m_oSoundEventList.SetOwnerSector(this);
//Shaitan Clean Env
/*
m_oEnvironmentList.SetOwnerSector(this);
m_oSurfaceList.SetOwnerSector(this);
*/
// RAZ all lists
m_oGraphicList.fn_vRemoveAllElements(FALSE);
m_oCollisionList.fn_vRemoveAllElements(FALSE);
m_oActivityList.fn_vRemoveAllElements(FALSE);
m_oSoundList.fn_vRemoveAllElements(FALSE);
m_oSoundEventList.fn_vRemoveAllElements(FALSE);
//Shaitan Clean Env
/*
m_oEnvironmentList.fn_vRemoveAllElements(FALSE);
m_lNbEnvironments = 0;
m_oSurfaceList.fn_vRemoveAllElements(FALSE);
m_lNbSurfaces = 0;
*/
// raz sections
m_bHasSectorsLinkSection = FALSE;
//Shaitan Clean Env
// m_bHasEnvAndSurfSection = FALSE;
// fill all lists
fn_vInitSortedLists();
//Shaitan Clean Env
// fn_vInitEnvironments();
// fn_vInitSurfaces();
fn_vInitBorder();
// init param for Rename
m_bWasRenamed = FALSE;
};
/*===========================================================================
* Description: Destructor
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
Sector_Object::~Sector_Object()
{
// clear all list
/* while (m_oGraphicList.GetCount())
delete (m_oGraphicList.RemoveTail());
while (m_oCollisionList.GetCount())
delete (m_oCollisionList.RemoveTail());
while (m_oActivityList.GetCount())
delete (m_oActivityList.RemoveTail());
while (m_oSoundList.GetCount())
delete (m_oSoundList.RemoveTail());
while (m_oSoundEventList.GetCount())
delete (m_oSoundEventList.RemoveTail());
*/
}
/*===========================================================================
* Description: Set Struct
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::SetEngineStruct (SECT_tdxHandleOfSectorObject hObj)
{
// set engine struct
SetStruct(hObj);
fn_vInitEngineAnchors();
// raz all lists
m_oGraphicList.fn_vRemoveAllElements(FALSE);
m_oCollisionList.fn_vRemoveAllElements(FALSE);
m_oActivityList.fn_vRemoveAllElements(FALSE);
m_oSoundList.fn_vRemoveAllElements(FALSE);
m_oSoundEventList.fn_vRemoveAllElements(FALSE);
//Shaitan Clean Env
/*
m_oEnvironmentList.fn_vRemoveAllElements(FALSE);
m_lNbEnvironments = 0;
m_oSurfaceList.fn_vRemoveAllElements(FALSE);
m_lNbSurfaces = 0;
*/
// raz sections
m_bHasSectorsLinkSection = FALSE;
//Shaitan Clean Env
// m_bHasEnvAndSurfSection = FALSE;
// fill all lists
fn_vInitSortedLists();
//Shaitan Clean Env
// fn_vInitEnvironments();
// fn_vInitSurfaces();
fn_vInitBorder();
}
/*===========================================================================
* Description: Engine struct : inits for lists
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::fn_vInitEngineAnchors (void)
{
if (GetStruct())
{
m_oGraphicList.SetEngineAnchor(&GetStruct()->stListOfSectorsInGraphicInteraction);
m_oCollisionList.SetEngineAnchor(&GetStruct()->stListOfSectorsInCollisionInteraction);
m_oActivityList.SetEngineAnchor(&GetStruct()->stListOfSectorsInActivityInteraction);
m_oSoundList.SetEngineAnchor(&GetStruct()->stListOfSectorsInSoundInteraction);
m_oSoundEventList.SetEngineAnchor(&GetStruct()->stListOfSoundEvent);
//Shaitan Clean Env
/*
m_oEnvironmentList.SetEngineAnchor(&GetStruct()->stListOfEnvironment);
m_oSurfaceList.SetEngineAnchor(&GetStruct()->stListOfSurface);
*/
}
else
{
m_oGraphicList.SetEngineAnchor(NULL);
m_oCollisionList.SetEngineAnchor(NULL);
m_oActivityList.SetEngineAnchor(NULL);
m_oSoundList.SetEngineAnchor(NULL);
m_oSoundEventList.SetEngineAnchor(NULL);
//Shaitan Clean Env
/*
m_oEnvironmentList.SetEngineAnchor(NULL);
m_oSurfaceList.SetEngineAnchor(NULL);
*/
}
}
//#################################################################################
// INITS
//#################################################################################
/*===========================================================================
* Description: Init for scripts
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::StaticInit()
{
CPA_EdMot<SECT_tdxHandleOfSectorObject>::Init(NULL,NULL,del);
//Shaitan Clean Env
/*
CPA_EdMot<ENV_tdxHandleToEnvironment>::Init(ENV_fn_hCreateEnvironment,ENV_fn_vCopyEnvironment,del);
CPA_EdMot<DNM_tdxHandleToMecEnvironment>::Init(DNM_fn_xEnvironmentCreate,NULL,del);
CPA_EdMot<ACP_tdxHandleToVisualEnvironment>::Init(GLI_fn_hCreateVisualEnvironment,NULL,del);
CPA_EdMot<SRF_tdxHandleToSurface>::Init(SRF_fn_hCreatesSurface,NULL,del);
*/
CPA_EdMot<SECT_tdxHandleOfElementLstCollisionInteraction>::Init(SECT_fn_hCreateElementLstCollisionInteraction,NULL,del);
CPA_EdMot<SECT_tdxHandleOfElementLstActivityInteraction>::Init(SECT_fn_hCreateElementLstActivityInteraction,NULL,del);
CPA_EdMot<SECT_tdxHandleOfElementLstGraphicInteraction>::Init(SECT_fn_hCreateElementLstGraphicInteraction,NULL,del);
CPA_EdMot<SECT_tdxHandleOfElementLstSoundInteraction>::Init(SECT_fn_hCreateElementLstSoundInteraction,NULL,del);
CPA_EdMot<SCT_tdxHandleOfLstSoundEvent>::Init(SCT_fn_hCreateElementLstSoundEvent,NULL,del);
//Shaitan Clean Env
/*
CPA_EdMot<SECT_tdxHandleOfElementLstEnvironment>::Init(SECT_fn_hCreateElementLstEnvironment,NULL,del);
CPA_EdMot<SCT_tdxHandleOfElementLstSurface>::Init(SCT_fn_hCreateElementLstSurface,NULL,del);
*/
}
/*===========================================================================
* Description: Fill sorted lists from engine struct
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::fn_vInitSortedLists (void)
{
SECT_tdxHandleOfElementLstSoundInteraction hSoundElem;
SECT_tdxHandleOfElementLstGraphicInteraction hGraphicElem;
SECT_tdxHandleOfElementLstActivityInteraction hActivityElem;
SECT_tdxHandleOfElementLstCollisionInteraction hCollisionElem;
SCT_tdxHandleOfLstSoundEvent hSoundEventElem;
HIE_tdxHandleToSuperObject hSupObj;
SECT_SndEvtEngineElem *pSoundEventElem;
SECT_CollisionElement *pCollisionElem;
SECT_ActivityElement *pActivityElem;
SECT_GraphicElement *pGraphicElem;
SECT_SoundElement *pSoundElem;
long lCount = 0;
// get engine super-object
if (!GetSuperObject())
return;
// only if lists are not initialised
lCount += m_oGraphicList.GetCount();
lCount += m_oCollisionList.GetCount();
lCount += m_oActivityList.GetCount();
lCount += m_oSoundList.GetCount();
lCount += m_oSoundEventList.GetCount();
if (lCount > 0)
return;
hSupObj = (HIE_tdxHandleToSuperObject) GetSuperObject()->GetSuperObjectStruct();
// graphic
hGraphicElem = SECT_fn_hGetFirstGraphicNodeInGraphicList(hSupObj);
while (hGraphicElem)
{
// there is at least an element => section exists !
SetExistingSectorsLinkSection(TRUE);
// create element
pGraphicElem = new SECT_GraphicElement(hGraphicElem, this);
// update list
m_oGraphicList.fn_bAddAnElement(pGraphicElem, FALSE);
// next elem
hGraphicElem = SECT_fn_hGetNextGraphicNodeInGraphicList(hGraphicElem);
}
// collision
hCollisionElem = SECT_fn_hGetFirstCollisionNodeInCollisionList(hSupObj);
while (hCollisionElem)
{
// there is at least an element => section exists !
SetExistingSectorsLinkSection(TRUE);
// create element
pCollisionElem = new SECT_CollisionElement(hCollisionElem, this);
// update list
m_oCollisionList.fn_bAddAnElement(pCollisionElem, FALSE);
// next elem
hCollisionElem = SECT_fn_hGetNextCollisionNodeInCollisionList(hCollisionElem);
}
// activity
hActivityElem = SECT_fn_hGetFirstActivityNodeInActivityList(hSupObj);
while (hActivityElem)
{
// there is at least an element => section exists !
SetExistingSectorsLinkSection(TRUE);
// create element
pActivityElem = new SECT_ActivityElement(hActivityElem, this);
// update list
m_oActivityList.fn_bAddAnElement(pActivityElem, FALSE);
// next elem
hActivityElem = SECT_fn_hGetNextActivityNodeInActivityList(hActivityElem);
}
// sound
hSoundElem = SECT_fn_hGetFirstSoundNodeInSoundList(hSupObj);
while (hSoundElem)
{
// there is at least an element => section exists !
SetExistingSectorsLinkSection(TRUE);
// create element
pSoundElem = new SECT_SoundElement(hSoundElem, this);
// update list
m_oSoundList.fn_bAddAnElement(pSoundElem, FALSE);
// next elem
hSoundElem = SECT_fn_hGetNextSoundNodeInSoundList(hSoundElem);
}
// sound event
hSoundEventElem = SCT_fn_hGetFirstSoundEventNodeInSoundEventList(hSupObj);
while (hSoundEventElem)
{
// there is at least an element => section exists !
SetExistingSectorsLinkSection(TRUE);
// create element
pSoundEventElem = new SECT_SndEvtEngineElem(hSoundEventElem, this);
// update list
m_oSoundEventList.fn_bAddAnElement(pSoundEventElem);
// next elem
hSoundEventElem = SCT_fn_hGetNextSoundEventNodeInSoundEventList(hSoundEventElem);
}
}
/*===========================================================================
* Description: Init environement parameters
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
//Shaitan Clean Env
/*
void Sector_Object::fn_vInitEnvironments (void)
{
SECT_tdxHandleOfElementLstEnvironment hEnvElem;
HIE_tdxHandleToSuperObject hSupObj;
SECT_EnvElem *pNewEnvElem, *pPrevEnvElem;
// only if list is empty
if (m_lNbEnvironments > 0)
return;
// get engine super-object
if (!GetSuperObject())
return;
hSupObj = (HIE_tdxHandleToSuperObject) GetSuperObject()->GetSuperObjectStruct();
// init env
hEnvElem = SECT_fn_hGetFirstEnvironmentListInSector(hSupObj);
pPrevEnvElem = NULL;
// fill list of environments
while (hEnvElem)
{
// there is at least an element => section exists !
SetExistingEnvAndSurfSection(TRUE);
// create element
pNewEnvElem = new SECT_EnvElem(hEnvElem, this);
// add it to the list
m_oEnvironmentList.fn_bAddAnElement(pNewEnvElem, pPrevEnvElem, FALSE);
m_lNbEnvironments++;
// next elem
hEnvElem = SECT_fn_hGetNextEnvironmentListInSector(hEnvElem);
pPrevEnvElem = pNewEnvElem;
}
}
*/
/*===========================================================================
* Description: Init surface parameters
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
//Shaitan Clean Env
/*
void Sector_Object::fn_vInitSurfaces (void)
{
SCT_tdxHandleOfElementLstSurface hSurfElem;
HIE_tdxHandleToSuperObject hSupObj;
SECT_SurfElem *pNewSurfElem, *pPrevSurfElem;
// only if list is empty
if (m_lNbSurfaces > 0)
return;
// get engine super-object
if (!GetSuperObject())
return;
hSupObj = (HIE_tdxHandleToSuperObject) GetSuperObject()->GetSuperObjectStruct();
// init surface
hSurfElem = SCT_fn_hGetFirstSurfaceListInSector(hSupObj);
pPrevSurfElem = NULL;
// fill list of surfaces
while (hSurfElem)
{
// there is at least an element => section exists !
SetExistingEnvAndSurfSection(TRUE);
// create element
pNewSurfElem = new SECT_SurfElem(hSurfElem, this);
// add it to the list
m_oSurfaceList.fn_bAddAnElement(pNewSurfElem, pPrevSurfElem, FALSE);
m_lNbSurfaces++;
// next elem
hSurfElem = SCT_fn_hGetNextSurfaceListInSector(hSurfElem);
pPrevSurfElem = pNewSurfElem;
}
}
*/
/*===========================================================================
* Description: init editor border
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::fn_vInitBorder (void)
{
MTH3D_tdstVector stPoint;
CPA_DLLBase *pOGD;
CString csName;
Box3D *pBorderBox;
long lMask;
// if necessary, create border
if (m_pBorder == NULL)
{
// init super-object
csName = GetSectorInterface()->GetInterface()->GetPrefixedName(GetName() + "_BorderSO");
m_pBorder = GetSectorInterface()->GetInterface()->GetNewSuperObject(E_ss_NoSave, C_Protected, csName);
lMask = HIE_fn_lGetSuperObjectDrawMask(m_pBorder->GetStruct());
HIE_fn_vSetSuperObjectDrawMask(m_pBorder->GetStruct(), lMask - GLI_C_lIsNotDrawCollideInformation - GLI_C_lIsNotDrawCollideInformationLight);
HIE_fn_SO_vSetFlags(m_pBorder->GetStruct(), HIE_C_Flag_ulNotPickable);
HIE_fn_vSetSuperObjectTransparenceLevel(m_pBorder->GetStruct(), 100);
// init box 3D
pOGD = GetMainWorld()->GetObjectDLLWithName(C_szDLLGeometryName);
csName = GetSectorInterface()->GetInterface()->GetPrefixedName(GetName() + "_BorderSO");
pBorderBox = new Box3D(TRUE, pOGD, csName, E_ss_NoSave);
m_pBorder->SetObject(pBorderBox);
m_pBorder->SetSuperObjectOwner(GetSuperObject());
}
else
pBorderBox = (Box3D *) m_pBorder->GetObject();
// update border coordinates
SECT_fn_vGetMinPointInBorder(GetStruct(), &stPoint);
pBorderBox->SetMinPoint(&stPoint);
SECT_fn_vGetMaxPointInBorder(GetStruct(), &stPoint);
pBorderBox->SetMaxPoint(&stPoint);
// if necessary, create section
if (!m_pBorderSection)
m_pBorderSection = new CPA_SectionObject (GetSectorBorderSection(), fn_szGetLevelsDataPath(), Sector_Object::CallBackSaveSectorBorder, this, TRUE);
}
/*===========================================================================
* Description: get real Zmax of the sector
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
MTH_tdxReal Sector_Object::GetZmaxOfSector (void)
{
return SECT_fn_xGetRealZmax(GetStruct());
}
/*===========================================================================
* Description: get Zmax of the border
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
MTH_tdxReal Sector_Object::GetZmaxOfBorder (void)
{
return SECT_fn_xGetZmaxOfBorder(GetStruct());
}
/*===========================================================================
* Description: update Zmax of the border
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::SetZmaxOfBorder (MTH_tdxReal xZmax)
{
MTH3D_tdstVector stMaxPoint;
Box3D *pBorderBox;
// update engine parameter
SECT_fn_vSetZmaxOfBorder(GetStruct(), xZmax);
// update border
if (xZmax > MTH_C_InfinitMinus)
{
// update engine border
SECT_fn_vGetMaxPointInBorder(GetStruct(), &stMaxPoint);
stMaxPoint.xZ = xZmax;
SECT_fn_vSetMaxPointInBorder(GetStruct(), &stMaxPoint);
// update editor border
pBorderBox = (Box3D *) m_pBorder->GetObject();
pBorderBox->SetMaxPoint(&stMaxPoint);
}
// notify for save
fn_vNotifyBorderSection((xZmax > MTH_C_InfinitMinus));
}
/*===========================================================================
* Description: get min point of border
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::GetMinPointInBorder (MTH3D_tdstVector *p_stMinPoint)
{
Box3D *pBorderBox;
if (m_pBorder)
{
pBorderBox = (Box3D *) m_pBorder->GetObject();
*p_stMinPoint = pBorderBox->GetMinPoint();
}
else
{
p_stMinPoint->xX = MTH_C_InfinitPlus;
p_stMinPoint->xY = MTH_C_InfinitPlus;
p_stMinPoint->xZ = MTH_C_InfinitPlus;
}
}
/*===========================================================================
* Description: get max point of border
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::GetMaxPointInBorder (MTH3D_tdstVector *p_stMaxPoint)
{
Box3D *pBorderBox;
if (m_pBorder)
{
pBorderBox = (Box3D *) m_pBorder->GetObject();
*p_stMaxPoint = pBorderBox->GetMaxPoint();
}
else
{
p_stMaxPoint->xX = MTH_C_InfinitMinus;
p_stMaxPoint->xY = MTH_C_InfinitMinus;
p_stMaxPoint->xZ = MTH_C_InfinitMinus;
}
}
/*===========================================================================
* Description: get center of border
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::GetCenterInBorder (MTH3D_tdstVector *p_stCenter)
{
SECT_fn_vGetCenterOfBorder(GetStruct(), p_stCenter);
}
/*===========================================================================
* Description: get maximal dimension of border
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
MTH_tdxReal Sector_Object::GetMaxDimension (void)
{
MTH3D_tdstVector stMin, stMax;
MTH_tdxReal xDimension = 0;
GetMinPointInBorder(&stMin);
GetMaxPointInBorder(&stMax);
xDimension = ((stMax.xX - stMin.xX) > xDimension) ? stMax.xX - stMin.xX : xDimension;
xDimension = ((stMax.xY - stMin.xY) > xDimension) ? stMax.xY - stMin.xY : xDimension;
xDimension = ((stMax.xZ - stMin.xZ) > xDimension) ? stMax.xZ - stMin.xZ : xDimension;
return xDimension;
}
//#################################################################################
// FAR CLIPPING
//#################################################################################
/*===========================================================================
* Description: get Zfar
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
MTH_tdxReal Sector_Object::GetZfarInSector (void)
{
return fn_xGetSectorZFar(GetSuperObject()->GetStruct());
}
/*===========================================================================
* Description: update Zmax of the border
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::SetZfarInSector (MTH_tdxReal xZfar)
{
// update engine parameter
fn_vSetSectorZFar(GetSuperObject()->GetStruct(), xZfar);
m_pVirtualSection->fn_vWriteSection();
}
//#################################################################################
// VIRTUAL & GOTHROUGH
//#################################################################################
/*===========================================================================
* Description: check virtual status
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
BOOL Sector_Object::fn_bIsVirtual (void)
{
return (GetStruct()->xVirtual);
}
/*===========================================================================
* Description: update virtual status
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::fn_vSetVirtual (BOOL bVirtual, CPA_SuperObject *pBorder)
{
if (bVirtual)
{
// update engine status
SECT_fn_vSetOnVirtualSector(GetStruct());
}
else
{
// update engine status
SECT_fn_vSetOffVirtualSector(GetStruct());
}
// notify for save
m_pVirtualSection->fn_vWriteSection();
}
//#################################################################################
// SECTOR LINKS
//#################################################################################
/*===========================================================================
* Description: add sector to the corresponding list
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
BOOL Sector_Object::fn_bAddSectorInList (SECT_ElementBase *pNewElem, tdeTypeList eType)
{
SECT_ElementBase *pElem;
SECT_ListBase *pCurrentList;
// corresponding list
pCurrentList = GetCurrentList(eType);
if (!pCurrentList)
return FALSE;
// check if element already exist
pElem = pCurrentList->GetElementWithSector(pNewElem->GetSector());
if (pElem)
return FALSE;
if (pNewElem->GetSector() && (pNewElem->GetSector()->GetObject() == this))
return FALSE;
// add it to the list
pCurrentList->fn_bAddAnElement(pNewElem);
// notify change
if (g_bCanSave)
pNewElem->fn_vWriteSection();
return TRUE;
}
/*===========================================================================
* Description: remove sector from the corresponding list
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
BOOL Sector_Object::fn_bRemoveSectorInList (SECT_ElementBase *pOldElem, tdeTypeList eType)
{
SECT_ElementBase *pElem;
SECT_ListBase *pCurrentList;
// corresponding list
pCurrentList = GetCurrentList(eType);
if (!pCurrentList)
return FALSE;
// check if element already exist
pElem = pCurrentList->GetElementWithSector(pOldElem->GetSector());
if (pElem != pOldElem)
return FALSE;
// remove it from the list
pCurrentList->fn_vRemoveAnElement(pOldElem);
// notify change
if (g_bCanSave)
pOldElem->fn_vWriteSection();
return TRUE;
}
/*===========================================================================
* Description: Get list from type
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
SECT_ListBase * Sector_Object::GetCurrentList (tdeTypeList eType)
{
switch (eType)
{
case E_Graphic:
return &m_oGraphicList;
case E_Collision:
return &m_oCollisionList;
case E_Activity:
return &m_oActivityList;
case E_Sound:
return &m_oSoundList;
case E_SoundEvent:
return &m_oSoundEventList;
}
return NULL;
}
/*===========================================================================
* Description: Build new element of corresponding type
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
SECT_ElementBase * Sector_Object::GetNewElement (tdeTypeList eType, CPA_SuperObject *pSector)
{
SECT_ElementBase *pElem;
SECT_ListBase *pCurrentList;
// corresponding list
pCurrentList = GetCurrentList(eType);
if (!pCurrentList)
return NULL;
switch (eType)
{
case E_Graphic:
pElem = new SECT_GraphicElement(pSector, this);
break;
case E_Collision:
pElem = new SECT_CollisionElement(pSector, this);
break;
case E_Activity:
pElem = new SECT_ActivityElement(pSector, this);
break;
case E_Sound:
pElem = new SECT_SoundElement(pSector, this);
break;
case E_SoundEvent:
pElem = new SECT_SoundEventElement(pSector, this);
break;
}
return pElem;
}
/*===========================================================================
* Description: check if sector is linked with all other sectors
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
BOOL Sector_Object::fn_bHasFullLink (tdeTypeList eType)
{
CPA_BaseObjectList *pListSectors;
SECT_ListBase *pCurrentList;
// get list of all sectors
pListSectors = GetSectorInterface()->GetBaseObjectList(C_szSectorTypeName);
// get list of linked sectors
pCurrentList = GetCurrentList(eType);
// check elements
return (pCurrentList->GetNbElements() == (pListSectors->GetCount() - 1));
}
//#################################################################################
// ENVIRONMENT ELEMENT
//#################################################################################
/*===========================================================================
* Description: add an environment element to the lists
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
//Shaitan Clean Env
/*
BOOL Sector_Object::fn_bAddEnvironmentElement (SECT_EnvElem *pEnvElem, SECT_SurfElem *pSurfElem)
{
SECT_SurfElem *pPreviousSurf;
SECT_EnvElem *pPreviousEnv;
long lNumEnvElem;
// get insert position
lNumEnvElem = m_oSurfaceList.GetInsertPosition(pSurfElem);
// get previous elements
pPreviousEnv = GetEnvironment(lNumEnvElem-1);
pPreviousSurf = GetSurface(lNumEnvElem-1);
// insert new elements
m_oEnvironmentList.fn_bAddAnElement(pEnvElem, pPreviousEnv);
m_lNbEnvironments++;
m_oSurfaceList.fn_bAddAnElement(pSurfElem, pPreviousSurf);
m_lNbSurfaces++;
// reinit dialog
if (GetSuperObject() == GetSectorInterface()->GetEditedSector())
{
GetSectorInterface()->GetDialogEnvList()->fn_vInitEnvList(GetSuperObject());
GetSectorInterface()->GetDialogEnvList()->fn_vInitEnvElem(lNumEnvElem);
}
// notify change
if (g_bCanSave)
{
pEnvElem->fn_vWriteSection();
pSurfElem->fn_vWriteSection();
}
return TRUE;
}
*/
/*===========================================================================
* Description: remove given element from the lists
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
//Shaitan Clean Env
/*
BOOL Sector_Object::fn_bDelEnvironmentElement (SECT_EnvElem *pEnvElem, SECT_SurfElem *pSurfElem)
{
POSITION posEnv, posSurf;
// check if elements exist in the list
posSurf = m_oSurfaceList.Find(pSurfElem, NULL);
posEnv = m_oEnvironmentList.Find(pEnvElem, NULL);
if ((!posSurf)||(!posEnv))
return FALSE;
// notify change
if (g_bCanSave)
{
pEnvElem->fn_vWriteSection();
pSurfElem->fn_vWriteSection();
}
// remove element
m_oSurfaceList.fn_vRemoveAnElement(pSurfElem);
m_lNbSurfaces--;
// remove element
m_oEnvironmentList.fn_vRemoveAnElement(pEnvElem);
m_lNbEnvironments--;
// update dialog
if (GetSuperObject() == GetSectorInterface()->GetEditedSector())
GetSectorInterface()->GetDialogEnvList()->fn_vInitEnvList(GetSuperObject());
return TRUE;
}
*/
/*===========================================================================
* Description: get environment in list
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
//Shaitan Clean Env
/*
SECT_EnvElem * Sector_Object::GetEnvironment (long lNumEnv)
{
SECT_EnvElem *pEnvElem;
POSITION pos;
long lCurNum = 0;
for (pEnvElem = m_oEnvironmentList.GetHeadElement(pos); pEnvElem;
pEnvElem = m_oEnvironmentList.GetNextElement(pos))
{
if (lNumEnv == lCurNum++)
return pEnvElem;
}
// element was not found
return NULL;
}
*/
/*===========================================================================
* Description: get surface in list
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
//Shaitan Clean Env
/*
SECT_SurfElem * Sector_Object::GetSurface (long lNumEnv)
{
SECT_SurfElem *pSurfElem;
POSITION pos;
long lCurNum = 0;
for (pSurfElem = m_oSurfaceList.GetHeadElement(pos); pSurfElem;
pSurfElem = m_oSurfaceList.GetNextElement(pos))
{
if (lNumEnv == lCurNum++)
return pSurfElem;
}
// element was not found
return NULL;
}
*/
/*===========================================================================
* Description: update given element when surface or height has changed
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
//Shaitan Clean Env
/*
long Sector_Object::fn_lUpdateEnvironmentElement (long lNumEnvElem)
{
SECT_SurfElem *pSurfElem, *pPreviousSurf;
SECT_EnvElem *pEnvElem, *pPreviousEnv;
long lNewNum;
// get corresponding elements in the list
pEnvElem = GetEnvironment(lNumEnvElem);
pSurfElem = GetSurface(lNumEnvElem);
// remove elements from the list
m_oSurfaceList.fn_vRemoveAnElement(pSurfElem);
m_oEnvironmentList.fn_vRemoveAnElement(pEnvElem);
// check new element
lNewNum = m_oSurfaceList.GetInsertPosition(pSurfElem);
// get previous elements
pPreviousEnv = GetEnvironment(lNewNum-1);
pPreviousSurf = GetSurface(lNewNum-1);
// insert new elements
m_oEnvironmentList.fn_bAddAnElement(pEnvElem, pPreviousEnv);
m_oSurfaceList.fn_bAddAnElement(pSurfElem, pPreviousSurf);
// reinit dialog
if (GetSuperObject() == GetSectorInterface()->GetEditedSector())
{
GetSectorInterface()->GetDialogEnvList()->fn_vInitEnvList(GetSuperObject());
GetSectorInterface()->GetDialogEnvList()->fn_vInitEnvElem(lNewNum);
}
// notify change
if (g_bCanSave)
{
pEnvElem->fn_vWriteSection();
pSurfElem->fn_vWriteSection();
}
return lNewNum;
}
*/
/*===========================================================================
* Description: apply same environment as given lists
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
//Shaitan Clean Env
/*
void Sector_Object::fn_vApplySameEnvironment (CPA_List<SECT_Environment> *pListEnv, CPA_List<SECT_Surface> *pListSrf)
{
SECT_Environment *pEnv;
SECT_SurfElem *pNewSurfElem, *pPrevSurfElem;
SECT_EnvElem *pNewEnvElem, *pPrevEnvElem;
SECT_Surface *pSurf;
POSITION pos;
// RAZ sector lists
m_oEnvironmentList.fn_vRemoveAllElements();
m_oSurfaceList.fn_vRemoveAllElements();
// copy environment list
pPrevEnvElem = NULL;
for (pEnv = pListEnv->GetHeadElement(pos); pEnv; pEnv = pListEnv->GetNextElement(pos))
{
// build new envelem and add it
pNewEnvElem = new SECT_EnvElem(pEnv, this);
m_oEnvironmentList.fn_bAddAnElement(pNewEnvElem, pPrevEnvElem);
// next element
pPrevEnvElem = pNewEnvElem;
}
if ((g_bCanSave)&&(pPrevEnvElem))
pPrevEnvElem->fn_vWriteSection();
// copy surface list
pPrevSurfElem = NULL;
for (pSurf = pListSrf->GetHeadElement(pos); pSurf; pSurf = pListSrf->GetNextElement(pos))
{
// build new envelem and add it
pNewSurfElem = new SECT_SurfElem(pSurf, this);
m_oSurfaceList.fn_bAddAnElement(pNewSurfElem, pPrevSurfElem);
// next element
pPrevSurfElem = pNewSurfElem;
}
if ((g_bCanSave)&&(pPrevSurfElem))
pPrevSurfElem->fn_vWriteSection();
}
*/
//#################################################################################
// SAVES
//#################################################################################
/*===========================================================================
* Description: compute sectorlinks subsection name
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
CString Sector_Object::GetSectorsLinkSection (void)
{
CString csSectionName;
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
// get corresponding section
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, (char *)(LPCSTR)GetReferencedSectionName(),
C_szSectorsLinkSubSection, NULL);
csSectionName = szSectionName;
return csSectionName;
}
/*===========================================================================
* Description: compute env&srf subsection name
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
//Shaitan Clean Env
/*
CString Sector_Object::GetEnvAndSurfSection (void)
{
CString csSectionName;
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
// get corresponding section
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, (char *)(LPCSTR)GetReferencedSectionName(),
C_szEnvAndSurfSubSection, NULL);
csSectionName = szSectionName;
return csSectionName;
}
*/
/*===========================================================================
* Description: callback for modify name
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::CallBackSaveName (SCR_tdst_File_Description *p_stFile, char *szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
Sector_Object *pSector;
char szNewSectionName[SCR_CV_ui_Cfg_MaxLenName];
// get sector
pSector = (Sector_Object *) p_vData;
switch (eAction)
{
case SCR_EA_Ntfy_ModifySection:
// delete previous section name
SCR_fn_v_SvL1_ToPrevLine(p_stFile);
SCR_fn_v_SvL1_DeleteLine(p_stFile);
// save new section name
SCR_fn_v_RdL0_ComputeSectionName(szNewSectionName, NULL, C_szSectorTypeName, (char*)(LPCSTR) pSector->GetName());
SCR_M_SvL0_SaveBeginSection(p_stFile, szNewSectionName, SCR_CC_C_Cfg_EOL);
SCR_g_ui_SvL0_IndentationLevel--;
break;
}
}
/*===========================================================================
* Description: build the name of the border subsection
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
CString Sector_Object::GetSectorBorderSection (void)
{
CString csSectionName;
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
// get corresponding section
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, (char *)(LPCSTR)GetReferencedSectionName(),
C_szSectorBorderSubSection, NULL);
csSectionName = szSectionName;
return csSectionName;
}
/*===========================================================================
* Description: notify border subsection
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::fn_vNotifyBorderSection (BOOL bWrite)
{
if (bWrite)
{
if (m_pBorderSection->GetCurrentNotification() == SCR_EA_Ntfy_DeleteSection)
m_pBorderSection->fn_vRestoreSection();
m_pBorderSection->fn_vWriteSection();
}
else
m_pBorderSection->fn_vDeleteSection();
}
/*===========================================================================
* Description: callback for save
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::CallBackSaveSectorBorder (SCR_tdst_File_Description *p_stFile, char *szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
MTH3D_tdstVector stMinPoint, stMaxPoint;
Sector_Object *pSector;
char szNewSectionName[SCR_CV_ui_Cfg_MaxLenName];
int iSaveIndentLevel;
// get sector
pSector = (Sector_Object *) p_vData;
switch (eAction)
{
case SCR_EA_Ntfy_AddSection:
case SCR_EA_Ntfy_RebuildSection:
// indent level
iSaveIndentLevel = SCR_g_ui_SvL0_IndentationLevel;
SCR_g_ui_SvL0_IndentationLevel = 1;
// save begin section
SCR_fn_v_RdL0_ComputeSectionName(szNewSectionName, NULL, C_szSectorBorderSubSection, " ");
SCR_M_SvL0_SaveBeginSection(p_stFile, szNewSectionName, SCR_CC_C_Cfg_EOL);
// min point
pSector->GetMinPointInBorder(&stMinPoint);
SCR_M_SvL0_SaveEntry(p_stFile, "MinPointOfBorder", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%0.3f,%0.3f,%0.3f", stMinPoint.xX, stMinPoint.xY, stMinPoint.xZ);
// max point
pSector->GetMinPointInBorder(&stMaxPoint);
SCR_M_SvL0_SaveEntry(p_stFile, "MaxPointOfBorder", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 4, "%0.3f,%0.3f,%0.3f", stMaxPoint.xX, stMaxPoint.xY, stMaxPoint.xZ);
// Zmax
if (pSector->GetZmaxOfBorder() > MTH_C_InfinitMinus)
{
SCR_M_SvL0_SaveEntry(p_stFile, "ZmaxOfBorder", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%f", GLI_M_ValueToFloat(pSector->GetZmaxOfBorder()));
}
// end section
SCR_M_SvL0_SaveEndSection (p_stFile, SCR_CC_C_Cfg_EOL);
if (eAction == SCR_EA_Ntfy_AddSection)
SCR_M_SvL0_SaveBlankLine (p_stFile);
// indent level
SCR_g_ui_SvL0_IndentationLevel = iSaveIndentLevel;
pSector->GetBorderSection()->fn_vSectionSaved();
break;
case SCR_EA_Ntfy_DeleteSection:
pSector->GetBorderSection()->fn_vSectionDeleted();
break;
}
}
/*===========================================================================
* Description: get camera type
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
char Sector_Object::GetCameraType (void)
{
return fn_cGetSectorCameraType(GetSuperObject()->GetStruct());
}
/*===========================================================================
* Description: set camera type
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::SetCameraType (char cType)
{
fn_vSetSectorCameraType(GetSuperObject()->GetStruct(), cType);
m_pCameraSection->fn_vWriteSection();
}
/*===========================================================================
* Description: get priority
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
char Sector_Object::GetPriority (void)
{
return SECT_fn_cGetSectorPriority(GetStruct());
}
/*===========================================================================
* Description: set priority
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Sector_Object::SetPriority (char cPriority)
{
CPA_BaseObjectList *pListSector;
SECT_ElementBase *pElement;
CPA_BaseObject *pElem;
Sector_Object *pSectObj;
Position Pos;
SECT_fn_vSetSectorPriority(GetStruct(), cPriority);
m_pPrioritySection->fn_vWriteSection();
// update position in all lists of all sectors
pListSector = GetSectorInterface()->GetBaseObjectList(C_szSectorTypeName);
for (pElem = pListSector->GetHeadElement(Pos); pElem;
pElem = pListSector->GetNextElement(Pos))
{
// get sector
pSectObj = (Sector_Object *) pElem;
// check if element exists
if (pSectObj != this)
{
// graphic list
pElement = pSectObj->GetGraphicList()->GetElementWithSector(GetSuperObject());
if (pElement)
{
// remove element from list and reinsert it at the right place
pSectObj->fn_bRemoveSectorInList(pElement, E_Graphic);
pSectObj->fn_bAddSectorInList(pElement, E_Graphic);
}
// collision list
pElement = pSectObj->GetCollisionList()->GetElementWithSector(GetSuperObject());
if (pElement)
{
// remove element from list and reinsert it at the right place
pSectObj->fn_bRemoveSectorInList(pElement, E_Collision);
pSectObj->fn_bAddSectorInList(pElement, E_Collision);
}
// activity list
pElement = pSectObj->GetActivityList()->GetElementWithSector(GetSuperObject());
if (pElement)
{
// remove element from list and reinsert it at the right place
pSectObj->fn_bRemoveSectorInList(pElement, E_Activity);
pSectObj->fn_bAddSectorInList(pElement, E_Activity);
}
// sound list
pElement = pSectObj->GetSoundList()->GetElementWithSector(GetSuperObject());
if (pElement)
{
// remove element from list and reinsert it at the right place
pSectObj->fn_bRemoveSectorInList(pElement, E_Sound);
pSectObj->fn_bAddSectorInList(pElement, E_Sound);
}
}
}
}