284 lines
10 KiB
C++
284 lines
10 KiB
C++
/*=========================================================================
|
|
File Name: COPYPASTE.CPP
|
|
Purpose:
|
|
Implements tdoCopyBuffer, tdoPasteSubMaterialModif and tdoInstanciateSubMaterialModif classes
|
|
|
|
Author: Benoit Germain
|
|
Date: June 1997
|
|
==========================================================================*/
|
|
#include "stdafx.h"
|
|
#include "Acp_Base.h"
|
|
#include "itf.h"
|
|
#include "gmt.h"
|
|
|
|
#include "GMatObj.hpp"
|
|
#include "CopyPaste.hpp"
|
|
#include "inctex.h"
|
|
#include "_interf.hpp"
|
|
#include "diameca.hpp"
|
|
#include "diacol.hpp"
|
|
#include "diasound.hpp"
|
|
|
|
extern Material_Interface *gs_p_oMaterialInterface;
|
|
|
|
/*=========================================================================
|
|
implementation of tdoCopyBuffer
|
|
==========================================================================*/
|
|
|
|
void tdoCopyBuffer::m_vInvalidateAllHandlesAtConstruct()
|
|
{
|
|
m_eType = E_cbt_None;
|
|
|
|
DNM_fn_vInvalidateMatCharacteristics(&m_hMechanicsMaterialToPaste);
|
|
m_hCollideMaterialToPaste = GMT_C_InvalidCollideMaterial;
|
|
m_hSoundMaterialToPaste = GMT_C_InvalidSoundMaterial;
|
|
}
|
|
|
|
/*=========================================================================
|
|
==========================================================================*/
|
|
tdoCopyBuffer::tdoCopyBuffer(DNM_tdxHandleToMecMatCharacteristics _hMechanicsMaterial)
|
|
{
|
|
m_vInvalidateAllHandlesAtConstruct();
|
|
|
|
m_eType = E_cbt_Mechanics;
|
|
|
|
//create a copy of the material for paste operations
|
|
m_hMechanicsMaterialToPaste = DNM_fn_xMatCharacteristicsCreate();
|
|
if ( DNM_fn_bIsMatCharacteristicsValid(_hMechanicsMaterial) )
|
|
DNM_fn_vMatCharacteristicsCopy(m_hMechanicsMaterialToPaste, _hMechanicsMaterial);
|
|
}
|
|
|
|
tdoCopyBuffer::tdoCopyBuffer(GMT_tdxHandleToCollideMaterial _hCollideMaterial)
|
|
{
|
|
m_vInvalidateAllHandlesAtConstruct();
|
|
|
|
m_eType = E_cbt_Collide;
|
|
|
|
//create a copy of the material for paste operations
|
|
m_hCollideMaterialToPaste = GMT_fn_hCreateCollideMaterial();
|
|
if ( _hCollideMaterial != GMT_C_InvalidCollideMaterial )
|
|
GMT_fn_vCopyCollideMaterial(m_hCollideMaterialToPaste, _hCollideMaterial);
|
|
}
|
|
|
|
tdoCopyBuffer::tdoCopyBuffer(SND_tdxHandleToSoundMaterial _hSoundMaterial)
|
|
{
|
|
m_vInvalidateAllHandlesAtConstruct();
|
|
|
|
m_eType = E_cbt_Sound;
|
|
|
|
//create a copy of the material for paste operations
|
|
m_hSoundMaterialToPaste = _hSoundMaterial;
|
|
}
|
|
|
|
/*=========================================================================
|
|
==========================================================================*/
|
|
tdoCopyBuffer::~tdoCopyBuffer()
|
|
{
|
|
//destroy the buffers we created for copy
|
|
|
|
//mechanics
|
|
if ( DNM_fn_bIsMatCharacteristicsValid(m_hMechanicsMaterialToPaste) )
|
|
{
|
|
DNM_fn_vMatCharacteristicsDestroy(m_hMechanicsMaterialToPaste);
|
|
DNM_fn_vInvalidateMatCharacteristics(&m_hMechanicsMaterialToPaste);
|
|
}
|
|
|
|
//collide
|
|
if ( m_hCollideMaterialToPaste != GMT_C_InvalidCollideMaterial )
|
|
{
|
|
GMT_fn_vDestroyCollideMaterial(&m_hCollideMaterialToPaste);
|
|
}
|
|
|
|
//sound
|
|
m_hSoundMaterialToPaste = GMT_C_InvalidSoundMaterial;
|
|
}
|
|
|
|
/*=========================================================================
|
|
==========================================================================*/
|
|
BOOL tdoCopyBuffer::m_bDoPaste(
|
|
GMT_tdxHandleToGameMaterial _hTargetGameMaterial
|
|
)
|
|
{
|
|
switch ( m_eType )
|
|
{
|
|
case E_cbt_Mechanics:
|
|
{
|
|
//get the mechanics material of the target game material
|
|
DNM_tdxHandleToMecMatCharacteristics hTargetMechanicsMaterial;
|
|
hTargetMechanicsMaterial = GMT_fn_hGetMechanicsMaterial(_hTargetGameMaterial);
|
|
//and copy the contents of the source
|
|
DNM_fn_vMatCharacteristicsCopy(hTargetMechanicsMaterial, m_hMechanicsMaterialToPaste);
|
|
}
|
|
break;
|
|
|
|
case E_cbt_Collide:
|
|
{
|
|
//get the collide material of the target game material
|
|
GMT_tdxHandleToCollideMaterial hTargetCollideMaterial;
|
|
hTargetCollideMaterial = GMT_fn_hGetCollideMaterial(_hTargetGameMaterial);
|
|
//and copy the contents of the source
|
|
GMT_fn_vCopyCollideMaterial(hTargetCollideMaterial, m_hCollideMaterialToPaste);
|
|
}
|
|
break;
|
|
|
|
case E_cbt_Sound:
|
|
GMT_fn_vSetSoundMaterial(_hTargetGameMaterial, m_hSoundMaterialToPaste);
|
|
break;
|
|
|
|
default:
|
|
ASSERT(FALSE);
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/*=========================================================================
|
|
==========================================================================*/
|
|
/*=========================================================================
|
|
implementation of tdoPasteSubMaterialModif class
|
|
==========================================================================*/
|
|
/*=========================================================================
|
|
==========================================================================*/
|
|
|
|
tdoPasteSubMaterialModif::tdoPasteSubMaterialModif(tdoCopyBuffer *_p_oCopyBuffer)
|
|
: CPA_Modif(0, "")
|
|
{
|
|
m_hTargetGameMaterial = gs_p_oMaterialInterface->m_p_oGetEditedMaterial()->m_hGetEngineMaterial();
|
|
m_p_oCopyBufferForDo = _p_oCopyBuffer;
|
|
|
|
switch ( _p_oCopyBuffer->m_eGetType() )
|
|
{
|
|
case E_cbt_Mechanics:
|
|
{
|
|
//create a copy buffer which contains the submaterial info of the target material
|
|
DNM_tdxHandleToMecMatCharacteristics hTargetMechanicsMaterial;
|
|
hTargetMechanicsMaterial = GMT_fn_hGetMechanicsMaterial(m_hTargetGameMaterial);
|
|
m_p_oCopyBufferForUndo = new tdoCopyBuffer(hTargetMechanicsMaterial);
|
|
SetName("Mechanics Material Paste");
|
|
}
|
|
break;
|
|
|
|
case E_cbt_Collide:
|
|
{
|
|
//create a copy buffer which contains the submaterial info of the target material
|
|
GMT_tdxHandleToCollideMaterial hTargetCollideMaterial;
|
|
hTargetCollideMaterial = GMT_fn_hGetCollideMaterial(m_hTargetGameMaterial);
|
|
m_p_oCopyBufferForUndo = new tdoCopyBuffer(hTargetCollideMaterial);
|
|
SetName("Collide Material Paste");
|
|
}
|
|
break;
|
|
|
|
case E_cbt_Sound:
|
|
{
|
|
//create a copy buffer which contains the submaterial info of the target material
|
|
SND_tdxHandleToSoundMaterial hTargetSoundMaterial;
|
|
hTargetSoundMaterial = GMT_fn_hGetSoundMaterial(m_hTargetGameMaterial);
|
|
m_p_oCopyBufferForUndo = new tdoCopyBuffer(hTargetSoundMaterial);
|
|
SetName("Sound Material Paste");
|
|
}
|
|
break;
|
|
default:
|
|
ASSERT(FALSE);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*=========================================================================
|
|
==========================================================================*/
|
|
tdoPasteSubMaterialModif::~tdoPasteSubMaterialModif()
|
|
{
|
|
delete m_p_oCopyBufferForUndo;
|
|
//do not delete the Do() buffer if we are not done, because the dialog
|
|
//may use it again...
|
|
if ( HasBeenDone() )
|
|
delete m_p_oCopyBufferForDo;
|
|
}
|
|
|
|
/*=========================================================================
|
|
==========================================================================*/
|
|
BOOL tdoPasteSubMaterialModif::Do()
|
|
{
|
|
if ( m_p_oCopyBufferForDo->m_bDoPaste(m_hTargetGameMaterial) )
|
|
{
|
|
tdoEditorGameMaterial *p_oTargetGameMaterial = (tdoEditorGameMaterial *)
|
|
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hTargetGameMaterial);
|
|
//if the edited material is the submaterial's owner game material, update display
|
|
switch ( m_p_oCopyBufferForDo->m_eGetType() )
|
|
{
|
|
case E_cbt_Mechanics:
|
|
gs_p_oMaterialInterface->m_p_oGetMecaView()->m_p_oCopyBuffer = NULL;
|
|
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial() == p_oTargetGameMaterial )
|
|
gs_p_oMaterialInterface->m_p_oGetMecaView()->m_fn_vShowMaterial(m_hTargetGameMaterial);
|
|
//tell the editor object responsible for the submaterial that it has to be saved
|
|
DNM_tdxHandleToMecMatCharacteristics hTargetMechanicsMaterial;
|
|
hTargetMechanicsMaterial = GMT_fn_hGetMechanicsMaterial(m_hTargetGameMaterial);
|
|
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hTargetMechanicsMaterial)->fn_vNotifySave();
|
|
break;
|
|
|
|
case E_cbt_Collide:
|
|
gs_p_oMaterialInterface->m_p_oGetCollView()->m_p_oCopyBuffer = NULL;
|
|
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial() == p_oTargetGameMaterial )
|
|
gs_p_oMaterialInterface->m_p_oGetCollView()->m_fn_vShowMaterial(m_hTargetGameMaterial);
|
|
//tell the editor object responsible for the submaterial that it has to be saved
|
|
GMT_tdxHandleToCollideMaterial hTargetCollideMaterial;
|
|
hTargetCollideMaterial = GMT_fn_hGetCollideMaterial(m_hTargetGameMaterial);
|
|
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(hTargetCollideMaterial)->fn_vNotifySave();
|
|
break;
|
|
|
|
case E_cbt_Sound:
|
|
gs_p_oMaterialInterface->m_p_oGetSoundView()->m_p_oCopyBuffer = NULL;
|
|
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial() == p_oTargetGameMaterial )
|
|
gs_p_oMaterialInterface->m_p_oGetSoundView()->m_fn_vShowMaterial(m_hTargetGameMaterial);
|
|
//tell the editor object responsible for the submaterial that it has to be saved
|
|
//SND_tdxHandleToSoundMaterial hTargetSoundMaterial; //until sound materials need an editor object...
|
|
//hTargetSoundMaterial = GMT_fn_hGetSoundMaterial(m_hTargetGameMaterial);
|
|
//gs_p_oMaterialInterface->m_p_oGetEditorSoundMaterialForEngine(hTargetsoundMaterial)->fn_vNotifySave();
|
|
break;
|
|
|
|
default:
|
|
ASSERT(FALSE);
|
|
return FALSE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/*=========================================================================
|
|
==========================================================================*/
|
|
BOOL tdoPasteSubMaterialModif::Undo()
|
|
{
|
|
if ( m_p_oCopyBufferForUndo->m_bDoPaste(m_hTargetGameMaterial) )
|
|
{
|
|
tdoEditorGameMaterial *p_oTargetGameMaterial = (tdoEditorGameMaterial *)
|
|
gs_p_oMaterialInterface->m_p_oGetEditorObjectForEngine(m_hTargetGameMaterial);
|
|
//if the edited material is the submaterial's owner game material, update display
|
|
//note that the paste operation already marked the materials for save, so it is not necessary
|
|
//to notify the change again
|
|
switch ( m_p_oCopyBufferForDo->m_eGetType() )
|
|
{
|
|
case E_cbt_Mechanics:
|
|
gs_p_oMaterialInterface->m_p_oGetMecaView()->m_p_oCopyBuffer = m_p_oCopyBufferForDo;
|
|
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial() == p_oTargetGameMaterial )
|
|
gs_p_oMaterialInterface->m_p_oGetMecaView()->m_fn_vShowMaterial(m_hTargetGameMaterial);
|
|
break;
|
|
|
|
case E_cbt_Collide:
|
|
gs_p_oMaterialInterface->m_p_oGetCollView()->m_p_oCopyBuffer = m_p_oCopyBufferForDo;
|
|
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial() == p_oTargetGameMaterial )
|
|
gs_p_oMaterialInterface->m_p_oGetCollView()->m_fn_vShowMaterial(m_hTargetGameMaterial);
|
|
break;
|
|
|
|
case E_cbt_Sound:
|
|
gs_p_oMaterialInterface->m_p_oGetSoundView()->m_p_oCopyBuffer = m_p_oCopyBufferForDo;
|
|
if ( gs_p_oMaterialInterface->m_p_oGetEditedMaterial() == p_oTargetGameMaterial )
|
|
gs_p_oMaterialInterface->m_p_oGetSoundView()->m_fn_vShowMaterial(m_hTargetGameMaterial);
|
|
break;
|
|
|
|
default:
|
|
ASSERT(FALSE);
|
|
return FALSE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|