/**********************************************************
 *                                                        *
 *                   Magnet                               *
 *                                                        *
 * Author : Ubi China - Marc Trabucato                    *
 *                                                        *
 **********************************************************/
 
#include "acp_base.h"
/*
#include "incGAM.h"
#include "SPO.h"
#include "GEO.h"
 
#include "MTH.h"
#include "GLI.h"
#include "incIPO.h"
*/
#define D_MSMagnet_StructureDefine
 
#include "MTH.h"
#include "MEC.h"
#include "GMT.h"
#include "GEO.h"
#include "GLI.h"
 
/*XB980506*/
/*#include "incGAM.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"
 
/*#include "incSPO.h"*/
#include "pos.h"
#include "spo.h"
 
/*#include "incIPO.h"*/
#include "po.h"
/*XB980821*/
#ifndef D_THROW_IPO
#include "ipo.h"
#endif /* D_THROW_IPO */
/*End XB*/
 
/*XB980821*/
#ifndef D_THROW_IPO
#include "ISI.h"
#endif /* D_THROW_IPO */
/*End XB*/
 
#include "MGT\MGTStruc.h"
#include "MGTInit.h"
#include "MGTMain.h"
#include "MGTmm.h"
#include "MGTmo.h"
 
/*************************************************************************************************/
 
/*=======================================================================================
 * Description
 *
 * Creation date    01/03/98
 * Author           Marc Trabucato
 *=====================================================================================*/
void MGT_fn_vFirstInitMagnet( void )
{
	ACP_tdxIndex xIndex;
 
	for( xIndex = 0 ; xIndex < MGT_MAX_NUMBEROF_MAGNETS ; xIndex++ )
		MGT_g_aDEF_hActivatedMagnets[ xIndex ] = NULL;
 
	for( xIndex = 0 ; xIndex < MGT_MAX_NUMBEROF_MODIFIEDOBJECTS ; xIndex++ )
		MGT_g_aDEF_hModifiedObjects[ xIndex ] = NULL;
 
    MGT_g_xMaxIndexOfActivatedMagnet = 0;
    MGT_g_xMaxIndexOfModifiedObject  = 0;
}
 
/*======================================================================================
 * Description
 *
 * Creation date    01/03/98
 * Author           Marc Trabucato
 *=====================================================================================*/
void MGT_fn_vLastDesInitMagnet( void )
{
	ACP_tdxIndex					xIndex , xIndexModif;
	MGT_tdxHandleToModifiedObject	*p_h_ModifiedObject;
 
	for( xIndex = 0 , p_h_ModifiedObject = MGT_g_aDEF_hModifiedObjects ;
         xIndex < MGT_g_xMaxIndexOfModifiedObject;
		 xIndex++, p_h_ModifiedObject++ )
	{
		if( *p_h_ModifiedObject )
		{
			for( xIndexModif = 0 ; xIndexModif < MGT_MAX_NUMBEROF_MAGNETS ; xIndexModif++ )
			{
				if( (*p_h_ModifiedObject) -> aDEF_hMagnet[ xIndexModif ] != NULL )
				{
					MGT_fn_vDeleteMagnetModification( (*p_h_ModifiedObject) -> aDEF_hMagnet[ xIndexModif ] );
				}
			}
            MGT_fn_vDeleteModifiedObject( xIndex );
		}
	}
    MGT_g_xMaxIndexOfModifiedObject = 0;
	MGT_fn_vUpdateActivatedMagnetsList();
}
 
 
/*=======================================================================================
 * Description
 *
 * Creation date    01/03/98
 * Author           Marc Trabucato
 *=====================================================================================*/
void MGT_fn_vAddObjectToMagnetList(HIE_tdxHandleToSuperObject p_stObject)
{
    ACP_tdxIndex            xIndex , xFreeIndex;
    MS_tdxHandleToMSMagnet  hMagnet;
 
	xFreeIndex = MGT_g_xMaxIndexOfActivatedMagnet;
 
    for( xIndex = 0 ; xIndex < MGT_g_xMaxIndexOfActivatedMagnet ; xIndex++ )
    {
        if( MGT_g_aDEF_hActivatedMagnets[ xIndex ] == p_stObject )
        {
			xFreeIndex = xIndex;
            break;
        }
		else if( ( xFreeIndex == MGT_g_xMaxIndexOfActivatedMagnet ) && (MGT_g_aDEF_hActivatedMagnets[ xIndex ] == NULL) )
		{
			xFreeIndex = xIndex;
		}
    }
	if( xFreeIndex != MGT_MAX_NUMBEROF_MAGNETS )
	{
        MGT_g_aDEF_hActivatedMagnets[ xFreeIndex ] = p_stObject;
        if( xFreeIndex == MGT_g_xMaxIndexOfActivatedMagnet )
            MGT_g_xMaxIndexOfActivatedMagnet++;
 
        hMagnet = M_GetMSHandle(p_stObject, MSMagnet);
		if( hMagnet )
		{
			fn_vMSMagnetSetStatus( hMagnet, MAGNETGROWING);
			POS_fn_vGetTranslationVector( HIE_fn_hGetSuperObjectGlobalMatrix(p_stObject), fn_hMSMagnetGetPosition( hMagnet ) );
 
			MGT_fn_vComputeInfluence( p_stObject , hMagnet, xFreeIndex );
		}
	}
}
 
/*=======================================================================================
 * Description
 *
 * Creation date    01/03/98
 * Author           Marc Trabucato
 *=====================================================================================*/
