reman3/Rayman_X/cpa/tempgrp/ITF/cpaworld.cpp

509 lines
17 KiB
C++

// class CPA_WORLD
#include "stdafx.h"
#ifdef ACTIVE_EDITOR
#include "acp_base.h"
#include "itf/CPAWorld.hpp"
#include "itf/cpasobj.hpp"
#include "itf/devmul3d.hpp"
#include "itf/CPAMWorl.hpp"
#include "itf/CPAInter.hpp"
#include "itf/stddllid.h"
CPA_World::CPA_World(CPA_MainWorld *_p_oMainWorld, BOOL bTemporary)
{
CPA_CameraDLLBase* p_oCamDLL;
m_bIsTemporary = bTemporary;
m_p_oSprObjRoot = NULL;
m_p_oMultiDevice = NULL;
fn_vInitListObjects(_p_oMainWorld->GetListOfObjectDLLBase());
p_oCamDLL = (CPA_CameraDLLBase*) (_p_oMainWorld->GetObjectDLLWithName(C_szDLLCameraName));
m_oCameraSlots.SetInterface(p_oCamDLL);
}
CPA_World::~CPA_World()
{
while (!(m_lstListByDLL.IsEmpty()))
delete m_lstListByDLL.RemoveHead();
//CPA2 Corneliu Babiuc (multiple teleportation) 3-03-98
while (!(m_lstRegisterListByDLL.IsEmpty()))
delete m_lstRegisterListByDLL.RemoveHead();
//END CPA2 Corneliu Babiuc (multiple teleportation) 3-03-98
}
CPA_Interface * CPA_World::GetInterface (void)
{
return m_p_oMultiDevice->GetInterface();
}
/*===========================================================================
* Description: Init the lists
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vCreateListFromHierarchy(CPA_List<CPA_ObjectDLLBase> *_p_oListOfObjectDLL)
{
fn_vInitListObjects(_p_oListOfObjectDLL);
fn_vInitListAllObjects(m_p_oSprObjRoot);
}
/*===========================================================================
* Description: Init the lists from Objects DLLs
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
*
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vInitListObjects(CPA_List<CPA_ObjectDLLBase> *_p_oListOfObjectDLL)
{
CPA_ObjectDLLBase *p_oDLL;
POSITION pos;
// RAZ
m_lstListByDLL.RemoveAll();
m_stListAllObjects.RemoveAll();
m_stListAllDLLs.fn_vReinit();
//CPA2 Corneliu Babiuc (multiple registration)
m_lstRegisterListByDLL.RemoveAll();
m_stRegisterListAllDLLs.fn_vReinit();
//END CPA2 Corneliu Babiuc (multiple registration)
// check all objects dlls to find the available types
for (p_oDLL = _p_oListOfObjectDLL->GetHeadElement(pos); p_oDLL;
p_oDLL = _p_oListOfObjectDLL->GetNextElement(pos))
{
// create the corresponding ListByType
m_lstListByDLL.AddTail(new EDT_ListByDLL(p_oDLL));
//CPA2 Corneliu Babiuc (multiple registration)
m_lstRegisterListByDLL.AddTail(new EDT_ListByDLL(p_oDLL));
//END CPA2 Corneliu Babiuc (multiple registration)
p_oDLL->fn_vInitListByType(this);
}
}
/*===========================================================================
* Description: create and init the lists of models
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
*
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vAddANewListByType (char *szTypeName, CPA_ObjectDLLBase *pObjectDLL)
{
EDT_ListByType *pListType;
EDT_ListByDLL *pListDLL;
// find the corresponding DLL list
pListDLL = GetListFromObjectDLL(pObjectDLL);
if (!pListDLL)
{
pListDLL= new EDT_ListByDLL(pObjectDLL);
GetListOfListByDLL()->AddTail(pListDLL);
}
// create list by type
pListType = pListDLL->GetListByType(szTypeName);
if (!pListType)
{
pListType = new EDT_ListByType(pObjectDLL, szTypeName);
pListDLL->m_stListOfListByType.AddTail(pListType);
}
}
/*===========================================================================
* Description: Init the list of all objects in the hierarchy
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
*
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vInitListAllObjects(CPA_SuperObject *_p_EdObj)
{
CPA_SuperObject *p_EdChild;
p_EdChild = _p_EdObj->GetSuperObjectFirstChild();
while (p_EdChild)
{
// add the child to the list
m_stListAllObjects.AddTail(p_EdChild);
// next level of hierarchy
fn_vInitListAllObjects(p_EdChild);
// next brother
p_EdChild = _p_EdObj->GetSuperObjectNextChild(p_EdChild);
}
}
void CPA_World::InitWorldForDrawing()
{
ASSERT(m_p_oSprObjRoot != NULL);
// compute new world spherebox
// GLI_xComputeSuperObjectSphereBox(m_p_oSprObjRoot->GetStruct());
}
void CPA_World::fn_vSetRoot(CPA_SuperObject *_p_SprObj)
{
// if there is a multidevice, then clear old engine struct
if (m_p_oMultiDevice)
m_p_oMultiDevice->SetEngineWorld(NULL);
m_p_oSprObjRoot = _p_SprObj;
if (m_p_oSprObjRoot)
{
InitWorldForDrawing();
fn_vReinitListObjects();
fn_vFillListObjects(m_p_oSprObjRoot);
fn_vReinitSortedList();
if (m_p_oMultiDevice)
{
m_p_oMultiDevice->SetEngineWorld(m_p_oSprObjRoot->GetStruct());
if (m_p_oMultiDevice->GetInterface())
m_p_oMultiDevice->GetInterface()->fn_vChangeRoot();
}
}
}
/*===========================================================================
* Description: RAZ of all lists
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* test the type of the object
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vReinitListObjects(void)
{
EDT_ListByDLL *pListDLL;
POSITION pos;
// Reinit the list of all objects
m_stListAllDLLs.fn_vReinit();
m_stListAllObjects.RemoveAll();
// Reinit the lists by Types
for (pListDLL = m_lstListByDLL.GetHeadElement(pos); pListDLL;
pListDLL = m_lstListByDLL.GetNextElement(pos))
pListDLL->fn_vReinit();
}
/*===========================================================================
* Description: RAZ of all lists
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* test the type of the object
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vReinitSortedList(void)
{
EDT_ListByDLL *pListDLL;
POSITION pos;
// Reinit the list of all objects
m_stListAllDLLs.fn_vUpdateSortedList();
// Reinit the lists by Types
for (pListDLL = m_lstListByDLL.GetHeadElement(pos); pListDLL;
pListDLL = m_lstListByDLL.GetNextElement(pos))
pListDLL->fn_vUpdateSortedList();
}
/*===========================================================================
* Description: fill the list from the current hierarchy
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* test the type of the object
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vFillListObjects(CPA_SuperObject *pEdObj)
{
CPA_SuperObject *pChild;
EDT_ListByDLL *pListDLL;
// Find objects which type belongs to the Editor
if ((pEdObj->GetObjectType() != HIE_C_ulSuperObject)&&(!pEdObj->fn_bIsEditProtected()))
{
// update the corresponding list
pListDLL = GetListFromObject(pEdObj);
pListDLL->fn_vUpdateListObject(pEdObj, E_lum_Insert);
// Update the lists by Type
m_stListAllDLLs.fn_vUpdateListObject(pEdObj, E_lum_Insert);
}
// Fill the list of all objects
m_stListAllObjects.AddTail(pEdObj);
// Next level of hierarchy
pChild = pEdObj->GetSuperObjectFirstChild();
while (pChild)
{
fn_vFillListObjects(pChild);
pChild = pEdObj->GetSuperObjectNextChild(pChild);
}
}
//CPA2 Corneliu Babiuc (multiple registration) 02-07-98
/*===========================================================================
* Description: Find the list by type corresponding to the object
* (the list it must belong to).
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* test the type of the object
*---------------------------------------------------------------------------
* Revision date: Author:
* 02-07-98 Corneliu Babiuc (pass the list as parameter)
*=========================================================================*/
EDT_ListByDLL * CPA_World::GetListFromObject (CPA_List<EDT_ListByDLL> *p_lstListByDLL, CPA_SuperObject *pEdObj)
{
EDT_ListByDLL *pListDLL = NULL;
POSITION pos;
// protected childs can't be selected
if (!pEdObj)
return NULL;
/* for (pListDLL = m_lstListByDLL.GetHeadElement(pos); pListDLL;
pListDLL = m_lstListByDLL.GetNextElement(pos)) */
for (pListDLL = p_lstListByDLL->GetHeadElement(pos); pListDLL;
pListDLL = p_lstListByDLL->GetNextElement(pos))
//END CPA2 Corneliu Babiuc (multiple registration) 02-07-98
{
if (pEdObj->GetObjectDLL() == pListDLL->GetDLL())
return pListDLL;
}
return NULL;
}
//CPA2 Corneliu Babiuc (multiple registration) 02-07-98
/*===========================================================================
* Description: Find the lists corresponding to the type of object
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* test the type of the object
*---------------------------------------------------------------------------
* Revision date: Author:
* 02-07-98 Corneliu Babiuc (pass the list as parameter)
*=========================================================================*/
EDT_ListByDLL * CPA_World::GetListFromObjectDLL (CPA_List<EDT_ListByDLL> *p_lstListByDLL, CPA_ObjectDLLBase *p_oDLL)
{
EDT_ListByDLL *pListDLL = NULL;
POSITION pos;
/* for (pListDLL = m_lstListByDLL.GetHeadElement(pos); pListDLL;
pListDLL = m_lstListByDLL.GetNextElement(pos)) */
for (pListDLL = p_lstListByDLL->GetHeadElement(pos); pListDLL;
pListDLL = p_lstListByDLL->GetNextElement(pos))
//END CPA2 Corneliu Babiuc (multiple registration) 02-07-98
{
if (p_oDLL == pListDLL->GetDLL())
return pListDLL;
}
return NULL;
}
/*===========================================================================
* Description: Update the lists when an object is deleted or inserted
* in the hierarchy (recursive function)
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
*
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vUpdateListObjects (CPA_SuperObject *pEdObj, tdeListUpdateMode eType, BOOL bUpdateObject)
{
CPA_SuperObject *pChild;
EDT_ListByDLL *pListDLL;
POSITION pos;
pListDLL = GetListFromObject(pEdObj);
// if the type is handled by the Editor
if (pListDLL)
pListDLL->fn_vUpdateListObject(pEdObj, eType);
m_stListAllDLLs.fn_vUpdateListObject(pEdObj, eType);
// update other lists
if ((eType == E_lum_Insert)||(eType == E_lum_ReInsert))
m_stListAllObjects.AddTail(pEdObj);
else if (eType == E_lum_Delete)
{
// update the list of all objects
pos = m_stListAllObjects.Find(pEdObj, NULL);
if (pos)
m_stListAllObjects.RemoveAt(pos);
// update selection
fn_vUpdateSelectLists(pEdObj, E_lum_Delete, TRUE);
}
// next level of the hierarchy
pChild = pEdObj->GetSuperObjectFirstChild();
while (pChild)
{
fn_vUpdateListObjects(pChild, eType, bUpdateObject);
pChild = pEdObj->GetSuperObjectNextChild(pChild);
}
}
/*===========================================================================
* Description: Update select lists when an object is selected or
* un-selected
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
*
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vUpdateSelectLists (CPA_SuperObject *pEdObj, tdeListUpdateMode eType, BOOL bIsSelected)
{
CPA_SuperObject *pChild;
EDT_ListByDLL *pListSelect;
// update list select
pListSelect = GetListFromObject(pEdObj);
if (pListSelect)
pListSelect->fn_vUpdateListSelect(pEdObj, eType, bIsSelected);
// update list all types
m_stListAllDLLs.fn_vUpdateListSelect(pEdObj, eType, bIsSelected);
// if necessary, update lists for the owner
if (pEdObj->GetSuperObjectOwner())
{
pListSelect = GetListFromObject(pEdObj->GetSuperObjectOwner());
if (pListSelect)
pListSelect->fn_vUpdateListProtect(pEdObj, eType, bIsSelected);
}
// next level of the hierarchy
pChild = pEdObj->GetSuperObjectFirstChild();
while (pChild)
{
fn_vUpdateSelectLists(pChild, eType, FALSE);
pChild = pEdObj->GetSuperObjectNextChild(pChild);
}
}
//CPA2 Corneliu Babiuc (multiple registration) 02-07-98
/*===========================================================================
* Description: Update registration lists when an object is added or
removed from registration
* Creation date:
* Author: Corneliu Babiuc
*---------------------------------------------------------------------------
*
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vUpdateRegisterLists (CPA_SuperObject *pEdObj, tdeListUpdateMode eType, BOOL bIsSelected)
{
CPA_SuperObject *pChild;
EDT_ListByDLL *pListSelect;
// update list select
pListSelect = GetListFromObject(&m_lstRegisterListByDLL, pEdObj);
if (pListSelect)
pListSelect->fn_vUpdateListSelect(pEdObj, eType, bIsSelected);
// update list all types
m_stRegisterListAllDLLs.fn_vUpdateListSelect(pEdObj, eType, bIsSelected);
// if necessary, update lists for the owner
if (pEdObj->GetSuperObjectOwner())
{
pListSelect = GetListFromObject(&m_lstRegisterListByDLL, pEdObj->GetSuperObjectOwner());
if (pListSelect)
pListSelect->fn_vUpdateListProtect(pEdObj, eType, bIsSelected);
}
// next level of the hierarchy
pChild = pEdObj->GetSuperObjectFirstChild();
while (pChild)
{
fn_vUpdateRegisterLists(pChild, eType, FALSE);
pChild = pEdObj->GetSuperObjectNextChild(pChild);
}
}
//END CPA2 Corneliu Babiuc (multiple registration) 02-07-98
/*===========================================================================
* Description: insert super-object in a new world without updating object
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
*
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vInsertSuperObjectInNewWorld (CPA_SuperObject *pEdObj, CPA_SuperObject *pParent, BOOL bUpdateDrawing)
{
// insert object in hierarchy
pEdObj->Isolate();
pParent->AddTail(pEdObj);
// update the corresponding list
fn_vUpdateListObjects(pEdObj, E_lum_Insert, FALSE);
// update validity
pEdObj->fn_vUpdateValidity(TRUE);
// update absolute position
if ((m_p_oMultiDevice)&&(m_p_oMultiDevice->GetInterface()))
{
if (bUpdateDrawing)
m_p_oMultiDevice->GetInterface()->fn_vUpdateAll(E_mc_UpdateAll);
}
}
/*===========================================================================
* Description: delete super-object in new world without updating object
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
*
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void CPA_World::fn_vDeleteSuperObjectInNewWorld (CPA_SuperObject *pEdObj, BOOL bUpdateDrawing)
{
// remove object from hierarchy
pEdObj->Isolate();
// update all the lists
fn_vUpdateListObjects(pEdObj, E_lum_Delete, FALSE);
// update validity
pEdObj->fn_vUpdateValidity(FALSE);
// update absolute position
if ((m_p_oMultiDevice)&&(m_p_oMultiDevice->GetInterface()))
{
if (bUpdateDrawing)
m_p_oMultiDevice->GetInterface()->fn_vUpdateAll(E_mc_UpdateAll);
}
}
#endif //ACTIVE_EDITOR