657 lines
27 KiB
C
657 lines
27 KiB
C
/*
|
|
0 1 2 3 4 5 6 7
|
|
01234567890123456789012345678901234567890123456789012345678901234567890123456789
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Particles system
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 12 jun 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
#ifndef D_THROW_PRT
|
|
|
|
#include "acp_base.h"
|
|
#include "MTH.h"
|
|
#include "RND.h"
|
|
#include "MEC.h"
|
|
#include "GMT.h"
|
|
#include "GEO.h"
|
|
#include "GLI.h"
|
|
#include "COL.h"
|
|
|
|
#include "PRT/SprtPrt.h"
|
|
|
|
extern float a64_fSinTable[64];
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Global variables
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Sprite particles creation
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 12 jun 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
void PRT_fn_vCreateSpriteParticles ( PRT_tdstParticlesSystem *_p_stParticlesSystem, ACP_tdxHandleOfSprite _hSprite )
|
|
{
|
|
ACP_tdxHandleOfElement hElementSprite;
|
|
ACP_tdxIndex xSpriteIndex;
|
|
MTH2D_tdstVector stDefaultSize = { MTH_C_ONE, MTH_C_ONE };
|
|
PRT_tdstSpriteCommonData *p_stSpriteCommonData;
|
|
|
|
_p_stParticlesSystem->xParticlesType = PRT_C_xSpriteParticles;
|
|
|
|
/* Table de vitesse de particules */
|
|
GEO_M_CPAMalloc ( _p_stParticlesSystem->d_stSpeed,
|
|
MTH3D_tdstVector *,
|
|
sizeof ( MTH3D_tdstVector ) * _p_stParticlesSystem->xNbParticles,
|
|
E_uwGEONotEnoughtMemory );
|
|
|
|
GEO_M_CPAMalloc ( _p_stParticlesSystem->d_stListOfParticles,
|
|
void *,
|
|
sizeof ( PRT_tdstSpriteParticle ) * _p_stParticlesSystem->xNbParticles,
|
|
E_uwGEONotEnoughtMemory );
|
|
|
|
GEO_M_CPAMalloc ( _p_stParticlesSystem->p_stCommonData,
|
|
void *,
|
|
sizeof ( PRT_tdstSpriteCommonData ),
|
|
E_uwGEONotEnoughtMemory );
|
|
|
|
GEO_vCreateGeometricObject ( &(_p_stParticlesSystem->hParticlesSystemObject), _p_stParticlesSystem->xNbParticles, 1 );
|
|
GEO_vCreateElementSprite ( _p_stParticlesSystem->hParticlesSystemObject, &hElementSprite, _p_stParticlesSystem->xNbParticles );
|
|
/*ANNECY VL PRT 18/03/98{*/
|
|
((GEO_tdstElementSprite *) _p_stParticlesSystem->hParticlesSystemObject->d_stListOfElements[0])->cFastDraw = 1;
|
|
/*ENDANNECY VL}*/
|
|
for ( xSpriteIndex = 0 ; xSpriteIndex < _p_stParticlesSystem->xNbParticles ; xSpriteIndex ++ )
|
|
{
|
|
GEO_vSetSizeOfIndexedSprite ( _p_stParticlesSystem->hParticlesSystemObject, hElementSprite, xSpriteIndex, &stDefaultSize );
|
|
GEO_vSetCenterPointOfIndexedSprite ( _p_stParticlesSystem->hParticlesSystemObject, hElementSprite, xSpriteIndex, xSpriteIndex );
|
|
GEO_vSetHandleOfIndexedSprite ( _p_stParticlesSystem->hParticlesSystemObject, hElementSprite, xSpriteIndex, _hSprite );
|
|
}
|
|
GEO_vEndCreateObject ( _p_stParticlesSystem->hParticlesSystemObject );
|
|
|
|
p_stSpriteCommonData = (PRT_tdstSpriteCommonData *)(_p_stParticlesSystem->p_stCommonData);
|
|
p_stSpriteCommonData->hSprite = _hSprite;
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description : Sprite particles destruction
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 12 jun 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
|
void PRT_fn_vDestructSpriteParticles ( PRT_tdstParticlesSystem *_p_stParticlesSystem )
|
|
{
|
|
PRT_tdstSpriteCommonData *p_stSpriteCommonData;
|
|
|
|
_p_stParticlesSystem->xParticlesType = PRT_C_xNullParticles;
|
|
|
|
/* Table de vitesse de particules */
|
|
GEO_M_CPAFree ( _p_stParticlesSystem->d_stSpeed );
|
|
_p_stParticlesSystem->d_stSpeed = NULL;
|
|
|
|
GEO_M_CPAFree ( _p_stParticlesSystem->d_stListOfParticles );
|
|
_p_stParticlesSystem->d_stListOfParticles = NULL;
|
|
|
|
p_stSpriteCommonData = (PRT_tdstSpriteCommonData *) _p_stParticlesSystem->p_stCommonData;
|
|
if ( p_stSpriteCommonData->d_stSpriteData != NULL )
|
|
GEO_M_CPAFree ( p_stSpriteCommonData->d_stSpriteData );
|
|
|
|
GEO_M_CPAFree ( p_stSpriteCommonData );
|
|
_p_stParticlesSystem->p_stCommonData = NULL;
|
|
|
|
GEO_vDeleteGeometricObject ( &(_p_stParticlesSystem->hParticlesSystemObject) );
|
|
_p_stParticlesSystem->hParticlesSystemObject = NULL;
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description :
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 12 jun 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
void PRT_fn_vSetGameMaterialSpriteParticles ( PRT_tdstParticlesSystem *_p_stParticlesSystem,
|
|
GMT_tdxHandleToGameMaterial _hGameMaterial )
|
|
{
|
|
PRT_tdstSpriteCommonData *p_stSpriteCommonData;
|
|
|
|
p_stSpriteCommonData = (PRT_tdstSpriteCommonData *)(_p_stParticlesSystem->p_stCommonData);
|
|
p_stSpriteCommonData->hMaterial = _hGameMaterial;
|
|
}
|
|
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
|
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description :
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 12 jun 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
void PRT_fn_vGenerateSpriteParticle
|
|
(
|
|
MTH3D_tdstVector *_p_stParticlePosition,
|
|
MTH3D_tdstVector *_p_stParticleSpeed,
|
|
PRT_tdstSpriteParticle *_p_stSpriteParticle,
|
|
PRT_tdstSpriteCommonData *_p_stSpriteCommonData,
|
|
PRT_tdstParticlesSource *_p_stParticlesSource,
|
|
POS_tdstCompletePosition *_p_stSourceMatrix,
|
|
MTH_tdxReal _xTimeT
|
|
)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
MTH3D_tdstVector stSpeedVariation;
|
|
MTH_tdxReal xC1, xC2, xC3, xC4;
|
|
MTH3D_tdstVector stTrans;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/* vecteur variation de vitesse */
|
|
MTH3D_M_vSetVectorElements
|
|
(
|
|
&stSpeedVariation,
|
|
RND_fn_xGetRealRandomValue ( 0, MTH_M_xNeg ( _p_stParticlesSource->xSpeedRange ), _p_stParticlesSource->xSpeedRange ),
|
|
RND_fn_xGetRealRandomValue ( 0, MTH_M_xNeg ( _p_stParticlesSource->xSpeedRange ), _p_stParticlesSource->xSpeedRange ),
|
|
RND_fn_xGetRealRandomValue ( 0, MTH_M_xNeg ( _p_stParticlesSource->xSpeedRange ), _p_stParticlesSource->xSpeedRange )
|
|
);
|
|
|
|
/* vitesse initiale */
|
|
MTH3D_M_vMullAddVector ( _p_stParticleSpeed, _p_stParticlesSource->xSpeed, &(_p_stParticlesSource->stNormal), &stSpeedVariation );
|
|
if ( (_p_stParticlesSource->ucLinkMode == PRT_C_ucRotationLink) || (_p_stParticlesSource->ucLinkMode == PRT_C_ucRotAndTransLink) )
|
|
{
|
|
POS_fn_vMulMatrixVector ( _p_stParticleSpeed, _p_stSourceMatrix, _p_stParticleSpeed );
|
|
}
|
|
|
|
/* position initiale */
|
|
if ( _p_stParticlesSource->ucGeometryMode == PRT_C_ucPoint )
|
|
{
|
|
MTH3D_M_vCopyVector ( _p_stParticlePosition, &(_p_stParticlesSource->stVertex1) );
|
|
}
|
|
else
|
|
if ( _p_stParticlesSource->ucGeometryMode == PRT_C_ucQuad )
|
|
{
|
|
/* genere les deux parametres */
|
|
xC2 = RND_fn_xGetRealRandomValue ( 0, MTH_C_ZERO, MTH_C_ONE );
|
|
xC3 = RND_fn_xGetRealRandomValue ( 0, MTH_C_ZERO, MTH_C_ONE );
|
|
xC1 = MTH_M_xSub ( MTH_M_xSub ( MTH_C_ONE, xC2 ), xC3 );
|
|
_p_stParticlePosition->xX = xC1*_p_stParticlesSource->stVertex1.xX + xC2*_p_stParticlesSource->stVertex2.xX + xC3*_p_stParticlesSource->stVertex3.xX;
|
|
_p_stParticlePosition->xY = xC1*_p_stParticlesSource->stVertex1.xY + xC2*_p_stParticlesSource->stVertex2.xY + xC3*_p_stParticlesSource->stVertex3.xY;
|
|
_p_stParticlePosition->xZ = xC1*_p_stParticlesSource->stVertex1.xZ + xC2*_p_stParticlesSource->stVertex2.xZ + xC3*_p_stParticlesSource->stVertex3.xZ;
|
|
}
|
|
else if ( _p_stParticlesSource->ucGeometryMode == PRT_C_ucParallelepipede )
|
|
{
|
|
/* genere les deux parametres */
|
|
xC2 = RND_fn_xGetRealRandomValue ( 0, MTH_C_ZERO, MTH_C_ONE );
|
|
xC3 = RND_fn_xGetRealRandomValue ( 0, MTH_C_ZERO, MTH_C_ONE );
|
|
xC4 = RND_fn_xGetRealRandomValue ( 0, MTH_C_ZERO, MTH_C_ONE );
|
|
xC1 = MTH_M_xSub ( MTH_M_xSub ( MTH_M_xSub ( MTH_C_ONE, xC2 ), xC3 ), xC4 );
|
|
_p_stParticlePosition->xX = xC1*_p_stParticlesSource->stVertex1.xX + xC2*_p_stParticlesSource->stVertex2.xX + xC3*_p_stParticlesSource->stVertex3.xX + xC4*_p_stParticlesSource->stVertex4.xX;
|
|
_p_stParticlePosition->xY = xC1*_p_stParticlesSource->stVertex1.xY + xC2*_p_stParticlesSource->stVertex2.xY + xC3*_p_stParticlesSource->stVertex3.xY + xC4*_p_stParticlesSource->stVertex4.xY;
|
|
_p_stParticlePosition->xZ = xC1*_p_stParticlesSource->stVertex1.xZ + xC2*_p_stParticlesSource->stVertex2.xZ + xC3*_p_stParticlesSource->stVertex3.xZ + xC4*_p_stParticlesSource->stVertex4.xZ;
|
|
}
|
|
|
|
if ( _p_stParticlesSource->ucLinkMode == PRT_C_ucRotAndTransLink )
|
|
{
|
|
POS_fn_vMulMatrixVertex( _p_stParticlePosition, _p_stSourceMatrix, _p_stParticlePosition );
|
|
}
|
|
else if ( _p_stParticlesSource->ucLinkMode == PRT_C_ucTranslationLink )
|
|
{
|
|
POS_fn_vGetTranslationVector( _p_stSourceMatrix, &stTrans );
|
|
MTH3D_M_vAddVector ( _p_stParticlePosition, &stTrans, _p_stParticlePosition );
|
|
}
|
|
else if ( _p_stParticlesSource->ucLinkMode == PRT_C_ucRotationLink )
|
|
{
|
|
POS_fn_vMulMatrixVector ( _p_stParticlePosition, _p_stSourceMatrix, _p_stParticlePosition );
|
|
}
|
|
|
|
/* DeathDate */
|
|
if ( _p_stParticlesSource->ucLifeMode == PRT_C_ucNoLifeTime )
|
|
{
|
|
_p_stSpriteParticle->xDeathDate = MTH_C_InfinitPlus;
|
|
}
|
|
else if ( _p_stParticlesSource->ucLifeMode == PRT_C_ucConstantLifeTime )
|
|
{
|
|
_p_stSpriteParticle->xDeathDate = MTH_M_xAdd ( _xTimeT, _p_stParticlesSource->xMinTime );
|
|
}
|
|
else if ( _p_stParticlesSource->ucLifeMode == PRT_C_ucProbabilistLifeTime )
|
|
{
|
|
_p_stSpriteParticle->xDeathDate = MTH_M_xAdd ( _xTimeT, RND_fn_xGetRealRandomValue ( 0, _p_stParticlesSource->xMinTime, _p_stParticlesSource->xMaxTime ) );
|
|
}
|
|
/* particle rotation */
|
|
{
|
|
static int iRotation = 0;
|
|
if (iRotation)
|
|
{
|
|
_p_stSpriteParticle->a2_cRotateSpeed[0] = (char) (RND_fn_ulGetUnsignedLongRandomValue( 0, 0, 9) - 4 );
|
|
_p_stSpriteParticle->a2_cRotateSpeed[1] = (char) (RND_fn_ulGetUnsignedLongRandomValue( 0, 0, 9) - 4 );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
Description : add a particle in a particle generator
|
|
--------------------------------------------------------------------------------
|
|
Creation date : 12 jun 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
void PRT_fn_vAddSpriteParticle( tdstParticleGenerator *_p_stPrtGen, MTH3D_tdstVector *_p_stParticlePosition, MTH3D_tdstVector *_p_stParticleSpeed, MTH_tdxReal _xTime )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
MTH3D_tdstVector *p_stVect;
|
|
PRT_tdstParticlesSystem *p_stPrtSys;
|
|
PRT_tdstParticlesSource *p_stPrtSrc;
|
|
PRT_tdstSpriteParticle *p_stSprPrt;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
p_stPrtSys = _p_stPrtGen->p_stPrtSys;
|
|
if (p_stPrtSys->xNbActiveParticles == p_stPrtSys->xNbParticles)
|
|
return;
|
|
|
|
/* DeathDate */
|
|
p_stPrtSrc = _p_stPrtGen->p_stPrtSrc;
|
|
p_stSprPrt = (PRT_tdstSpriteParticle *)(p_stPrtSys->d_stListOfParticles) + p_stPrtSys->xNbActiveParticles;
|
|
if ( p_stPrtSrc->ucLifeMode == PRT_C_ucNoLifeTime )
|
|
p_stSprPrt->xDeathDate = MTH_C_InfinitPlus;
|
|
else if ( p_stPrtSrc->ucLifeMode == PRT_C_ucConstantLifeTime )
|
|
p_stSprPrt->xDeathDate = MTH_M_xAdd ( _xTime, p_stPrtSrc->xMinTime );
|
|
else if ( p_stPrtSrc->ucLifeMode == PRT_C_ucProbabilistLifeTime )
|
|
p_stSprPrt->xDeathDate = MTH_M_xAdd ( _xTime, RND_fn_xGetRealRandomValue ( 0, p_stPrtSrc->xMinTime, p_stPrtSrc->xMaxTime ) );
|
|
|
|
p_stVect = p_stPrtSys->hParticlesSystemObject->d_stListOfPoints + p_stPrtSys->xNbActiveParticles;
|
|
MTH3D_M_vCopyVector( p_stVect, _p_stParticlePosition );
|
|
p_stVect = p_stPrtSys->d_stSpeed + p_stPrtSys->xNbActiveParticles;
|
|
MTH3D_M_vCopyVector( p_stVect, _p_stParticleSpeed );
|
|
p_stPrtSys->xNbActiveParticles++;
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description :
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 12 jun 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
void PRT_fn_vMecaSpriteParticlesSystem ( tdstParticleGenerator *_p_stPrtGen,MTH_tdxReal _xTimeT,MTH_tdxReal _xDeltaT )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
PRT_tdstSpriteParticle *p_stSpriteParticle, *p_stLastSpriteParticle;
|
|
MTH3D_tdstVector *p_stParticlePosition, *p_stLastParticlePosition;
|
|
MTH3D_tdstVector *p_stParticleSpeed, *p_stLastParticleSpeed;
|
|
ACP_tdxBool bAlivedParticle;
|
|
MTH3D_tdstVector stAccelerationVariation;
|
|
PRT_tdstParticlesEnvironment *p_stPrtEnv;
|
|
PRT_tdstParticlesSystem *p_stPrtSys;
|
|
/*XB980505*/
|
|
/* GEO_tdstIndexedSprite *p_stGeoSprite, *p_stLastGeoSprite;*/
|
|
GEO_tdstIndexedSprite *p_stGeoSprite, *p_stLastGeoSprite=NULL;
|
|
/*End XB*/
|
|
PRT_tdstSpriteData *p_stSprData;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
p_stPrtEnv = _p_stPrtGen->p_stPrtEnv;
|
|
p_stPrtSys = _p_stPrtGen->p_stPrtSys;
|
|
|
|
p_stSpriteParticle = (PRT_tdstSpriteParticle *)(p_stPrtSys->d_stListOfParticles);
|
|
p_stLastSpriteParticle = p_stSpriteParticle + p_stPrtSys->xNbActiveParticles;
|
|
p_stParticlePosition = p_stPrtSys->hParticlesSystemObject->d_stListOfPoints;
|
|
p_stLastParticlePosition = p_stParticlePosition + p_stPrtSys->xNbActiveParticles;
|
|
p_stParticleSpeed = p_stPrtSys->d_stSpeed;
|
|
p_stLastParticleSpeed = p_stParticleSpeed + p_stPrtSys->xNbActiveParticles;
|
|
|
|
if (PRT_fn_cSystemIsMultipleSprites( p_stPrtSys) )
|
|
{
|
|
p_stGeoSprite = ((GEO_tdstElementSprite *) p_stPrtSys->hParticlesSystemObject->d_stListOfElements[0])->d_stListOfSprites;
|
|
p_stLastGeoSprite = p_stGeoSprite + p_stPrtSys->xNbActiveParticles;
|
|
}
|
|
else
|
|
p_stGeoSprite = NULL;
|
|
|
|
while ( p_stSpriteParticle != p_stLastSpriteParticle )
|
|
{
|
|
/* first test death date */
|
|
bAlivedParticle = MTH_M_bGreater ( p_stSpriteParticle->xDeathDate, _xTimeT );
|
|
if (bAlivedParticle)
|
|
{
|
|
/* appliquer la meca */
|
|
/* vecteur variation de l acceleration */
|
|
MTH3D_M_vSetVectorElements
|
|
(
|
|
&stAccelerationVariation,
|
|
RND_fn_xGetRealRandomValue ( 0, MTH_M_xNeg ( p_stPrtEnv->xAccelerationRange ), p_stPrtEnv->xAccelerationRange ),
|
|
RND_fn_xGetRealRandomValue ( 0, MTH_M_xNeg ( p_stPrtEnv->xAccelerationRange ), p_stPrtEnv->xAccelerationRange ),
|
|
RND_fn_xGetRealRandomValue ( 0, MTH_M_xNeg ( p_stPrtEnv->xAccelerationRange ), p_stPrtEnv->xAccelerationRange )
|
|
);
|
|
MTH3D_M_vAddVector ( &stAccelerationVariation, &(p_stPrtEnv->stAcceleration), &stAccelerationVariation );
|
|
|
|
/* Vit t = f( Vit t-1, Pos t-1, Accel t ) */
|
|
MTH3D_M_vMullAddVector ( p_stParticleSpeed, _xDeltaT, &stAccelerationVariation, p_stParticleSpeed );
|
|
/* Pos t = f( Vit t, Pos t-1, Accel t ) */
|
|
MTH3D_M_vMullAddVector ( p_stParticlePosition, _xDeltaT, p_stParticleSpeed, p_stParticlePosition );
|
|
|
|
bAlivedParticle =
|
|
( p_stPrtEnv->ulEnvType == PRT_C_ulAlignedBoxEnv ) ?
|
|
INT_fn_bGetInclusionPointInBox ( p_stParticlePosition, &(p_stPrtEnv->stMinPoint), &(p_stPrtEnv->stMaxPoint) ) :
|
|
INT_fn_bGetInclusionPointInSphere ( p_stParticlePosition,&(p_stPrtEnv->stSphereCenter),p_stPrtEnv->xRadius );
|
|
}
|
|
|
|
if ( bAlivedParticle )
|
|
{
|
|
/*
|
|
* treatment on alive particle that have not to be done to death particles
|
|
*/
|
|
/* rotation */
|
|
if (p_stSpriteParticle->a2_cRotateSpeed[0])
|
|
{
|
|
p_stSpriteParticle->a2_ucRotateAngle[0] += p_stSpriteParticle->a2_cRotateSpeed[0];
|
|
p_stGeoSprite->stSize.xX = p_stSpriteParticle->stSize.xX * a64_fSinTable[ p_stSpriteParticle->a2_ucRotateAngle[0] & 0x3F ] / 2;
|
|
}
|
|
|
|
if (p_stSpriteParticle->a2_cRotateSpeed[1])
|
|
{
|
|
p_stSpriteParticle->a2_ucRotateAngle[1] += p_stSpriteParticle->a2_cRotateSpeed[1];
|
|
p_stGeoSprite->stSize.xY = p_stSpriteParticle->stSize.xY * a64_fSinTable[ p_stSpriteParticle->a2_ucRotateAngle[1] & 0x3F ] / 2;
|
|
}
|
|
/* change sprite */
|
|
if ( p_stGeoSprite && MTH_M_bGreater( _xTimeT, p_stSpriteParticle->xChangeSpriteDate ) )
|
|
{
|
|
p_stSprData = ((PRT_tdstSpriteCommonData *) p_stPrtSys->p_stCommonData)->d_stSpriteData + p_stSpriteParticle->cNextSpriteIndex;
|
|
p_stGeoSprite->hSprite = p_stSprData->hSprite;
|
|
if ( p_stSprData->xTime < 0 )
|
|
p_stSpriteParticle->xChangeSpriteDate = MTH_C_InfinitPlus;
|
|
else
|
|
{
|
|
p_stSpriteParticle->xChangeSpriteDate = _xTimeT + p_stSprData->xTime;
|
|
p_stSpriteParticle->cNextSpriteIndex = p_stSprData->cNextSprite;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* goto next particle
|
|
*/
|
|
p_stSpriteParticle ++;
|
|
p_stParticlePosition ++;
|
|
p_stParticleSpeed ++;
|
|
if (p_stGeoSprite)
|
|
p_stGeoSprite++;
|
|
}
|
|
else
|
|
{
|
|
p_stPrtSys->xNbActiveParticles --;
|
|
p_stLastSpriteParticle --;
|
|
|
|
/*
|
|
* If there's a linked generator add this particle to linked generator
|
|
*/
|
|
if (_p_stPrtGen->p_stLinkedPrtGen)
|
|
{
|
|
if (_p_stPrtGen->ulLinkedPrtGenMask & 1 )
|
|
MTH3D_M_vNullVector( p_stParticleSpeed );
|
|
PRT_fn_vAddSpriteParticle( _p_stPrtGen->p_stLinkedPrtGen, p_stParticlePosition, p_stParticleSpeed, _xTimeT );
|
|
}
|
|
|
|
if ( p_stSpriteParticle != p_stLastSpriteParticle )
|
|
{
|
|
*p_stSpriteParticle = *p_stLastSpriteParticle;
|
|
p_stLastParticlePosition --;
|
|
*p_stParticlePosition = *p_stLastParticlePosition;
|
|
p_stLastParticleSpeed --;
|
|
*p_stParticleSpeed = *p_stLastParticleSpeed;
|
|
if (p_stGeoSprite)
|
|
p_stGeoSprite->hSprite = (--p_stLastGeoSprite)->hSprite;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description :
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 12 jun 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
void PRT_fn_vSourceGenerateSpriteParticle
|
|
(
|
|
PRT_tdstParticlesSystem *_p_stParticlesSystem,
|
|
PRT_tdstParticlesSource *_p_stParticlesSource,
|
|
POS_tdstCompletePosition *_p_stSourceMatrix,
|
|
MTH_tdxReal _xTimeT
|
|
)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
PRT_tdstSpriteParticle *p_stSpriteParticle;
|
|
MTH3D_tdstVector *p_stParticlePosition;
|
|
MTH3D_tdstVector *p_stParticleSpeed;
|
|
ACP_tdxIndex xNbParticlesToInject;
|
|
ACP_tdxIndex xIndex;
|
|
ACP_tdxIndex xSpriteIndex;
|
|
PRT_tdstSpriteCommonData *p_stSpriteCommonData;
|
|
PRT_tdstSpriteData *p_stSprData;
|
|
char cProba;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/* generation de particules ? */
|
|
if ( PRT_fn_bComputeParticlesGeneration ( _p_stParticlesSource ) )
|
|
{
|
|
xNbParticlesToInject = (ACP_tdxIndex) MTH_M_xRealToLong ( MTH_M_xMul ( MTH_M_xLongToReal ( PRT_fn_xComputeNbParticlesToInject ( _p_stParticlesSource ) ), PRT_g_xNbParticlesFactor ) );
|
|
|
|
if ( xNbParticlesToInject > 0 )
|
|
{
|
|
if ( _p_stParticlesSystem->xNbActiveParticles + xNbParticlesToInject > _p_stParticlesSystem->xNbParticles )
|
|
{
|
|
xNbParticlesToInject = _p_stParticlesSystem->xNbParticles - _p_stParticlesSystem->xNbActiveParticles;
|
|
}
|
|
|
|
p_stSpriteCommonData = (PRT_tdstSpriteCommonData *)(_p_stParticlesSystem->p_stCommonData);
|
|
p_stSpriteParticle = (PRT_tdstSpriteParticle *)(_p_stParticlesSystem->d_stListOfParticles) + _p_stParticlesSystem->xNbActiveParticles;
|
|
p_stParticlePosition = _p_stParticlesSystem->hParticlesSystemObject->d_stListOfPoints + _p_stParticlesSystem->xNbActiveParticles;
|
|
p_stParticleSpeed = _p_stParticlesSystem->d_stSpeed + _p_stParticlesSystem->xNbActiveParticles;
|
|
xSpriteIndex = _p_stParticlesSystem->xNbActiveParticles;
|
|
_p_stParticlesSystem->xNbActiveParticles += xNbParticlesToInject;
|
|
|
|
for ( xIndex = 0 ; xIndex < xNbParticlesToInject ; xIndex ++ )
|
|
{
|
|
/* reset meca */
|
|
PRT_fn_vGenerateSpriteParticle
|
|
(
|
|
p_stParticlePosition,
|
|
p_stParticleSpeed,
|
|
p_stSpriteParticle,
|
|
p_stSpriteCommonData,
|
|
_p_stParticlesSource,
|
|
_p_stSourceMatrix,
|
|
_xTimeT
|
|
);
|
|
|
|
/* special for multi sprite particles : to be deplaced in generation part code */
|
|
if ( (p_stSprData = p_stSpriteCommonData->d_stSpriteData) != NULL )
|
|
{
|
|
cProba = (char) RND_fn_ulGetUnsignedLongRandomValue( 0, 0, 100 );
|
|
while (p_stSprData->cProba <= cProba )
|
|
p_stSprData++;
|
|
|
|
GEO_vSetHandleOfIndexedSprite( _p_stParticlesSystem->hParticlesSystemObject, 0, xSpriteIndex, p_stSprData->hSprite );
|
|
|
|
if (p_stSprData->xTime < 0)
|
|
p_stSpriteParticle->xChangeSpriteDate = MTH_C_InfinitPlus;
|
|
else
|
|
{
|
|
p_stSpriteParticle->xChangeSpriteDate = _xTimeT + p_stSprData->xTime;
|
|
p_stSpriteParticle->cNextSpriteIndex = p_stSprData->cNextSprite;
|
|
}
|
|
|
|
xSpriteIndex++;
|
|
}
|
|
/* end multi sprite special code */
|
|
|
|
p_stSpriteParticle ++;
|
|
p_stParticlePosition ++;
|
|
p_stParticleSpeed ++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Description :
|
|
--------------------------------------------------------------------------------
|
|
-- Creation date : 12 jun 1997 Author : FPI
|
|
--------------------------------------------------------------------------------
|
|
*/
|
|
|
|
void PRT_fn_vPreDrawSpriteParticlesSystem ( PRT_tdstParticlesSystem *_p_stParticlesSystem )
|
|
{
|
|
_p_stParticlesSystem->hParticlesSystemObject->xNbPoints = _p_stParticlesSystem->xNbActiveParticles;
|
|
((GEO_tdstElementSprite *)(_p_stParticlesSystem->hParticlesSystemObject->d_stListOfElements[0]))->xNbSprites = _p_stParticlesSystem->xNbActiveParticles;
|
|
}
|
|
|
|
|
|
/*ANNECY VL PRT 30/03/98{*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : create multiple sprites particles system
|
|
_p_stPrtSys -> system
|
|
_xNbSprites -> number of different sprites
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
|
void PRT_fn_vCreateMultipleSpritesParticles( PRT_tdstParticlesSystem *_p_stPrtSys, ACP_tdxIndex _xNbSprites )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
PRT_tdstSpriteCommonData *p_stSprCommonData;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
_p_stPrtSys->xParticlesType = PRT_C_xSpriteParticles;
|
|
|
|
/* Table de vitesse de particules */
|
|
GEO_M_CPAMalloc ( _p_stPrtSys->d_stSpeed, MTH3D_tdstVector *, sizeof ( MTH3D_tdstVector ) * _p_stPrtSys->xNbParticles, E_uwGEONotEnoughtMemory );
|
|
/* list of sprite particles */
|
|
GEO_M_CPAMalloc ( _p_stPrtSys->d_stListOfParticles, void *, sizeof ( PRT_tdstSpriteParticle ) * _p_stPrtSys->xNbParticles, E_uwGEONotEnoughtMemory );
|
|
/* common data for sprite system */
|
|
GEO_M_CPAMalloc ( _p_stPrtSys->p_stCommonData, void *, sizeof ( PRT_tdstSpriteCommonData ), E_uwGEONotEnoughtMemory );
|
|
p_stSprCommonData = (PRT_tdstSpriteCommonData *)(_p_stPrtSys->p_stCommonData);
|
|
/* common data for sprite system */
|
|
GEO_M_CPAMalloc ( p_stSprCommonData->d_stSpriteData, PRT_tdstSpriteData *, _xNbSprites * sizeof( PRT_tdstSpriteData ), E_uwGEONotEnoughtMemory );
|
|
p_stSprCommonData->xNumberOfSprites = 0;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : end creation of multiple sprite particles system (create geom object)
|
|
_p_stPrtSys -> system
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void PRT_fn_vEndCreateMultipleSpritesParticles( PRT_tdstParticlesSystem *_p_stPrtSys )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
ACP_tdxHandleOfElement hElementSprite;
|
|
ACP_tdxIndex xSpriteIndex;
|
|
MTH2D_tdstVector stDefaultSize = { MTH_C_ONE, MTH_C_ONE };
|
|
PRT_tdstSpriteCommonData *p_stSprCommonData;
|
|
PRT_tdstSpriteParticle *p_stSprParticle;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
if (_p_stPrtSys->xParticlesType != PRT_C_xSpriteParticles )
|
|
return;
|
|
|
|
|
|
GEO_vCreateGeometricObject ( &(_p_stPrtSys->hParticlesSystemObject), _p_stPrtSys->xNbParticles, 1 );
|
|
GEO_vCreateElementSprite ( _p_stPrtSys->hParticlesSystemObject, &hElementSprite, _p_stPrtSys->xNbParticles );
|
|
((GEO_tdstElementSprite *) _p_stPrtSys->hParticlesSystemObject->d_stListOfElements[0])->cFastDraw = 1;
|
|
|
|
p_stSprCommonData = (PRT_tdstSpriteCommonData *) _p_stPrtSys->p_stCommonData;
|
|
p_stSprParticle = _p_stPrtSys->d_stListOfParticles;
|
|
|
|
for ( xSpriteIndex = 0 ; xSpriteIndex < _p_stPrtSys->xNbParticles ; xSpriteIndex ++, p_stSprParticle++ )
|
|
{
|
|
GEO_vSetSizeOfIndexedSprite ( _p_stPrtSys->hParticlesSystemObject, hElementSprite, xSpriteIndex, &stDefaultSize );
|
|
GEO_vSetCenterPointOfIndexedSprite ( _p_stPrtSys->hParticlesSystemObject, hElementSprite, xSpriteIndex, xSpriteIndex );
|
|
GEO_vSetHandleOfIndexedSprite ( _p_stPrtSys->hParticlesSystemObject, hElementSprite, xSpriteIndex, p_stSprCommonData->d_stSpriteData[ xSpriteIndex % p_stSprCommonData->xNumberOfSprites ].hSprite );
|
|
p_stSprParticle->stSize = stDefaultSize;
|
|
}
|
|
GEO_vEndCreateObject ( _p_stPrtSys->hParticlesSystemObject );
|
|
}
|
|
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
|
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Test if system is a multiple sprite particle system
|
|
_p_stPrtSys -> system
|
|
Returns (char ) : 0 if false, otherwise 0
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
char PRT_fn_cSystemIsMultipleSprites( PRT_tdstParticlesSystem *_p_stPrtSys )
|
|
{
|
|
if (_p_stPrtSys->xParticlesType != PRT_C_xSpriteParticles )
|
|
return 0;
|
|
return ( ((PRT_tdstSpriteCommonData *) _p_stPrtSys->p_stCommonData)->d_stSpriteData != NULL );
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : add a sprite in a multiple sprite particle system
|
|
_p_stPrtSys -> system
|
|
_hSprite -> sprite
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
|
void PRT_fn_vAddSprite( PRT_tdstParticlesSystem *_p_stPrtSys, ACP_tdxHandleOfSprite _hSprite )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
PRT_tdstSpriteCommonData *p_stSpriteCommonData;
|
|
PRT_tdstSpriteData *p_stSprData;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
if (_p_stPrtSys->xParticlesType != PRT_C_xSpriteParticles )
|
|
return;
|
|
|
|
p_stSpriteCommonData = (PRT_tdstSpriteCommonData *) _p_stPrtSys->p_stCommonData;
|
|
p_stSprData = p_stSpriteCommonData->d_stSpriteData + p_stSpriteCommonData->xNumberOfSprites++;
|
|
p_stSprData->hSprite = _hSprite;
|
|
|
|
if (p_stSpriteCommonData->xNumberOfSprites == 1)
|
|
{
|
|
p_stSprData->cProba = 100;
|
|
p_stSprData->xTime = 2;
|
|
p_stSprData->cNextSprite = 1;
|
|
}
|
|
else if (p_stSpriteCommonData->xNumberOfSprites == 5)
|
|
{
|
|
p_stSprData->cProba = 0;
|
|
p_stSprData->xTime = 0.1f;
|
|
p_stSprData->cNextSprite = 0;
|
|
}
|
|
else
|
|
{
|
|
p_stSprData->cProba = 0;
|
|
p_stSprData->xTime = 0.1f;
|
|
p_stSprData->cNextSprite = (char)(p_stSpriteCommonData->xNumberOfSprites);
|
|
}
|
|
|
|
}
|
|
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
|
|
|
|
|
|
|
#endif /* D_THROW_PRT */
|