void MGT_fn_vDeleteObjectFromMagnetList(HIE_tdxHandleToSuperObject p_stObject)
{
    ACP_tdxIndex            xIndex;
    MS_tdxHandleToMSMagnet  hMagnet;
 
    for( xIndex = 0 ; xIndex < MGT_g_xMaxIndexOfActivatedMagnet ; xIndex++ )
    {
        if( MGT_g_aDEF_hActivatedMagnets[ xIndex ] == p_stObject )
        {
            MGT_g_aDEF_hActivatedMagnets[ xIndex ] = NULL;
            if( xIndex = (MGT_g_xMaxIndexOfActivatedMagnet-1) )
                MGT_g_xMaxIndexOfActivatedMagnet--;
 
            hMagnet = M_GetMSHandle(p_stObject, MSMagnet);
            fn_vMSMagnetSetStatus( hMagnet, MAGNETOFF);
            break;
        }
    }
}
 
/*=======================================================================================
 * Description
 *
 * Creation date    02/03/98
 * Author           Marc Trabucato
 *=====================================================================================*/
void MGT_fn_vDeleteMagnetFromMagnetList( ACP_tdxIndex x_Magnet )
{
    MGT_g_aDEF_hActivatedMagnets[ x_Magnet ] = NULL;
    if( x_Magnet == (MGT_g_xMaxIndexOfActivatedMagnet-1) )
        MGT_g_xMaxIndexOfActivatedMagnet--;
}
 
/*=======================================================================================
 * Description
 *
 * Creation date    02/03/98
 * Author           Marc Trabucato
 *=====================================================================================*/
void MGT_fn_vDeleteMagnet( ACP_tdxIndex x_Magnet )
{
    /*
    ACP_tdxIndex					  xIndex;
	MGT_tdxHandleToMagnetModification hModif;
 
    for ( xIndex = 0 ; xIndex < MGT_MAX_NUMBEROF_MAGNETS ; xIndex++ )
    {
		hModif = fn_hMSMagnetGetMagnetModification( hMagnet, xIndex );
        if( hModif )
        {
            MGT_fn_vDeleteMagnetModification( hModif );
        }
    }
    */
}
 
/*=======================================================================================
 * Description
 *
 * Creation date    02/03/98
 * Author           Marc Trabucato
 *=====================================================================================*/
void MGT_fn_vDeleteMSMagnetIfNeeded( ACP_tdxIndex x_Magnet )
{
    ACP_tdxIndex			xIndex;
    MS_tdxHandleToMSMagnet  h_Magnet;
 
    h_Magnet = M_GetMSHandle( MGT_g_aDEF_hActivatedMagnets[ x_Magnet ], MSMagnet);
 
	if( h_Magnet )
	{
		for( xIndex = 0 ; xIndex < MGT_MAX_NUMBEROF_MODIFIEDOBJECTS ; xIndex++ )
		{
			if( fn_hMSMagnetGetMagnetModification( h_Magnet, xIndex ) )
			{
				break;
			}
		}
		if( (xIndex == MGT_MAX_NUMBEROF_MODIFIEDOBJECTS) && (fn_lMSMagnetGetStatus( h_Magnet ) == MAGNETRECOVERING) )
		{
			fn_vMSMagnetSetStatus( h_Magnet, MAGNETOFF);
			/* delete the magnet from the active magnet list.*/
			MGT_fn_vDeleteMagnetFromMagnetList( x_Magnet );
		}
	}
	else
	{
		/* delete the magnet from the active magnet list.*/
		MGT_fn_vDeleteMagnetFromMagnetList( x_Magnet );
	}
}
 
/*=======================================================================================
 * Description
 *
 * Creation date    02/03/98
 * Author           Marc Trabucato
 *=====================================================================================*/
void MGT_fn_vUpdateModifiedObjectsList( void )
{
	ACP_tdxIndex					xIndex;
	MGT_tdxHandleToModifiedObject	*p_h_ModifiedObject;
 
	for( xIndex = 0 , p_h_ModifiedObject = MGT_g_aDEF_hModifiedObjects ; 
		 xIndex < MGT_g_xMaxIndexOfModifiedObject ;
		 xIndex++,  p_h_ModifiedObject++ )
	{
		if( *p_h_ModifiedObject )
		{
			MGT_fn_vDeleteModifiedObjectIfNeeded( xIndex );
		}
	}
}
 
/*=======================================================================================
 * Description
 *
 * Creation date    02/03/98
 * Author           Marc Trabucato
 *=====================================================================================*/
void MGT_fn_vUpdateActivatedMagnetsList( void )
{
	ACP_tdxIndex			    xIndex;
	MS_tdxHandleToMSMagnet		h_Magnet;
	HIE_tdxHandleToSuperObject  *p_hSO;
 
    for ( xIndex = 0 , p_hSO = MGT_g_aDEF_hActivatedMagnets ;
		  xIndex < MGT_g_xMaxIndexOfActivatedMagnet ;
		  xIndex++, p_hSO++ )
    {
        if( *p_hSO )
        {
            h_Magnet   = M_GetMSHandle( (*p_hSO) , MSMagnet);
			MGT_fn_vDeleteMSMagnetIfNeeded( xIndex );
			if( h_Magnet )
			{
				fn_vMSMagnetSetStrengthModification( h_Magnet, FALSE );
				fn_vMSMagnetSetNearFarModification ( h_Magnet, FALSE );
			}
		}
	}
}
