reman3/Rayman_X/cpa/tempgrp/TGM/Src/MMatObj.cpp

261 lines
9.8 KiB
C++

//
/*=============================================================================
*
* Filename: MMatObj.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 "MMatObj.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
//=================================================================================
tdoEditorMechanicsMaterial::tdoEditorMechanicsMaterial(
CPA_FileObject *_p_oOwnerFile,
CString _csId,
BOOL _bSectionAlreadyExists,
DNM_tdxHandleToMecMatCharacteristics _hTemplateMechanicsMaterial
)
: CPA_SaveObject(
gs_p_oMaterialInterface, //editor
C_szMechanicsMaterialTypeName, //type
E_ss_Responsible, //responsibility
_p_oOwnerFile, //owner (the file containing the section)
FALSE, //available
(char*)LPCTSTR(_p_oOwnerFile->GetCompletionPath(gs_p_oMaterialInterface, C_szFileReferencedNameKey)), //data path to complete the referenced section name
m_vCallBackSaveMMT//callback
)
{
//tell the file object that an object exists for its section
g_oCoherenceManager.m_fn_vAddALink(_p_oOwnerFile, this);
//the editor object directly handles the engine object
m_hMechanicsMaterial = _hTemplateMechanicsMaterial;
SetAvailable(DNM_fn_bIsMatCharacteristicsValid(_hTemplateMechanicsMaterial));
// 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_SectionMecMatCharacteristics,
(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;
}
//=================================================================================
//=================================================================================
tdoEditorMechanicsMaterial::~tdoEditorMechanicsMaterial()
{
//remove myself totally from the coherence manager database
if ( !fn_bSectionExists() )
g_oCoherenceManager.m_fn_vRemoveAllLinks(this, C_cLinkedAsChild);
}
//=================================================================================
//=================================================================================
void tdoEditorMechanicsMaterial::m_vAssociateEngineMaterial(
DNM_tdxHandleToMecMatCharacteristics _hMechanicsMaterial,
BOOL /*_bSectionAlreadyExists*/
)
{
//make the list update the data sort order
fn_vUpdateData(_hMechanicsMaterial);
//now we can set the value that will be returned by GetData()
m_hMechanicsMaterial = _hMechanicsMaterial;
SetAvailable(DNM_fn_bIsMatCharacteristicsValid(_hMechanicsMaterial));
}
//================================================================================
//================================================================================
BOOL tdoEditorMechanicsMaterial::m_bIsReferenced()
{
return g_oCoherenceManager.m_fn_iGetFatherCount(this) > 1;
}
//=================================================================================
//=================================================================================
void tdoEditorMechanicsMaterial::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
);
DNM_tdxHandleToMecMatCharacteristics hMechanicsMaterial = (DNM_tdxHandleToMecMatCharacteristics) 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(hMechanicsMaterial));
//create the association
m_vAssociateEngineMaterial(hMechanicsMaterial, TRUE);
}
}
/*=================================================================================
//save a section of the form:
{MechanicalMaterial:<name>
Adhesion(0.0603564)
Absorption(0.0603564)
Friction(0.0603564)
Slide(0.0603564)
Progression(0.0603564)
PenetrationSpeed(0.0603564)
PenetrationMax(0.0603564)
}
//=================================================================================*/
void tdoEditorMechanicsMaterial::m_vCallBackSaveMMT(
SCR_tdst_File_Description *_p_stFile,
char *_p_szSectionName,
void *_p_vData,
SCR_tde_Ntfy_Action _eAction
)
{
tdoEditorMechanicsMaterial *p_oEditorMaterial = (tdoEditorMechanicsMaterial *) _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 (action == MechanicalMaterial)
SCR_M_SvL0_SaveBeginSection(_p_stFile, szSectionName, SCR_CC_C_Cfg_EOL);
//get the handles we need
DNM_tdxHandleToMecMatCharacteristics hMaterialMechanics = p_oEditorMaterial->m_hGetEngineMaterial();
//get the parameters we want to save
MTH_tdxReal xCoeff;
xCoeff = DNM_fn_xMatCharacteristicsGetSlide (hMaterialMechanics);
SCR_M_SvL0_SaveEntry(_p_stFile, C_EntrySlide, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(_p_stFile, SCR_EF_SvL0_ArrayFloat, 2, 1, &xCoeff);
xCoeff = DNM_fn_xMatCharacteristicsGetRebound (hMaterialMechanics);
SCR_M_SvL0_SaveEntry(_p_stFile, C_EntryRebound, SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(_p_stFile, SCR_EF_SvL0_ArrayFloat, 2, 1, &xCoeff);
// 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 tdoEditorMechanicsMaterial::m_bGetHighlightColor(GEO_tdstColor *_p_stColor /*= NULL*/)
{
if ( m_bIsHighlighted && _p_stColor )
*_p_stColor = m_stHighlightColor;
return m_bIsHighlighted;
}
//=================================================================================
//=================================================================================
void tdoEditorMechanicsMaterial::m_vSetHighlightColor(GEO_tdstColor _stColor)
{
m_stHighlightColor = _stColor;
}
//=================================================================================
//=================================================================================
//=================================================================================
// static functions for the class
//=================================================================================
//=================================================================================
//=================================================================================
SCR_tdst_Link_Table *tdoEditorMechanicsMaterial::m_p_stGetAssociatedLinkTable()
{
return DNM_fn_p_stGetLinkTableOfMecMatCharacteristics();
}
BOOL tdoEditorMechanicsMaterial::m_bIsEngineMaterialValid(DNM_tdxHandleToMecMatCharacteristics _hMechanicsMaterial)
{
return DNM_fn_bIsMatCharacteristicsValid(_hMechanicsMaterial);
}
/*CString tdoEditorMechanicsMaterial::m_csGetBaseDataPath()
{
return fn_szGetMechanicsMaterialDataPath();
}*/
void tdoEditorMechanicsMaterial::m_vInvalidateEngineMaterial(DNM_tdxHandleToMecMatCharacteristics &r_hMechanicsMaterial)
{
DNM_fn_vInvalidateMatCharacteristics(&r_hMechanicsMaterial);
}
CString tdoEditorMechanicsMaterial::m_csGetMaterialType()
{
return C_szMechanicsMaterialTypeName;
}
CString tdoEditorMechanicsMaterial::m_csGetScriptExtension()
{
return ".mmt";
}