/*
  MODULE : PRT (Particle system Library)
  AUTHOR : Frederic PHILIPPE
           UBI R&D
  FILE : PRT.h (Principal header file)
*/
#ifndef D_THROW_PRT
 
#ifndef PRT_PRTSRC_H
#define PRT_PRTSRC_H
 
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
 
#include "cpa_expt.h"
 
/* For Global declaration in C files : */
#ifdef PRT_GLOBALS
 #define PRT_EXTERN extern
#else /* !PRT_GLOBALS */
 #define PRT_EXTERN
#endif /* !PRT_GLOBALS */
 
/*
-----------------------------------------------------------------------------
INCLUDES FILES
-----------------------------------------------------------------------------
*/
 
/*#include "Futil.h"*/
 
/*
-----------------------------------------------------------------------------
CONSTANT DECLARATION
-----------------------------------------------------------------------------
*/
 
#define PRT_C_ucNoGeneration           0
#define PRT_C_ucContinousGeneration    1
#define PRT_C_ucProbabilistGeneration  2
#define PRT_C_ucCrenelGeneration       3
 
#define PRT_C_ucConstantNb             0
#define PRT_C_ucProbabilistNb          1
 
#define PRT_C_ucPoint                  0
#define PRT_C_ucQuad                   1
#define PRT_C_ucParallelepipede        2
 
#define PRT_C_ucRotationLink           0
#define PRT_C_ucTranslationLink        1
#define PRT_C_ucRotAndTransLink        2
 
#define PRT_C_ucNoLifeTime             0
#define PRT_C_ucConstantLifeTime       1
#define PRT_C_ucProbabilistLifeTime    2
 
/*
-----------------------------------------------------------------------------
TYPES DEFINITION
-----------------------------------------------------------------------------
*/
 
/* source particules structure */
typedef struct PRT_tdstParticlesSource_
{
  /* parametres de generation */
  unsigned char ucGenerationMode;
  MTH_tdxReal xGenerationProbability;
  ACP_tdxIndex xNbFramesNoGeneration;
  ACP_tdxIndex xNbFramesTotal;
  ACP_tdxIndex xFramesCounter;
 
  unsigned char ucNbParticlesToGenerateMode;
  ACP_tdxIndex xNbParticlesToGenerate;
  ACP_tdxIndex xNbMin;
  ACP_tdxIndex xNbMax;
 
  /* parametres geometriques  */
  /* source parallelelogramme */
  /*      3_____________      */
  /* N_   |\__          |     */
  /* / \  |   \__       |     */
  /* |*|  |      \__    |     */
  /* \_/  |         \__ |     */
  /*     1|____________\2     */
  /*                          */
  unsigned char ucGeometryMode;
  unsigned char ucLinkMode;
  MTH3D_tdstVector stVertex1;
  MTH3D_tdstVector stVertex2;
  MTH3D_tdstVector stVertex3;
  MTH3D_tdstVector stNormal;
  MTH3D_tdstVector stVertex4;
 
  /* vitesse initiale */
  MTH_tdxReal xSpeed;
  MTH_tdxReal xSpeedRange;
 
  unsigned char ucLifeMode;
  MTH_tdxReal xMinTime;
  MTH_tdxReal xMaxTime;
}
  PRT_tdstParticlesSource;
 
/*
-----------------------------------------------------------------------------
GLOBAL VARIABLE DECLARATION
-----------------------------------------------------------------------------
*/
 
extern MTH_tdxReal PRT_g_xNbParticlesFactor;
 
/*
-----------------------------------------------------------------------------
FUNCTIONS DECLARATION
-----------------------------------------------------------------------------
*/
 
#define PRT_M_vCopyCloneParticlesSource( _p_stDstParticlesSource, _p_stSrcParticlesSource )\
  memcpy ( _p_stDstParticlesSource, _p_stSrcParticlesSource, sizeof ( PRT_tdstParticlesSource ) )
 
#define PRT_M_vSetGenerationModeParticlesSource( _p_stParticlesSource, _ucGenerationMode )\
  ( (_p_stParticlesSource)->ucGenerationMode = ( _ucGenerationMode ) )
 
#define PRT_M_vSetGenerationProbabilityParticlesSource( _p_stParticlesSource, _xGenerationProbability )\
  ( (_p_stParticlesSource)->xGenerationProbability = ( _xGenerationProbability ) )
 
#define PRT_M_vSetNbFramesCrenelParticlesSource( _p_stParticlesSource, _xNbFramesNoGeneration, _xNbFramesGeneration )\
{\
  (_p_stParticlesSource)->xNbFramesNoGeneration = (ACP_tdxIndex) ( _xNbFramesNoGeneration );\
  (_p_stParticlesSource)->xNbFramesTotal = (ACP_tdxIndex) (( _xNbFramesNoGeneration ) + ( _xNbFramesGeneration ));\
  (_p_stParticlesSource)->xFramesCounter = 0;\
}
 
