309 lines
11 KiB
C++
309 lines
11 KiB
C++
//
|
|
/*=============================================================================
|
|
*
|
|
* Filename: CMatObj.cpp
|
|
* Version: 1.0
|
|
* Date: 06/11/96
|
|
* Author: B.G.
|
|
*
|
|
* Description: implementation of editor material class
|
|
*
|
|
*===========================================================================*/
|
|
|
|
#include "stdafx.h"
|
|
#include "Acp_base.h"
|
|
#include "itf.h"
|
|
#include "gmt.h"
|
|
#include "IncMEC.h"
|
|
#include "gli.h"
|
|
#include "x:\cpa\main\inc\_editid.h"
|
|
#include "inctex.h"
|
|
|
|
#include "_interf.hpp"
|
|
#include "CMatObj.hpp"
|
|
#include "GMatObj.hpp"
|
|
|
|
extern Material_Interface *gs_p_oMaterialInterface;
|
|
|
|
//=================================================================================
|
|
//=================================================================================
|
|
//=================================================================================
|
|
//constructor. the object is name with the following rules
|
|
//1. it is not a clone but will directly handle the engine material
|
|
// -> will take the name from the section for the engine material
|
|
//2. it is a clone, and a name is specified
|
|
// -> an underscore is added to the original's name,
|
|
// because someday the base constructor will add a number there
|
|
//3. it is a clone, and no name is specified
|
|
// -> the default name is given by the base constructor
|
|
//=================================================================================
|
|
tdoEditorCollideMaterial::tdoEditorCollideMaterial(
|
|
CPA_FileObject *_p_oOwnerFile,
|
|
CString _csId,
|
|
BOOL _bSectionAlreadyExists,
|
|
GMT_tdxHandleToCollideMaterial _hTemplateCollideMaterial
|
|
)
|
|
: CPA_SaveObject(
|
|
gs_p_oMaterialInterface, //editor
|
|
C_szCollideMaterialTypeName, //type
|
|
E_ss_Responsible, //responsibility
|
|
_p_oOwnerFile, //owner (there is none)
|
|
FALSE, //available
|
|
(char*)LPCTSTR(_p_oOwnerFile->GetCompletionPath(gs_p_oMaterialInterface, C_szFileReferencedNameKey)), //data path to complete the referenced section name
|
|
m_vCallBackSaveCMT//callback
|
|
)
|
|
{
|
|
//tell the file object that an object exists for its section
|
|
g_oCoherenceManager.m_fn_vAddALink(_p_oOwnerFile, this);
|
|
|
|
m_hCollideMaterial = _hTemplateCollideMaterial;
|
|
SetAvailable(_hTemplateCollideMaterial != GMT_C_InvalidCollideMaterial);
|
|
|
|
// construct section name (hack: szSectionName is here as an anti-bug for ...Split...
|
|
char szSectionName[SCR_CV_ui_Cfg_MaxLenName];
|
|
SCR_fn_v_RdL0_ComputeSectionName(
|
|
szSectionName,
|
|
(char*)LPCTSTR(_p_oOwnerFile->GetReferencedName(gs_p_oMaterialInterface, C_szFileReferencedNameKey)),
|
|
C_SectionCollideMaterial,
|
|
(char*)LPCTSTR(_csId)
|
|
);
|
|
|
|
// section object
|
|
SetSectionData(this) ;
|
|
SetReferencedSectionName(szSectionName) ;
|
|
|
|
// name
|
|
if ( fn_eRename(_csId) != E_mc_None )
|
|
SetDefaultValidName() ;
|
|
|
|
fn_vUpdateSectionName() ;
|
|
|
|
if ( _bSectionAlreadyExists )
|
|
fn_vSectionSaved(); //the section is saved, and has no pending notification
|
|
else
|
|
fn_vSectionDeleted(); //the section does not exist, and has no pending nofitication
|
|
|
|
if ( fn_bCanBeNotified() && !fn_bSectionExists() )
|
|
fn_vNotifySave();
|
|
|
|
m_bIsHighlighted = FALSE;
|
|
m_stHighlightColor.xR = (GEO_tdxColorValue) 0.7;
|
|
m_stHighlightColor.xG = (GEO_tdxColorValue) 0.3;
|
|
m_stHighlightColor.xB = (GEO_tdxColorValue) 0.0;
|
|
}
|
|
|
|
//=================================================================================
|
|
//=================================================================================
|
|
tdoEditorCollideMaterial::~tdoEditorCollideMaterial()
|
|
{
|
|
//remove myself totally from the coherence manager database
|
|
if ( !fn_bSectionExists() )
|
|
g_oCoherenceManager.m_fn_vRemoveAllLinks(this, C_cLinkedAsChild);
|
|
}
|
|
|
|
//=================================================================================
|
|
//=================================================================================
|
|
void tdoEditorCollideMaterial::m_vAssociateEngineMaterial(GMT_tdxHandleToCollideMaterial _hCollideMaterial, BOOL /*_bSectionAlreadyExists*/)
|
|
{
|
|
//make the list update the data sort order
|
|
fn_vUpdateData(_hCollideMaterial);
|
|
//now we can set the value that will be returned by GetData()
|
|
m_hCollideMaterial = _hCollideMaterial;
|
|
SetAvailable(_hCollideMaterial != GMT_C_InvalidCollideMaterial);
|
|
}
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
BOOL tdoEditorCollideMaterial::m_bIsReferenced()
|
|
{
|
|
return g_oCoherenceManager.m_fn_iGetFatherCount(this) > 1;
|
|
}
|
|
|
|
//=================================================================================
|
|
//=================================================================================
|
|
void tdoEditorCollideMaterial::m_vLoadAssociatedEngineMaterial()
|
|
{
|
|
if ( !fn_bIsAvailable() )
|
|
{
|
|
//if the section name is not in the linktable, analyse the section
|
|
SCR_tdst_Cxt_Values *p_stAnalyzeResult = SCR_fnp_st_RdL0_AnalyseSection(
|
|
(char *) LPCTSTR(GetReferencedSectionName()),
|
|
SCR_CDF_uw_Anl_Normal
|
|
);
|
|
GMT_tdxHandleToCollideMaterial hCollideMaterial = (GMT_tdxHandleToCollideMaterial) p_stAnalyzeResult->a_ulValues[0];
|
|
//there must not already exist an editor material for the loaded game material!
|
|
ASSERT(!gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hCollideMaterial));
|
|
//create the association
|
|
m_vAssociateEngineMaterial(hCollideMaterial, TRUE);
|
|
}
|
|
}
|
|
|
|
/*=================================================================================
|
|
//save a section of the form:
|
|
{CollideMaterial:<name>
|
|
Type(2)
|
|
Identifier(3)
|
|
}
|
|
//=================================================================================*/
|
|
void tdoEditorCollideMaterial::m_vCallBackSaveCMT(
|
|
SCR_tdst_File_Description *_p_stFile,
|
|
char *_p_szSectionName,
|
|
void *_p_vData,
|
|
SCR_tde_Ntfy_Action _eAction
|
|
)
|
|
{
|
|
tdoEditorCollideMaterial *p_oEditorMaterial = (tdoEditorCollideMaterial *) _p_vData;
|
|
|
|
if ( _eAction == SCR_EA_Ntfy_DeleteSection )
|
|
//now the section exists, if this was not the case
|
|
p_oEditorMaterial->fn_vSectionDeleted(); //the section does not exist, and has no pending nofitication
|
|
|
|
if ( _eAction != SCR_EA_Ntfy_AddSection && _eAction != SCR_EA_Ntfy_RebuildSection )
|
|
return;
|
|
|
|
if ( _eAction == 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);
|
|
}
|
|
|
|
char szSectionName[SCR_CV_ui_Cfg_MaxLenName],szAction[SCR_CV_ui_Cfg_MaxLenName],szId[SCR_CV_ui_Cfg_MaxLenName];
|
|
|
|
// construct section name (hack: szSectionName is here as an anti-bug for ...Split...
|
|
SCR_fn_v_RdL0_SplitSectionName(_p_szSectionName, szSectionName, szAction, szId);
|
|
SCR_fn_v_RdL0_ComputeSectionName(szSectionName, NULL, szAction, szId);
|
|
// save begin section for the game material
|
|
SCR_M_SvL0_SaveBeginSection(_p_stFile, szSectionName, SCR_CC_C_Cfg_EOL);
|
|
|
|
//get the parameters we want to save
|
|
GMT_tdxHandleToCollideMaterial hMaterialCollide = p_oEditorMaterial->m_hGetEngineMaterial();
|
|
short wType, wIdentifier;
|
|
|
|
wType = GMT_fn_wGetTypeOfCollideMaterial(hMaterialCollide);
|
|
char *pszType = GMT_C_szZDE;
|
|
switch ( wType )
|
|
{
|
|
case GMT_C_wZDM:
|
|
pszType = GMT_C_szZDM;
|
|
break;
|
|
|
|
case GMT_C_wZDR:
|
|
pszType = GMT_C_szZDR;
|
|
break;
|
|
|
|
case GMT_C_wZDE:
|
|
pszType = GMT_C_szZDE;
|
|
break;
|
|
|
|
case GMT_C_wZDD:
|
|
pszType = GMT_C_szZDD;
|
|
break;
|
|
}
|
|
wIdentifier = GMT_fn_hGetCollideMaterialIdentifier(hMaterialCollide);
|
|
SCR_M_SvL0_SaveEntry(_p_stFile, C_EntryCollideMaterial, SCR_CC_C_Cfg_NoChar);
|
|
SCR_fn_v_SvL0_SaveParameters_MP(
|
|
_p_stFile,
|
|
SCR_EF_SvL0_Scanf, 3, "%s,%hd",
|
|
pszType, wIdentifier
|
|
);
|
|
|
|
// End Section
|
|
SCR_M_SvL0_SaveEndSection(_p_stFile, SCR_CC_C_Cfg_EOL);
|
|
|
|
//now the section exists, if this was not the case
|
|
p_oEditorMaterial->fn_vSectionSaved(); // the section is saved and has no pending notification
|
|
}
|
|
|
|
//=================================================================================
|
|
//=================================================================================
|
|
BOOL tdoEditorCollideMaterial::m_bGetHighlightColor(GEO_tdstColor *_p_stColor /*= NULL*/)
|
|
{
|
|
if ( m_bIsHighlighted && _p_stColor )
|
|
*_p_stColor = m_stHighlightColor;
|
|
|
|
return m_bIsHighlighted;
|
|
}
|
|
|
|
//=================================================================================
|
|
//=================================================================================
|
|
void tdoEditorCollideMaterial::m_vSetHighlightColor(GEO_tdstColor _stColor)
|
|
{
|
|
m_stHighlightColor = _stColor;
|
|
}
|
|
|
|
//=================================================================================
|
|
//=================================================================================
|
|
//=================================================================================
|
|
// static functions for the class
|
|
//=================================================================================
|
|
//=================================================================================
|
|
//=================================================================================
|
|
SCR_tdst_Link_Table *tdoEditorCollideMaterial::m_p_stGetAssociatedLinkTable()
|
|
{
|
|
return GMT_fn_p_stGetZoneLinkTable();
|
|
}
|
|
|
|
BOOL tdoEditorCollideMaterial::m_bIsEngineMaterialValid(GMT_tdxHandleToCollideMaterial _hCollideMaterial)
|
|
{
|
|
return _hCollideMaterial != GMT_C_InvalidCollideMaterial;
|
|
}
|
|
|
|
/*CString tdoEditorCollideMaterial::m_csGetBaseDataPath()
|
|
{
|
|
return fn_szGetCollideMaterialDataPath();
|
|
}*/
|
|
|
|
void tdoEditorCollideMaterial::m_vInvalidateEngineMaterial(GMT_tdxHandleToCollideMaterial &r_hCollideMaterial)
|
|
{
|
|
r_hCollideMaterial = GMT_C_InvalidCollideMaterial;
|
|
}
|
|
|
|
CString tdoEditorCollideMaterial::m_csGetMaterialType()
|
|
{
|
|
return C_szCollideMaterialTypeName;
|
|
}
|
|
|
|
CString tdoEditorCollideMaterial::m_csGetScriptExtension()
|
|
{
|
|
return ".cmt";
|
|
}
|
|
|
|
//ROMTEAM WorldEditor (Cristi Petrescu 11/12/97)
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Method : word tdoEditorCollideMaterial::m_uwTypeOfZonesUsingMe (void)
|
|
// Date : 97.12.11
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description :
|
|
// Tells which zone types are using this material
|
|
// The result is a word of bit flags
|
|
// Uses the coherence manager to find the objects using the material
|
|
// Author : Cristi Petrescu
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification :
|
|
// Date :
|
|
// By :
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
WORD tdoEditorCollideMaterial::m_uwTypeOfZonesUsingMe (void)
|
|
{
|
|
CList< CPA_BaseObject *, CPA_BaseObject *> oFatherList;
|
|
int iNoObjects;
|
|
WORD uwResult = 0;
|
|
iNoObjects = g_oCoherenceManager . m_fn_iGetFatherList (this, & oFatherList);
|
|
if (iNoObjects)
|
|
{
|
|
POSITION xPos;
|
|
CPA_BaseObject* poBaseObject;
|
|
|
|
for ( xPos=oFatherList.GetHeadPosition(); xPos; oFatherList.GetNext(xPos) )
|
|
{
|
|
poBaseObject = oFatherList.GetAt (xPos);
|
|
if (poBaseObject -> fn_bIsOfType (C_szGameMaterialTypeName))
|
|
uwResult |= ((tdoEditorGameMaterial *) poBaseObject) -> m_uwTypeOfZonesUsingMe ();
|
|
}
|
|
}
|
|
return uwResult;
|
|
}
|
|
//ENDROMTEAM WorldEditor (Cristi Petrescu)
|