/*
  MODULE : COL (Intersection & Collision Library)
  AUTHOR : Frederic PHILIPPE
           UBI R&D
  FILE : CollGOCo.h (Geometric object collision)
*/
 
#ifndef COL_COLLGOCO_H
#define COL_COLLGOCO_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
#include "cpa_expt.h"
 
/* For Global declaration in C files : */
#ifdef COL_GLOBALS
 #define COL_EXTERN extern
#else /* !COL_GLOBALS */
 #define COL_EXTERN
#endif /* !COL_GLOBALS */
 
/*
-----------------------------------------------------------------------------
INCLUDES FILES
-----------------------------------------------------------------------------
*/
 
#include "Futil.h"
#include "Box.h"
#include "Inters.h"
#include "IntersGO.h"
#include "OctreeGO.h"
#include "CollGOUt.h"
 
/*
-----------------------------------------------------------------------------
CONSTANT DECLARATION
-----------------------------------------------------------------------------
*/
 
/* cas de collision */
#define COL_C_ulDynamicNonWithStaticNon 0x00000000
 
#define COL_C_ulDynamicPtsWithStaticITr 0x00000001
#define COL_C_ulDynamicPtsWithStaticFMD 0x00000002
#define COL_C_ulDynamicPtsWithStaticSph 0x00000004
#define COL_C_ulDynamicPtsWithStaticBox 0x00000008
#define COL_C_ulDynamicPtsWithStaticElt 0x0000000F
 
#define COL_C_ulDynamicITrWithStaticPts 0x00000010
#define COL_C_ulDynamicFMDWithStaticPts 0x00000020
#define COL_C_ulDynamicSphWithStaticPts 0x00000040
#define COL_C_ulDynamicBoxWithStaticPts 0x00000080
#define COL_C_ulDynamicEltWithStaticPts 0x000000F0
 
#define COL_C_ulDynamicEdgWithStaticEdg 0x00000100
 
#define COL_C_ulDynamicEdgWithStaticSph 0x00000200
#define COL_C_ulDynamicEdgWithStaticBox 0x00000400
#define COL_C_ulDynamicEdgWithStaticElt 0x00000600
 
#define COL_C_ulDynamicSphWithStaticEdg 0x00000800
#define COL_C_ulDynamicBoxWithStaticEdg 0x00001000
#define COL_C_ulDynamicEltWithStaticEdg 0x00001800
 
#define COL_C_ulDynamicITrWithStaticSph 0x00002000
#define COL_C_ulDynamicITrWithStaticBox 0x00004000
#define COL_C_ulDynamicITrWithStaticElt 0x00006000
 
#define COL_C_ulDynamicFMDWithStaticSph 0x00008000
#define COL_C_ulDynamicFMDWithStaticBox 0x00010000
#define COL_C_ulDynamicFMDWithStaticElt 0x00018000
 
#define COL_C_ulDynamicSphWithStaticITr 0x00020000
#define COL_C_ulDynamicSphWithStaticFMD 0x00040000
#define COL_C_ulDynamicSphWithStaticSph 0x00080000
#define COL_C_ulDynamicSphWithStaticBox 0x00100000
#define COL_C_ulDynamicSphWithStaticElt 0x001E0000
 
#define COL_C_ulDynamicBoxWithStaticITr 0x00200000
#define COL_C_ulDynamicBoxWithStaticFMD 0x00400000
#define COL_C_ulDynamicBoxWithStaticSph 0x00800000
#define COL_C_ulDynamicBoxWithStaticBox 0x01000000
#define COL_C_ulDynamicBoxWithStaticElt 0x01E00000
 
#define COL_C_ulDynamicEltWithStaticElt 0x01FFE000
 
#define COL_C_ulDynamicAllWithStaticAll 0x01FFFFFF
 
/* ANNECY AV {*/
/*#define COL_C_xPointEntity       0*/
#define COL_C_xTriangleEntity      1
/*#define COL_C_xEdgeEntity        2*/
#define COL_C_xSphereEntity        3
#define COL_C_xAlignedBoxEntity    4
#define COL_C_xHighEdgeEntity      7    /* Edge     that is above the collision point */
#define COL_C_xLowEdgeEntity       8    /* Edge     that is below the collision point */
/* END ANNECY AV }*/
 
