345 lines
12 KiB
C++
345 lines
12 KiB
C++
/*
|
|
*=======================================================================================
|
|
* Name : 3dgmodif.cpp
|
|
*
|
|
* Author : Marc Trabucato Date : ...
|
|
*
|
|
* Description : implementation of Geometry3D_Modif class use to store a move point
|
|
* modification
|
|
*=======================================================================================
|
|
* Modification -> Author : Vincent Lhullier Date : 24/04/97
|
|
* Description : add notification for saving modified object
|
|
*=======================================================================================
|
|
*/
|
|
|
|
/*---------------------------------------------*/
|
|
#include "stdafx.h"
|
|
|
|
#include "ACP_Base.h"
|
|
#include "incITF.h" // interface
|
|
#include "incGAM.h"
|
|
|
|
//ROMTEAM WorldEditor (Nicu 16/01/98)
|
|
#include "OGD.h"
|
|
//ENDROMTEAM WorldEditor (Nicu)
|
|
|
|
#include "3DGModif.hpp"
|
|
#include "3DInterf.hpp"
|
|
//#include "GLI.h"
|
|
//#include "SCR.h"
|
|
|
|
#define TYPE_MOVE 0
|
|
|
|
/*---------------------------------------------*/
|
|
|
|
/*---------------------------------------------*/
|
|
#undef CPA_WANTS_IMPORT
|
|
#undef CPA_EXPORT
|
|
#define CPA_WANTS_EXPORT
|
|
#include "OGD.h"
|
|
#undef CPA_WANTS_EXPORT
|
|
#define CPA_WANTS_IMPORT
|
|
/*---------------------------------------------*/
|
|
|
|
/*
|
|
*=======================================================================================
|
|
* MACROS
|
|
*=======================================================================================
|
|
*/
|
|
|
|
// to redraw world in 3D View
|
|
#define M_RedrawWorld() (((DEV_MultiDevice*)g_oFrameGest.ma_p_oWinArray[2][2]->GetActiveView())->DrawObject())
|
|
|
|
/*
|
|
*=======================================================================================
|
|
* Geometry3D_Modif
|
|
*=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : constructor for Geometr3D_Modif which is the modif object used when a point
|
|
of a geometric object is moved
|
|
_p_xObject -> editor geometric object that is modified
|
|
_xIndexPoint -> moved point
|
|
_st3DTranslation -> moving vector
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
//Geometry3D_Modif::Geometry3D_Modif(Geometry3D *_p_xObject, ACP_tdxIndex _xIndexPoint, MTH3D_tdstVector _st3DTranslation, DWORD *adr)
|
|
//CPA2 Corneliu Babiuc 09-09-98 (duplicated points)
|
|
/*
|
|
Geometry3D_Modif::Geometry3D_Modif(Geometry3D *_p_xObject,int NbPoints, ACP_tdxIndex *_xIndexPoints, float *Dist, MTH3D_tdstVector _st3DTranslation, DWORD *adr)
|
|
:CPA_Modif(TYPE_MOVE, "Move point", FALSE)
|
|
{
|
|
m_p_xObject = _p_xObject;
|
|
|
|
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
|
|
// m_xIndexPoint = _xIndexPoint;
|
|
m_iNbPoints = NbPoints;
|
|
m_xIndexPoints = (ACP_tdxIndex *)malloc(m_iNbPoints * sizeof(ACP_tdxIndex));
|
|
memcpy(m_xIndexPoints, _xIndexPoints, m_iNbPoints * sizeof(ACP_tdxIndex));
|
|
m_fDist = (float *)malloc(m_iNbPoints * sizeof(float));
|
|
memcpy(m_fDist, Dist, m_iNbPoints * sizeof(float));
|
|
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
|
|
*/
|
|
Geometry3D_Modif::Geometry3D_Modif(CPA_List<CPA_PointsList> * _lstPoints, MTH3D_tdstVector _st3DTranslation, DWORD *adr, BOOL _bFirstTime)
|
|
:CPA_Modif(TYPE_MOVE, "Move point", FALSE)
|
|
{
|
|
POSITION pos;
|
|
CPA_PointsList * p_oPoints;
|
|
for (p_oPoints = _lstPoints->GetHeadElement(pos); p_oPoints; p_oPoints = _lstPoints->GetNextElement(pos))
|
|
{
|
|
m_lstPointsList.AddTail( new CPA_PointsList(*p_oPoints) );
|
|
}
|
|
m_bFirstTime = _bFirstTime;
|
|
|
|
// use in Doing function to indicate that first time the transmlation is already done
|
|
m_bFirstTime = _bFirstTime;
|
|
// m_bFirstTime = TRUE;
|
|
//END CPA2 Corneliu Babiuc 09-09-98 (duplicated points)
|
|
memcpy(&m_st3DTranslation,&_st3DTranslation,sizeof(MTH3D_tdstVector));
|
|
|
|
//ROMTEAM WorldEditor (Nicu 05/12/97)
|
|
m_adrGeom = adr;
|
|
if(adr) m_pGeom = *adr;
|
|
//ROMTEAM WorldEditor (Nicu)
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : destructor
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
Geometry3D_Modif::~Geometry3D_Modif()
|
|
{
|
|
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
|
|
//CPA2 Corneliu Babiuc 10-09-98 (duplicated points)
|
|
/*
|
|
free(m_xIndexPoints);
|
|
free(m_fDist);
|
|
*/
|
|
while (!m_lstPointsList.IsEmpty()) delete (m_lstPointsList.RemoveHead());
|
|
//END CPA2 Corneliu Babiuc 10-09-98 (duplicated points)
|
|
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : do the moving point modification
|
|
Returns (BOOL) TRUE if modif is done, FALSE otherwise
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL Geometry3D_Modif::Do (void)
|
|
{
|
|
// the first time this function is called, the translation is already done
|
|
if(!m_bFirstTime)
|
|
{
|
|
// translate point
|
|
//--------------------------------------------------------------
|
|
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
|
|
// m_p_xObject->fn_vTranslatePoint(m_xIndexPoint,&m_st3DTranslation);
|
|
//CPA2 Corneliu Babiuc 10-09-98 (duplicated points)
|
|
/*
|
|
int i;
|
|
MTH3D_tdstVector st3DTranslation;
|
|
GEO_tdstGeometricObject *GeomObj = m_p_xObject->GetStruct();
|
|
for(i=0; i<m_iNbPoints; i++)
|
|
{
|
|
st3DTranslation = m_st3DTranslation;
|
|
st3DTranslation.xX *= m_fDist[i];
|
|
st3DTranslation.xY *= m_fDist[i];
|
|
st3DTranslation.xZ *= m_fDist[i];
|
|
if(m_iNbPoints == 1)m_p_xObject->fn_vTranslatePoint(m_xIndexPoints[i],&st3DTranslation);
|
|
else
|
|
{
|
|
(GeomObj->d_stListOfPoints[m_xIndexPoints[i]]).xX += st3DTranslation.xX;
|
|
(GeomObj->d_stListOfPoints[m_xIndexPoints[i]]).xY += st3DTranslation.xY;
|
|
(GeomObj->d_stListOfPoints[m_xIndexPoints[i]]).xZ += st3DTranslation.xZ;
|
|
}
|
|
// m_p_xObject->fn_vTranslatePoint(m_xIndexPoints[i],&st3DTranslation);
|
|
}
|
|
if(m_iNbPoints != 1)
|
|
{
|
|
m_p_xObject->fn_vEndModification();
|
|
m_p_xObject->fn_vSetMustRecomputeBdV();
|
|
}
|
|
*/
|
|
POSITION pos;
|
|
MTH3D_tdstVector st3DTranslation;
|
|
for( CPA_PointsList * p_oPoints = m_lstPointsList.GetHeadElement(pos);
|
|
p_oPoints;
|
|
p_oPoints = m_lstPointsList.GetNextElement(pos) )
|
|
{
|
|
GEO_tdstGeometricObject * GeomObj = p_oPoints->GetObject()->GetStruct();
|
|
for( int i=0; i<p_oPoints->GetNumberOfSelectedPoints(); i++)
|
|
{
|
|
ACP_tdxIndex xPointIndex = p_oPoints->GetPoint(i);
|
|
MTH3D_M_vMulScalarVector(&st3DTranslation, p_oPoints->m_fDist[i], &m_st3DTranslation);
|
|
if( i == p_oPoints->GetNumberOfSelectedPoints()-1)
|
|
p_oPoints->GetObject()->fn_vTranslatePoint(xPointIndex, &st3DTranslation);
|
|
else
|
|
{
|
|
MTH3D_M_vAddVector(&(GeomObj->d_stListOfPoints[xPointIndex]),
|
|
&(GeomObj->d_stListOfPoints[xPointIndex]), &st3DTranslation);
|
|
}
|
|
}
|
|
p_oPoints->GetObject()->fn_vSetMustRecomputeBdV();
|
|
}
|
|
//END CPA2 Corneliu Babiuc 10-09-98 (duplicated points)
|
|
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
|
|
//--------------------------------------------------------------
|
|
// redraw the world
|
|
M_RedrawWorld();
|
|
}
|
|
// indicate that first time is over
|
|
m_bFirstTime = FALSE;
|
|
|
|
//ROMTEAM WorldEditor (Nicu 05/12/97)
|
|
if(m_adrGeom) *m_adrGeom = 0;
|
|
//ENDROMTEAM WorldEditor (Nicu)
|
|
|
|
/*
|
|
* Notify that object has been modified
|
|
*/
|
|
//CPA2 Corneliu Babiuc 10-09-98 (duplicated points)
|
|
POSITION pos;
|
|
for( CPA_PointsList * p_oPoints = m_lstPointsList.GetHeadElement(pos); pos;
|
|
m_lstPointsList.GetNextElement(pos) )
|
|
p_oPoints->GetObject()->fn_vNotifySaveObject();
|
|
// m_p_xObject->fn_vNotifySaveObject();
|
|
//END CPA2 Corneliu Babiuc 10-09-98 (duplicated points)
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : undo the moving point modification
|
|
Returns (BOOL) TRUE when undoing success (always the case)
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL Geometry3D_Modif::Undo (void)
|
|
{
|
|
//-----------------------------------------------
|
|
//ROMTEAM WorldEditor (Viorel Preoteasa 20/01/98)
|
|
// calculate the opposite translation
|
|
/*
|
|
MTH3D_tdstVector st3DOppTranslation;
|
|
MTH3D_M_vNullVector(&st3DOppTranslation);
|
|
MTH3D_M_vSubVector(&st3DOppTranslation,&st3DOppTranslation,&m_st3DTranslation);
|
|
// translate point
|
|
m_p_xObject->fn_vTranslatePoint(m_xIndexPoint,&st3DOppTranslation);
|
|
*/
|
|
//CPA2 Corneliu Babiuc 10-09-98 (duplicated points)
|
|
/*
|
|
int i;
|
|
MTH3D_tdstVector st3DTranslation;
|
|
GEO_tdstGeometricObject *GeomObj = m_p_xObject->GetStruct();
|
|
for(i=0; i<m_iNbPoints; i++)
|
|
{
|
|
st3DTranslation = m_st3DTranslation;
|
|
st3DTranslation.xX *= -m_fDist[i];
|
|
st3DTranslation.xY *= -m_fDist[i];
|
|
st3DTranslation.xZ *= -m_fDist[i];
|
|
if(m_iNbPoints == 1)m_p_xObject->fn_vTranslatePoint(m_xIndexPoints[i],&st3DTranslation);
|
|
else
|
|
{
|
|
(GeomObj->d_stListOfPoints[m_xIndexPoints[i]]).xX += st3DTranslation.xX;
|
|
(GeomObj->d_stListOfPoints[m_xIndexPoints[i]]).xY += st3DTranslation.xY;
|
|
(GeomObj->d_stListOfPoints[m_xIndexPoints[i]]).xZ += st3DTranslation.xZ;
|
|
}
|
|
// m_p_xObject->fn_vTranslatePoint(m_xIndexPoints[i],&st3DTranslation);
|
|
}
|
|
if(m_iNbPoints != 1)
|
|
{
|
|
m_p_xObject->fn_vEndModification();
|
|
m_p_xObject->fn_vSetMustRecomputeBdV();
|
|
}
|
|
*/
|
|
POSITION pos;
|
|
MTH3D_tdstVector st3DTranslation;
|
|
for( CPA_PointsList * p_oPoints = m_lstPointsList.GetHeadElement(pos);
|
|
p_oPoints;
|
|
p_oPoints = m_lstPointsList.GetNextElement(pos) )
|
|
{
|
|
GEO_tdstGeometricObject * GeomObj = p_oPoints->GetObject()->GetStruct();
|
|
for( int i=0; i<p_oPoints->GetNumberOfSelectedPoints(); i++)
|
|
{
|
|
ACP_tdxIndex xPointIndex = p_oPoints->GetPoint(i);
|
|
MTH3D_M_vMulScalarVector(&st3DTranslation, -p_oPoints->m_fDist[i], &m_st3DTranslation);
|
|
if( i == p_oPoints->GetNumberOfSelectedPoints()-1)
|
|
p_oPoints->GetObject()->fn_vTranslatePoint(xPointIndex, &st3DTranslation);
|
|
else
|
|
{
|
|
MTH3D_M_vAddVector(&(GeomObj->d_stListOfPoints[xPointIndex]),
|
|
&(GeomObj->d_stListOfPoints[xPointIndex]), &st3DTranslation);
|
|
}
|
|
// it is not necesary to call Geometry3D::fn_vEndModification method.
|
|
// This is done from fn_vTranslatePoint function !!!
|
|
p_oPoints->GetObject()->fn_vSetMustRecomputeBdV();
|
|
|
|
}
|
|
}
|
|
//END CPA2 Corneliu Babiuc 10-09-98 (duplicated points)
|
|
|
|
//ENDROMTEAM WorldEditor (Viorel Preoteasa)
|
|
//-----------------------------------------------
|
|
//ROMTEAM WorldEditor (Nicu 05/12/97)
|
|
if(m_adrGeom) *m_adrGeom = m_pGeom;
|
|
//ENDROMTEAM WorldEditor (Nicu)
|
|
|
|
|
|
// redraw the world
|
|
M_RedrawWorld();
|
|
|
|
//CPA2 Corneliu Babiuc 10-09-98 (duplicated points)
|
|
for( p_oPoints = m_lstPointsList.GetHeadElement(pos); pos;
|
|
m_lstPointsList.GetNextElement(pos) )
|
|
p_oPoints->GetObject()->fn_vNotifySaveObject();
|
|
// m_p_xObject->fn_vNotifySaveObject();
|
|
//END CPA2 Corneliu Babiuc 10-09-98 (duplicated points)
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// class Geometry3D_Rename
|
|
|
|
Geometry3D_Rename::Geometry3D_Rename(Geometry3D *_p_Object,CString _csName)
|
|
:CPA_Modif(TYPE_MOVE, "Rename Geometric object", FALSE)
|
|
{
|
|
m_p_xObject = _p_Object;
|
|
m_csNewName = _csName;
|
|
}
|
|
|
|
Geometry3D_Rename::~Geometry3D_Rename()
|
|
{
|
|
}
|
|
|
|
BOOL Geometry3D_Rename::Do(void)
|
|
{
|
|
// update data
|
|
CString csTmp = m_p_xObject -> GetName();
|
|
|
|
if( csTmp == m_csNewName )
|
|
return FALSE;
|
|
|
|
m_p_xObject -> fn_eRename( m_csNewName );
|
|
m_p_xObject -> fn_vNotifyRenameObject();
|
|
m_csNewName = csTmp;
|
|
|
|
// update display
|
|
if( m_p_xObject -> GetEditor() -> fn_bIsCurrentEditor() )
|
|
((Geometry3D_Interface*)m_p_xObject -> GetEditor()) -> fn_vNameChanged();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL Geometry3D_Rename::Undo(void)
|
|
{
|
|
return Do();
|
|
} |