reman3/Rayman_X/cpa/tempgrp/OGD/src/3dobject.cpp

2601 lines
104 KiB
C++

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// delete all ModifSections ........
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ACP_Base.h"
#include "ITF.h"
#include "incGAM.h"
#include "GLI.h"
#include "DPT.h"
#include "ErO.h"
#undef CPA_WANTS_IMPORT
#undef CPA_EXPORT
#define CPA_WANTS_EXPORT
#include "OGD.h"
#undef CPA_WANTS_EXPORT
#define CPA_WANTS_IMPORT
#include "3Dinterf.hpp"
#include "X:/CPA/main/inc/_editid.h"
//#include "3DSctn.hpp"
///////////////////////////////////////////////////////////////////////////////
// DEFINE
///////////////////////////////////////////////////////////////////////////////
#define M_bHasPTModification() (m_oListOfModifiedPoints . GetCount() )
#define M_bHasGMTModification() (m_oListOfGMTModif . GetCount() )
#define M_bHasFMDModification() (m_oListOfFMDModif . GetCount() )
#define M_LKTB_SearchKeyByValue( p_stLinkTable, ulValue ) SCR_M_p_sz_Link_GetKey( SCR_fnp_st_Link_SearchValue( p_stLinkTable, ulValue ) )
#define M_LKTB_SearchValueByKey( p_stLinkTable, szKey ) SCR_M_ul_Link_GetValue( SCR_fnp_st_Link_SearchKey( p_stLinkTable, szKey ) )
#define M_LKTB_SearchAdditionalLongByValue( p_stLinkTable, ulValue ) SCR_M_ul_Link_GetAdditionalLong( SCR_fnp_st_Link_SearchValue( p_stLinkTable, ulValue ), 1 )
#define M_LKTB_GetKeyAndAdditionalLongByValue( p_stLinkTable, ulValue , p_cKey, ulLong )\
{\
SCR_tdst_Link_Value *p_stValue = SCR_fnp_st_Link_SearchValue( p_stLinkTable, ulValue );\
if ( p_stValue )\
{\
p_cKey = SCR_M_p_sz_Link_GetKey( p_stValue );\
ulLong = SCR_M_ul_Link_GetAdditionalLong( p_stValue, 1 );\
}\
else\
{\
p_cKey = NULL;\
ulLong = 0;\
}\
}
#define M_GetMaterialValue(szKey) ((GMT_tdxHandleToGameMaterial)M_LKTB_SearchValueByKey(GMT_fn_p_stGetLinkTable(),szKey))
#define M_GetElementType(_szName,_Type) for( (_Type) = 0 ; strcmpi(g_szElementTypeName[_Type],"END") && strcmpi(g_szElementTypeName[_Type],_szName) ; (_Type)++);
#define M_GetFMTToElementFMD(xElementFMD, xFaceFMD) (((GEO_tdstElementFaceMapDescriptors*)GetStruct() -> d_stListOfElements[xElementFMD]) -> d_stListOfFacesQuadrupled[xFaceFMD])
#define M_GetFMDToElementFMD(xElementFMD, xFaceFMD) (M_GetFMTToElementFMD(xElementFMD, xFaceFMD) . hFaceMapDescriptor)
#define M_ForEachElement( oList, oElement, Pos )\
for( oElement = (oList) . GetHeadElement( Pos ) ; \
oElement ; \
oElement = (oList) . GetNextElement( Pos ) )
#define C_szDefaultMaterial "Common\\Common.gmt^GameMaterial:Default"
//=======================================================================================
// ENGINE
//=======================================================================================
DeclareTemplateStatic(ACP_tdxHandleOfObject);
void del(ACP_tdxHandleOfObject h)
{
// if ( h )
// delete h;
}
//=======================================================================================
// GLOBALS
//=======================================================================================
char *g_szElementTypeName[] =
{
"",
"IndexedTriangles",
"FaceMapDescriptors",
"Sprites",
"TMeshes",
"Points",
"Lines",
"Spheres",
"AlignedBoxes",
"Cones",
"",
"Altimap",
"END"
};
static CPA_DLLBase *s_p_oDLLTGM;
//
//
// implementation
//
//
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::StaticInit(CPA_MainWorld *_p_oMainWorld)
{
CPA_EdMot<ACP_tdxHandleOfObject>::Init(NULL,NULL,del);
SCR_fn_v_RdL0_RegisterCallback( "Edit-Geometric", Geometry3D::CallBackLoad, SCR_CRC_c_RdL0_ForSection );
SCR_fn_v_RdL0_RegisterCallback( C_szModifActionName, Geometry3D::CallBackLoadModif, SCR_CRC_c_RdL0_ForSection );
s_p_oDLLTGM = _p_oMainWorld -> GetToolDLLWithName( C_szDLLMaterialName );
}
// ----------------------------------------------------------------------------
// Description : constructor to encapsulate an existing engine object
// ----------------------------------------------------------------------------
Geometry3D::Geometry3D(CPA_EditorBase *_p_oEditor, CPA_BaseObject *_p_oOwnerFile, ACP_tdxHandleOfObject _hObject,
const CString _csName /*=""*/, char *_p_cRefPath /*=NULL*/, tdeSaveStatus _eStatus /*=E_ss_Modify*/)
:CPA_ModifiableObject( _p_oEditor, C_szGeometricType, _eStatus, _p_oOwnerFile, TRUE, NULL, Geometry3D::CallBackSaveGeometricObject),
CPA_EdMot<ACP_tdxHandleOfObject>(_hObject)
{
ASSERT( _p_oOwnerFile || _eStatus == E_ss_NoSave);
ASSERT( _hObject );
int iPathLength;
//m_p_oModifListSection = NULL;
m_p_oModifSection = NULL;
//
// path
if (_p_oOwnerFile)
{
char szShortSectionName[SCR_CV_ui_Cfg_MaxLenName];
if( _p_cRefPath == NULL )
{
_p_cRefPath = (char*) GetEditor() -> OnQueryAction( NULL, C_uiGetOGDTypePath, (long)(char*)(LPCTSTR)((CPA_FileObject*)_p_oOwnerFile) -> GetCompleteName() );
}
SetDataPath( _p_cRefPath );
iPathLength = (_p_cRefPath) ? strlen( _p_cRefPath ) + 1 : 0;
SCR_fn_v_RdL0_ComputeSectionName( szShortSectionName, (char*)(LPCTSTR)(((CPA_FileObject*)_p_oOwnerFile) -> GetCompleteName()) + iPathLength,
"Geometric", " " );
SetReferencedSectionName( szShortSectionName );
SetSectionData( this );
SetExistingSection( TRUE );
}
else
{
SetReferencedSectionName( "Bidon.mod^Geometric:This" );
SetSectionData( this );
SetExistingSection( FALSE );
}
//
// name
BOOL bLoading = GetEditor()->GetInterface()->fn_bIsLoadingWorld();
if (_eStatus == E_ss_NoSave)
GetEditor()->GetInterface()->SetLoadingWorld(FALSE);
if( fn_eRename( _csName ) != E_mc_None )
SetDefaultValidName();
if (_eStatus == E_ss_NoSave)
GetEditor()->GetInterface()->SetLoadingWorld(bLoading);
fn_vUpdateSectionName();
//
// datas
SetExistingSection( (_p_oOwnerFile!=NULL) );
// create list of ElementSection
ACP_tdxIndex xNbElements = GEO_xGetGeometricObjectNumberOfElements( _hObject );
SCR_tdst_Link_Table *p_stLkTb;
for( ACP_tdxIndex xElement = 0; xElement < xNbElements ; xElement++ )
{
switch ( GEO_xGetElementType(_hObject, xElement) )
{
case GEO_C_xElementIndexedTriangles:
p_stLkTb = GLI_p_stGetLinkTableOfElementIndexedTriangle();
break;
case GEO_C_xElementFaceMapDescriptors:
p_stLkTb = GLI_p_stGetLinkTableOfElementFaceMapDescriptor();
break;
case GEO_C_xElementSprites:
p_stLkTb = GLI_p_stGetLinkTableOfElementSprite();
break;
case GEO_C_xElementTMeshes:
p_stLkTb = GLI_p_stGetLinkTableOfElementTMeshe();
break;
case GEO_C_xElementPoints:
p_stLkTb = GLI_p_stGetLinkTableOfElementPoint();
break;
case GEO_C_xElementLines:
p_stLkTb = GLI_p_stGetLinkTableOfElementLine();
break;
case GEO_C_xElementSpheres:
p_stLkTb = GLI_p_stGetLinkTableOfElementSphere();
break;
case GEO_C_xElementAlignedBoxes:
p_stLkTb = GLI_p_stGetLinkTableOfElementAlignedBoxe();
break;
case GEO_C_xElementCones:
p_stLkTb = GLI_p_stGetLinkTableOfElementCone();
break;
//VLNEWGLI
/*
// BEGIN CPA2 Cristi Petrescu 98-03-
case GEO_C_xElementAltimap:
p_stLkTb = GLI_p_stGetLinkTableOfElementAltimap ();
break;
// END CPA2 Cristi Petrescu 98-03-
*/
//EVL
default:
p_stLkTb = NULL;
}
if( p_stLkTb )
{
char *p_cLinkName;
unsigned long ulValue;
M_LKTB_GetKeyAndAdditionalLongByValue( p_stLkTb, (unsigned long) _hObject -> d_stListOfElements[ xElement ], p_cLinkName, ulValue );
if( p_cLinkName )
{
SectionElement *p_oElementSection = new SectionElement(p_cLinkName + ulValue, _p_cRefPath,
Geometry3D::CallBackSaveGeometricElement );
p_oElementSection -> SetSectionData( p_oElementSection );
p_oElementSection -> SetElement( (void*)_hObject -> d_stListOfElements[ xElement ] );
m_oListOfElementSections . AddTail( p_oElementSection );
}
}
}
// data members
m_oListOfModifiedPoints . RemoveAll();
m_oListOfGMTModif . RemoveAll();
// BEGIN CPA2 Cristi Petrescu 98-02-
m_oListOfFMDModif . RemoveAll ();
// END CPA2 Cristi Petrescu 98-02-
m_hBoundingVolume = NULL;
m_bMustRecomputeBdV = TRUE;
m_bEndCreated = TRUE;
fn_vInitFMD();
// init Modif Sections
//fn_vInitModifSections();
if (_p_oOwnerFile)
mfn_vLoadModifSection ();
}
// ----------------------------------------------------------------------------
// Description : constructor to create and save a new object
// ----------------------------------------------------------------------------
Geometry3D::Geometry3D(CPA_EditorBase *_p_oEditor, ACP_tdxIndex xNbPoints, ACP_tdxIndex xNbElements,
CPA_BaseObject *_p_oOwnerFile, const CString _csName /*=""*/, char *_p_cRefPath /*=NULL*/,
tdeSaveStatus _eStatus /*=E_ss_Responsible*/)
:CPA_ModifiableObject( _p_oEditor, C_szGeometricType, _eStatus, _p_oOwnerFile, TRUE, NULL, Geometry3D::CallBackSaveGeometricObject),
CPA_EdMot<ACP_tdxHandleOfObject>((ACP_tdxHandleOfObject)NULL)
{
ASSERT( _p_oOwnerFile );
//
char szShortSectionName[SCR_CV_ui_Cfg_MaxLenName];
ACP_tdxHandleOfObject hObject;
//m_p_oModifListSection = NULL;
m_p_oModifSection = NULL;
//
// path
if( _p_cRefPath == NULL )
{
_p_cRefPath = (char*)GetEditor() -> OnQueryAction( NULL, C_uiGetOGDTypePath, (long)(char*)(LPCTSTR)((CPA_FileObject*)_p_oOwnerFile) -> GetCompleteName() );
}
SetDataPath( _p_cRefPath );
SCR_fn_v_RdL0_ComputeSectionName( szShortSectionName, (char*)(LPCTSTR)(((CPA_FileObject*)_p_oOwnerFile) -> GetCompleteName()) + strlen( _p_cRefPath ) + 1, "Geometric", " " );
SetReferencedSectionName( szShortSectionName );
SetSectionData( this );
SetExistingSection( FALSE );
//
// datas
GEO_vCreateGeometricObject( &hObject, xNbPoints , xNbElements );
SetStruct( (ACP_tdxHandleOfObject) hObject );
// create list of ElementSection
for( ACP_tdxIndex xElement = 0; xElement < xNbElements ; xElement++ )
{
SectionElement *p_oElementSection = new SectionElement("", _p_cRefPath, Geometry3D::CallBackSaveGeometricElement);
p_oElementSection -> SetSectionData( p_oElementSection );
p_oElementSection -> SetExistingSection( FALSE );
m_oListOfElementSections . AddTail( p_oElementSection );
}
//
// name
if( fn_eRename( _csName ) != E_mc_None )
SetDefaultValidName();
fn_vUpdateSectionName();
//
m_oListOfModifiedPoints . RemoveAll();
m_oListOfGMTModif . RemoveAll();
// BEGIN CPA2 Cristi Petrescu 98-02-
m_oListOfFMDModif . RemoveAll ();
// END CPA2 Cristi Petrescu 98-02-
m_hBoundingVolume = NULL;
m_bMustRecomputeBdV = TRUE;
m_bEndCreated = FALSE;
fn_vInitFMD();
// init Modif Sections
// fn_vInitModifSections();
mfn_vLoadModifSection ();
}
// ----------------------------------------------------------------------------
// Description : constructor to create and a new object which can't be save
// ----------------------------------------------------------------------------
Geometry3D::Geometry3D(CPA_EditorBase *_p_oEditor, ACP_tdxIndex xNbPoints, ACP_tdxIndex xNbElements,
const CString _csName /*=""*/, tdeSaveStatus _eStatus /*=E_ss_NoSave*/)
:CPA_ModifiableObject( _p_oEditor, C_szGeometricType, _eStatus, NULL, TRUE),
CPA_EdMot<ACP_tdxHandleOfObject>((ACP_tdxHandleOfObject)NULL)
{
ASSERT( xNbPoints > 0 );
ASSERT( xNbElements > 0 );
//
ACP_tdxHandleOfObject hObject;
//m_p_oModifListSection = NULL;
m_p_oModifSection = NULL;
//
// path
SetSectionData( NULL );
SetExistingSection( FALSE );
//
// datas
GEO_vCreateGeometricObject( &hObject, xNbPoints , xNbElements );
SetStruct( (ACP_tdxHandleOfObject) hObject );
m_oListOfElementSections . RemoveAll();
//
// name
if( fn_eRename( _csName ) != E_mc_None )
SetDefaultValidName();
fn_vUpdateSectionName();
//
m_oListOfModifiedPoints . RemoveAll();
m_oListOfGMTModif . RemoveAll();
// BEGIN CPA2 Cristi Petrescu 98-02-
m_oListOfFMDModif . RemoveAll ();
// END CPA2 Cristi Petrescu 98-02-
m_hBoundingVolume = NULL;
m_bMustRecomputeBdV = TRUE;
m_bEndCreated = FALSE;
// init Modif Sections
//fn_vInitModifSections();
//mfn_vCreateModifSection ();
fn_vInitFMD();
}
// ----------------------------------------------------------------------------
// Description : destructor
// ----------------------------------------------------------------------------
Geometry3D::~Geometry3D()
{
while ( ! m_oListOfElementSections . IsEmpty() )
delete m_oListOfElementSections . RemoveHead();
while ( ! m_oListOfFMD . IsEmpty() )
free( m_oListOfFMD . RemoveHead() );
//if( m_p_oModifListSection ) delete m_p_oModifListSection;
if( m_p_oModifSection ) delete m_p_oModifSection;
//
fn_vClearFMDModificationsList();
fn_vClearGMTModificationsList();
fn_vClearModificationsList();
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vInitModifSections(void)
{
/*
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
char szShortSectionName[SCR_CV_ui_Cfg_MaxLenName];
SCR_fn_v_RdL0_SplitSectionName( (char*)(LPCTSTR) GetReferencedSectionName(), szFileName, NULL, NULL );
// Modif List Section
SCR_fn_v_RdL0_ComputeSectionName( szShortSectionName, szFileName, C_szModifListActionName, NULL );
m_p_oModifListSection = new CPA_SectionObject( szShortSectionName, GetDataPath(), Geometry3D::CallBackSaveModifListGeometricObject );
m_p_oModifListSection -> SetSectionData( this );
m_p_oModifListSection -> SetExistingSection( FALSE );
// Modif Section
SCR_fn_v_RdL0_ComputeSectionName( szShortSectionName, szFileName, C_szModifActionName, fn_p_szGetName() );
m_p_oModifSection = new CPA_SectionObject( szShortSectionName, GetDataPath(), Geometry3D::CallBackSaveModifGeometricObject );
m_p_oModifSection -> SetSectionData( this );
m_p_oModifSection -> SetExistingSection( FALSE );
*/
}
// ----------------------------------------------------------------------------
// Author : MT
// Creation : 30/07/97
//
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vInitFMD(void)
{
m_bMustSaveFMD = FALSE;
m_oListOfFMD . RemoveAll();
m_lUniqueFMD = 0;
if ( fn_bCanBeNotified() )
{
ACP_tdxHandleOfObject p_stObj = GetStruct();
ACP_tdxIndex xElementFMD;
// search for a Face descriptor element
for ( xElementFMD = 0 ; xElementFMD < p_stObj->xNbElements; xElementFMD++ )
{
if ( p_stObj -> d_xListOfElementsTypes[ xElementFMD ] == GEO_C_xElementFaceMapDescriptors )
break;
}
if ( xElementFMD != p_stObj -> xNbElements )
{
// face map descriptor found, must update m_lUniqueFMD
ACP_tdxIndex xNbFaces = ((GEO_tdstElementFaceMapDescriptors*)p_stObj -> d_stListOfElements[ xElementFMD ]) -> xNbFaces;
ACP_tdxIndex xIndexFace;
for ( xIndexFace = 0 ; xIndexFace < xNbFaces ; xIndexFace++ )
{
ACP_tdxHandleOfFMD hFMD = M_GetFMDToElementFMD( xElementFMD, xIndexFace );
char *szLinkName = M_LKTB_SearchKeyByValue( GLI_p_stGetLinkTableOfFaceMapDescriptor(), (unsigned long)hFMD);
if( szLinkName )
{
char *p_cPoint = strrchr( szLinkName, '_' );
if( p_cPoint )
{
long lValue = atol( p_cPoint + 1 );
m_lUniqueFMD = max( m_lUniqueFMD, lValue );
}
}
}
}
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vUpdateSectionName(void)
{
CPA_ModifiableObject::fn_vUpdateSectionName();
if( m_p_oModifSection != NULL )
{
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
char szShortSectionName[SCR_CV_ui_Cfg_MaxLenName];
SCR_fn_v_RdL0_SplitSectionName( (char*)(LPCTSTR) m_p_oModifSection -> GetReferencedSectionName(), szFileName, NULL, NULL );
SCR_fn_v_RdL0_ComputeSectionName( szShortSectionName, szFileName, C_szModifActionName, fn_p_szGetName() );
m_p_oModifSection -> SetReferencedSectionName( szShortSectionName );
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::SetExistingModifSection(BOOL _bExists)
{
if( m_p_oModifSection ) m_p_oModifSection -> SetExistingSection( _bExists );
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
/*
void Geometry3D::SetExistingModifListSection(BOOL _bExists)
{
if( m_p_oModifListSection ) m_p_oModifListSection -> SetExistingSection( _bExists );
}
*/
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifySave()
{
if( fn_bCanBeNotified() )
{
// main section of object
fn_vWriteSection();
// Element Sections
SectionElement *p_oSectionElement;
POSITION xPos;
M_ForEachElement( m_oListOfElementSections, p_oSectionElement, xPos )
{
p_oSectionElement -> fn_vWriteSection();
}
// modif section
if( GetSaveStatus() == E_ss_Modify )
{
//if( m_p_oModifListSection ) m_p_oModifListSection -> fn_vWriteSection();
if( m_p_oModifSection ) m_p_oModifSection -> fn_vWriteSection();
}
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifyUnSave()
{
if( fn_bCanBeNotified() )
{
// main section of object
fn_vDeleteSection();
// Element Sections
SectionElement *p_oSectionElement;
POSITION xPos;
M_ForEachElement( m_oListOfElementSections, p_oSectionElement, xPos )
{
p_oSectionElement -> fn_vDeleteSection();
}
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifyRestore()
{
if( fn_bCanBeNotified() )
{
// main section of object
fn_vRestoreSection();
// Element Sections
SectionElement *p_oSectionElement;
POSITION xPos;
M_ForEachElement( m_oListOfElementSections, p_oSectionElement, xPos )
{
p_oSectionElement -> fn_vRestoreSection();
}
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifyRename()
{
if( fn_bCanBeNotified() )
{
// main section of object
fn_vRenameSection(fn_csComputeReferencedSectionName(GetName()));
// modif section
if( ( GetSaveStatus() == E_ss_Modify ) && m_p_oModifSection )
{
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
char szShortSectionName[SCR_CV_ui_Cfg_MaxLenName];
//m_p_oModifListSection -> fn_vWriteSection();
SCR_fn_v_RdL0_SplitSectionName( (char*)(LPCTSTR) m_p_oModifSection -> GetReferencedSectionName(), szFileName, NULL, NULL );
SCR_fn_v_RdL0_ComputeSectionName( szShortSectionName, szFileName, C_szModifActionName, fn_p_szGetName() );
m_p_oModifSection -> fn_vRenameSection( szShortSectionName );
}
// Element Sections
SectionElement *p_oSectionElement;
POSITION xPos;
int iElement = 0;
M_ForEachElement( m_oListOfElementSections, p_oSectionElement, xPos )
{
char szShortSectionName[SCR_CV_ui_Cfg_MaxLenName];
fn_vComputeElementReferencedSectionName( szShortSectionName, iElement );
p_oSectionElement -> fn_vRenameSection( szShortSectionName );
iElement++;
}
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifySaveObject(void)
{
if( fn_bCanBeNotified() )
{
fn_vWriteSection();
// modif section
if( GetSaveStatus() == E_ss_Modify )
{
//if( m_p_oModifListSection ) m_p_oModifListSection -> fn_vWriteSection();
if( m_p_oModifSection ) m_p_oModifSection -> fn_vWriteSection();
}
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifyUnSaveObject(void)
{
if( fn_bCanBeNotified() )
fn_vDeleteSection();
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifyRestoreObject(void)
{
if( fn_bCanBeNotified() )
fn_vRestoreSection();
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifyRenameObject(void)
{
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifySaveElement(ACP_tdxHandleOfElement _hElement)
{
POSITION xPos = m_oListOfElementSections . FindIndex( _hElement );
if( xPos )
{
m_oListOfElementSections . GetAt( xPos ) -> fn_vWriteSection();
// modif section
if( GetSaveStatus() == E_ss_Modify )
{
//if( m_p_oModifListSection ) m_p_oModifListSection -> fn_vWriteSection();
if( m_p_oModifSection ) m_p_oModifSection -> fn_vWriteSection();
}
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifyUnSaveElement(ACP_tdxHandleOfElement _hElement)
{
POSITION xPos = m_oListOfElementSections . FindIndex( _hElement );
if( xPos )
{
m_oListOfElementSections . GetAt( xPos ) -> fn_vDeleteSection();
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vNotifyRestoreElement(ACP_tdxHandleOfElement _hElement)
{
POSITION xPos = m_oListOfElementSections . FindIndex( _hElement );
if( xPos )
{
m_oListOfElementSections . GetAt( xPos ) -> fn_vRestoreSection();
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
// BEGIN CPA2 Cristi Petrescu 98-02-
/*
void Geometry3D::fn_vSetOnState(CString _ocsModificationType, BOOL _bInitialState)
{
if( fn_bIsModified(_ocsModificationType) && (fn_bIsOnInitialState(_ocsModificationType) != _bInitialState) )
{
if( _ocsModificationType == C_szFormModif )
{
// swap positions
MTH3D_tdstVector st3DTmpPoint;
tdstModifPoint *p_stModif;
POSITION xPos;
M_ForEachElement( m_oListOfModifiedPoints, p_stModif, xPos )
{
fn_vGetPoint( p_stModif -> xIndexOfPoint , &st3DTmpPoint );
fn_vOwnerSetPoint( p_stModif -> xIndexOfPoint , &(p_stModif -> st3DPoint) );
memcpy( &(p_stModif -> st3DPoint), &st3DTmpPoint, sizeof(MTH3D_tdstVector) );
}
if( ! m_oListOfModifiedPoints . IsEmpty() )
fn_vEndModification();
}
else if ( _ocsModificationType == C_szMaterialModif )
{
// swap material
GMT_tdxHandleToGameMaterial hGameMaterial;
tdstModifGMT *p_stModif;
POSITION xPos;
M_ForEachElement( m_oListOfGMTModif, p_stModif, xPos )
{
hGameMaterial = fn_hGetGameMaterial( p_stModif -> hElement, p_stModif -> xIndexInElement );
fn_vOwnerSetMaterial( p_stModif -> hElement, p_stModif -> xIndexInElement, p_stModif -> hGameMaterial );
p_stModif -> hGameMaterial = hGameMaterial;
}
}
}
}
*/
// END CPA2 Cristi Petrescu 98-02-
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
BOOL Geometry3D::fn_bCanBeModified(void)
{
switch ( GetSaveStatus() )
{
case E_ss_Responsible:
// BEGIN CPA2 Cristi Petrescu 98-02-
return !( M_bHasPTModification() || M_bHasGMTModification() || M_bHasFMDModification() );
// END CPA2 Cristi Petrescu 98-02-
break;
case E_ss_NoSave:
case E_ss_Modify:
return TRUE;
break;
case E_ss_NoModif:
return FALSE;
break;
}
return FALSE;
}
// ----------------------------------------------------------------------------
// Description : CallBack from reading 'Edit-Geometric' section
// ----------------------------------------------------------------------------
SCR_tde_Anl_ReturnValue Geometry3D::CallBackLoad(SCR_tdst_File_Description *_p_stFile, char *_pszName,
char *_ap_szParams[], SCR_tde_Anl_Action _eAction)
{
ASSERT(0);
return SCR_ERV_Anl_NormalReturn;
}
// ----------------------------------------------------------------------------
// Description : CallBack from reading 'Edit-ModifGeometric' section
// ----------------------------------------------------------------------------
SCR_tde_Anl_ReturnValue Geometry3D::CallBackLoadModif(SCR_tdst_File_Description *_p_stFile, char *_pszName,
char *_ap_szParams[], SCR_tde_Anl_Action _eAction)
{
Geometry3D *p_oGeom;
SCR_M_RdL0_GetContextLong(0, 0, Geometry3D*, p_oGeom);
switch ( _eAction )
{
case SCR_EA_Anl_BeginSection:
p_oGeom -> m_oListOfModifiedPoints . RemoveAll();
p_oGeom -> m_oListOfGMTModif . RemoveAll();
// BEGIN CPA2 Cristi Petrescu 98-02-
p_oGeom -> m_oListOfFMDModif . RemoveAll ();
// END CPA2 Cristi Petrescu 98-02-
break;
case SCR_EA_Anl_Entry:
if( ! strcmpi(_pszName,"MovedPoint") )
{
ACP_tdxIndex xIndex = atoi( _ap_szParams[0] );
if( xIndex < GEO_xGetGeometricObjectNumberOfPoints( p_oGeom -> GetStruct() ) )
{
// BEGIN CPA2 Cristi Petrescu 98-02-
/*
MTH3D_tdstVector st3D;
MTH3D_M_vSetVectorElements( &st3D, (MTH_tdxReal)atof(_ap_szParams[1]),
(MTH_tdxReal)atof(_ap_szParams[2]),
(MTH_tdxReal)atof(_ap_szParams[3]) );
*/
p_oGeom -> fn_vAddModification( xIndex/*, &st3D */);
// END CPA2 Cristi Petrescu 98-02-
}
}
else if( ! strcmpi(_pszName,"GameMaterial") )
{
ACP_tdxHandleOfElement hElement = atoi( _ap_szParams[0] );
// BEGIN CPA2 Cristi Petrescu 98-03-
ACP_tdxIndex xIndexInElement = 0; //atoi( _ap_szParams[2] );
// END CPA2 Cristi Petrescu 98-03-
// BEGIN CPA2 Cristi Petrescu 98-02-
GMT_tdxHandleToGameMaterial hGM = NULL;
SCR_tdst_Link_Value *p_stValue = SCR_fnp_st_Link_SearchKey (GMT_fn_p_stGetLinkTable(), _ap_szParams[2]);
if (p_stValue)
hGM = (GMT_tdxHandleToGameMaterial) SCR_M_ul_Link_GetValue (p_stValue);
//M_GetMaterialValue( _ap_szParams[2] );
/*
char *szGameMaterialName = _ap_szParams[2];
GMT_tdxHandleToGameMaterial hGM;
SCR_tdst_Link_Table *p_stGameMaterialLinkTable = GMT_fn_p_stGetLinkTable();
SCR_tdst_Link_Value *p_stMaterialEntry = SCR_fnp_st_Link_SearchValue(p_stGameMaterialLinkTable, (unsigned long) hGameMaterial);
hGM = (GMT_tdxHandleToGameMaterial) SCR_M_ul_Link_GetValue (p_stMaterialEntry);
*/
if (hGM)
p_oGeom -> fn_vAddGMTModification( hElement, xIndexInElement, hGM );
// END CPA2 Cristi Petrescu 98-02-
}
// BEGIN CPA2 Cristi Petrescu 98-02-
else if( ! strcmpi(_pszName,"MovedFace") )
{
ACP_tdxIndex xElementIT = atoi( _ap_szParams[0] );
ACP_tdxIndex xIndexFaceIT = atoi( _ap_szParams[1] );
ACP_tdxIndex xElementFMD = atoi( _ap_szParams[2] );
ACP_tdxIndex xIndexFaceFMD = atoi( _ap_szParams[3] );
p_oGeom -> fn_vAddFMDModification( xElementIT, xIndexFaceIT, xElementFMD, xIndexFaceFMD);
}
// END CPA2 Cristi Petrescu 98-02-
break;
case SCR_EA_Anl_EndSection:
// form modif
if( !p_oGeom -> m_oListOfModifiedPoints . IsEmpty() )
p_oGeom -> fn_vSetCurrentState( C_szFormModif, FALSE ); // use modification
// material modif
if( !p_oGeom -> m_oListOfGMTModif . IsEmpty() )
p_oGeom -> fn_vSetCurrentState( C_szMaterialModif,FALSE );
// BEGIN CPA2 Cristi Petrescu 98-02-
// FMD modif
if( !p_oGeom -> m_oListOfFMDModif . IsEmpty() )
p_oGeom -> fn_vSetCurrentState( C_szFMDModif,FALSE );
// END CPA2 Cristi Petrescu 98-02-
break;
}
return SCR_ERV_Anl_NormalReturn;
}
// ----------------------------------------------------------------------------
// Description : CallBack from reading 'Edit-ListModifGeometric' section
// ----------------------------------------------------------------------------
/*
SCR_tde_Anl_ReturnValue Geometry3D::CallBackLoadModifList
(SCR_tdst_File_Description *_p_stFile, char *_pszName,
char *_ap_szParams[], SCR_tde_Anl_Action _eAction)
{
CListOfString *p_oListOfModifSection;
SCR_M_RdL0_GetContextLong(0, 0, CListOfString*, p_oListOfModifSection);
switch ( _eAction )
{
case SCR_EA_Anl_BeginSection:
p_oListOfModifSection -> AddTail( CString("File Loaded") );
break;
case SCR_EA_Anl_Entry:
if( ! strcmpi(_pszName,"AddModif") )
p_oListOfModifSection -> AddTail( CString(_ap_szParams[0]) );
break;
case SCR_EA_Anl_EndSection:
break;
}
return SCR_ERV_Anl_NormalReturn;
}
*/
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
//
// CallBack Save functions
//
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
/*===========================================================================
* Description: Call Back Save for List of Modif Section
* Creation date:
* Author: Marc
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
/*
void Geometry3D::CallBackSaveModifListGeometricObject(SCR_tdst_File_Description *p_stFile,
char *p_szSectionName, void *p_vData,
SCR_tde_Ntfy_Action eAction)
{
Geometry3D *p_oGeom = (Geometry3D*)p_vData;
CPA_BaseObject *p_oOwnerFile = p_oGeom -> GetOwner();
CPA_BaseObjectList *p_oListOfGeometric = p_oGeom -> GetBaseObjectList();
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
Position stPos;
switch( eAction )
{
case SCR_EA_Ntfy_AddSection:
case SCR_EA_Ntfy_RebuildSection:
// get section name
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, C_szModifListActionName, " ");
// save begin section
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_EOL);
// save entries
stPos = p_oListOfGeometric -> GetHeadPosition();
while ( stPos )
{
Geometry3D *p_oObject = (Geometry3D*) p_oListOfGeometric -> GetNext( stPos );
if( (p_oObject -> GetSaveStatus() == E_ss_Modify) &&
(p_oObject -> GetOwner() == p_oOwnerFile) &&
( (! p_oObject -> m_oListOfModifiedPoints . IsEmpty()) || (! p_oObject -> m_oListOfGMTModif . IsEmpty()) )
)
{
SCR_M_SvL0_SaveEntry(p_stFile, "AddModif", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, C_szModifActionName, p_oObject -> fn_p_szGetName() );
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, szSectionName );
}
}
// write 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);
//
p_oGeom -> m_p_oModifListSection -> fn_vSectionSaved();
break;
case SCR_EA_Ntfy_DeleteSection:
p_oGeom -> m_p_oModifListSection -> fn_vSectionDeleted();
break;
}
}
*/
/*===========================================================================
* Description: Call Back Save for geometric object (Modif Section)
* Creation date:
* Author: Marc
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Geometry3D::CallBackSaveModifGeometricObject(SCR_tdst_File_Description *p_stFile, char *p_szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
GEO_tdstGeometricObject *p_stGeometric;
Geometry3D *p_oObject;
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
double dUnit = 1;
POSITION xPos;
// init parameters
p_oObject = (Geometry3D *) p_vData;
p_stGeometric = (GEO_tdstGeometricObject *) p_oObject->GetData();
switch( eAction )
{
case SCR_EA_Ntfy_AddSection:
// go to end of file (we need all file directive to load this section)
SCR_fn_v_SvL1_ToEndSection(p_stFile);
SCR_M_SvL0_SaveBlankLine (p_stFile);
case SCR_EA_Ntfy_RebuildSection:
// Get unit from script file
SCR_M_RdL0_GetFileDouble(0, 1, dUnit);
if (dUnit == 0)
dUnit = 1.0;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save begin section
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_EOL);
// save entries (FormModif)
xPos = p_oObject -> m_oListOfModifiedPoints . GetHeadPosition();
while ( xPos )
{
tdstModifPoint *p_stModif = p_oObject -> m_oListOfModifiedPoints . GetNext( xPos );
// BEGIN CPA2 Cristi Petrescu 98-02-
MTH3D_tdstVector st3DPoint;
p_oObject-> fn_vGetPoint (p_stModif -> xIndexOfPoint, &st3DPoint);
SCR_M_SvL0_SaveEntry(p_stFile, "MovedPoint", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%.6f,%.6f,%.6f",
p_stModif -> xIndexOfPoint,
/*p_stModif ->*/ st3DPoint . xX / dUnit,
/*p_stModif ->*/ st3DPoint . xY / dUnit,
/*p_stModif ->*/ st3DPoint . xZ / dUnit);
// END CPA2 Cristi Petrescu 98-02-
}
// save entries (GMTModif)
xPos = p_oObject -> m_oListOfGMTModif . GetHeadPosition();
while( xPos )
{
tdstModifGMT *p_stModif = p_oObject -> m_oListOfGMTModif . GetNext( xPos );
// BEGIN CPA2 Cristi Petrescu 98-02-
GMT_tdxHandleToGameMaterial hGameMaterial;
hGameMaterial = p_oObject -> fn_hGetGameMaterial (p_stModif -> hElement, p_stModif -> xIndexInElement);
CPA_SaveObject *p_oGM = (CPA_SaveObject*)s_p_oDLLTGM -> GetBaseObject(/*p_stModif ->*/ hGameMaterial, C_szGameMaterialTypeName);
CPA_SaveObject *p_oInitialGM = (CPA_SaveObject*)s_p_oDLLTGM -> GetBaseObject(p_stModif -> hGameMaterial, C_szGameMaterialTypeName);
CString csGameMaterialName = p_oGM -> GetCompleteSectionName();
CString csInitialGameMaterialName = p_oInitialGM -> GetCompleteSectionName();
//GMT_tdxHandleToGameMaterial hGM = M_GetMaterialValue ((char*)(LPCTSTR)csGameMaterialName);
// END CPA2 Cristi Petrescu 98-02-
// BEGIN CPA2 Cristi Petrescu 98-03-
SCR_M_SvL0_SaveEntry(p_stFile, "GameMaterial", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d,%s,%s,%s",
p_stModif -> hElement,
// p_stModif -> xIndexInElement,
(char*)(LPCTSTR)csGameMaterialName,
(char*)(LPCTSTR)csInitialGameMaterialName,
g_szElementTypeName[ p_stModif -> xElementType ]);
// END CPA2 Cristi Petrescu 98-03-
}
// BEGIN CPA2 Cristi Petrescu 98-02-
// save entries (FMDModif)
xPos = p_oObject -> m_oListOfFMDModif . GetHeadPosition();
while( xPos )
{
tdstModifFMD *p_stModif = p_oObject -> m_oListOfFMDModif . GetNext( xPos );
GMT_tdxHandleToGameMaterial hGameMaterial;
hGameMaterial = p_oObject -> fn_hGetGameMaterial (p_stModif -> xElementFMD, p_stModif -> xIndexFaceFMD);
CPA_SaveObject *p_oGM = (CPA_SaveObject*)s_p_oDLLTGM -> GetBaseObject(hGameMaterial, C_szGameMaterialTypeName);
CString csGameMaterialName = p_oGM -> GetCompleteSectionName();
SCR_M_SvL0_SaveEntry(p_stFile, "MovedFace", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d,%d,%d,%d,%s",
p_stModif -> xElementIT,
p_stModif -> xIndexFaceIT,
p_stModif -> xElementFMD,
p_stModif -> xIndexFaceFMD,
(char*)(LPCTSTR)csGameMaterialName );
}
// END CPA2 Cristi Petrescu 98-02-
// write 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);
p_oObject -> m_p_oModifSection -> fn_vSectionSaved();
break;
case SCR_EA_Ntfy_DeleteSection:
p_oObject -> m_p_oModifSection -> fn_vSectionDeleted();
break;
}
}
/*===========================================================================
* Description: Call Back Save for geometric object
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Geometry3D::CallBackSaveGeometricObject( SCR_tdst_File_Description *p_stFile, char *p_szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
GEO_tdstGeometricObject *p_stGeometric;
Geometry3D *p_oObject;
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];
double dUnit = 1;
long iInd;
POSITION xPos;
SectionElement *p_oElementSection;
// ANNECY MT 23/02/98 {
ACP_tdxIndex xIndexBdV;
// END ANNECY MT }
// init parameters
p_oObject = (Geometry3D *) p_vData;
p_stGeometric = (GEO_tdstGeometricObject *) p_oObject->GetData();
switch (eAction)
{
case SCR_EA_Ntfy_AddSection:
// go to end of file (we need all file directive to load this section)
SCR_fn_v_SvL1_ToEndSection(p_stFile);
SCR_M_SvL0_SaveBlankLine (p_stFile);
case SCR_EA_Ntfy_RebuildSection:
// Get unit from script file
SCR_M_RdL0_GetFileDouble(0, 1, dUnit);
if (dUnit == 0)
dUnit = 1.0;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, szFileName, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save begin section
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d,%d,%d",
p_stGeometric->xNbPoints, 0 /*p_stGeometric->xNbEdges*/, p_stGeometric->xNbElements);
// write list of points
for (iInd = 0; iInd < p_stGeometric->xNbPoints; iInd++)
{
SCR_M_SvL0_SaveEntry(p_stFile, "AddVertex", SCR_CC_C_Cfg_NoChar);
if( p_stGeometric->d_stListOfPointsReceivedLightIntensity )
{
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.1f,%.1f,%.1f",
iInd,
p_stGeometric->d_stListOfPoints[iInd].xX / dUnit,
p_stGeometric->d_stListOfPoints[iInd].xY / dUnit,
p_stGeometric->d_stListOfPoints[iInd].xZ / dUnit,
p_stGeometric->d_stListOfPointsNormals[iInd].xX,
p_stGeometric->d_stListOfPointsNormals[iInd].xY,
p_stGeometric->d_stListOfPointsNormals[iInd].xZ,
p_stGeometric->d_stListOfPointsReceivedLightIntensity[iInd].xR,
p_stGeometric->d_stListOfPointsReceivedLightIntensity[iInd].xG,
p_stGeometric->d_stListOfPointsReceivedLightIntensity[iInd].xB);
}
else
{
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f",
iInd,
p_stGeometric->d_stListOfPoints[iInd].xX / dUnit,
p_stGeometric->d_stListOfPoints[iInd].xY / dUnit,
p_stGeometric->d_stListOfPoints[iInd].xZ / dUnit,
p_stGeometric->d_stListOfPointsNormals[iInd].xX,
p_stGeometric->d_stListOfPointsNormals[iInd].xY,
p_stGeometric->d_stListOfPointsNormals[iInd].xZ);
}
}
// write list of elements
iInd = 0;
M_ForEachElement( p_oObject -> m_oListOfElementSections, p_oElementSection, xPos )
{
xIndexBdV = GEO_xGetParallelBoxIndexOfElement( p_stGeometric, iInd );
SCR_fn_v_RdL0_SplitSectionName( (char*)(LPCTSTR)p_oElementSection -> GetReferencedSectionName(), szFileName, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, "*", szActionName, szName);
SCR_M_SvL0_SaveEntry(p_stFile, "AddElement", SCR_CC_C_Cfg_NoChar);
// ANNECY MT 23/02/98 {
if( xIndexBdV == GEO_C_xNoParallelBox )
{
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d,%s,%s",
iInd, g_szElementTypeName[p_stGeometric->d_xListOfElementsTypes[iInd]], szSectionName);
}
else
{
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d,%s,%s,%d",
iInd, g_szElementTypeName[p_stGeometric->d_xListOfElementsTypes[iInd]], szSectionName, xIndexBdV);
}
// END ANNECY MT }
iInd++;
}
// write 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);
p_oObject -> fn_vSectionSaved();
break;
case SCR_EA_Ntfy_DeleteSection:
p_oObject -> fn_vSectionDeleted();
break;
}
}
/*===========================================================================
* Description: Call Back Save for geometric element
* Creation date:
* Author: Shaitan
*---------------------------------------------------------------------------
* Revision date: Author:
*=========================================================================*/
void Geometry3D::CallBackSaveGeometricElement (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
ACP_tdxIndex xElementType;
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
char *p_szActionName;
SectionElement *p_oElementSection = (SectionElement*) p_vData;
switch (eAction)
{
case SCR_EA_Ntfy_AddSection:
// go to end of file (we need all file directive to load this section)
SCR_fn_v_SvL1_ToEndSection(p_stFile);
SCR_M_SvL0_SaveBlankLine (p_stFile);
case SCR_EA_Ntfy_RebuildSection:
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
// find element type from action name
p_szActionName = szActionName + strlen("Element");
M_GetElementType( p_szActionName, xElementType );
switch (xElementType)
{
case GEO_C_xElementIndexedTriangles:
CallBackSaveElementIndexedTriangle(p_stFile, p_szSectionName, (GEO_tdstElementIndexedTriangles *) p_oElementSection -> hGetElement() );
break;
case GEO_C_xElementFaceMapDescriptors:
CallBackSaveElementFaceMapDescriptors(p_stFile, p_szSectionName, (GEO_tdstElementFaceMapDescriptors *) p_oElementSection -> hGetElement() );
break;
case GEO_C_xElementSprites:
CallBackSaveElementSprites(p_stFile, p_szSectionName, (GEO_tdstElementSprite *) p_oElementSection -> hGetElement() );
break;
case GEO_C_xElementTMeshes:
CallBackSaveElementTMeshes(p_stFile, p_szSectionName, (GEO_tdstElementTMeshes *) p_oElementSection -> hGetElement() );
break;
case GEO_C_xElementPoints:
CallBackSaveElementPoints(p_stFile, p_szSectionName, (GEO_tdstElementPoints *) p_oElementSection -> hGetElement() );
break;
case GEO_C_xElementLines:
CallBackSaveElementLines(p_stFile, p_szSectionName, (GEO_tdstElementLines *) p_oElementSection -> hGetElement() );
break;
case GEO_C_xElementSpheres:
CallBackSaveElementSpheres(p_stFile, p_szSectionName, (GEO_tdstElementSpheres *) p_oElementSection -> hGetElement() );
break;
case GEO_C_xElementAlignedBoxes:
CallBackSaveElementAlignedBox(p_stFile, p_szSectionName, (GEO_tdstElementAlignedBoxes *) p_oElementSection -> hGetElement() );
break;
case GEO_C_xElementCones:
CallBackSaveElementCones(p_stFile, p_szSectionName, (GEO_tdstElementCones *) p_oElementSection -> hGetElement() );
break;
// BEGIN CPA2 Cristi Petrescu 98-03-
case GEO_C_xElementAltimap:
CallBackSaveElementAltimap (p_stFile, p_szSectionName, (GEO_tdstElementAltimap *) p_oElementSection -> hGetElement());
break;
// END CPA2 Cristi Petrescu 98-03-
}
p_oElementSection -> fn_vSectionSaved();
break;
case SCR_EA_Ntfy_DeleteSection:
p_oElementSection -> fn_vSectionDeleted();
break;
}
}
/*===========================================================================
*=========================================================================*/
void Geometry3D::CallBackSaveElementIndexedTriangle (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, GEO_tdstElementIndexedTriangles *p_stElement)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
long iInd;
char *p_szGMName;
// find section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save begin section
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d,%d",
p_stElement->xNbFaces, p_stElement->xNbElementUV);
// save material entry
p_szGMName = mfn_p_szGetGameMaterialName( p_stElement->hMaterial );
if (p_szGMName != NULL)
{
SCR_M_SvL0_SaveEntry(p_stFile, "Material", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_szGMName);
}
// save faces
for (iInd = 0; iInd < p_stElement->xNbFaces; iInd++)
{
SCR_M_SvL0_SaveEntry(p_stFile, "AddFaceUV", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%d,%d,%d,%.6f,%.6f,%.6f,%d,%d,%d",
iInd,
p_stElement->d_stListOfFacesTripled[iInd].a3_xIndex[0],
p_stElement->d_stListOfFacesTripled[iInd].a3_xIndex[1],
p_stElement->d_stListOfFacesTripled[iInd].a3_xIndex[2],
p_stElement->d_stListOfFacesNormals[iInd].xX,
p_stElement->d_stListOfFacesNormals[iInd].xY,
p_stElement->d_stListOfFacesNormals[iInd].xZ,
p_stElement->d_stListOfFacesTripledIndexUV[iInd].a3_xIndex[0],
p_stElement->d_stListOfFacesTripledIndexUV[iInd].a3_xIndex[1],
p_stElement->d_stListOfFacesTripledIndexUV[iInd].a3_xIndex[2]);
}
// save list of uv
for (iInd = 0; iInd < p_stElement->xNbElementUV; iInd++)
{
SCR_M_SvL0_SaveEntry(p_stFile, "AddUV", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%.6f,%.6f",
iInd,
p_stElement->d_stListOfElementUV[iInd].xU,
p_stElement->d_stListOfElementUV[iInd].xV);
}
// end of section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/*===========================================================================
*=========================================================================*/
void Geometry3D::CallBackSaveElementFaceMapDescriptors (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, GEO_tdstElementFaceMapDescriptors *p_stElement)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
char *szLinkName;
long iInd;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save section beginning
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d", p_stElement->xNbFaces);
// save each face
for(iInd = 0; iInd < p_stElement->xNbFaces; iInd++)
{
szLinkName = M_LKTB_SearchKeyByValue( GLI_p_stGetLinkTableOfFaceMapDescriptor(),(unsigned long)p_stElement->d_stListOfFacesQuadrupled[iInd].hFaceMapDescriptor );
if (szLinkName == NULL)
break;
SCR_fn_v_RdL0_SplitSectionName(szLinkName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, "*", szActionName, szName);
SCR_M_SvL0_SaveEntry(p_stFile, "AddFaceFMD", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%d,%d,%d,%.6f,%.6f,%.6f,%s",
iInd,
p_stElement->d_stListOfFacesQuadrupled[iInd].stFaceTripled.a3_xIndex[0],
p_stElement->d_stListOfFacesQuadrupled[iInd].stFaceTripled.a3_xIndex[1],
p_stElement->d_stListOfFacesQuadrupled[iInd].stFaceTripled.a3_xIndex[2],
p_stElement->d_stListOfFacesNormals[iInd].xX,
p_stElement->d_stListOfFacesNormals[iInd].xY,
p_stElement->d_stListOfFacesNormals[iInd].xZ,
szSectionName);
}
// save end of section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/*===========================================================================
*=========================================================================*/
void Geometry3D::CallBackSaveFaceMapDescriptors (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
char *p_szGMName;
ACP_tdxHandleOfFMD hFMD = (ACP_tdxHandleOfFMD)p_vData;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save section beginning
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_EOL);
// save Line
SCR_M_SvL0_SaveEntry(p_stFile, "TripledUV", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%.6f,%.6f,%.6f,%.6f,%.6f,%.6f",
hFMD -> stUVValues[0] . xU, hFMD -> stUVValues[0] . xV,
hFMD -> stUVValues[1] . xU, hFMD -> stUVValues[1] . xV,
hFMD -> stUVValues[2] . xU, hFMD -> stUVValues[2] . xV);
// save material entry
p_szGMName = mfn_p_szGetGameMaterialName( hFMD->hMaterial );
if (p_szGMName != NULL)
{
SCR_M_SvL0_SaveEntry(p_stFile, "Material", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Normal, 1, p_szGMName);
}
// end of section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/*===========================================================================
*=========================================================================*/
void Geometry3D::CallBackSaveElementSprites (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, GEO_tdstElementSprite *p_stElement)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
char *szLinkName;
long iInd;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save section beginning
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d", p_stElement->xNbSprites);
// save each sprites
for (iInd = 0; iInd < p_stElement->xNbSprites; iInd++)
{
szLinkName = M_LKTB_SearchKeyByValue( GLI_p_stGetLinkTableOfElementSprite(),(unsigned long)p_stElement->d_stListOfSprites[iInd].hSprite );
if (szLinkName == NULL)
return;
SCR_fn_v_RdL0_SplitSectionName(szLinkName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, "*", szActionName, szName);
SCR_M_SvL0_SaveEntry(p_stFile, "AddSprite", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%d,%.6f,%.6f,%s",
iInd,
p_stElement->d_stListOfSprites[iInd].xCenterPoint,
p_stElement->d_stListOfSprites[iInd].stSize.xX,
p_stElement->d_stListOfSprites[iInd].stSize.xY,
szSectionName );
}
// save end of section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/*===========================================================================
*=========================================================================*/
void Geometry3D::CallBackSaveElementTMeshes (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, GEO_tdstElementTMeshes *p_stElement)
{
}
/*===========================================================================
*=========================================================================*/
void Geometry3D::CallBackSaveElementPoints (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, GEO_tdstElementPoints *p_stElement)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
long iInd;
char *p_szGMName;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save section beginning
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d", p_stElement->xNbPoints);
// save fatness entry
SCR_M_SvL0_SaveEntry(p_stFile, "Fatness", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%.6f", p_stElement->xFatness);
// save list of points
for (iInd = 0; iInd < p_stElement->xNbPoints; iInd++)
{
SCR_M_SvL0_SaveEntry(p_stFile, "AddPoint", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%d", iInd, p_stElement->d_xListOfPointIndex[iInd]);
}
// save GameMaterial Entry
p_szGMName = mfn_p_szGetGameMaterialName( p_stElement->hMaterial );
SCR_M_SvL0_SaveEntry(p_stFile, "GameMaterial", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%s", p_szGMName);
// save end of section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/*===========================================================================
*=========================================================================*/
void Geometry3D::CallBackSaveElementLines (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, GEO_tdstElementLines *p_stElement)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
long iInd;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save section beginning
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d", p_stElement->xNbLines);
// save thickness entry
SCR_M_SvL0_SaveEntry(p_stFile, "Thickness", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%.6f", p_stElement->xThickness);
// save list of lines
for (iInd = 0; iInd < p_stElement->xNbLines; iInd++)
{
SCR_M_SvL0_SaveEntry(p_stFile, "AddLine", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%d,%d",
iInd,
p_stElement->d_stListOfLineIndex[iInd].a2_xIndex[0],
p_stElement->d_stListOfLineIndex[iInd].a2_xIndex[1]);
}
// Save end of section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/*===========================================================================
*=========================================================================*/
void Geometry3D::CallBackSaveElementSpheres (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, GEO_tdstElementSpheres *p_stElement)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
long iInd;
char *p_szGMName;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save section beginning
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d", p_stElement->xNbSpheres);
// save list of spheres
for (iInd = 0; iInd < p_stElement->xNbSpheres; iInd++)
{
p_szGMName = mfn_p_szGetGameMaterialName( p_stElement->d_stListOfSpheres[iInd].hMaterial );
SCR_M_SvL0_SaveEntry(p_stFile, "AddSphere", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%d,%.6f,%s",
iInd,
p_stElement->d_stListOfSpheres[iInd].xCenterPoint,
p_stElement->d_stListOfSpheres[iInd].xRadius,
p_szGMName);
}
// save end of section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/*===========================================================================
*=========================================================================*/
void Geometry3D::CallBackSaveElementAlignedBox (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, GEO_tdstElementAlignedBoxes *p_stElement)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
long iInd;
char *p_szGMName;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save section beginning
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d", p_stElement->xNbAlignedBoxes);
// save list of aligned boxes
for (iInd = 0; iInd < p_stElement->xNbAlignedBoxes; iInd++)
{
p_szGMName = mfn_p_szGetGameMaterialName( p_stElement->d_stListOfAlignedBoxes[iInd].hMaterial );
SCR_M_SvL0_SaveEntry(p_stFile, "AddAlignedBox", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%d,%d,%s",
iInd,
p_stElement->d_stListOfAlignedBoxes[iInd].xMinPoint,
p_stElement->d_stListOfAlignedBoxes[iInd].xMaxPoint,
p_szGMName);
}
// save end of section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
/*===========================================================================
*=========================================================================*/
void Geometry3D::CallBackSaveElementCones (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, GEO_tdstElementCones *p_stElement)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
long iInd;
char *p_szGMName;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save section beginning
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1, "%d", p_stElement->xNbCones);
// save list of cones
for (iInd = 0; iInd < p_stElement->xNbCones; iInd++)
{
p_szGMName = mfn_p_szGetGameMaterialName( p_stElement->d_stListOfCones[iInd].hMaterial );
SCR_M_SvL0_SaveEntry(p_stFile, "AddCone", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%d,%d,%.6f,%s",
iInd,
p_stElement->d_stListOfCones[iInd].xTopPoint,
p_stElement->d_stListOfCones[iInd].xBasePoint,
p_stElement->d_stListOfCones[iInd].xBaseRadius,
p_szGMName);
}
// save end of section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : Geometry3D::CallBackSaveElementAltimap
// Date : 98.03
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description : saves an altimap into a file
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void Geometry3D::CallBackSaveElementAltimap (SCR_tdst_File_Description *p_stFile, char *p_szSectionName, GEO_tdstElementAltimap *p_stElement)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
char *p_szGMName;
ACP_tdxIndex xI, xJ, xK, xF;
// get section name
SCR_fn_v_RdL0_SplitSectionName(p_szSectionName, NULL, szActionName, szName);
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szActionName, szName);
// save section beginning
SCR_M_SvL0_SaveBeginSection(p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar);
// nb of vertex, square, faces, uv
SCR_fn_v_SvL0_SaveParameters_MP (p_stFile, SCR_EF_SvL0_Scanf, 1, "%d,%d,%d,%d",
(p_stElement -> xWidth + 1) * (p_stElement -> xDepth + 1),
p_stElement -> xWidth * p_stElement -> xDepth,
p_stElement -> xNbFaces,
p_stElement -> xNbUVValues);
// save origin
SCR_M_SvL0_SaveEntry(p_stFile, "Origin", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%.6f,%.6f,%.6f",
p_stElement -> stOrigin . xX,
p_stElement -> stOrigin . xY,
p_stElement -> stOrigin . xZ);
// save square pattern
SCR_M_SvL0_SaveEntry(p_stFile, "SquarePattern", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%.6f,%d,%.6f",
p_stElement -> xWidth,
p_stElement -> xDeltaX,
p_stElement -> xDepth,
p_stElement -> xDeltaY);
// save list of vertexes
//--- xI : Width
//--- xJ : Height
//--- xK : xJ * (Width+1) + xI
for(xJ = 0, xK = 0; xJ < p_stElement -> xDepth + 1; xJ ++)
for(xI = 0; xI < p_stElement -> xWidth + 1; xI ++, xK ++)
{
SCR_M_SvL0_SaveEntry(p_stFile, "SetVertex", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%.6f,%.6f,%.6f,.6f",
xK,
p_stElement -> d_xHeight [xK],
p_stElement -> d_stPointNormals [xK] . xX,
p_stElement -> d_stPointNormals [xK] . xY,
p_stElement -> d_stPointNormals [xK] . xZ);
}
// save squares & triangles
for(xK = 0; xK< p_stElement -> xWidth * p_stElement->xDepth; xK ++)
{
// the square
xF = p_stElement -> d_stSquare [xK] . xFaceIndex;
SCR_M_SvL0_SaveEntry(p_stFile, "SetSquare", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%u,%d",
xK,
(unsigned int) p_stElement -> d_stSquare [xK] . ucType,
xF);
// the faces
switch (p_stElement -> d_stSquare [xK] . ucType)
{
case GEO_C_xAltiSquareBothTRBL:
case GEO_C_xAltiSquareBothTLBR:
// Save the Second triangle
// ###########
p_szGMName = mfn_p_szGetGameMaterialName (p_stElement->d_hMaterial[ p_stElement->d_stFaces[xF+1].ucMatIndex]);
SCR_M_SvL0_SaveEntry(p_stFile, "SetTriangle", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%.6f,%.6f,%.6f,%s,%d,%d,%d",
xF + 1,
p_stElement -> d_stFaces [xF + 1] . stNormal . xX,
p_stElement -> d_stFaces [xF + 1] . stNormal . xY,
p_stElement -> d_stFaces [xF + 1] . stNormal . xZ,
p_szGMName,
p_stElement -> d_stFaces [xF + 1] . xUVIndex [0],
p_stElement -> d_stFaces [xF + 1] . xUVIndex [1],
p_stElement -> d_stFaces [xF + 1] . xUVIndex [2]);
// Save the first triangle, too. No break.
case GEO_C_xAltiSquareTopRight:
case GEO_C_xAltiSquareBottomLeft:
case GEO_C_xAltiSquareTopLeft:
case GEO_C_xAltiSquareBottomRight:
// ###########
p_szGMName = mfn_p_szGetGameMaterialName (p_stElement->d_hMaterial[ p_stElement->d_stFaces[xF].ucMatIndex]);
SCR_M_SvL0_SaveEntry(p_stFile, "SetTriangle", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%.6f,%.6f,%.6f,%s,%d,%d,%d",
xF,
p_stElement -> d_stFaces [xF] . stNormal . xX,
p_stElement -> d_stFaces [xF] . stNormal . xY,
p_stElement -> d_stFaces [xF] . stNormal . xZ,
p_szGMName,
p_stElement -> d_stFaces [xF] . xUVIndex [0],
p_stElement -> d_stFaces [xF] . xUVIndex [1],
p_stElement -> d_stFaces [xF] . xUVIndex [2]);
break;
case GEO_C_xAltiSquareVoid:
break;
default:
ASSERT (FALSE);
}
}
// save the uv
for (xK = 0; xK < p_stElement -> xNbUVValues; xK ++)
{
SCR_M_SvL0_SaveEntry(p_stFile, "AddUV", SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf, 1,
"%d,%.6f,%.6f",
xK,
p_stElement -> d_stUVValues [xK] . xU,
p_stElement -> d_stUVValues [xK] . xV);
}
// save end of section
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// MODIFICATIONS //
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// Description : clear list of Points modifications
// ----------------------------------------------------------------------------
void Geometry3D::fn_vClearModificationsList()
{
while ( ! m_oListOfModifiedPoints . IsEmpty() )
delete m_oListOfModifiedPoints . RemoveHead();
//
fn_vSetModification( C_szFormModif, FALSE );
}
// ----------------------------------------------------------------------------
// Description : add a Point modification
// ----------------------------------------------------------------------------
void Geometry3D::fn_vAddModification(ACP_tdxIndex _xIndex/*, MTH3D_tdstVector *_p_st3DPoint*/)
{
tdstModifPoint *p_stModif = fn_p_stGetModification( _xIndex );
if( !p_stModif )
{
p_stModif = new(tdstModifPoint);
p_stModif -> xIndexOfPoint = _xIndex;
m_oListOfModifiedPoints . AddTail( p_stModif );
if( m_oListOfModifiedPoints . GetCount() == 1 )
fn_vSetModification( C_szFormModif, TRUE, FALSE );
}
// BEGIN CPA2 Cristi Petrescu 98-02-
/*
memcpy( &(p_stModif -> st3DPoint), _p_st3DPoint, sizeof(MTH3D_tdstVector) );
*/
// END CPA2 Cristi Petrescu 98-02-
}
// ----------------------------------------------------------------------------
// Description : return modification to given point, or null if none
// ----------------------------------------------------------------------------
tdstModifPoint *Geometry3D::fn_p_stGetModification(ACP_tdxIndex _xIndex)
{
tdstModifPoint *p_stModif;
POSITION xPos;
M_ForEachElement( m_oListOfModifiedPoints, p_stModif, xPos )
{
if( p_stModif -> xIndexOfPoint == _xIndex )
return p_stModif;
}
return NULL;
}
// ----------------------------------------------------------------------------
// Description : set point to new values without responsability verification
// ----------------------------------------------------------------------------
void Geometry3D::fn_vOwnerSetPoint(ACP_tdxIndex xNumPoint,MTH3D_tdstVector *p_stPoint)
{
GEO_vSetPointOfObject(GetStruct(),p_stPoint,xNumPoint);
fn_vEndModification();
}
// ----------------------------------------------------------------------------
// Description : compute internal informations
// ----------------------------------------------------------------------------
void Geometry3D::fn_vEndModification(void)
{
// ANNECY MT 13-02-98 {
if( m_bEndCreated )
{
GEO_vEndModifyObject2(GetStruct());
if( GetStruct() -> d_hListOfPointsMaterial != NULL )
GEO_vComputeObjectListOfPointsMaterial( GetStruct() );
}
// END ANNECY MT }
}
// ----------------------------------------------------------------------------
// Description : clear list of Material modifications
// ----------------------------------------------------------------------------
void Geometry3D::fn_vClearGMTModificationsList()
{
while ( ! m_oListOfGMTModif . IsEmpty() )
delete m_oListOfGMTModif . RemoveHead();
//
fn_vSetModification( C_szMaterialModif, FALSE );
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vAddGMTModification(ACP_tdxHandleOfElement _hElement, ACP_tdxIndex _xIndexInElement, GMT_tdxHandleToGameMaterial _hGameMaterial)
{
//CPA2 Stegaru Cristian 98-04
//no previous game material
if (NULL == _hGameMaterial)
return;
//End CPA2 Stegaru Cristian 98-04
ACP_tdxIndex _xElementType = GEO_xGetElementType(GetStruct() , _hElement);
tdstModifGMT *p_stModif = fn_p_stGetGMTModification( _hElement, _xIndexInElement );
if( !p_stModif )
{
// add new modification
p_stModif = new(tdstModifGMT);
p_stModif -> xElementType = _xElementType;
p_stModif -> hElement = _hElement;
//BEGIN ROMTEAM Cristi Petrescu 98-06-
if (_xElementType == GEO_C_xElementIndexedTriangles)
p_stModif -> xIndexInElement = 0;
else
p_stModif -> xIndexInElement = _xIndexInElement;
// set modif
// BEGIN CPA2 Cristi Petrescu 98-02-
p_stModif -> hGameMaterial = _hGameMaterial;
// END CPA2 Cristi Petrescu 98-02-
//END ROMTEAM Cristi Petrescu 98-06-
m_oListOfGMTModif . AddTail( p_stModif );
if( m_oListOfGMTModif . GetCount() == 1 )
fn_vSetModification( C_szMaterialModif, TRUE, FALSE );
}
// BEGIN ROMTEAM Cristi Petrescu 98-06-
// moved...
// END ROMTEAM Cristi Petrescu 98-06-
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
tdstModifGMT *Geometry3D::fn_p_stGetGMTModification(ACP_tdxHandleOfElement _hElement, ACP_tdxIndex _xIndexInElement)
{
ACP_tdxIndex _xElementType = GEO_xGetElementType(GetStruct(), _hElement);
tdstModifGMT *p_stModif;
POSITION xPos;
M_ForEachElement( m_oListOfGMTModif, p_stModif, xPos )
{
if( ( _xElementType == p_stModif -> xElementType ) &&
( _hElement == p_stModif -> hElement ) &&
( _xIndexInElement == p_stModif -> xIndexInElement)
)
return p_stModif;
}
return NULL;
}
// ----------------------------------------------------------------------------
// Description : set point to new values without responsability verification
// ----------------------------------------------------------------------------
void Geometry3D::fn_vOwnerSetMaterial(ACP_tdxHandleOfElement _hElement, ACP_tdxIndex _xIndexInElement, GMT_tdxHandleToGameMaterial _hGameMaterial)
{
if( !_hGameMaterial )
return;
ACP_tdxIndex _xElementType = GEO_xGetElementType(GetStruct(), _hElement);
ACP_tdxIndex xIndexUnused;
ACP_tdxHandleOfFMD p_stFMD;
switch( _xElementType )
{
case GEO_C_xElementIndexedTriangles:
if( fn_bIsIndexedTriangle( _hElement, _xIndexInElement ) )
GEO_vSetGameMaterialOfIndexedTriangles(GetStruct(), _hElement, _hGameMaterial);
break;
case GEO_C_xElementFaceMapDescriptors:
GEO_xGetFaceOfElementFaceMap( GetStruct(), _hElement , _xIndexInElement, &xIndexUnused, &xIndexUnused, &xIndexUnused, &p_stFMD );
GEO_xSetFaceMapDescriptorGameMaterial( p_stFMD, _hGameMaterial);
break;
case GEO_C_xElementSprites:
// no material
break;
case GEO_C_xElementTMeshes:
// no function on element.h (engine )
break;
case GEO_C_xElementPoints:
if( fn_bIsPoint( _hElement, _xIndexInElement ) )
GEO_xSetGameMaterialOfElementPoints( GetStruct(), _hElement, _hGameMaterial );
break;
case GEO_C_xElementLines:
if( fn_bIsLine( _hElement, _xIndexInElement ) )
GEO_xSetGameMaterialOfElementLines( GetStruct(), _hElement, _xIndexInElement, _hGameMaterial );
break;
case GEO_C_xElementSpheres:
if( fn_bIsSphere( _hElement, _xIndexInElement ) )
GEO_vSetGameMaterialOfIndexedSphere( GetStruct(), _hElement, _xIndexInElement, _hGameMaterial );
break;
case GEO_C_xElementAlignedBoxes:
if( fn_bIsAlignedBox( _hElement, _xIndexInElement ) )
GEO_vSetGameMaterialOfIndexedAlignedBox( GetStruct(), _hElement, _xIndexInElement, _hGameMaterial );
break;
case GEO_C_xElementCones:
if( fn_bIsCone( _hElement, _xIndexInElement ) )
GEO_vSetGameMaterialOfIndexedCone( GetStruct(), _hElement, _xIndexInElement, _hGameMaterial );
break;
}
fn_vEndGMTModification( _hElement, _xIndexInElement );
}
// ----------------------------------------------------------------------------
// Description : compute internal informations about GameMaterial
// ----------------------------------------------------------------------------
void Geometry3D::fn_vEndGMTModification(ACP_tdxHandleOfElement _hElement, ACP_tdxIndex _xDataElementIndex/*=0*/)
{
if( m_bEndCreated )
GEO_vComputeElementMaterial(GetStruct(), _hElement, _xDataElementIndex );
}
// ----------------------------------------------------------------------------
// Author : MT
// Creation : 31/07/97
//
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vClearFMDModificationsList(void)
{
while( ! m_oListOfFMDModif . IsEmpty() )
free( m_oListOfFMDModif . RemoveHead() );
}
// ----------------------------------------------------------------------------
// Author : MT
// Creation : 31/07/97
//
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vAddFMDModification(ACP_tdxIndex xElementIT, ACP_tdxIndex xFaceIT, ACP_tdxIndex xElementFMD, ACP_tdxIndex xFaceFMD)
{
tdstModifFMD *p_stFMDModif = fn_p_stGetFMDModification( xElementIT, xFaceIT, xElementFMD, xFaceFMD);
if( p_stFMDModif == NULL )
{
p_stFMDModif = (tdstModifFMD*) malloc( sizeof( tdstModifFMD ) );
p_stFMDModif -> xElementIT = xElementIT;
p_stFMDModif -> xIndexFaceIT = xFaceIT;
p_stFMDModif -> xElementFMD = xElementFMD;
p_stFMDModif -> xIndexFaceFMD = xFaceFMD;
m_oListOfFMDModif . AddHead( p_stFMDModif );
}
}
// ----------------------------------------------------------------------------
// Author : MT
// Creation : 31/07/97
//
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::fn_vDelFMDModification(ACP_tdxIndex xElementIT, ACP_tdxIndex xFaceIT, ACP_tdxIndex xElementFMD, ACP_tdxIndex xFaceFMD)
{
tdstModifFMD *p_stFMDModif;
POSITION xPos;
M_ForEachElement( m_oListOfFMDModif, p_stFMDModif, xPos )
{
if( ( p_stFMDModif -> xElementIT == xElementIT ) && ( p_stFMDModif -> xIndexFaceIT == xFaceIT ) )
{
m_oListOfFMDModif . RemoveAt( xPos );
free( p_stFMDModif );
break;
}
}
}
// ----------------------------------------------------------------------------
// Author : MT
// Creation : 31/07/97
//
// Description : search Modification by source
// ----------------------------------------------------------------------------
tdstModifFMD *Geometry3D::fn_p_stGetFMDModification(ACP_tdxIndex xElementIT, ACP_tdxIndex xFaceIT, ACP_tdxIndex xElementFMD, ACP_tdxIndex xFaceFMD)
{
tdstModifFMD *p_stFMDModif;
POSITION xPos;
M_ForEachElement( m_oListOfFMDModif, p_stFMDModif, xPos )
{
if( ( p_stFMDModif -> xElementIT == xElementIT ) && ( p_stFMDModif -> xIndexFaceIT == xFaceIT ) &&
( p_stFMDModif -> xElementFMD == xElementFMD ) && ( p_stFMDModif -> xIndexFaceFMD == xFaceFMD ) )
return p_stFMDModif;
}
return NULL;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
GMT_tdxHandleToGameMaterial Geometry3D::fn_hGetGameMaterial(ACP_tdxHandleOfElement _hElement, ACP_tdxIndex _xIndexInElement)
{
GMT_tdxHandleToGameMaterial hGameMaterial = NULL;
ACP_tdxIndex xElementType = GEO_xGetElementType(GetStruct(), _hElement);
switch( xElementType )
{
case GEO_C_xElementIndexedTriangles:
if( fn_bIsIndexedTriangle( _hElement, _xIndexInElement ) )
GEO_vGetGameMaterialOfIndexedTriangles(GetStruct(), _hElement, &hGameMaterial);
break;
case GEO_C_xElementFaceMapDescriptors:
if ( fn_bIsFMD( _hElement, _xIndexInElement ) )
{
ACP_tdxIndex xIndexUnused;
ACP_tdxHandleOfFMD p_stFMD;
GEO_xGetFaceOfElementFaceMap( GetStruct(), _hElement , _xIndexInElement, &xIndexUnused, &xIndexUnused, &xIndexUnused, &p_stFMD );
GEO_xGetFaceMapDescriptorGameMaterial( p_stFMD, &hGameMaterial );
}
break;
case GEO_C_xElementSprites:
// no material
break;
case GEO_C_xElementTMeshes:
// no function on element.h (engine )
break;
case GEO_C_xElementPoints:
if( fn_bIsPoint( _hElement, _xIndexInElement ) )
hGameMaterial = GEO_xGetGameMaterialOfElementPoints( GetStruct(), _hElement );
break;
case GEO_C_xElementLines:
if( fn_bIsLine( _hElement, _xIndexInElement ) )
GEO_xGetGameMaterialOfElementLines( GetStruct(), _hElement, _xIndexInElement, &hGameMaterial );
break;
case GEO_C_xElementSpheres:
if( fn_bIsSphere( _hElement, _xIndexInElement ) )
hGameMaterial = GEO_hGetGameMaterialOfIndexedSphere( GetStruct(), _hElement, _xIndexInElement );
break;
case GEO_C_xElementAlignedBoxes:
if( fn_bIsAlignedBox( _hElement, _xIndexInElement ) )
hGameMaterial = GEO_vGetGameMaterialOfIndexedAlignedBox( GetStruct(), _hElement, _xIndexInElement );
break;
case GEO_C_xElementCones:
if( fn_bIsCone( _hElement, _xIndexInElement ) )
hGameMaterial = GEO_vGetGameMaterialOfIndexedCone ( GetStruct(), _hElement, _xIndexInElement );
break;
}
return hGameMaterial;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
GMT_tdxHandleToGameMaterial Geometry3D::fn_hGetDefaultGameMaterial(void)
{
if( s_p_oDLLTGM )
{
return (GMT_tdxHandleToGameMaterial) s_p_oDLLTGM -> OnQueryAction( (CPA_DLLBase*)GetEditor(), (WPARAM)C_cGetDefaultGameMaterial, 0);
}
else
{
//if we did not create the editor materials, find an engine material in the link table
// first, search default material
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
char szCompleteSectionName[SCR_CV_ui_Cfg_MaxLenName];
SCR_tdst_Link_Value *p_stEntry;
SCR_tdst_Link_Table *p_stLinkTable = GMT_fn_p_stGetLinkTable();
unsigned int uiPos;
sprintf( szFileName, "%s\\Common\\Common.gmt", fn_szGetGameMaterialDataPath() );
SCR_fn_v_RdL0_ComputeSectionName( szCompleteSectionName, szFileName, "GameMaterial", "Default" );
p_stEntry = SCR_fnp_st_Link_SearchKey(GMT_fn_p_stGetLinkTable(),szCompleteSectionName);
if( p_stEntry != NULL )
return (GMT_tdxHandleToGameMaterial)SCR_M_ul_Link_GetValue( p_stEntry );
// else get first entry on Link Table
uiPos = 0;
SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, p_stEntry, p_stLinkTable->stLinkArray );
return (GMT_tdxHandleToGameMaterial)(p_stEntry ? SCR_M_ul_Link_GetValue(p_stEntry) : NULL);
}
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
char * Geometry3D::mfn_p_szGetGameMaterialName(GMT_tdxHandleToGameMaterial hGameMaterial)
{
if( s_p_oDLLTGM )
{
CPA_BaseObject *p_oGameMaterial = s_p_oDLLTGM -> GetBaseObject( (void*)hGameMaterial, C_szGameMaterialTypeName );
if( p_oGameMaterial && p_oGameMaterial->fn_bCanBeSaved() )
return ((char*)(LPCTSTR) ((CPA_SaveObject *) p_oGameMaterial )-> GetReferencedSectionName() );
}
// no DLL GameMaterial or No GameMaterial Editor Object
SCR_tdst_Link_Value *p_stEntry = SCR_fnp_st_Link_SearchValue(GMT_fn_p_stGetLinkTable(),(unsigned long)hGameMaterial);
if( p_stEntry )
{
char *szCompleteSectionName = SCR_M_p_sz_Link_GetKey( p_stEntry );
unsigned long ulSize = SCR_M_ul_Link_GetAdditionalLong( p_stEntry ,1 );
return ( szCompleteSectionName + ulSize );
}
return C_szDefaultMaterial;
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
BOOL Geometry3D::mfn_bMustSaveModifications()
{
return ( ( GetSaveStatus() == E_ss_Modify ) &&
( ! m_oListOfModifiedPoints . IsEmpty() || ! m_oListOfGMTModif . IsEmpty() || ! m_oListOfFMDModif . IsEmpty() ) );
}
// ----------------------------------------------------------------------------
// Description :
// ----------------------------------------------------------------------------
void Geometry3D::mfn_vSaveModifications(FILE *_pFile, char *_szIdentity)
{
// BEGIN CPA2 Cristi Petrescu 98-02-
/*
tdstModifPoint *p_stModif;
tdstModifGMT *p_stGMTModif;
tdstModifFMD *p_stFMDModif;
POSITION xPos;
char szName[SCR_CV_ui_Cfg_MaxLenName];
char *p_cFMDName;
SectionElement *p_oSectionElement;
GEO_tdstFaceMapTriangle *p_stFMT;
// header
fprintf( _pFile, "\nObject %s:\t\tModified : %s\n{\n", fn_p_szGetName(), _szIdentity );
// Translation
if( ! m_oListOfModifiedPoints . IsEmpty() )
{
fputs( "Translated Points\n", _pFile );
M_ForEachElement( m_oListOfModifiedPoints, p_stModif, xPos )
{
fprintf( _pFile, "\tPoint %3d : initial position : ( %.6f , %.6f , %.6f )\n",
p_stModif -> xIndexOfPoint,
p_stModif -> st3DPoint . xX, p_stModif -> st3DPoint . xY, p_stModif -> st3DPoint . xZ);
}
fn_vClearModificationsList();
}
// FMD
if( !m_oListOfFMDModif . IsEmpty() )
{
fputs( "Faces Move to FaceMapDescriptors\n", _pFile );
M_ForEachElement( m_oListOfFMDModif, p_stFMDModif, xPos )
{
p_oSectionElement = m_oListOfElementSections . GetAt( m_oListOfElementSections . FindIndex( p_stFMDModif -> xElementIT ) );
SCR_fn_v_RdL0_SplitSectionName( (char*)(LPCTSTR)p_oSectionElement -> GetCompleteSectionName(), NULL, NULL, szName );
p_stFMT = & M_GetFMTToElementFMD( p_stFMDModif -> xElementFMD, p_stFMDModif -> xIndexFaceFMD );
fprintf( _pFile, "\t Face %3d (%3d,%3d,%3d) of IT \"%s\"",
p_stFMDModif -> xIndexFaceIT,
p_stFMT -> stFaceTripled . a3_xIndex[0],
p_stFMT -> stFaceTripled . a3_xIndex[1],
p_stFMT -> stFaceTripled . a3_xIndex[2],
szName );
p_oSectionElement = m_oListOfElementSections . GetAt( m_oListOfElementSections . FindIndex( p_stFMDModif -> xElementFMD ) );
SCR_fn_v_RdL0_SplitSectionName( (char*)(LPCTSTR)p_oSectionElement -> GetCompleteSectionName(), NULL, NULL, szName );
fprintf( _pFile, " Moved to Face %3d on ElementFMD \"%s\" ", p_stFMDModif -> xIndexFaceFMD, szName );
p_cFMDName = M_LKTB_SearchKeyByValue( GLI_p_stGetLinkTableOfFaceMapDescriptor(), (unsigned long)M_GetFMDToElementFMD( p_stFMDModif -> xElementFMD, p_stFMDModif -> xIndexFaceFMD ) );
SCR_fn_v_RdL0_SplitSectionName( p_cFMDName, NULL, NULL, szName );
fprintf( _pFile, "\t Create FMD \"%s\"\n", szName );
}
fn_vClearFMDModificationsList();
}
// GMT
if( ! m_oListOfGMTModif . IsEmpty() )
{
fputs( "Material \n", _pFile );
M_ForEachElement( m_oListOfGMTModif, p_stGMTModif, xPos )
{
CPA_SaveObject *p_oPreviousGM = (CPA_SaveObject*)s_p_oDLLTGM -> GetBaseObject(p_stGMTModif -> hGameMaterial, C_szGameMaterialTypeName);
CPA_SaveObject *p_oNewGM = (CPA_SaveObject*)fn_p_oGetGameMaterial( p_stGMTModif -> hElement, p_stGMTModif -> xIndexInElement );
if( p_oPreviousGM && p_oNewGM )
{
fprintf( _pFile, "\t Element %3d \t Type \"%s\" \t IndexInElement %3d \t GameMaterial \"%s\" ===> \"%s\"\n",
p_stGMTModif -> hElement,
g_szElementTypeName[ p_stGMTModif -> xElementType ],
p_stGMTModif -> xIndexInElement,
(char*)(LPCTSTR)p_oPreviousGM -> GetReferencedSectionName(),
(char*)(LPCTSTR)p_oNewGM -> GetReferencedSectionName());
}
}
fn_vClearGMTModificationsList();
}
//
fputs( "}\n\n", _pFile );
fputs( "///////////////////////////////////////////////////////////////////////////////////////////////////\n\n", _pFile );
*/
// END CPA2 Cristi Petrescu 98-02-
}
/*-----------------------------------------------------------------------------
* Author : MT
* Creation : 30/07/97
*
* Description :
*---------------------------------------------------------------------------*/
void Geometry3D::mfn_vSaveFMD(void)
{
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
char szName[SCR_CV_ui_Cfg_MaxLenName];
char *p_cName;
if( ! fn_bCanBeNotified() )
return;
// get section name
SCR_fn_v_RdL0_SplitSectionName((char*)(LPCTSTR)GetCompleteSectionName(), szFileName, NULL, szName);
strcat( szName,"_FMD_");
p_cName = szName + strlen( szName );
while( ! m_oListOfFMD . IsEmpty() )
{
tdstInfoFMD *p_stInfoFMD = m_oListOfFMD . RemoveHead();
sprintf( p_cName, "%d", ++m_lUniqueFMD );
SCR_fn_v_RdL0_ComputeSectionName(szSectionName,szFileName, GLI_C_SectionFaceMapDescriptor, szName);
SCR_fn_v_SvL1_RegisterNotify(szSectionName, CallBackSaveFaceMapDescriptors, p_stInfoFMD -> hFMD, SCR_EA_Ntfy_AddSection);
//
SCR_fnp_st_Link_SetValue( GLI_p_stGetLinkTableOfFaceMapDescriptor(), szSectionName, (unsigned long)p_stInfoFMD -> hFMD );
//
free( p_stInfoFMD );
}
m_bMustSaveFMD = FALSE;
}
//ROMTEAM WorldEditor (Cristian Stegaru 12/97)
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_vInitElement
// Date : 97-12
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Cristian Stegaru - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void Geometry3D::mfn_vInitElement (char *szFileReference, char *szClassPath, BOOL bSectionExists/* = FALSE*/)
{
SectionElement *p_oElementSection = new SectionElement(szFileReference, szClassPath,
Geometry3D::CallBackSaveGeometricElement);
p_oElementSection->SetSectionData (p_oElementSection);
p_oElementSection->SetElement ((void*)GetStruct ()->d_stListOfElements[0]);
p_oElementSection->SetExistingSection (bSectionExists);
m_oListOfElementSections.AddTail (p_oElementSection);
// init Modif Sections
fn_vInitModifSections();
// data members
m_oListOfModifiedPoints . RemoveAll();
//CPA2 Stegaru Cristian 98-04
//the list is emptied in constructor
// m_oListOfGMTModif . RemoveAll();
//End CPA2 Stegaru Cristian 98-04
m_oListOfFMDModif . RemoveAll();
m_hBoundingVolume = NULL;
m_bMustRecomputeBdV = TRUE;
m_bEndCreated = TRUE;
fn_vInitFMD();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_vRefreshElement
// Date : 97-12
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Cristian Stegaru - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void Geometry3D::mfn_vRefreshElement ()
{
if(m_oListOfElementSections.IsEmpty()) return;
SectionElement *p_oElementSection = m_oListOfElementSections.GetHead ();
ASSERT (p_oElementSection);
p_oElementSection->SetElement ((void*)GetStruct ()->d_stListOfElements[0]);
}
//ENDROMTEAM WorldEditor (Cristian Stegaru)
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : Geometry3D::mfn_vComputeModificationSectionName
// Date : 98.02
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description : Computes the name of the modification section
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void Geometry3D::mfn_vComputeModifSectionName(char *szModifSectionName)
{
CString csCompleteSectionName = GetReferencedSectionName();
char *szSectionName = (char*)(LPCTSTR)csCompleteSectionName;
char *szPoint = NULL;
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
if( strchr( szSectionName, SCR_CC_c_Cfg_NameSeparator ) != NULL )
SCR_fn_v_RdL0_SplitSectionName(szSectionName, szFileName, NULL, NULL);
else
strcpy( szFileName, szSectionName );
szPoint = strrchr( szFileName, '.' );
if ( szPoint )
{
++ szPoint;
strcpy( szPoint, "mdt" );
}
SCR_fn_v_RdL0_ComputeSectionName( szModifSectionName, szFileName, C_szModifActionName, fn_p_szGetName() );
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : Geometry3D::mfn_vLoadModifSection
// Date : 98.02
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description : Loads the modif section
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void Geometry3D::mfn_vLoadModifSection (void)
{
// load it only if it is savable...
if (GetSaveStatus() == E_ss_Modify)
{
char szModifSectionName[SCR_CV_ui_Cfg_MaxLenName];
mfn_vComputeModifSectionName (szModifSectionName);
// analyse "Modif-Geometric" section
if(SCR_fn_c_RdL0_IsSectionExists (szModifSectionName))
{
// first create the ModifSection object
ASSERT (! m_p_oModifSection);
mfn_vCreateModifSection (szModifSectionName);
// and load it from file
SCR_M_RdL0_SetContextLong (1, 0, this);
SCR_fnp_st_RdL0_AnalyseSection (szModifSectionName, SCR_CDF_uw_Anl_Normal);
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : Geometry3D::mfn_vCreateModifSection
// Date : 98.02
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description : Creates the Modif Section
// Author : Cristi Petrescu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
void Geometry3D::mfn_vCreateModifSection (char *szModifSectionName/*=NULL*/)
{
if (!szModifSectionName)
{
// then is a new section (not loaded from a file)
if (! m_p_oModifSection)
{
// and is not already created...
char szModifSectionName[SCR_CV_ui_Cfg_MaxLenName];
mfn_vComputeModifSectionName (szModifSectionName);
m_p_oModifSection = new CPA_SectionObject( szModifSectionName, GetDataPath (), Geometry3D::CallBackSaveModifGeometricObject );
m_p_oModifSection -> SetExistingSection( FALSE );
m_p_oModifSection -> SetSectionData( this );
m_p_oModifSection -> fn_vWriteSection ();
}
}
else
{
// loading from file
m_p_oModifSection = new CPA_SectionObject( szModifSectionName, GetDataPath (), Geometry3D::CallBackSaveModifGeometricObject );
m_p_oModifSection -> SetExistingSection (TRUE);
m_p_oModifSection -> SetSectionData( this );
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_iGetFacesNumber
// Date : 98-05
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
ACP_tdxIndex Geometry3D::mfn_iGetFacesNumber ()
{
GEO_tdstGeometricObject *pGeometricObject = GetStruct ();
ASSERT (pGeometricObject);
//particular situation
if (1 == pGeometricObject->xNbPoints && 1 <= pGeometricObject->xNbElements)
{
if (GEO_C_xElementSprites == pGeometricObject->d_xListOfElementsTypes [0])
return 1; //only one face for a sprite
}
if (pGeometricObject->xNbElements >= 1 && GEO_C_xElementIndexedTriangles == pGeometricObject->d_xListOfElementsTypes [0])
{
GEO_tdstElementIndexedTriangles *pElement = (GEO_tdstElementIndexedTriangles *)GetStruct ()->d_stListOfElements [0];
ASSERT (pElement);
return pElement->xNbFaces;
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_3dvGetMinCoordinates
// Date : 98-05
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
MTH3D_tdstVector Geometry3D::mfn_3dvGetMinCoordinates ()
{
MTH3D_tdstVector tdstMinCoordinates, tdstCurrentPoint;
tdstMinCoordinates.xX = tdstMinCoordinates.xY = tdstMinCoordinates.xZ = 0;
ACP_tdxHandleOfObject hObject = GetStruct ();
ACP_tdxIndex iObjectsNb = GEO_xGetGeometricObjectNumberOfPoints (hObject);
if (1 < iObjectsNb)
{
//initialize with first point's coordinates
GEO_vGetPointOfObject (hObject, &tdstCurrentPoint, 0);
tdstMinCoordinates.xX = tdstCurrentPoint.xX;
tdstMinCoordinates.xY = tdstCurrentPoint.xY;
tdstMinCoordinates.xZ = tdstCurrentPoint.xZ;
for (int iInx = 0; iInx < iObjectsNb; iInx++)
{
GEO_vGetPointOfObject (hObject, &tdstCurrentPoint, iInx);
tdstMinCoordinates.xX = tdstCurrentPoint.xX < tdstMinCoordinates.xX ? tdstCurrentPoint.xX : tdstMinCoordinates.xX;
tdstMinCoordinates.xY = tdstCurrentPoint.xY < tdstMinCoordinates.xY ? tdstCurrentPoint.xY : tdstMinCoordinates.xY;
tdstMinCoordinates.xZ = tdstCurrentPoint.xZ < tdstMinCoordinates.xZ ? tdstCurrentPoint.xZ : tdstMinCoordinates.xZ;
}
}
else if (1 == iObjectsNb)
{
if (GEO_C_xElementSprites == hObject->d_xListOfElementsTypes [0])
{
GEO_tdstElementSprite *pSpriteElement = (GEO_tdstElementSprite *)hObject->d_stListOfElements [0];
MTH_tdxReal rXSize = 0, rYSize = 0;
for (int iSpritesInx = 0; iSpritesInx < pSpriteElement->xNbSprites; iSpritesInx++)
{
ACP_tdxHandleOfSprite hSprite = pSpriteElement->d_stListOfSprites [iSpritesInx].hSprite;
for (int iSprites2Inx = 0; iSprites2Inx < hSprite->xNbSprites; iSprites2Inx++)
{
rXSize = hSprite->d_xSizeOfSprite [iSprites2Inx].xX > rXSize? hSprite->d_xSizeOfSprite [iSprites2Inx].xX : rXSize;
rYSize = hSprite->d_xSizeOfSprite [iSprites2Inx].xY > rYSize? hSprite->d_xSizeOfSprite [iSprites2Inx].xY : rYSize;
}
}
//compute min coordinates using the center point and the size
MTH3D_tdstVector tdstInsertionPoint;
GEO_vGetPointOfObject (hObject, &tdstInsertionPoint, 0);
tdstMinCoordinates.xX = tdstInsertionPoint.xX - (rXSize / 2);
tdstMinCoordinates.xY = tdstInsertionPoint.xY - (rYSize / 2);
tdstMinCoordinates.xZ = tdstInsertionPoint.xZ;
}
}
return tdstMinCoordinates;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_3dvGetMaxCoordinates
// Date : 98-05
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
MTH3D_tdstVector Geometry3D::mfn_3dvGetMaxCoordinates ()
{
MTH3D_tdstVector tdstMaxCoordinates, tdstCurrentPoint;
tdstMaxCoordinates.xX = tdstMaxCoordinates.xY = tdstMaxCoordinates.xZ = 0;
ACP_tdxHandleOfObject hObject = GetStruct ();
ACP_tdxIndex iObjectsNb = GEO_xGetGeometricObjectNumberOfPoints (hObject);
if (1 < iObjectsNb)
{
//initialize with first point's coordinates
GEO_vGetPointOfObject (hObject, &tdstCurrentPoint, 0);
tdstMaxCoordinates.xX = tdstCurrentPoint.xX;
tdstMaxCoordinates.xY = tdstCurrentPoint.xY;
tdstMaxCoordinates.xZ = tdstCurrentPoint.xZ;
for (int iInx = 0; iInx < iObjectsNb; iInx++)
{
GEO_vGetPointOfObject (hObject, &tdstCurrentPoint, iInx);
tdstMaxCoordinates.xX = tdstCurrentPoint.xX > tdstMaxCoordinates.xX ? tdstCurrentPoint.xX : tdstMaxCoordinates.xX;
tdstMaxCoordinates.xY = tdstCurrentPoint.xY > tdstMaxCoordinates.xY ? tdstCurrentPoint.xY : tdstMaxCoordinates.xY;
tdstMaxCoordinates.xZ = tdstCurrentPoint.xZ > tdstMaxCoordinates.xZ ? tdstCurrentPoint.xZ : tdstMaxCoordinates.xZ;
}
}
else if (1 == iObjectsNb)
{
if (GEO_C_xElementSprites == hObject->d_xListOfElementsTypes [0])
{
GEO_tdstElementSprite *pSpriteElement = (GEO_tdstElementSprite *)hObject->d_stListOfElements [0];
MTH_tdxReal rXSize = 0, rYSize = 0;
for (int iSpritesInx = 0; iSpritesInx < pSpriteElement->xNbSprites; iSpritesInx++)
{
ACP_tdxHandleOfSprite hSprite = pSpriteElement->d_stListOfSprites [iSpritesInx].hSprite;
for (int iSprites2Inx = 0; iSprites2Inx < hSprite->xNbSprites; iSprites2Inx++)
{
rXSize = hSprite->d_xSizeOfSprite [iSprites2Inx].xX > rXSize? hSprite->d_xSizeOfSprite [iSprites2Inx].xX : rXSize;
rYSize = hSprite->d_xSizeOfSprite [iSprites2Inx].xY > rYSize? hSprite->d_xSizeOfSprite [iSprites2Inx].xY : rYSize;
}
}
//compute min coordinates using the center point and the size
MTH3D_tdstVector tdstInsertionPoint;
GEO_vGetPointOfObject (hObject, &tdstInsertionPoint, 0);
tdstMaxCoordinates.xX = tdstInsertionPoint.xX + (rXSize / 2);
tdstMaxCoordinates.xY = tdstInsertionPoint.xY + (rYSize / 2);
tdstMaxCoordinates.xZ = tdstInsertionPoint.xZ;
}
}
return tdstMaxCoordinates;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Method : mfn_3dvGetSizes
// Date : 98-05
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Description :
// Author : Stegaru Cristian - CPA2
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Modification :
// Date :
// By :
//////////////////////////////////////////////////////////////////////////////////////////////////////
MTH3D_tdstVector Geometry3D::mfn_3dvGetSizes () //dX, dY, dZ
{
MTH3D_tdstVector tdstSizes, tdstMinCoordinates, tdstMaxCoordinates;
tdstMinCoordinates = mfn_3dvGetMinCoordinates ();
tdstMaxCoordinates = mfn_3dvGetMaxCoordinates ();
tdstSizes.xX = tdstMaxCoordinates.xX - tdstMinCoordinates.xX;
tdstSizes.xY = tdstMaxCoordinates.xY - tdstMinCoordinates.xY;
tdstSizes.xZ = tdstMaxCoordinates.xZ - tdstMinCoordinates.xZ;
return tdstSizes;
}
#include "3DObject.cxx"