/*ANNECY jt {*/
#define COL_C_xNoEntity			99
/*ENDANNECY jt }*/
 
#define COL_C_xMaxStaticPoints			500
#define COL_C_xMaxStaticEdges			500
#define COL_C_xMaxStaticBoundingBoxes	50
 
/*#define COL_C_xMaxNumberOfCollisions    25   // 50    jt*/
#define COL_C_xMaxNumberOfCollisions    75   

 
 
/*
-----------------------------------------------------------------------------
TYPES DEFINITION
-----------------------------------------------------------------------------
*/
 
/*	WARNING 
	To Optimize MECA-Collisions Array computing, 
	this struct MUST BE exactly the same as
	DNM_stMecObstacle in DNMObsta.h
	Any change to this struct MUST be reported to DNM_stMecObstacle */

typedef struct COL_tdstCollisionCase_
{
  /* 1 temps de collision */
  MTH_tdxReal xCollisionTime; 

  /* 2 normale de collision */
  MTH3D_tdstVector stCollisionNormal;
  
  /* 3 point de collision */
  MTH3D_tdstVector stCollisionPoint;


  /* 4 materiau dynamique */
  GMT_tdxHandleToGameMaterial hDynamicMaterial;

  /* 5 materiau statique */
  GMT_tdxHandleToGameMaterial hStaticMaterial;

  /* 6 parametre 1 pour la meca HIE_tdxHandleToSuperObject mp_stSupObj */
  void *p_vParameter1;

  /* 7 parametre 2 pour la meca DNM_tdeObstacleType m_eType */
  long sParameter2;

  /* 8 geometrie dynamique */
  ACP_tdxIndex xDynamicGeomEntity;

  /* 9 geometrie statique */
  ACP_tdxIndex xStaticGeomEntity;

 
  /* 10 The translation to do to the actor*/
  MTH3D_tdstVector stTranslation;
  
  /* 11 the movement of the zone */
  MTH3D_tdstVector stMovement;

  /* 12 the final position of the center of the sphere */
  MTH3D_tdstVector stEndPosition;
  
  /* 13 The radius of the sphere (or the dimension of the box) */
  MTH_tdxReal xSphereRadius;
  
  /* 14 Pour correspondre a la structure de meca*/
  /*DNM_tdstMecMatCharacteristics m_stProperties; *//* Material properties */
	MTH_tdxReal m_xSlide1;
	MTH_tdxReal m_xRebound1;

  /* 15 Pour correspondre a la structure de meca*/
  /* DNM_tdstMecMatCharacteristics m_stMyProperties;*/ /* Material properties of mine */
	MTH_tdxReal m_xSlide2;
	MTH_tdxReal m_xRebound2;



}
  COL_tdstCollisionCase;
 
