251 lines
9.2 KiB
C
251 lines
9.2 KiB
C
/**********************************************************
|
|
* *
|
|
* Magnet *
|
|
* *
|
|
* Author : Ubi China - Marc Trabucato *
|
|
* *
|
|
**********************************************************/
|
|
|
|
#include "acp_base.h"
|
|
|
|
#define D_MSMagnet_StructureDefine
|
|
/*XB9800506*/
|
|
/*#include "incGEO.h"*/
|
|
#include "GEO.h"
|
|
/*#include "incGLI.h"*/
|
|
#include "GLI.h"
|
|
/*#include "incGAM.h"*/
|
|
#include "mec.h"
|
|
#include "fil.h"
|
|
#include "snd.h"
|
|
#include "pcs.h"
|
|
#include "gld.h"
|
|
#include "lst.h"
|
|
#ifdef USE_IPT_DX5
|
|
#include "IPT_DX5.h" /* InPuT (absolutely before GAM.h)*/
|
|
#else /* USE_IPT_WIN */
|
|
#include "IPT.h" /* InPuT (absolutely before GAM.h)*/
|
|
#endif /* USE_IPT_WIN */
|
|
/*#include "srf.h"*/
|
|
/*#include "env.h"*/
|
|
#include "sct.h"
|
|
#include "prt.h"
|
|
#include "gam.h"
|
|
/*End XB*/
|
|
|
|
#include "MGT\MGTStruc.h"
|
|
#include "MGTmo.h"
|
|
#include "MGTmm.h"
|
|
|
|
#ifdef MGT_RASTER
|
|
#include "MGTRast.h"
|
|
#endif
|
|
|
|
HIE_tdxHandleToSuperObject MGT_g_aDEF_hActivatedMagnets[MGT_MAX_NUMBEROF_MAGNETS]; /* handle of activated magnets */
|
|
ACP_tdxIndex MGT_g_xMaxIndexOfActivatedMagnet;
|
|
MGT_tdxHandleToModifiedObject MGT_g_aDEF_hModifiedObjects[MGT_MAX_NUMBEROF_MODIFIEDOBJECTS];
|
|
ACP_tdxIndex MGT_g_xMaxIndexOfModifiedObject;
|
|
|
|
/*=======================================================================================
|
|
* Description
|
|
*
|
|
* Creation date 01/03/98
|
|
* Author Marc Trabucato
|
|
*=====================================================================================*/
|
|
ACP_tdxIndex MGT_fn_xCreateModifiedObject( GEO_tdstGeometricObject *p_stObject )
|
|
{
|
|
MGT_tdxHandleToModifiedObject h_ModifiedObject , *p_h_ModifiedObject;
|
|
ACP_tdxIndex xIndex;
|
|
|
|
MGT_M_pvMalloc( h_ModifiedObject, MGT_tdxHandleToModifiedObject , sizeof ( MGT_tdstModifiedObject ) );
|
|
|
|
h_ModifiedObject -> p_stMorphedObject = p_stObject;
|
|
|
|
for( xIndex = 0 ; xIndex < MGT_MAX_NUMBEROF_MAGNETS ; xIndex++ )
|
|
h_ModifiedObject -> aDEF_hMagnet[ xIndex ] = NULL;
|
|
|
|
MGT_M_pvMalloc( h_ModifiedObject -> d_cFieldBitsAlreadyInfluencedPoints , char* , MGT_M_BYTESFORBITS( p_stObject -> xNbPoints ) );
|
|
MGT_fn_vClearAlreadyInfluencedPointsOfModifiedObject( h_ModifiedObject );
|
|
|
|
MGT_M_pvMalloc( h_ModifiedObject -> d_stOriginalPosition , MTH3D_tdstVector* , p_stObject -> xNbPoints * sizeof( MTH3D_tdstVector ) );
|
|
memcpy( h_ModifiedObject -> d_stOriginalPosition , p_stObject -> d_stListOfPoints , p_stObject -> xNbPoints * sizeof( MTH3D_tdstVector ) );
|
|
|
|
h_ModifiedObject -> p_stOctree = p_stObject -> p_stOctree;
|
|
p_stObject -> p_stOctree = NULL;
|
|
|
|
h_ModifiedObject -> h_SuperObject = NULL;
|
|
|
|
/* add to global list*/
|
|
for ( xIndex = 0 , p_h_ModifiedObject = MGT_g_aDEF_hModifiedObjects ;
|
|
xIndex < MGT_g_xMaxIndexOfModifiedObject ;
|
|
xIndex++, p_h_ModifiedObject++ )
|
|
{
|
|
if( (*p_h_ModifiedObject) == NULL )
|
|
{
|
|
*p_h_ModifiedObject = h_ModifiedObject;
|
|
return xIndex;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( MGT_g_xMaxIndexOfModifiedObject < MGT_MAX_NUMBEROF_MODIFIEDOBJECTS )
|
|
{
|
|
*p_h_ModifiedObject = h_ModifiedObject; /* xIndex = MGT_g_xMaxIndexOfModifiedObject*/
|
|
MGT_g_xMaxIndexOfModifiedObject++;
|
|
return xIndex;
|
|
}
|
|
return MGT_C_xIndexError;
|
|
}
|
|
|
|
/*=======================================================================================
|
|
* Description
|
|
*
|
|
* Creation date 01/03/98
|
|
* Author Marc Trabucato
|
|
*=====================================================================================*/
|
|
ACP_tdxIndex MGT_fn_xFindModifiedObject( GEO_tdstGeometricObject *p_stObject )
|
|
{
|
|
MGT_tdxHandleToModifiedObject *p_h_ModifiedObject;
|
|
ACP_tdxIndex xObjectIndex;
|
|
|
|
for ( xObjectIndex = 0 , p_h_ModifiedObject = MGT_g_aDEF_hModifiedObjects ; xObjectIndex < MGT_g_xMaxIndexOfModifiedObject ; xObjectIndex++, p_h_ModifiedObject++ )
|
|
{
|
|
if( *p_h_ModifiedObject && ( (*p_h_ModifiedObject) -> p_stMorphedObject == p_stObject ) )
|
|
return xObjectIndex;
|
|
}
|
|
return MGT_C_xIndexError;
|
|
}
|
|
|
|
/*=======================================================================================
|
|
* Description
|
|
*
|
|
* Creation date 01/03/98
|
|
* Author Marc Trabucato
|
|
*=====================================================================================*/
|
|
void MGT_fn_vAddMagnetModificationToModifiedObject( MGT_tdxHandleToMagnetModification h_MagnetModif )
|
|
{
|
|
ACP_tdxIndex xIndex;
|
|
MGT_tdxHandleToModifiedObject h_ModifiedObject;
|
|
|
|
h_ModifiedObject = MGT_g_aDEF_hModifiedObjects[ h_MagnetModif -> xIndexOfModifiedObject ];
|
|
|
|
for( xIndex = 0 ; xIndex < MGT_MAX_NUMBEROF_MAGNETS ; xIndex++ )
|
|
{
|
|
if( h_ModifiedObject -> aDEF_hMagnet[ xIndex ] == NULL )
|
|
{
|
|
h_ModifiedObject -> aDEF_hMagnet[ xIndex ] = h_MagnetModif;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*=======================================================================================
|
|
* Description
|
|
*
|
|
* Creation date 02/03/98
|
|
* Author Marc Trabucato
|
|
*=====================================================================================*/
|
|
void MGT_fn_vClearAlreadyInfluencedPointsOfModifiedObject( MGT_tdxHandleToModifiedObject h_ModifiedObject )
|
|
{
|
|
memset( h_ModifiedObject -> d_cFieldBitsAlreadyInfluencedPoints, 0, MGT_M_BYTESFORBITS( h_ModifiedObject -> p_stMorphedObject -> xNbPoints ) );
|
|
}
|
|
|
|
/*=======================================================================================
|
|
* Description Delete MagnetModification from ModifiedObject
|
|
*
|
|
* Creation date 02/03/98
|
|
* Author Marc Trabucato
|
|
*=====================================================================================*/
|
|
void MGT_fn_vDeleteMagnetModificationToModifiedObject( MGT_tdxHandleToMagnetModification h_MagnetModif )
|
|
{
|
|
ACP_tdxIndex xIndex;
|
|
MGT_tdxHandleToModifiedObject h_ModifiedObject;
|
|
|
|
h_ModifiedObject = MGT_g_aDEF_hModifiedObjects[ h_MagnetModif -> xIndexOfModifiedObject ];
|
|
|
|
for( xIndex = 0 ; xIndex < MGT_MAX_NUMBEROF_MAGNETS ; xIndex++ )
|
|
{
|
|
if( h_ModifiedObject -> aDEF_hMagnet[ xIndex ] == h_MagnetModif )
|
|
{
|
|
h_ModifiedObject -> aDEF_hMagnet[ xIndex ] = NULL;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*=======================================================================================
|
|
* Description Free ModifiedObject and delete it from global list
|
|
*
|
|
* Creation date 02/03/98
|
|
* Author Marc Trabucato
|
|
*=====================================================================================*/
|
|
void MGT_fn_vDeleteModifiedObject( ACP_tdxIndex x_ModifiedObject )
|
|
{
|
|
GEO_tdstGeometricObject *p_stObject;
|
|
MGT_tdxHandleToModifiedObject h_ModifiedObject;
|
|
|
|
h_ModifiedObject = MGT_g_aDEF_hModifiedObjects[ x_ModifiedObject ];
|
|
p_stObject = h_ModifiedObject -> p_stMorphedObject;
|
|
|
|
MGT_M_Free( h_ModifiedObject -> d_cFieldBitsAlreadyInfluencedPoints );
|
|
|
|
memcpy( p_stObject -> d_stListOfPoints , h_ModifiedObject -> d_stOriginalPosition , p_stObject -> xNbPoints * sizeof( MTH3D_tdstVector ) );
|
|
MGT_M_Free( h_ModifiedObject -> d_stOriginalPosition );
|
|
p_stObject -> p_stOctree = h_ModifiedObject -> p_stOctree;
|
|
GEO_vEndModifyObject2(p_stObject);
|
|
|
|
MGT_g_aDEF_hModifiedObjects[ x_ModifiedObject ] = NULL;
|
|
if( x_ModifiedObject == MGT_g_xMaxIndexOfModifiedObject-1 )
|
|
MGT_g_xMaxIndexOfModifiedObject--;
|
|
|
|
MGT_M_Free( h_ModifiedObject );
|
|
}
|
|
|
|
/*=======================================================================================
|
|
* Description Free ModifiedObject and delete it from global list
|
|
*
|
|
* Creation date 02/03/98
|
|
* Author Marc Trabucato
|
|
*=====================================================================================*/
|
|
void MGT_fn_hDeleteIfExistsMagnetModification( ACP_tdxIndex x_ModifiedObject, ACP_tdxIndex x_Magnet )
|
|
{
|
|
ACP_tdxIndex xIndex;
|
|
MGT_tdxHandleToMagnetModification *p_h_MagnetModif;
|
|
MGT_tdxHandleToModifiedObject h_ModifiedObject;
|
|
|
|
h_ModifiedObject = MGT_g_aDEF_hModifiedObjects[ x_ModifiedObject ];
|
|
|
|
for( xIndex = 0 , p_h_MagnetModif = h_ModifiedObject -> aDEF_hMagnet ;
|
|
xIndex < MGT_MAX_NUMBEROF_MAGNETS ;
|
|
xIndex++, p_h_MagnetModif++ )
|
|
{
|
|
if( *p_h_MagnetModif && ( (*p_h_MagnetModif) -> xIndexOfActivatedMagnet == x_Magnet ) )
|
|
{
|
|
MGT_fn_vDeleteMagnetModification( *p_h_MagnetModif );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*=======================================================================================
|
|
* Description Delete Modified Object if it has no MagnetModification
|
|
*
|
|
* Creation date 02/03/98
|
|
* Author Marc Trabucato
|
|
*=====================================================================================*/
|
|
void MGT_fn_vDeleteModifiedObjectIfNeeded( ACP_tdxIndex x_ModifiedObject )
|
|
{
|
|
ACP_tdxIndex xIndex;
|
|
MGT_tdxHandleToModifiedObject h_ModifiedObject;
|
|
|
|
h_ModifiedObject = MGT_g_aDEF_hModifiedObjects[ x_ModifiedObject ];
|
|
|
|
for( xIndex = 0 ; xIndex < MGT_MAX_NUMBEROF_MAGNETS ; xIndex++ )
|
|
{
|
|
if( h_ModifiedObject -> aDEF_hMagnet[ xIndex ] != NULL )
|
|
break;
|
|
}
|
|
if( xIndex == MGT_MAX_NUMBEROF_MAGNETS )
|
|
MGT_fn_vDeleteModifiedObject( x_ModifiedObject );
|
|
}
|