/*********************************************************/
/*  Module used to display Waypoints in the Game engine*/
/*	*/
/*		Author	: Marc Fascia - Annecy*/
/*		Date		: 02 / 03 / 1998*/
/**/
/*********************************************************/
 
#define _WP_D_WAYPOINT_FRIEND_
 
#include "specif/AIOption.h"
#include "AIMacros.h"
#include "AIUseCPA.h"
#include "AI_Mmg.h"
#include "AI_Erm.h"
 
#include "AI_Proto.h"
 
#include "WPEngDsp.h"
#include "WPWayPt.h"
 
#include "WP_Handl.h"
 
#include "WP_Func.h"
 
#ifndef U64
static GEO_tdstGeometricObject * p_stGeoModel;
static GEO_tdstGeometricObject * p_stGeoCurr;
#endif

 
#ifdef __cplusplus
extern "C"{
#endif
#if !defined(PRESS_DEMO)
	extern void DisplayPolices (char * _szText , long _lX , long _lY);
#else
#define DisplayPolices(a,b,c)
#endif /* PRESS_DEMO */
	extern void GLI_vEndOfGeometricLoad( void );
	/*bart990209 : extern void GLI_vDownLoadTexture( void );*/
    #ifndef U64
        /*static*/ unsigned char           ucIsInitDone = 0;
    #endif
#ifdef __cplusplus
}
#endif
 
#if !defined(U64) && !defined(RETAIL)
/***********************************************************************************************/
/*  Name        : WP_InitGeoModel*/
/*  Description : Loads the Geo Obj used to display the WP from .mod file */
/*  Author      : Marc FASCIA*/
/*  Date        : 04/03/98*/
/***********************************************************************************************/
GEO_tdstGeometricObject * WP_InitGeoModel()
{
  GEO_tdstGeometricObject * p_stLoaded;
  
  p_stLoaded = (GEO_tdstGeometricObject *) SCR_M_ul_RdL0_ExtractLongValue( 
    SCR_fnp_st_RdL0_AnalyseSection( "GameData\\World\\Graphics\\Objects\\Banks\\Waypoints\\wp.mod^Geometric:Box01", SCR_CDF_uw_Anl_ForceAnalyse ), 
    0 );
 
  return p_stLoaded;
}
/* LOL #endif*/
 
/***********************************************************************************************/
/*  Name        : WP_SendWaypointsToViewport*/
/*  Description : Displays the Geo Objs for WP*/
/*  Author      : Marc FASCIA*/
/*  Date        : 04/03/98*/
/*  Optimized ? : No*/
/***********************************************************************************************/
void WP_SendWaypointsToViewport( GLD_tdstViewportAttributes * p_stViewport, unsigned long ulDrawMask )
 
{
 
  WP_tdstWayPoint             * p_stWaypt;
  ACP_tdxIndex                xNbVertices;
  unsigned int                uiPos;	
  SCR_tdst_Link_Value         * pLinkValue = NULL;
  SCR_tdst_Link_Table         * pLinkTable;
  char                        szText[ 255 ];
 
  /*--- First time we are here ??? ---*/
  if( !ucIsInitDone )
  {
    /*--- Loading Goe Objs from file ---*/
    p_stGeoModel = WP_InitGeoModel();
    p_stGeoCurr  = WP_InitGeoModel();
    GLI_vEndofGeometricLoad();
    
    ucIsInitDone = 1;
 
  }
  
  /*--- gettink back the Waypoints linktable*/
  pLinkTable = WP_fnp_WayPoint_GetLinkTable();
 
  /*--- First element*/
  uiPos = 0;
  SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, pLinkValue, SCR_M_st_Link_GetDynamicArray(pLinkTable) )
  while (pLinkValue)
  {
    /*--- Getting the Waypoint handle*/
    p_stWaypt = (WP_tdstWayPoint *) SCR_M_ul_Link_GetValue( pLinkValue );
 
    for( xNbVertices = 0 ; xNbVertices < p_stGeoCurr->xNbPoints ; xNbVertices++ )
    {
      /*--- Translates the current object at the waypoint position*/
      MTH3D_M_vAddVector( &(p_stGeoCurr->d_stListOfPoints[ xNbVertices ]),
        &(p_stGeoModel->d_stListOfPoints[ xNbVertices ]),
        &(p_stWaypt->m_stVertex) );
    }
 
    /*--- Translates the center of BV of object*/
    MTH3D_M_vAddVector( &p_stGeoCurr->xBoudingSphereCenter, &p_stGeoModel->xBoudingSphereCenter, &p_stWaypt->m_stVertex );
      
    /*--- Sends the object to the Display Routines*/
    GLI_xSendObjectToViewportWithLights( p_stViewport, p_stGeoCurr, ulDrawMask );
         
    /*--- Next Linked Value*/
    uiPos++;
    SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, pLinkValue, SCR_M_st_Link_GetDynamicArray(pLinkTable) )
  }
  sprintf( szText, "[P] Display Waypoints" );
  DisplayPolices( (char *)szText, 450, 450 );
 
}
/* LOL */
#endif /* U64 */
 