typedef struct COL_tdstGVForCollision_
{
  /* parametres */
  ACP_tdxBool bStaticGeomObjHasNoTransformationMatrix;
  ACP_tdxBool bDynamicGeomObjHasZoomInsteadOfScale;
  GEO_tdstGeometricObject *p_stDynamicGeomObj;
  POS_tdstCompletePosition *p_stT0DynamicGeomObjMatrix;
  POS_tdstCompletePosition *p_stT1DynamicGeomObjMatrix;
  GEO_tdstGeometricObject *p_stStaticGeomObj;
  POS_tdstCompletePosition *p_stStaticGeomObjMatrix;
  unsigned long ulSelectedCollisionCases;
  void *p_vParameter1;
  short sParameter2;
 
  /* variables internes */
 
  /* matrices */
  POS_tdstCompletePosition stInvMatrix;
 
  POS_tdstCompletePosition stD2ST0TransformMatrix;
  POS_tdstCompletePosition stD2ST1TransformMatrix;
 
  POS_tdstCompletePosition stS2DT0TransformMatrix;
  POS_tdstCompletePosition stS2DT1TransformMatrix;
 
  MTH_tdxReal xStaticScale;
 
  /* index generaux */
  ACP_tdxIndex xDynamicPointIndex;
  ACP_tdxIndex xStaticPointIndex;
 
  ACP_tdxIndex xDynamicEdgeIndex;
  ACP_tdxIndex xStaticEdgeIndex;
 
  ACP_tdxIndex xDynamicElementIndex;
  ACP_tdxIndex xStaticElementIndex;
 
  /* pointeurs des elements */
  MTH3D_tdstVector *p_stDynamicPoint;
  MTH3D_tdstVector *p_stStaticPoint;
 
  GEO_tdstDoubledIndex *p_stDynamicEdge;
  GEO_tdstDoubledIndex *p_stStaticEdge;
 
  GEO_tdstElementIndexedTriangles *p_stDynamicElementIndexedTriangles;
  GEO_tdstElementIndexedTriangles *p_stStaticElementIndexedTriangles;
 
//XB99/04/27
#ifndef U64
  GEO_tdstElementFaceMapDescriptors *p_stDynamicElementFaceMapDescriptors;
  GEO_tdstElementFaceMapDescriptors *p_stStaticElementFaceMapDescriptors;
#endif U64
//End XB99/04/27
 
  GEO_tdstElementSpheres *p_stDynamicElementSpheres;
  GEO_tdstElementSpheres *p_stStaticElementSpheres;
 
  GEO_tdstElementAlignedBoxes *p_stDynamicElementAlignedBoxes;
  GEO_tdstElementAlignedBoxes *p_stStaticElementAlignedBoxes;
 
#ifdef USE_ALTIMAPS
  GEO_tdstElementAltimap *p_stStaticElementAltimap;
#endif /*USE_ALTIMAPS*/
 
  /* index des elements */
  ACP_tdxIndex xDynamicIndexedTriangleIndex;
  ACP_tdxIndex xStaticIndexedTriangleIndex;
 
  ACP_tdxIndex xDynamicFaceMapTriangleIndex;
  ACP_tdxIndex xStaticFaceMapTriangleIndex;
 
  ACP_tdxIndex xDynamicIndexedSphereIndex;
  ACP_tdxIndex xStaticIndexedSphereIndex;
 
  ACP_tdxIndex xDynamicIndexedAlignedBoxIndex;
  ACP_tdxIndex xStaticIndexedAlignedBoxIndex;
 
/* ANNECY MT 25/02/98 {*/
  long	lBitsFieldOfIndexedSpheresInCollision;
/* END ANNECY MT }*/
 
  /* pointeurs des parties d element */
  GEO_tdstIndexedSphere *p_stDynamicIndexedSphere;
  GEO_tdstIndexedSphere *p_stStaticIndexedSphere;
 
  GEO_tdstIndexedAlignedBox *p_stDynamicIndexedAlignedBox;
  GEO_tdstIndexedAlignedBox *p_stStaticIndexedAlignedBox;
 
  /* donnees de base */
  MTH3D_tdstVector stDinST0Point;
  MTH3D_tdstVector stDinST1Point;
  MTH3D_tdstVector stDinST01Vector;

/* jt 220399 */
  MTH3D_tdstVector stSwapDinST0Point;
 
  MTH3D_tdstVector stSinDT0Point;
  MTH3D_tdstVector stSinDT1Point;
  MTH3D_tdstVector stSinDT01Vector;
 
  ACP_tdxIndex xVertex1Index;
  ACP_tdxIndex xVertex2Index;
  MTH3D_tdstVector *p_stVertex1;
  MTH3D_tdstVector *p_stVertex2;
  MTH3D_tdstVector stEdgeVector;
 
  MTH3D_tdstVector *p_stDynamicCenter;
  MTH3D_tdstVector *p_stStaticCenter;
  MTH_tdxReal xDynamicRadius;

/* jt 260399 */  
  MTH_tdxReal xSwapRadius;
  ACP_tdxBool bUseEnlargeSphere;

  MTH3D_tdstVector *p_stDynamicMinPoint;
  MTH3D_tdstVector *p_stDynamicMaxPoint;
  MTH3D_tdstVector *p_stStaticMinPoint;
  MTH3D_tdstVector *p_stStaticMaxPoint;
 
  MTH3D_tdstVector stDinST0MaxPoint;
  MTH3D_tdstVector stDinST1MaxPoint;
  MTH3D_tdstVector stDinST0MinPoint;
  MTH3D_tdstVector stDinST1MinPoint;
 
  COL_tda8st8VerticesBox a8_stDynamic8VBox;
  COL_tda8st8VerticesBox a8_stStatic8VBox;
 
  COL_tda8st8VerticesBox a8_stDinST08VBox;
  COL_tda8st8VerticesBox a8_stDinST18VBox;
  COL_tda8st8VerticesBox a8_stDinST01Vect;
 
  COL_tda8st8VerticesBox a8_stSinDT08VBox;
  COL_tda8st8VerticesBox a8_stSinDT18VBox;
  COL_tda8st8VerticesBox a8_stSinDT01Vect;
 
  GMT_tdxHandleToGameMaterial hDynamicMaterial;
  GMT_tdxHandleToGameMaterial hStaticMaterial;
 
  COL_tdpstOctree p_stOctree;
  ACP_tdxIndex xNumberOfSelectedNodes;
  COL_tdpstOctreeNode aDEF_pstSelectedNode[COL_C_xMaxSelectedNodes];
  MTH_tdxReal aDEF_xSelectedT[COL_C_xMaxSelectedNodes];
 
  ACP_tdxBool bSurfacicDynamicElement;
  ACP_tdxBool bDynamicSphereAndPointOnly;
 
  ACP_tdxIndex xNbStaticPoints;
  ACP_tdxIndex aDEF_xListOfStaticPoints[COL_C_xMaxStaticPoints];
 
  ACP_tdxIndex xNbStaticEdges;
  ACP_tdxIndex aDEF_xListOfStaticPt1Edges[COL_C_xMaxStaticEdges];
  ACP_tdxIndex aDEF_xListOfStaticPt2Edges[COL_C_xMaxStaticEdges];
  GMT_tdxHandleToGameMaterial aDEF_hListOfStaticMaterialEdges[COL_C_xMaxStaticEdges];
}
  COL_tdstGVForCollision;
 
