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

462 lines
15 KiB
C++

/*=========================================================================
*
* SECTsurf.cpp : Implementation of Editor Surface Lists
*
*
* Version 1.0
* Creation date
* Revision date
*
* Shaitan
*=======================================================================*/
/*
#include "stdafx.h"
#include "acp_base.h"
#define SRF_FRIEND
#define SRF_MAIN
#include "SECTint.hpp"
#include "DPT.h"
#undef SRF_MAIN
#undef SRF_FRIEND
#include "SRF\SRF_Fct.h"
DeclareTemplateStatic(SCT_tdxHandleOfElementLstSurface);
DeclareTemplateStatic(SRF_tdxHandleToSurface);
static long NbSurf = 0;
//#################################################################################
// Surface
//#################################################################################
/===========================================================================
Default Constructor
===========================================================================/
SECT_Surface::SECT_Surface (Sector_Interface *p_oDLL,
SRF_tdxHandleToSurface hSurface, BOOL bAvailable,
CString csName, CString csFileName)
: CPA_SaveObject(p_oDLL, C_szSurfaceTypeName, E_ss_Responsible, NULL, bAvailable,
fn_szGetLevelsDataPath(), SECT_Surface::CallBackSaveSurfaceMatrix),
CPA_EdMot<SRF_tdxHandleToSurface>(hSurface)
{
ACP_tdxHandleOfObject hVisual;
CPA_DLLBase *pGeomDLL;
CString csVisualName, csSuperObjectName;
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
// section object
SetSectionData(this);
// section name
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, (char *)(LPCSTR)csFileName, C_szSurfaceActionName, " ");
SetReferencedSectionName(szSectionName);
// matrix section
m_pMatrixSection = new CPA_SectionObject (GetMatrixSectionName(), fn_szGetLevelsDataPath(),
SECT_Surface::CallBackSaveSurfaceMatrix,
this, TRUE);
// create editor visual
hVisual = SRF_M_hGetVisualOfSurface(GetStruct());
pGeomDLL = p_oDLL->GetMainWorld()->GetObjectDLLWithName(C_szDLLGeometryName);
m_pVisualSurface = (CPA_BaseObject *) pGeomDLL->OnQueryAction(p_oDLL, C_uiCreateGeometricObject, (long) hVisual);
// create visual super-object
csVisualName = "SPO_Visual" + csName;
m_pVisualSuperObject = p_oDLL->GetInterface()->GetNewSuperObject(E_ss_NoSave, C_Dynamic, csVisualName, "");
m_pVisualSuperObject->SetObject(m_pVisualSurface);
HIE_fn_vSetSuperObjectMatrix(m_pVisualSuperObject->GetStruct(), SRF_M_hGetPositionOfSurface(GetStruct()));
// name
if (fn_eRename(csName ) != E_mc_None)
SetDefaultValidName();
fn_vUpdateSectionName();
// create super-object
csSuperObjectName = "SPO_" + GetName();
m_pSuperObject = p_oDLL->GetInterface()->GetNewSuperObject(E_ss_NoSave, C_Dynamic, csSuperObjectName, "");
m_pSuperObject->SetObject(this);
// update hierarchy
m_pSuperObject->AddANewChild(m_pVisualSuperObject);
m_pVisualSuperObject->SetSuperObjectOwner(m_pSuperObject);
// existence
SetExistingSection(TRUE);
}
/===========================================================================
Destructor
===========================================================================/
SECT_Surface::~SECT_Surface (void)
{
}
/===========================================================================
Matrix
===========================================================================/
CString SECT_Surface::GetMatrixSectionName (void)
{
CString csSectionName;
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
// get corresponding section
SCR_fn_v_RdL0_SplitSectionName((char*)(LPCSTR) GetReferencedSectionName(), szFileName, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, szFileName, "Matrix", szName);
csSectionName = szSectionName;
return csSectionName;
}
/===========================================================================
Height (Get)
===========================================================================/
MTH_tdxReal SECT_Surface::GetHeight (void)
{
// get engine height
return SRF_fn_xGetSurfaceHeight(GetStruct());
}
/===========================================================================
Height (Set)
===========================================================================/
void SECT_Surface::SetHeight (MTH_tdxReal xNewHeight)
{
MTH3D_tdstVector stSurfacePos;
// update engine height
SRF_fn_vSetSurfaceHeight(GetStruct(), xNewHeight);
// set initial height
POS_fn_vGetTranslationVector(SRF_M_hGetPositionOfSurface(GetStruct()), &stSurfacePos);
POS_fn_vSetTranslationVector(SRF_M_hGetInitPositionOfSurface(GetStruct()), &stSurfacePos);
// update visual super-object
HIE_fn_vSetSuperObjectMatrix(m_pVisualSuperObject->GetStruct(), SRF_M_hGetPositionOfSurface(GetStruct()));
// notify the change
fn_vNotifySave();
}
//#################################################################################
// Save
//#################################################################################
/===========================================================================
Update Section Name
=========================================================================/
void SECT_Surface::fn_vUpdateSectionName (void)
{
// update main section
CPA_SaveObject::fn_vUpdateSectionName();
// update matrix section
m_pMatrixSection->SetReferencedSectionName(GetMatrixSectionName());
}
/===========================================================================
Notifications
=========================================================================/
void SECT_Surface::fn_vNotifySave (void)
{
// matrix section
m_pMatrixSection->fn_vWriteSection();
}
//===========================================================================
void SECT_Surface::fn_vNotifyUnSave (void)
{
// matrix section
m_pMatrixSection->fn_vDeleteSection();
}
//===========================================================================
void SECT_Surface::fn_vNotifyRestore (void)
{
// matrix section
m_pMatrixSection->fn_vRestoreSection();
}
//===========================================================================
void SECT_Surface::fn_vNotifyRename (void)
{
// matrix section
m_pMatrixSection->fn_vRenameSection(GetMatrixSectionName());
}
/*===========================================================================
* Description: CallBack Save for matrix
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
/*
void SECT_Surface::CallBackSaveSurfaceMatrix (SCR_tdst_File_Description *p_stFile, char *szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
GEO_tdxHandleToMatrix hMatrix;
MTH3D_tdstVector stVecI,stVecJ,stVecK;
SECT_Surface *pSurface;
CString csName;
double dUnit;
char szNewSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szMatrixName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
// get parameters
pSurface = (SECT_Surface *) p_vData;
dUnit = GLI_dGetUnitInMeterInFile(NULL);
if (dUnit == 0)
dUnit = 1;
switch (eAction)
{
case SCR_EA_Ntfy_RebuildSection:
// corresponding matrix
hMatrix = SRF_M_hGetPositionOfSurface(pSurface->GetStruct());
// get section name
SCR_fn_v_RdL0_SplitSectionName(szSectionName, NULL, szNewSectionName, szName);
strcpy(szMatrixName, szName);
// save begin section
SCR_fn_v_RdL0_ComputeSectionName(szNewSectionName, NULL, "Matrix", szMatrixName);
SCR_M_SvL0_SaveBeginSection(p_stFile, szNewSectionName, SCR_CC_C_Cfg_EOL);
// save translation
SCR_M_SvL0_SaveEntry(p_stFile, "MatrixTranslation", SCR_CC_C_Cfg_NoChar);
POS_fn_vGetTranslationVector(hMatrix,&stVecI);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%f,%f,%f",
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecI)) / dUnit,
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecI)) / dUnit,
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecI)) / dUnit);
// save scale
SCR_M_SvL0_SaveEntry(p_stFile, "MatrixScale", SCR_CC_C_Cfg_NoChar);
POS_fn_vGetScaleMatrix(hMatrix,&stVecI,&stVecJ,&stVecK);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%f,%f,%f,%f,%f,%f,%f,%f,%f",
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecI)),
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecI)),
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecI)),
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecJ)),
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecJ)),
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecJ)),
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecK)),
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecK)),
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecK)));
// save rotation
SCR_M_SvL0_SaveEntry(p_stFile, "MatrixRotation", SCR_CC_C_Cfg_NoChar);
POS_fn_vGetRotationMatrix (hMatrix,&stVecI,&stVecJ,&stVecK);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%f,%f,%f,%f,%f,%f,%f,%f,%f",
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecI)),
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecI)),
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecI)),
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecJ)),
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecJ)),
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecJ)),
GLI_M_ValueToFloat(MTH3D_M_xGetXofVector(&stVecK)),
GLI_M_ValueToFloat(MTH3D_M_xGetYofVector(&stVecK)),
GLI_M_ValueToFloat(MTH3D_M_xGetZofVector(&stVecK)));
// save end section
SCR_M_SvL0_SaveEndSection (p_stFile, SCR_CC_C_Cfg_EOL);
// update section object
pSurface->fn_vSectionSaved();
pSurface->GetMatrixSection()->fn_vSectionSaved();
break;
}
}
//#################################################################################
// Surface Element
//#################################################################################
/===========================================================================
Default Constructor
===========================================================================/
SECT_SurfElem::SECT_SurfElem (SCT_tdxHandleOfElementLstSurface hSurfElem, Sector_Object *pOwnerSector)
: CPA_EdMot<SCT_tdxHandleOfElementLstSurface>(hSurfElem),
SECT_EnvElementBase (pOwnerSector)
{
SRF_tdxHandleToSurface hSurface;
// init environment
hSurface = SCT_GetSurfaceInList(hSurfElem);
m_pSurface = pOwnerSector->GetSectorInterface()->GetOrBuildSurface(hSurface);
}
/===========================================================================
New Constructor
===========================================================================/
SECT_SurfElem::SECT_SurfElem (SECT_Surface *pSurface, Sector_Object *pOwnerSector)
: CPA_EdMot<SCT_tdxHandleOfElementLstSurface>(),
SECT_EnvElementBase (pOwnerSector)
{
// init environment
m_pSurface = pSurface;
SCT_fn_vSetHandleOfSurfaceInSurfaceList(GetStruct(), m_pSurface->GetStruct());
}
/===========================================================================
Destructor
===========================================================================/
SECT_SurfElem::~SECT_SurfElem (void)
{
}
/===========================================================================
Surface
===========================================================================/
void SECT_SurfElem::SetSurface (SECT_Surface *pSurface)
{
// if there was a surface, warn coherence manager
if ((m_pSurface)&&(m_pOwnerSector))
g_oCoherenceManager.m_fn_vRemoveALink(m_pOwnerSector, m_pSurface);
// set environment
m_pSurface = pSurface;
// update engine element
SCT_fn_vSetHandleOfSurfaceInSurfaceList(GetStruct(), m_pSurface->GetStruct());
// warn coherence manager
if (m_pOwnerSector)
g_oCoherenceManager.m_fn_vAddALink(m_pOwnerSector, m_pSurface);
// notify modif
if (g_bCanSave)
fn_vWriteSection();
}
//#################################################################################
// Surface List
//#################################################################################
/===========================================================================
Add Surface Element
===========================================================================/
BOOL SECT_SurfaceList::fn_bAddAnElement (SECT_SurfElem *pNewElem, SECT_SurfElem *pPreviousElem, BOOL bUpdateEngine)
{
POSITION pos;
// check element owner
if (pNewElem->GetOwnerSector() != m_pOwnerSector)
return FALSE;
// no previous element => add head
if (!pPreviousElem)
AddHead(pNewElem, bUpdateEngine);
// previous element => add at corresponding position
else
{
pos = Find(pPreviousElem, NULL);
InsertAfter(pos, pNewElem, bUpdateEngine);
}
// warn coherence manager
g_oCoherenceManager.m_fn_vAddALink(m_pOwnerSector, pNewElem->GetSurface());
return TRUE;
}
/===========================================================================
Remove Surface Element
===========================================================================/
void SECT_SurfaceList::fn_vRemoveAnElement (SECT_SurfElem *pOldElem, BOOL bUpdateEngine)
{
POSITION pos;
// add element to the list
pos = Find(pOldElem, NULL);
if (pos)
RemoveAt(pos, bUpdateEngine);
// warn coherence manager
g_oCoherenceManager.m_fn_vRemoveALink(m_pOwnerSector, pOldElem->GetSurface());
}
/===========================================================================
Remove All Elements
===========================================================================/
void SECT_SurfaceList::fn_vRemoveAllElements (BOOL bUpdateEngine)
{
SECT_SurfElem *pElem;
while (GetCount() > 0)
{
pElem = RemoveTail(bUpdateEngine);
g_oCoherenceManager.m_fn_vRemoveALink(m_pOwnerSector, pElem->GetSurface());
}
}
/===========================================================================
Find Surface Element
===========================================================================/
SECT_SurfElem * SECT_SurfaceList::GetElementWithSurface (SECT_Surface *pSurface)
{
SECT_SurfElem *pElem;
POSITION pos;
// check every element
for (pElem = GetHeadElement(pos); pElem; pElem = GetNextElement(pos))
{
if (pElem->GetSurface() == pSurface)
return pElem;
}
// element was not found
return NULL;
}
/===========================================================================
Find Previous Surface Element
===========================================================================/
long SECT_SurfaceList::GetInsertPosition (SECT_SurfElem *pSurfElem)
{
SECT_SurfElem *pElem;
POSITION pos;
long lPosition = 0;
// check every element
for (pElem = GetHeadElement(pos); pElem; pElem = GetNextElement(pos))
{
if (pElem->GetSurface()->GetHeight() <= pSurfElem->GetSurface()->GetHeight())
return lPosition;
lPosition++;
}
// element was not found
return GetCount();
}
/===========================================================================
Find Surface Element
===========================================================================/
long SECT_SurfaceList::GetCurrentPosition (SECT_SurfElem *pSurfElem)
{
SECT_SurfElem *pElem;
POSITION pos;
long lPosition = 0;
// check every element
for (pElem = GetHeadElement(pos); pElem; pElem = GetNextElement(pos))
{
if (pElem == pSurfElem)
return lPosition;
lPosition++;
}
// element was not found
return -1;
}
*/