reman3/Rayman_X/cpa/tempgrp/Opd/src/EditorPO.cpp

973 lines
32 KiB
C++

/*
*=======================================================================================
* Name :EditorPO.cpp
*
* Author :Vincent Lhullier Date :09/04/97
*
* Description :implement member function of EditorPO object
*=======================================================================================
* Modification -> Author : Date :
* Description :
*=======================================================================================
*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "stdafx.h"
#include "acp_base.h"
#include "ITF.h"
#include "vig.h"
#include "DPT.h"
#include "incGLI.h"
#include "incOPD.h"
#include "OZO.h"
#include "x:\Cpa\Main\inc\_EditId.h"
//ROMTEAM WorldEditor (Cristian Stegaru 12/97)
#include "ogd.h"
#include "po\postruc.h"
#include "PO_res.h"
#include "x:\cpa\tempgrp\gliGLOU\MULTIDRV\inc\visus_st.h"
#include "DPT.h"
//ENDROMTEAM WorldEditor (Cristian Stegaru)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
DeclareTemplateStatic(PO_tdxHandleToPhysicalObject);
/*
=======================================================================================
CALLBACK (not class functions)
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : callback to save Physical Collide Set
p_stFile -> file
p_szSectionName -> section name
p_vData -> pointeur on data
eAction -> notification action
----------------------------------------------------------------------------------------
*/
void CallBackSaveCollideSet( SCR_tdst_File_Description *p_stFile, char *p_szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
EditorPO *p_oPO = (EditorPO *) p_vData;
switch (eAction)
{
case SCR_EA_Ntfy_AddSection:
case SCR_EA_Ntfy_RebuildSection:
//p_oPO->fn_vSectionSaved();
p_oPO->fn_p_oGetPCSSection()->fn_vSectionSaved();
{
char cZone;
static char *szZoneName[] = {"ZDD", "ZDM", "ZDE", "ZDR" };
/*
* save beginning of section
*/
char szName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName); // Remove the
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName); // file name
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_EOL);
for (cZone = 0; cZone < 4; cZone ++)
{
CPA_SaveObject * pObjectToSave = NULL;
if (p_oPO->GetZone( cZone ))
{
pObjectToSave = (CPA_SaveObject *) p_oPO->GetZone( cZone );
if (pObjectToSave -> fn_bIsOfType (C_szPhysicalObjectTypeName))
pObjectToSave = (CPA_SaveObject *) ((EditorPO *) pObjectToSave) -> m_fnp_oGetGeometricWithDistance (0);
}
if (pObjectToSave)
{
SCR_M_SvL0_SaveEntry(p_stFile, szZoneName[ cZone ], SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP
(
p_stFile,
SCR_EF_SvL0_Normal,
1,
pObjectToSave->GetReferencedSectionName()
);
}
}
/*
* save end of section
*/
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
break;
case SCR_EA_Ntfy_DeleteSection:
//p_oPO->fn_vSectionDeleted();
p_oPO->fn_p_oGetPCSSection()->fn_vSectionDeleted();
break;
}
}
/*
----------------------------------------------------------------------------------------
Description : script callback function to save Vse Section
p_stFile -> file info
p_szSectionName -> section name
p_vData -> pointer on data ( a visual set object handle )
eAction -> notify action
----------------------------------------------------------------------------------------
*/
void CallBackSaveVisualSet( SCR_tdst_File_Description *p_stFile, char *p_szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
EditorPO *p_oPO = (EditorPO *) p_vData;
switch (eAction)
{
case SCR_EA_Ntfy_AddSection:
case SCR_EA_Ntfy_RebuildSection:
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char *p_cCur, szString[20];
PO_tdxHandleToPhysicalObject hPO;
GEO_tdxHandleToVisualSet hVse;
ACP_tdxIndex xNbLods, xLod;
MTH_tdxReal xThreshold;
ACP_tdxHandleOfObject xGeom;
SCR_tdst_Link_Table *p_stGeomLinkTable;
SCR_tdst_Link_Value *p_stGeomLinkValue;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
hPO = p_oPO->GetStruct();
hVse = PO_fn_hGetVisualSet( hPO );
xNbLods = (ACP_tdxIndex) GLI_lGetVisualSetNumbertOfLOD( hVse );
/*
* write section name and number of lods
*/
p_cCur = strrchr( p_szSectionName, '^');
if (p_cCur == NULL)
p_cCur = p_szSectionName;
else
p_cCur++;
SCR_M_SvL0_SaveBeginSection(p_stFile, p_cCur, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP( p_stFile, SCR_EF_SvL0_Scanf, 2, "%d", xNbLods );
/*
* save now each sub section that correspond to each LOD
*/
p_stGeomLinkTable = GLI_p_stGetLinkTableOfGeometric();
for (xLod = 0; xLod < xNbLods; xLod ++)
{
GLI_vGetVisualSetLOD( hVse, xLod, &xThreshold, &xGeom );
sprintf( szString, "LOD:%d", xLod + 1);
SCR_M_SvL0_SaveBeginSection(p_stFile, szString, SCR_CC_C_Cfg_EOL);
SCR_M_SvL0_SaveEntry( p_stFile, "LOD_Treshold", SCR_CC_C_Cfg_NoChar );
SCR_fn_v_SvL0_SaveParameters_MP( p_stFile, SCR_EF_SvL0_Scanf, 2, "%g", xThreshold );
p_stGeomLinkValue = SCR_fnp_st_Link_SearchValue( p_stGeomLinkTable, (unsigned long) xGeom );
if (p_stGeomLinkValue != NULL)
{
p_cCur = SCR_M_p_sz_Link_GetKey( p_stGeomLinkValue ) + SCR_M_ul_Link_GetAdditionalLong( p_stGeomLinkValue, 1 );
SCR_M_SvL0_SaveEntry( p_stFile, "FichierMod", SCR_CC_C_Cfg_NoChar );
SCR_fn_v_SvL0_SaveParameters_MP( p_stFile, SCR_EF_SvL0_Scanf, 2, "%s", p_cCur );
}
//ROMTEAM WorldEditor (Cristian Stegaru 12/97)
else if (p_oPO->IsCandidatePO ())
{
ASSERT (NULL != p_oPO->m_pOrigGeom);
p_cCur = (char*)(LPCSTR)p_oPO->m_pOrigGeom->GetReferencedSectionName ();
SCR_M_SvL0_SaveEntry( p_stFile, "FichierMod", SCR_CC_C_Cfg_NoChar );
SCR_fn_v_SvL0_SaveParameters_MP( p_stFile, SCR_EF_SvL0_Scanf, 2, "%s", p_cCur );
}
//ENDROMTEAM WorldEditor (Cristian Stegaru)
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/*
* save end of section
*/
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
p_oPO->fn_p_oGetVSESection()->fn_vSectionSaved();
}
break;
case SCR_EA_Ntfy_DeleteSection:
p_oPO->fn_p_oGetPCSSection()->fn_vSectionDeleted();
break;
}
}
/*
----------------------------------------------------------------------------------------
Description : script callback function to save Po Section
p_stFile -> file info
p_szSectionName -> section name
p_vData -> pointer on data ( a visual set object handle )
eAction -> notify action
----------------------------------------------------------------------------------------
*/
void CallBackSavePhysicalObject( SCR_tdst_File_Description *p_stFile, char *p_szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
//ROMTEAM WorldEditor (Cristian Stegaru 16/01/98)
EditorPO *p_oPO = (EditorPO *) p_vData;
switch (eAction)
{
case SCR_EA_Ntfy_AddSection:
case SCR_EA_Ntfy_RebuildSection:
{
p_oPO->fn_vSectionSaved();
/*
* save beginning of section
*/
char szName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName); // Remove the
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName); // file name
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_EOL);
p_oPO->fn_vComputePCSSectionName( szSectionName );
CString csPCSSection, csOldPCSSection = szSectionName;
int iInx = csOldPCSSection.Find ('^');
ASSERT (-1 != iInx);
csPCSSection = csOldPCSSection.Left (iInx);
iInx = csOldPCSSection.ReverseFind ('^');
ASSERT (-1 != iInx);
csPCSSection += csOldPCSSection.Right (csOldPCSSection.GetLength () - iInx);
SCR_M_SvL0_SaveEntry(p_stFile, "CS", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP
(
p_stFile,
SCR_EF_SvL0_Normal,
1,
csPCSSection
);
p_oPO->fn_vComputeVSESectionName( szSectionName );
SCR_M_SvL0_SaveEntry(p_stFile, "VS", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP
(
p_stFile,
SCR_EF_SvL0_Normal,
1,
szSectionName
);
/*
* save end of section
*/
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
break;
case SCR_EA_Ntfy_DeleteSection:
break;
}
//ENDROMTEAM WorldEditor (Cristian Stegaru)
}
/*
=======================================================================================
Construction/destruction and initialization
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : constructor
p_oDLL -> owner dll
p_oMainWorld -> main world that contain EditorPO object
hObj -> handle on engine structure
csName -> name of object
csFileName -> file name were object is stored
csSectionName -> section name for object
----------------------------------------------------------------------------------------
*/
EditorPO::EditorPO
(
CPA_EditorBase *p_oDLL,
PO_tdxHandleToPhysicalObject hObj,
CPA_BaseObject *p_oOwner,
CString csName,
CString csFileName,
CString csSectionName
)
:CPA_SaveObject
(
p_oDLL,
C_szPhysicalObjectTypeName,
E_ss_Responsible,
p_oOwner,
TRUE,
NULL,
CallBackSavePhysicalObject
)
,CPA_EdMot<PO_tdxHandleToPhysicalObject>(hObj)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char *szPath;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//ROMTEAM WorldEditor (Nicu 07/11/97)
m_pGeom = NULL;
m_pOrigGeom = NULL;
m_iIdx = -2; // not a geometric object
m_bIsClone = FALSE;
//ENDROMTEAM WorldEditor (Nicu)
/*
* section object
*/
SetSectionData( this );
/*
* compute origin and get datapath corresponding to origin
*/
szPath = fn_szComputeOrigin( (char *) (LPCTSTR) csFileName, &m_cOrigin );
SetDataPath( szPath );
/*
* section name of PO object
*/
SCR_fn_v_RdL0_ComputeSectionName
(
szSectionName,
(char *)(LPCTSTR) fn_csConstructFileName(csFileName),
(char *)(LPCTSTR) csSectionName,
(char *)(LPCTSTR) csName
);
SetReferencedSectionName( szSectionName );
/*
* PCS Section
*/
/*
fn_vComputePCSSectionName( szSectionName );
m_p_oPCSSection = new CPA_SectionObject(szSectionName, szPath, CallBackSaveCollideSet, this, TRUE);
*/
/*
fn_vComputeVSESectionName( szSectionName );
m_p_oVSESection = new CPA_SectionObject(szSectionName, szPath, CallBackSaveVisualSet, this, TRUE);
*/
/*
* set object name
*/
if (fn_eRename(csName) != E_mc_None)
SetDefaultValidName();
fn_vUpdateSectionName();
if (hObj != NULL)
{
m_fn_vInitDataMembers();
//ROMTEAM WorldEditor (Nicu 06/12/97)
if(p_oOwner && p_oOwner->GetName() != "Geometric")
{
fn_vComputePCSSectionName( szSectionName );
if(!m_p_oPCSSection)
{
m_p_oPCSSection = new CPA_SectionObject(szSectionName, szPath, CallBackSaveCollideSet, this, FALSE);
ASSERT (m_p_oPCSSection);
m_p_oPCSSection->fn_vWriteSection ();
}
fn_vComputeVSESectionName( szSectionName );
if(!m_p_oVSESection)
{
m_p_oVSESection = new CPA_SectionObject(szSectionName, szPath, CallBackSaveVisualSet, this, FALSE);
ASSERT (m_p_oVSESection);
m_p_oVSESection->fn_vWriteSection ();
}
}
//ENDROMTEAM WorldEditor (Nicu)
// fbolefeysot - 06/08/98
// bidouille pour morphing premiere frame{
if(!m_p_oVSESection)
{
fn_vComputeVSESectionName( szSectionName );
m_p_oVSESection = new CPA_SectionObject(szSectionName, szPath, CallBackSaveVisualSet, this, FALSE);
ASSERT (m_p_oVSESection);
}
//END fbolefeysot}
}
else
{
SetAvailable( FALSE );
}
SetExistingSection( TRUE ); // A module can only be created during loading
m_fn_vSetIndexInObjectTable( C_uwNotInTable );
//ANNECY TQ 22/06/98{
this->fn_vSetEditorPOBoundingVolume(GEO_fn_hCreateGeometricSphere());
//ENDANNECY TQ}
};
/*
----------------------------------------------------------------------------------------
Description : Destructor
----------------------------------------------------------------------------------------
*/
EditorPO::~EditorPO()
{
/*
GEO_tdxHandleToVisualSet hVSE;
ACP_tdxIndex xNumberOfLod;
ACP_tdxIndex xIndexOfLod;
CPA_ObjectDLLBase *p_oGeoDLL;
if (GetDLL()->M_GetMultiDevice3D()->mbOnDestroy == FALSE)
{
hVSE = PO_fn_hGetVisualSet( GetStruct() );
xNumberOfLod = GLI_lGetVisualSetNumbertOfLOD( hVSE );
// Get Geometry3D DLL interface
p_oGeoDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLGeometryName);
// create a Geometric editor object for each Lod Definition
for (xIndexOfLod = 0; xIndexOfLod < xNumberOfLod; xIndexOfLod ++)
{
if (m_dp_oLodGeom[xIndexOfLod] != NULL)
p_oGeoDLL->OnQueryAction( p_oGeoDLL, C_uiDeleteGeometricObject, (LPARAM) m_dp_oLodGeom[xIndexOfLod] );
}
}
*/
free ( m_dp_oLodGeom );
}
/*
----------------------------------------------------------------------------------------
Description : dummy function
----------------------------------------------------------------------------------------
*/
void fn_vEmptyDeleteFunction(PO_tdxHandleToPhysicalObject h){}
/*
----------------------------------------------------------------------------------------
Description : Static Initialization
----------------------------------------------------------------------------------------
*/
void EditorPO::StaticInit()
{
CPA_EdMot<PO_tdxHandleToPhysicalObject>::Init(PO_fn_hAllocPhysicalObject,NULL,fn_vEmptyDeleteFunction);
}
/*
----------------------------------------------------------------------------------------
Description : init data member of editor object with engine object
----------------------------------------------------------------------------------------
*/
void EditorPO::m_fn_vInitDataMembers( BOOL _bSecondPass /* = FALSE */ )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
PO_tdxHandleToPhysicalObject hObj;
GEO_tdxHandleToVisualSet hVSE;
PCS_tdxHandleToPhysicalCollSet hPCS;
ACP_tdxIndex xNumberOfLod;
ACP_tdxIndex xIndexOfLod;
MTH_tdxReal xThreshold;
CPA_ObjectDLLBase *p_oOGDDLL;
CPA_ObjectDLLBase *p_oOZODLL;
ACP_tdxHandleOfObject hGeoObj;
char cZone;
SCR_tdst_Link_Value *p_stValue;
char *p_szPath, *p_szEndPath;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
hObj = (PO_tdxHandleToPhysicalObject) GetStruct();
hVSE = PO_fn_hGetVisualSet( hObj );
xNumberOfLod = (ACP_tdxIndex) GLI_lGetVisualSetNumbertOfLOD( hVSE );
if (! _bSecondPass)
{
/*
* init visual set section object
*/
p_stValue = SCR_fnp_st_Link_SearchValue(VS_fn_p_stGetLinkTable(), (unsigned long) hVSE );
//ROMTEAM WorldEditor (Nicu 10/11/97)
if(p_stValue) {
//ENDROMTEAM WorldEditor (Nicu)
p_szEndPath = p_stValue->p_szKey + p_stValue->stInfos.ulLong1 - 1;
*p_szEndPath = 0;
p_szPath = fn_szComputeOrigin( p_stValue->p_szKey, NULL );
*p_szEndPath++ = '\\';
m_p_oVSESection = new CPA_SectionObject( p_szEndPath, p_szPath, CallBackSaveVisualSet, this, TRUE);
//ROMTEAM WorldEditor (Nicu 07/11/97)
}
else m_p_oVSESection = NULL;
//ENDROMTEAM WorldEditor (Nicu)
/* allocate memory to store an array of pointer to Geometric Object */
m_dp_oLodGeom = (Geometry3D **) malloc ( xNumberOfLod * sizeof( Geometry3D *) );
/* Get Geometry3D DLL interface */
p_oOGDDLL = GetMainWorld()->GetObjectDLLWithName(C_szDLLGeometryName);
/* create a Geometric editor object for each Lod Definition */
for (xIndexOfLod = 0; xIndexOfLod < xNumberOfLod; xIndexOfLod ++)
{
if (p_oOGDDLL == NULL)
m_dp_oLodGeom[xIndexOfLod] = NULL;
else
{
GLI_vGetVisualSetLOD( hVSE, xIndexOfLod, &xThreshold, &hGeoObj );
m_dp_oLodGeom[xIndexOfLod] = (Geometry3D *) p_oOGDDLL->OnQueryAction( GetEditor(), C_uiCreateGeometricObject, (LPARAM) hGeoObj );
}
}
/*
* Init PhysicalCollSet section object
*/
hPCS = PO_fn_hGetCollideSet( hObj );
//ROMTEAM WorldEditor (Nicu 10/11/97)
if(hPCS) {
//ENDROMTEAM WorldEditor (Nicu)
p_stValue = SCR_fnp_st_Link_SearchValue(CS_fn_p_stGetLinkTable(), (unsigned long) hPCS );
p_szEndPath = p_stValue->p_szKey + p_stValue->stInfos.ulLong1 - 1;
*p_szEndPath = 0;
p_szPath = fn_szComputeOrigin( p_stValue->p_szKey, NULL );
*p_szEndPath++ = '\\';
m_p_oPCSSection = new CPA_SectionObject(p_szEndPath, p_szPath, CallBackSaveCollideSet, this, TRUE);
//ROMTEAM WorldEditor (Nicu 10/11/97)
}
else m_p_oPCSSection = NULL;
//ENDROMTEAM WorldEditor (Nicu)
}
/* now create Zone editor object */
hPCS = PO_fn_hGetCollideSet( hObj );
p_oOZODLL = GetMainWorld()->GetObjectDLLWithName( C_szDLLZDxName );
for (cZone = 0; cZone < 4; cZone ++)
{
if ( (p_oOZODLL == NULL) || (hPCS == NULL) )
m_ap_oZone[ cZone ] = NULL;
else
{
hGeoObj = PCS_fn_hGetGeoObjOfPhysicalCollSet( cZone, hPCS );
if (hGeoObj == NULL)
m_ap_oZone[ cZone ] = NULL;
else
{
static char *szZoneName[] = {C_szZddName, C_szZdmName, C_szZdeName, C_szZdrName };
tdstCreateZoneMess stZoneMess;
char *p_szSectionName = GLI_p_cSearchValueInLinkTableOfGeometric((unsigned long) hGeoObj);
char szName[SCR_CV_ui_Cfg_MaxLenName];
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, NULL, szName);
stZoneMess . csTypeName = szZoneName[ cZone ];
stZoneMess . hEngineZone = hGeoObj;
stZoneMess . csName = szName;
stZoneMess . pOwner = GetOwner();
stZoneMess . szDataPath = GetDataPath();
stZoneMess . csReferenceSectionName = p_szSectionName + strlen( stZoneMess . szDataPath ) + 1;
m_ap_oZone[ cZone ] = (CPA_BaseObject *) p_oOZODLL->OnQueryAction( GetEditor(), C_uiQueryCreateZDxObject, (LPARAM) & stZoneMess );
// for ZdR, if zone was not found : create the collision object
if ((m_ap_oZone[cZone] == NULL) && (cZone == 3) && (GetOwner() == NULL))
m_ap_oZone[ cZone ] = (Geometry3D *)p_oOGDDLL->OnQueryAction( GetEditor(), C_uiCreateGeometricObject, (LPARAM) hGeoObj );
}
}
}
}
/*
----------------------------------------------------------------------------------------
Description : load engine PO associated with an empty Editor PO
return (BOOL) TRUE if engine object is correctly loaded
----------------------------------------------------------------------------------------
*/
BOOL EditorPO::m_fn_bLoadEnginePO( void )
{
CString csRefSection;
SCR_tdst_Cxt_Values *p_stResult;
PO_tdxHandleToPhysicalObject hObj;
CPA_ToolDLLBase *p_oMaterialDLL;
if (!fn_bIsAvailable() )
{
csRefSection = GetReferencedSectionName();
p_stResult = SCR_fnp_st_RdL0_AnalyseSection( (char *) (LPCTSTR) csRefSection, SCR_CDF_uw_Anl_Normal );
GLI_vEndofGeometricLoad();
p_oMaterialDLL = GetMainWorld()->GetToolDLLWithName( C_szDLLMaterialName );
if (p_oMaterialDLL != NULL)
p_oMaterialDLL->OnQueryAction( GetEditor(), C_cCreateNewGameMaterial, 0 );
hObj = (PO_tdxHandleToPhysicalObject) SCR_M_ul_RdL0_ExtractLongValue( p_stResult, 0 );
fn_vUpdateData(hObj);
//ROMTEAM WorldEditor (Nicu 20/01/98)
POInterface *p_oOPD = (POInterface *)GetMainWorld()->GetObjectDLLWithName( C_szDLLPhysicalObjectName );
Shape3D* pGO;
if (p_oOPD->mfn_bIsACandidateEPO (GetName()))
{
pGO = p_oOPD->mfn_pGetGeomObjFromEPOName (GetName());
GMT_tdxHandleToGameMaterial hMaterial;
GEO_vGetGameMaterialOfIndexedTriangles (*hObj->_hVisualSet->d_p_stLodDefinitions, 0, &hMaterial);
struct GEO_tdstVisualSet_ *hVS = hObj->_hVisualSet;
*hVS->d_p_stLodDefinitions = pGO->GetStruct();
GEO_vSetGameMaterialOfIndexedTriangles (pGO->GetStruct(), 0, hMaterial);
}
//ENDROMTEAM WorldEditor (Nicu)
SetStruct( hObj );
SetAvailable( TRUE );
m_fn_vInitDataMembers();
//ROMTEAM WorldEditor (Nicu 20/01/98)
if (p_oOPD->mfn_bIsACandidateEPO (GetName()))
{
SetZone(3, pGO, FALSE);
m_iIdx = p_oOPD->mfn_iGetEPOIdx (GetName());
mfn_vSetClone (TRUE);
SetExistingSection (TRUE);
fn_vNotifySave ();
p_oOPD->m_lstOfCandidateEPO.AddTail (this);
}
//ENDROMTEAM WorldEditor (Nicu)
return TRUE;
}
return FALSE;
}
/*
----------------------------------------------------------------------------------------
Description : compute origin of an editor PO object
return data path for file that contain the PO
----------------------------------------------------------------------------------------
*/
char *EditorPO::fn_szComputeOrigin( char *_szFileName, char *_cOrigin )
{
char *szPath;
szPath = fn_szGetFamiliesDataPath();
if (strnicmp( _szFileName, szPath, strlen( szPath ) ) == 0)
{
if (_cOrigin != NULL)
*_cOrigin = C_cFromFamilies;
}
else
{
szPath = fn_szGetLevelsDataPath();
if (strnicmp( _szFileName, szPath, strlen( szPath) ) == 0)
{
if (_cOrigin != NULL)
*_cOrigin = C_cFromLevels;
}
else
{
szPath = fn_szGetGraphicsClassesDataPath();
if (strnicmp( _szFileName, szPath, strlen( szPath) ) == 0)
{
if (_cOrigin != NULL)
*_cOrigin = C_cFromClasses;
}
else
{
// this is not a PO, actually can be a VSE : don't need to return origin.
szPath = fn_szGetGraphicsBanksDataPath();
}
}
}
return szPath;
}
/*
----------------------------------------------------------------------------------------
Description : return part of filename that correspond to short file name
----------------------------------------------------------------------------------------
*/
CString EditorPO::fn_csConstructFileName(CString csFileName)
{
csFileName = csFileName.Mid( strlen( GetDataPath() ) + 1 );
return csFileName;
}
/*
----------------------------------------------------------------------------------------
Description : return PCS section Name associated with the PO object
szPCSSectionName -> string were result string is copied
----------------------------------------------------------------------------------------
*/
void EditorPO::fn_vComputePCSSectionName( char *szPCSSectionName )
{
char szEndSectionName[ SCR_CV_ui_Cfg_MaxLenName ];
char *p_cCur;
strcpy( szPCSSectionName, (char *) (LPCTSTR) GetReferencedSectionName());
p_cCur = strchr( szPCSSectionName, '.');
strcpy( szEndSectionName, p_cCur + 12 );
strcpy( p_cCur, ".zoo^AllCollideSets^CS:CS_");
strcat( p_cCur, szEndSectionName );
}
/*
----------------------------------------------------------------------------------------
Description : return PCS section Name associated with the PO object
szPCSSectionName -> string were result string is copied
----------------------------------------------------------------------------------------
*/
void EditorPO::fn_vComputeVSESectionName( char *szVSESectionName )
{
char szEndSectionName[ SCR_CV_ui_Cfg_MaxLenName ];
char *p_cCur;
strcpy( szVSESectionName, (char *) (LPCTSTR) GetReferencedSectionName());
p_cCur = strchr( szVSESectionName, '.');
if (p_cCur)
{
strcpy( szEndSectionName, p_cCur + 12 );
strcpy( p_cCur, ".vse^VS:VSE_");
strcat( p_cCur, szEndSectionName );
}
else
{
p_cCur = strchr(szVSESectionName, '^');
strcpy(szEndSectionName, p_cCur + 8);
strcpy( p_cCur, "^VS:VSE_");
strcat( p_cCur, szEndSectionName );
}
}
/*
=======================================================================================
Notification
=======================================================================================
*/
//--------------------------------------------------------------------------------------
void EditorPO::fn_vNotifySave (void)
{
//ROMTEAM WorldEditor (Cristian Stegaru 12/97)
fn_vWriteSection ();
//ENDROMTEAM WorldEditor (Cristian Stegaru)
m_p_oPCSSection->fn_vWriteSection();
}
//--------------------------------------------------------------------------------------
void EditorPO::fn_vNotifyUnSave (void)
{
m_p_oPCSSection->fn_vDeleteSection();
}
//--------------------------------------------------------------------------------------
void EditorPO::fn_vNotifyRestore (void)
{
m_p_oPCSSection->fn_vRestoreSection();
}
//--------------------------------------------------------------------------------------
void EditorPO::fn_vNotifyRename (void)
{
char szSectionName[ SCR_CV_ui_Cfg_MaxLenName ];
fn_vComputePCSSectionName( szSectionName );
m_p_oPCSSection->fn_vRenameSection( szSectionName );
/*
fn_vComputeVSESectionName( szSectionName );
m_p_oVSESection->fn_vRenameSection( szSectionName );
*/
}
//--------------------------------------------------------------------------------------
void EditorPO::fn_vUpdateSectionName (void)
{
// update main section
CPA_SaveObject::fn_vUpdateSectionName();
// update PCS section
//fn_vNotifyRename();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_csGetFullGeomSectionName
// Date : 98-03
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
CString EditorPO::mfn_csGetFullGeomSectionName ()
{
char *p_cCur;
PO_tdxHandleToPhysicalObject hPO;
GEO_tdxHandleToVisualSet hVse;
ACP_tdxIndex xNbLods, xLod;
MTH_tdxReal xThreshold;
ACP_tdxHandleOfObject xGeom;
SCR_tdst_Link_Table *p_stGeomLinkTable;
SCR_tdst_Link_Value *p_stGeomLinkValue;
CString csFullGeomSectionName;
CPA_ObjectDLLBase *p_oPODll = GetMainWorld()->GetObjectDLLWithName (C_szDLLPhysicalObjectName);
HINSTANCE hOldInst = AfxGetResourceHandle();
if (p_oPODll)
AfxSetResourceHandle (p_oPODll->GetDLLIdentity()->hModule);
hPO = GetStruct();
hVse = PO_fn_hGetVisualSet( hPO );
xNbLods = (ACP_tdxIndex) GLI_lGetVisualSetNumbertOfLOD( hVse );
ASSERT (1 == xNbLods);
xLod = 1;
p_stGeomLinkTable = GLI_p_stGetLinkTableOfGeometric();
GLI_vGetVisualSetLOD( hVse, xLod, &xThreshold, &xGeom );
p_stGeomLinkValue = SCR_fnp_st_Link_SearchValue( p_stGeomLinkTable, (unsigned long) xGeom );
if (p_stGeomLinkValue != NULL)
{
p_cCur = SCR_M_p_sz_Link_GetKey( p_stGeomLinkValue ) + SCR_M_ul_Link_GetAdditionalLong( p_stGeomLinkValue, 1 );
csFullGeomSectionName = p_cCur;
}
else
csFullGeomSectionName = mfn_csGetModSectionName ();
if (p_oPODll)
AfxSetResourceHandle(hOldInst);
return csFullGeomSectionName;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_csGetModSectionName
// Date : 98-03
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
CString EditorPO::mfn_csGetModSectionName ()
{
ASSERT (m_dp_oLodGeom);
Geometry3D *pG3d = m_dp_oLodGeom [0];
ASSERT (pG3d);
return pG3d->GetReferencedSectionName ();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_iGetFacesNumber
// Date : 98-05
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
ACP_tdxIndex EditorPO::mfn_iGetFacesNumber ()
{
ACP_tdxIndex iFacesNumber = 0;
Geometry3D *p3D = m_fnp_oGetGeometricWithDistance (0);
if (p3D)
iFacesNumber = p3D->mfn_iGetFacesNumber ();
return iFacesNumber;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_3dvGetMinCoordinates
// Date : 98-05
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
MTH3D_tdstVector EditorPO::mfn_3dvGetMinCoordinates ()
{
MTH3D_tdstVector tdstMinCoordintes;
tdstMinCoordintes.xX = tdstMinCoordintes.xY = tdstMinCoordintes.xZ = 0;
Geometry3D *p3D = m_fnp_oGetGeometricWithDistance (0);
if (p3D)
tdstMinCoordintes = p3D->mfn_3dvGetMinCoordinates ();
return tdstMinCoordintes;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_3dvGetMaxCoordinates
// Date : 98-05
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
MTH3D_tdstVector EditorPO::mfn_3dvGetMaxCoordinates ()
{
MTH3D_tdstVector tdstMaxCoordintes;
tdstMaxCoordintes.xX = tdstMaxCoordintes.xY = tdstMaxCoordintes.xZ = 0;
Geometry3D *p3D = m_fnp_oGetGeometricWithDistance (0);
if (p3D)
tdstMaxCoordintes = p3D->mfn_3dvGetMaxCoordinates ();
return tdstMaxCoordintes;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_3dvGetSizes
// Date : 98-05
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
MTH3D_tdstVector EditorPO::mfn_3dvGetSizes () //dX, dY, dZ
{
MTH3D_tdstVector tdstSize;
tdstSize.xX = tdstSize.xY = tdstSize.xZ = 0;
Geometry3D *p3D = m_fnp_oGetGeometricWithDistance (0);
if (p3D)
tdstSize = p3D->mfn_3dvGetSizes ();
return tdstSize;
}