/*
-----------------------------------------------------------------------------
GLOBAL VARIABLE DECLARATION
-----------------------------------------------------------------------------
*/
 
/* cas de collision */
extern COL_tdstCollisionCase COL_g_stCollisionCase [COL_C_xMaxNumberOfCollisions];
 
extern COL_tdstGVForCollision COL_g_stGVForCol;
extern long COL_g_lNbElementsInTable;
 
/*
-----------------------------------------------------------------------------
FUNCTIONS DECLARATION
-----------------------------------------------------------------------------
*/
 
/*extern CPA_EXPORT void COL_fn_vInitCollisionTable ( void );*/ /* anthony */
#define COL_fn_vInitCollisionTable() { COL_g_lNbElementsInTable = 0; }


extern CPA_EXPORT void COL_fn_vAddInStaticCollisionTable ( MTH_tdxReal _xT,
                                                           MTH3D_tdstVector * _p_stTranslation,
                                                           MTH3D_tdstVector * _p_stHit,
                                                           MTH3D_tdstVector * _p_stNormal,
                                                           GMT_tdxHandleToGameMaterial _hDynMat,
                                                           GMT_tdxHandleToGameMaterial _hStatMat,
                                                           ACP_tdxIndex       _xDynamicGeomEntity,
                                                           ACP_tdxIndex       _xStaticGeomEntity,
                                                           void *             _p_vParameter1,
                                                           short              _sParameter2,
                                                           MTH3D_tdstVector * _p_stMovement,
                                                           MTH_tdxReal        _xSphereRadius,
                                                           MTH3D_tdstVector * _p_stEndPosition);
/*extern CPA_EXPORT ACP_tdxBool COL_fn_bGetResultCollision         (COL_tdstCollisionCase * p_stCollisionCaseDst);*/
extern CPA_EXPORT ACP_tdxBool COL_fn_bGetMultipleResultCollision (COL_tdstCollisionCase * * _p_p_stCollisionCaseDst);
 
#ifdef __cplusplus
};
#endif
 
#endif /* COL_COLLGOCO_H */