#define PRT_M_vSetNbParticlesToGenerateModeParticlesSource( _p_stParticlesSource, _ucNbParticlesToGenerateMode )\
  ( (_p_stParticlesSource)->ucNbParticlesToGenerateMode = ( _ucNbParticlesToGenerateMode ) )
 
#define PRT_M_vSetNbParticlesToGenerateParticlesSource( _p_stParticlesSource, _xNbParticlesToGenerate )\
  ( (_p_stParticlesSource)->xNbParticlesToGenerate = ( _xNbParticlesToGenerate ) )
 
#define PRT_M_vSetFlowParticlesSource( _p_stParticlesSource, _xFlow, _xDeltaT )\
  ( (_p_stParticlesSource)->xNbParticlesToGenerate = MTH_M_xRealToLong ( MTH_M_xMul ( ( _xFlow ), ( _xDeltaT ) ) ) )
 
#define PRT_M_vSetNbMinMaxParticlesSource( _p_stParticlesSource, _xNbMin, _xNbMax )\
{\
  (_p_stParticlesSource)->xNbMin = ( _xNbMin );\
  (_p_stParticlesSource)->xNbMax = ( _xNbMax );\
}
 
#define PRT_M_vSetGeometryModeParticlesSource( _p_stParticlesSource, _ucGeometryMode )\
  ( (_p_stParticlesSource)->ucGeometryMode = ( _ucGeometryMode ) )
 
#define PRT_M_vSetLinkModeParticlesSource( _p_stParticlesSource, _ucLinkMode )\
  ( (_p_stParticlesSource)->ucLinkMode = ( _ucLinkMode ) )
 
#define PRT_M_vSetSpeedParticlesSource( _p_stParticlesSource, _xSpeed )\
  ( (_p_stParticlesSource)->xSpeed = ( _xSpeed ) )
 
#define PRT_M_vSetVertex4ParticlesSource( _p_stParticlesSource, _p_stVertex4 )\
{\
  MTH3D_M_vCopyVector ( &((_p_stParticlesSource)->stVertex4), ( _p_stVertex4 ) );\
}
 
#define PRT_M_vSetSpeedRangeParticlesSource( _p_stParticlesSource, _xSpeedRange )\
  ( (_p_stParticlesSource)->xSpeedRange = ( _xSpeedRange ) )
 
#define PRT_M_vSetLifeModeParticlesSource( _p_stParticlesSource, _ucLifeMode )\
  ( (_p_stParticlesSource)->ucLifeMode = ( _ucLifeMode ) )
 
#define PRT_M_vSetLifeTimeParticlesSource( _p_stParticlesSource, _xLifeTime )\
  ( (_p_stParticlesSource)->xMinTime = ( _xLifeTime ) )
 
#define PRT_M_vSetMinMaxLifeTimeParticlesSource( _p_stParticlesSource, _xMinTime, _xMaxTime )\
{\
  (_p_stParticlesSource)->xMinTime = ( _xMinTime );\
  (_p_stParticlesSource)->xMaxTime = ( _xMaxTime );\
}
 
extern CPA_EXPORT void PRT_fn_vCreateParticlesSource ( PRT_tdstParticlesSource **_p_pstParticlesSource );
 
extern CPA_EXPORT void PRT_fn_vDestructParticlesSource ( PRT_tdstParticlesSource *_p_stParticlesSource );
 
extern CPA_EXPORT void PRT_fn_vSetQuadParticlesSource ( PRT_tdstParticlesSource *_p_stParticlesSource,
                                      MTH3D_tdstVector *_p_stVertex1,
                                      MTH3D_tdstVector *_p_stVertex2,
                                      MTH3D_tdstVector *_p_stVertex3 );
 
extern CPA_EXPORT void PRT_fn_vSetPointParticlesSource ( PRT_tdstParticlesSource *_p_stParticlesSource, MTH3D_tdstVector *_p_stVertex );
 
extern CPA_EXPORT ACP_tdxBool PRT_fn_bComputeParticlesGeneration ( PRT_tdstParticlesSource *_p_stParticlesSource );
 
extern CPA_EXPORT ACP_tdxIndex PRT_fn_xComputeNbParticlesToInject ( PRT_tdstParticlesSource *_p_stParticlesSource );
 
extern CPA_EXPORT void PRT_fn_vSetNbParticlesFactor ( MTH_tdxReal _xNbParticlesFactor );
 
#ifdef __cplusplus
};
#endif /* __cplusplus */
 
#endif /* PRT_PRTSRC_H */
#endif /* D_THROW_PRT */