/*--------------------------------------------------------------
  -------------------- OLD VERSION -----------------------------
  --------------------------------------------------------------
 
 
#include "SPO\HieSpObj.h"
 
  
static HIE_tdstSuperObject     * p_stWaypointsSPO;
static unsigned char           s_ucWPDisplayNotInitialized = 1;
 
 
//*********************************************************************************************
//  Name        : WP_InitWaypointSPO
//  Description : Creates the SPO that will contain all the GEO Objs for the WP
//  Author      : Marc FASCIA
//  Date        : 04/03/98
//  Optimized ? : No
//*********************************************************************************************
HIE_tdstSuperObject * WP_InitSPO()
{
  MTH3D_tdstMatrix        stIdMatrix;
  MTH3D_tdstVector        stZeroVector;
  POS_stCompletePosition  stCompletePos;
  HIE_tdstSuperObject     * p_stSPO;
 
  //--- Creates the SPO in memory
  p_stSPO = HIE_fn_hCreateSuperObject();
 
  //--- Inits the Position ---
  MTH3D_M_vNullVector( &stZeroVector );
  MTH3D_M_vSetIdentityMatrix( &stIdMatrix );
  POS_fn_vSetTransformMatrix(   &stCompletePos, &stIdMatrix.stCol_0, &stIdMatrix.stCol_1, &stIdMatrix.stCol_2 );
  POS_fn_vSetRotationMatrix(    &stCompletePos, &stIdMatrix.stCol_0, &stIdMatrix.stCol_1, &stIdMatrix.stCol_2 );
  POS_fn_vSetTranslationVector( &stCompletePos, &stZeroVector );
 
  HIE_fn_vSetSuperObjectMatrix( p_stSPO, &stCompletePos );
 
  return p_stSPO;
}
 
 
 
//*********************************************************************************************
//  Name        : WP_InitWPModel
//  Description : Loads the GEO Obj primitive displayed for each WP
//  Author      : Marc FASCIA
//  Date        : 04/03/98
//  Optimized ? : No
//*********************************************************************************************
GEO_tdstGeometricObject * WP_InitWPModel()
{
  GEO_tdstGeometricObject * p_stLoaded;
 
  p_stLoaded = (GEO_tdstGeometricObject *) SCR_M_ul_RdL0_ExtractLongValue( 
    SCR_fnp_st_RdL0_AnalyseSection( "GameData\\World\\Levels\\morbide\\morbide.mod^Geometric:Box01", SCR_CDF_uw_Anl_ForceAnalyse ), 
    0 );
  return p_stLoaded;
}
 
 
//*********************************************************************************************
//  Name        : WP_FillWaypointsSPO
//  Description : Links the Geo Objs with the WP SPO
//  Author      : Marc FASCIA
//  Date        : 04/03/98
//  Optimized ? : No
//*********************************************************************************************
void WP_FillWaypointSPO()
 
{
  WP_tdstWayPoint             * p_stWaypt;
  ACP_tdxIndex                xNbVertices;
  unsigned int                uiPos;	
  SCR_tdst_Link_Value         * pLinkValue;
  SCR_tdst_Link_Table         * pLinkTable;
  GEO_tdstGeometricObject     * p_stCurrGeoObj;
  static HIE_tdstSuperObject  * p_stCurrSPO;
 
  //--- gettink back the Waypoints linktable
  pLinkTable = WP_fnp_WayPoint_GetLinkTable();
 
  //--- First element
  uiPos = 0;
  SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, pLinkValue, SCR_M_st_Link_GetDynamicArray(pLinkTable) )
  while (pLinkValue)
  {
    //--- Getting the Waypoint handle
    p_stWaypt = (WP_tdstWayPoint *) SCR_M_ul_Link_GetValue( pLinkValue );
      
    //--- Creates the Geo Obj and the SPO 
    p_stCurrGeoObj = WP_InitWPModel();
    p_stCurrSPO = WP_InitSPO();
 
    //--- Links it to its own SPO ---
    HIE_fn_vSetSuperObjectObjectAndType( p_stWaypointsSPO, p_stCurrGeoObj, C_ucPhysical );
 
    //--- Creates SPO hierarchy ---
    HIE_fn_vSuperObjectAddTail( p_stWaypointsSPO, p_stCurrSPO );
 
 
    for( xNbVertices = 0 ; xNbVertices < p_stCurrGeoObj->xNbPoints ; xNbVertices++ )
    {
      //--- Translates the Model object at the waypoint position
      MTH3D_M_vAddVector( &(p_stCurrGeoObj->d_stListOfPoints[ xNbVertices ]),
        &(p_stCurrGeoObj->d_stListOfPoints[ xNbVertices ]),
        &(p_stWaypt->m_stVertex) );
    }
      
    //--- Sends the object to the Display Routines
    //    GLI_xSendObjectToViewportWithLights( p_stViewport, p_stCurrGeoObj, ulDrawMask );
      
    //--- Next Linked Value
    uiPos++;
    SCR_M_DyAr_GetNextElement( SCR_tdst_Link_Value, uiPos, pLinkValue, SCR_M_st_Link_GetDynamicArray(pLinkTable) )
  }
}
 
 
//*********************************************************************************************
//  Name        : WP_WPAttachInHierarchy
//  Description : Adds the WP SPO in the SPO hierarchy
//  Author      : Marc FASCIA
//  Date        : 04/03/98
//  Optimized ? : No
//*********************************************************************************************
void WP_WPAttachInHierarchy( HIE_tdstSuperObject * p_stRootSPO )
{
  //--- We need to load the Model the first time
  if( s_ucWPDisplayNotInitialized )
  {
    //--- Init of the Waypoints root spo ---
    p_stWaypointsSPO = WP_InitSPO();
    HIE_fn_vSetSuperObjectObjectAndType( p_stWaypointsSPO, NULL, C_ucNoAction );
    WP_FillWaypointSPO();
 
    //--- Now the hierarchy has been built ---
    s_ucWPDisplayNotInitialized = 0;
  }
 
  //--- Linking this branch to the static tree ---
  HIE_fn_vSuperObjectAddTail( p_stRootSPO, p_stWaypointsSPO );
}
 
 
//*********************************************************************************************
//  Name        : WP_WPIsolateFromHierarchy
//  Description : Removes the WP SPO in the SPO hierarchy
//  Author      : Marc FASCIA
//  Date        : 04/03/98
//  Optimized ? : No
//*********************************************************************************************
void WP_WPIsolateFromHierarchy()
{
  //--- Cutting the Waypoint branch from the static tree ---  
  HIE_fn_vIsolate( p_stWaypointsSPO );
}
  
 
*/
