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

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;
}