4771 lines
121 KiB
C
4771 lines
121 KiB
C
/***************************************************
|
|
*
|
|
* AGO : Animations Graphiques Optimisées pour Ray2
|
|
***************************************************
|
|
*
|
|
* A ultra-simple multi-purpose particle system
|
|
* for animation optimizations
|
|
* (to reduce PlayAnim & IA use)
|
|
*
|
|
***************************************************
|
|
*
|
|
* Version 2.0 : Francois 'FX' Queinnec
|
|
*
|
|
***************************************************/
|
|
|
|
#include <stdlib.h> /* Needed for rand() function and constants */
|
|
|
|
#ifdef U64
|
|
#include <ultra.h>
|
|
#include <gbi.h>
|
|
#endif /* U64*/
|
|
|
|
#include "GLD.h"
|
|
#include "GMT.h"
|
|
|
|
#include "AGO.h"
|
|
|
|
|
|
#ifndef U64
|
|
|
|
#define INFODESIGN_RESEARCH
|
|
|
|
#endif
|
|
|
|
/*****************************************
|
|
* MAXIMUM NUMBER OF AGOS AT A TIME *
|
|
*****************************************
|
|
*
|
|
* PC can handle more than that, but
|
|
* we should keep this value for the
|
|
* editor... To let designers really
|
|
* see what's gonna happen.
|
|
*
|
|
***************************************/
|
|
#define AGO_MAX_NUMBER_OF_AGOS 150
|
|
|
|
|
|
/***************************************/
|
|
/* INTERNAL IDENTIFICATION CONSTANTS ***/
|
|
/***************************************/
|
|
|
|
/* Part behavior*/
|
|
#define AGO_TYPEMASK 0x000000FF
|
|
#define AGO_STILL 0x00000000
|
|
#define AGO_FALLING 0x00000001
|
|
#define AGO_SINUSING 0x00000002
|
|
#define AGO_MOVING 0x00000003
|
|
#define AGO_GEISER 0x00000004
|
|
#define AGO_FALLING_SLOW 0x00000005
|
|
#define AGO_ROTATING_SLOW 0x00000006
|
|
#define AGO_MOVINGSINXY 0x00000007
|
|
#define AGO_SPIRALE 0x00000008
|
|
#define AGO_MOVING_AND_SLOWING 0x00000009
|
|
#define AGO_GOINGTO 0x0000000A
|
|
#define AGO_MOVINGSINXYUP 0x0000000B
|
|
#define AGO_2DSPIRALE 0x0000000C
|
|
#define AGO_FASEGOINGTO 0x0000000E
|
|
#define AGO_FIREWORKS 0x0000000F
|
|
#define AGO_FALLING_MEGAFAST 0x00000010
|
|
#define AGO_FRAME 0x00000011
|
|
#define AGO_GOTO 0x00000012
|
|
|
|
#define AGO_GOTO_STEP 9.0f
|
|
|
|
/* Scaling Behavior*/
|
|
#define AGO_SCALEMASK 0x00000F00
|
|
#define AGO_SCALING_SLOW 0x00000100
|
|
#define AGO_SCALING_MID 0x00000200
|
|
#define AGO_SCALING_FAST 0x00000300
|
|
#define AGO_SCALING_FASTEST 0x00000400
|
|
#define AGO_UNSCALING_FAST 0x00000500
|
|
#define AGO_UNSCALING_SLOW 0x00000600
|
|
#define AGO_UNSCALING_FASTEST 0x00000700
|
|
#define AGO_SCALING_MEGASLOW 0x00000800
|
|
#define AGO_SCALING_MEGAFASTY 0x00000900
|
|
#define AGO_SCALING_XTOY 0x00000A00
|
|
#define AGO_SCALING_YTOX 0x00000B00
|
|
#define AGO_SCALING_YTOX2 0x00000D00
|
|
#define AGO_BIG_RANDOM_SCALE 0x00000E00
|
|
#define AGO_SMALL_RANDOM_SCALE 0x00000F00
|
|
|
|
|
|
/* Shading Behavior*/
|
|
#define AGO_SHADEMASK 0x0000F000
|
|
#define AGO_SHADE_SLOW 0x00001000
|
|
#define AGO_SHADE_MID 0x00002000
|
|
#define AGO_SHADE_FAST 0x00003000
|
|
#define AGO_SHADE_FASTEST 0x00004000
|
|
#define AGO_SHADE_MEGAFAST 0x00005000
|
|
#define AGO_SHADE_TWOFRAMES 0x00006000
|
|
#define AGO_APPEAR 0x00007000
|
|
#define AGO_WAIT 0x00008000
|
|
#define AGO_RANDOM_SHADE 0x00009000
|
|
#define AGO_UNSHADE 0x0000A000
|
|
|
|
/* Part death & misc flags:*/
|
|
#define AGO_TIMELIMITED 0x00010000
|
|
#define AGO_ENDASPLOUF 0x00020000
|
|
#define AGO_ZLIMITED 0x00040000
|
|
#define AGO_ZELDA 0x00080000
|
|
#define AGO_MUSTDIE 0x01000000
|
|
#define AGO_FOLLOWZ 0x02000000
|
|
#define AGO_LOOPANIM 0x04000000
|
|
#define AGO_BASEDSCALE 0x08000000
|
|
|
|
|
|
#define AGO_GEOMETRY_TYPE_MASK 0xF0000000
|
|
#define AGO_XYPLAN 0x10000000
|
|
#define AGO_ORTHOPLAN 0x20000000
|
|
#define AGO_ORIENTEDXYPLAN 0x30000000
|
|
#define AGO_REMANANCE 0x40000000
|
|
#define AGO_REMANANCE2 0x50000000
|
|
#define AGO_REMANANCE3 0x60000000
|
|
|
|
|
|
|
|
/*********************/
|
|
/* Gravity constant*/
|
|
/*********************/
|
|
#define AGO_G 9.81f
|
|
#define AGO_G_SLOW 3.50f
|
|
/*********************/
|
|
|
|
|
|
/***********************************************/
|
|
/* Predefined types*/
|
|
/***********************************************/
|
|
|
|
#define AGO_RAYMAN_PLOUF (AGO_STILL | AGO_XYPLAN | AGO_SCALING_FAST /*EST*/ | AGO_SHADE_FAST)
|
|
#define AGO_RAYMAN_SMALL_PLOUF (AGO_STILL | AGO_XYPLAN | AGO_SCALING_SLOW | AGO_SHADE_FAST)
|
|
|
|
#define AGO_RAYMAN_PLOUF_SKI (AGO_STILL | AGO_ORIENTEDXYPLAN | AGO_SCALING_SLOW | AGO_SHADE_MEGAFAST)
|
|
#define AGO_NAISSANCE_OBUS (AGO_MOVING | AGO_SCALING_SLOW | AGO_SHADE_SLOW)
|
|
#define AGO_APPARITION_FUMEE (AGO_MOVING | AGO_SCALING_FAST | AGO_SHADE_FAST)
|
|
/************************************************/
|
|
|
|
|
|
|
|
|
|
/*************************************/
|
|
/* MAIN AGO STRUCTURE*/
|
|
/*************************************/
|
|
typedef struct AGO_Part_
|
|
{
|
|
unsigned long ulType; /* Type of the animation*/
|
|
unsigned long AnimTime; /* Texture Animation timebase*/
|
|
float fCreationTime; /* 'Creation time'*/
|
|
float a3_fInitialPosition[3]; /* Initial Position of the part*/
|
|
float a3_fPosition[3]; /* Position of the part*/
|
|
float a3_fDirection[3]; /* Direction Vector*/
|
|
float fScale[2]; /* Sizes (X and Y)*/
|
|
float fAnimTimeScale; /* Texture animation time multiplier*/
|
|
union
|
|
{ float f_ZLimit; /* Z limitation from the initial position*/
|
|
float fTimeLimit; /* Time limitation*/
|
|
} LimitParam;
|
|
void *VisualMaterial; /* Visual material for the sprite*/
|
|
float Transparency; /* Alpha value for this part*/
|
|
} AGO_Part;
|
|
/**************************************/
|
|
|
|
|
|
/* */
|
|
/* ATTENTION ! SUR PC, CETTE CONSTANTE NE DOIT JAMAIS ETRE DEFINIE !!!*/
|
|
/* Elle me sert uniquement pour forcer des valeurs en dur lors de mes tests*/
|
|
/**/
|
|
#ifdef U64
|
|
/* #define AGO_TEMP_SETTINGS */
|
|
#endif /* U64*/
|
|
|
|
#ifdef U64
|
|
extern char g_bWeirdWaterEffect;
|
|
extern char g_bWeirdFireEffect;
|
|
#endif
|
|
|
|
|
|
/***************************************/
|
|
/* MAIN GLOBAL DATA*/
|
|
/***************************************/
|
|
unsigned long g_ulNumberOfAgos=0; /* Number of AGOs currently used */
|
|
|
|
AGO_Part g_AGO[AGO_MAX_NUMBER_OF_AGOS+1]; /* THE AGO array !! */
|
|
int g_AGO_MustReinitStaticVars=1; /* This is important to allow re-init */
|
|
/* of static vars... */
|
|
|
|
int AGO_g_OddFrame=0; /* Variable for displaying only on odd or even frames*/
|
|
|
|
float g_AGO_AnimTimeScale; /* Global time multiplier for texture animation*/
|
|
/* GLI uses it to desynchronize multiple AGOs that*/
|
|
/* were launched at the same time*/
|
|
|
|
float AGO_gExtraParameter1[3];
|
|
float AGO_gExtraParameter2[3];
|
|
/* XB 10/06/99 */
|
|
#ifdef INFODESIGN_RESEARCH
|
|
float AGO_gExtraFloatParameter;
|
|
#endif /* INFODESIGN_RESEARCH */
|
|
/* End XB 10/06/99 */
|
|
void *g_AGO_PloufMaterial=NULL;
|
|
void *AGO_gExtraMaterial=NULL;
|
|
|
|
unsigned char g_bUsingMapMondeAGOs=0;
|
|
|
|
|
|
#ifndef _FIRE_DEADCODE_U64_
|
|
static float g_OldPloufDirection[3]={0.0f, 0.0f, 0.0f}; /* Used to remember the last direction*/
|
|
/* of Rayman Ski*/
|
|
#endif
|
|
|
|
/* This is for nuclear explosions*/
|
|
char g_bForceWhiteFog=0;
|
|
char g_DoSmallPlouf=0;
|
|
|
|
|
|
/*****************************************/
|
|
/* (Real) Time values*/
|
|
/*****************************************/
|
|
float g_ffFrameTime=0.0f; /* The current frame timestamp*/
|
|
float g_ffLastFrameTime=0.0f; /* The last frame timestamp*/
|
|
float g_fTimeDifference=0.0f; /* time elapsed between this frame */
|
|
/* and the former one */
|
|
|
|
|
|
/****************************************/
|
|
/* VARIOUS SPECIFIC vars*/
|
|
/****************************************/
|
|
#ifdef U64
|
|
void *AGO_g_LastMaterialUsed=NULL; /* Used for "SendMaterialToViewport"*/
|
|
unsigned char AGO_SkipMaterial=0; /* optimizations...*/
|
|
char g_bLoopAnim=0; /* Boolean to tell GLI functions to loop the texture animations*/
|
|
extern unsigned long g_ulVBLTime; /* Timebase for texture animation*/
|
|
void GLI_vPrepareViewPort(void); /* Function to prepare the viewport for Sprite Display*/
|
|
/* Sprite optimization globals*/
|
|
extern char g_GLI_DontReinitSprites;
|
|
extern char g_GLI_DontInitSprites;
|
|
extern char g_GLI_SpritesUsed;
|
|
extern int g_iCurrentPlanarSprite;
|
|
extern char g_ulUseAntiAliasing;
|
|
#else /**********************************/
|
|
|
|
extern MTH_tdxReal gs_fCoefOfMultiplicationForAnimatedTexture; /* Timebase for texture animation*/
|
|
|
|
#endif /* U64 */
|
|
|
|
|
|
|
|
/****************************************/
|
|
|
|
/****************************************/
|
|
/* ZELDA EFFECT vars*/
|
|
/****************************************/
|
|
#define MAX_NUMBER_OF_ZELDA_AGOS 35
|
|
int g_NumberOfZeldaAgos=0;
|
|
/****************************************/
|
|
|
|
|
|
/*****************************************/
|
|
/* FLOAT_RANGED_RANDOM macro :*/
|
|
/**/
|
|
/* returns a float value between x and y*/
|
|
/*****************************************/
|
|
#ifdef U64
|
|
/* As a function, we save 1.5KB of memory !!!*/
|
|
/* Of course, it's a bit slower.. but not THAT slower anyway*/
|
|
float FLOAT_RANGED_RANDOM(float x, float y)
|
|
{
|
|
return (((((float)rand()) * ((y) - (x))) /((float)RAND_MAX) ) + (x) );
|
|
}
|
|
|
|
void GLI_vExtendedFarClipping(int b);
|
|
#else
|
|
#define FLOAT_RANGED_RANDOM(x,y) (((((float)rand()) * ((y) - (x))) /((float)RAND_MAX) ) + (x) )
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************/
|
|
/* Time limiter for AGOs ! ***/
|
|
/***********************************/
|
|
/**/
|
|
/* Used to limit the time between 2 AGOs of the same type.*/
|
|
/**/
|
|
/***********************************/
|
|
|
|
float g_fNextPlouf=0.0f;
|
|
|
|
#define LIMIT_AGO_TO_EVERY(timelimit) \
|
|
{ \
|
|
static float NextBubble=0.0f; \
|
|
g_ffFrameTime=AGO_fGetTimeInSeconds(); \
|
|
if ((g_AGO_MustReinitStaticVars) || (NextBubble==0.0f)) NextBubble=g_ffFrameTime; \
|
|
if (NextBubble>g_ffFrameTime) return; \
|
|
NextBubble=g_ffFrameTime+timelimit; \
|
|
}
|
|
|
|
|
|
/********************************************/
|
|
/* Copies a float[3] or a MTH3D_tdstVector*/
|
|
/* into a float[3] or a MTH3D_tdstVector*/
|
|
/********************************************/
|
|
|
|
|
|
#ifndef U64
|
|
|
|
#define Copy_a3f_Array(dest,src) \
|
|
{ \
|
|
register float *p1=(float *)(dest); \
|
|
register float *p2=(float *)(src); \
|
|
*(p1++)=*(p2++); \
|
|
*(p1++)=*(p2++); \
|
|
*(p1)=*(p2); \
|
|
}
|
|
|
|
#else /* U64 */
|
|
|
|
|
|
|
|
void Internal_Copy_a3f_Array(float *dest,float *src)
|
|
{
|
|
register float *p1=(float *)(dest);
|
|
register float *p2=(float *)(src);
|
|
*(p1++)=*(p2++);
|
|
*(p1++)=*(p2++);
|
|
*(p1)=*(p2);
|
|
}
|
|
|
|
#define Copy_a3f_Array(dest,src) Internal_Copy_a3f_Array(((float *)(dest)),((float *)(src)))
|
|
|
|
#endif
|
|
|
|
|
|
/*****************************************/
|
|
/* Various functions prototypes*/
|
|
/*****************************************/
|
|
void AGO_vInit(void);
|
|
AGO_Part *AGO_vCreatePart(unsigned long parm_ulType, float *parm_a3_fPosition, float *parm_a3_fDirection, float TimeLimit, float fScaleX, float fScaleY, void *pVisualMaterial);
|
|
void AGO_vDestroyPart(unsigned long ulPartNumber);
|
|
void AGO_vProcessPart(unsigned long ulPartNumber,GLD_tdstViewportAttributes *_p_stViewport);
|
|
void AGO_vProcessAllParts(GLD_tdstViewportAttributes *_p_stViewport);
|
|
void AGO_vTestNewParts(void);
|
|
void AGO_vAddParticle(unsigned long PartType,
|
|
MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter);
|
|
void AGO_Define_OrthogonalVectors(MTH3D_tdstVector *p_stDirection,MTH3D_tdstVector *p_stV1,MTH3D_tdstVector *p_stV2);
|
|
void AGO_vDisplayPart(unsigned long ulPartNumber, GLD_tdstViewportAttributes *_p_stViewport);
|
|
void InitGauges(void);
|
|
void InitIcones(void);
|
|
|
|
|
|
#ifdef INFODESIGN_RESEARCH
|
|
|
|
void AGO_vTrianglesInit(void);
|
|
|
|
void AGO_vDisplayTriangles(GLD_tdstViewportAttributes *p_stVpt);
|
|
|
|
void AGO_vCreateTriangle(float c1[3], float c2[3], float c3[3], void *VisualMat,
|
|
float U1, float V1,
|
|
float U2, float V2,
|
|
float U3, float V3,
|
|
float DelayTime,
|
|
unsigned long Parameter);
|
|
|
|
void GLI_vDisplayWorldTriangle(
|
|
GLD_tdstViewportAttributes *p_stVpt,
|
|
float coordinates[3][3],
|
|
float uvs[3][2],
|
|
void *VisualMaterial);
|
|
|
|
|
|
|
|
#endif /* INFODESIGN_RESEARCH */
|
|
|
|
|
|
|
|
void JFFTXT_vInit(void);
|
|
void JFFTXT_vAffiche(GLD_tdstViewportAttributes *p_stVpt);
|
|
|
|
|
|
/********************************************/
|
|
/************** CUSTOM LOGOS ****************/
|
|
/********************************************/
|
|
void *LogoMaterials[6*3];
|
|
float g_LogoTransparency=0;
|
|
float g_LogoPosition[4];
|
|
void AGO_vAddLogoPart(float parameter, void *hVisualMaterial);
|
|
void AGO_vActivateLogoDisplay(float *p_stPosition, float *p_stDirection, float parameter);
|
|
void AGO_vDisplayLogo(GLD_tdstViewportAttributes *p_stVpt);
|
|
/*********************************************/
|
|
|
|
|
|
extern ACP_tdxBool g_bInGameMenu;
|
|
|
|
/******************************************************/
|
|
/* SINUS and COSINUS FUNCTIONS*/
|
|
/******************************************************/
|
|
#ifdef U64
|
|
|
|
/* Defining an external look-up table for the N64 version*/
|
|
#define COSTABLESIZE 128
|
|
#define COSTABLEMASK (COSTABLESIZE-1)
|
|
#define COS_PI 3.1415927f
|
|
#define COS_2PI (2.0f*COS_PI)
|
|
#define COS_FLOAT2_TABLEINDEX ((float)COSTABLESIZE/(float)COS_2PI)
|
|
extern float g_pfCosTable[COSTABLESIZE];
|
|
#define COSINUS(f) (g_pfCosTable[((long)((f)*COS_FLOAT2_TABLEINDEX)) & COSTABLEMASK])
|
|
#define SINUS(f) (g_pfCosTable[((long)((f)*COS_FLOAT2_TABLEINDEX)+32) & COSTABLEMASK])
|
|
|
|
|
|
extern char FON_fn_cRefreshCache(unsigned char *_szString);
|
|
|
|
|
|
#else /*************************************************/
|
|
|
|
/* PC version uses MTH macros instead (hopin' they're optimized !)*/
|
|
#define SINUS(f) MTH_M_xSin(f)
|
|
#define COSINUS(f) MTH_M_xCos(f)
|
|
|
|
#endif /* U64*/
|
|
/******************************************************/
|
|
|
|
|
|
/*****************************************************************/
|
|
/* Initialization function... Once per map change or re-init*/
|
|
/***************************************************************/
|
|
|
|
|
|
void AGO_vInit(void)
|
|
{
|
|
g_ulNumberOfAgos=0;
|
|
g_bUsingMapMondeAGOs=0;
|
|
g_ffLastFrameTime=0.0f;
|
|
g_NumberOfZeldaAgos=0;
|
|
g_AGO_MustReinitStaticVars=1;
|
|
g_AGO_PloufMaterial=NULL;
|
|
g_fNextPlouf=0.0f;
|
|
g_DoSmallPlouf=0;
|
|
g_LogoTransparency=0;
|
|
#ifdef U64
|
|
g_bWeirdFireEffect=0;
|
|
#endif
|
|
InitGauges();
|
|
InitIcones();
|
|
JFFTXT_vInit();
|
|
|
|
#ifdef INFODESIGN_RESEARCH
|
|
|
|
AGO_vTrianglesInit();
|
|
|
|
#endif /* INFODESIGN_RESEARCH */
|
|
}
|
|
|
|
/***********************************************************/
|
|
/**/
|
|
/* returns time in seconds*/
|
|
/**/
|
|
/***********************************************************/
|
|
|
|
#include "lst.h"
|
|
#include "fil.h"
|
|
#include "pcs.h"
|
|
#include "geo.h"
|
|
#include "mec.h"
|
|
#include "sct.h"
|
|
#include "prt.h"
|
|
#include "gam.h"
|
|
#include "gli.h"
|
|
#include "gli\object.h"
|
|
|
|
#ifdef U64
|
|
|
|
void fn_vFadeIn(void);
|
|
void fn_vBlackScreenForNFrames(int);
|
|
void GLI_vSaveCenteringParameters(void);
|
|
|
|
float AGO_fGetTimeInSeconds(void)
|
|
{
|
|
return ((float)OS_CYCLES_TO_USEC(osGetTime()))/1000000.0f;
|
|
}
|
|
|
|
#else /****************************************************/
|
|
|
|
float AGO_fGetTimeInSeconds(void)
|
|
{
|
|
return ((float)g_stEngineStructure.stEngineTimer.ulCurrentTimerCount)*0.001f;
|
|
}
|
|
|
|
#endif /* U64*/
|
|
|
|
|
|
|
|
/******************************************************/
|
|
/* EXTERNAL AGO DRAWING FUNCTIONS*/
|
|
/******************************************************/
|
|
/* Draws a sprite using a world-coordinated-position, and 2 scales*/
|
|
int GLI_vDrawWorldSprite(float *a3_fPosition,
|
|
void *pVisualMaterial,
|
|
float fscaleX,
|
|
float fscaleY,
|
|
GLD_tdstViewportAttributes *_p_stViewport,
|
|
unsigned long AnimTime);
|
|
/*****************************/
|
|
/* Draws a planar sprite (XY-planar rectangle)*/
|
|
int GLI_vDrawWorldPlanarSprite(float *a3_fPosition,
|
|
void *pVisualMaterial,
|
|
float fscaleX,
|
|
float fscaleY,
|
|
GLD_tdstViewportAttributes *_p_stViewport,
|
|
unsigned long AnimTime);
|
|
/*****************************/
|
|
/* Draws an oriented rectangle according to the given 2 vectors*/
|
|
int GLI_vDrawWorldOrthoPlanarSprite(float *a3_fPosition,
|
|
void *pVisualMaterial,
|
|
float fscaleX,
|
|
float fscaleY,
|
|
GLD_tdstViewportAttributes *_p_stViewport,
|
|
unsigned long AnimTime,
|
|
MTH3D_tdstVector *p_stV1,
|
|
MTH3D_tdstVector *p_stV2,
|
|
int FollowZ); /* This parameter is ignored right now...*/
|
|
|
|
|
|
/***************************************/
|
|
/* Draws a black transparent rectangle */
|
|
/***************************************/
|
|
|
|
void GLI_vDisplayFrame(float *a3_fPosition, /* X,Y in percent of screen size (Z is ignored) of UpperLeft */
|
|
float *a3_fDirection, /* X,Y in percent of screen size (Z is ignored) of LowerRight*/
|
|
float Transparency, /* Opacity of the black frame */
|
|
GLD_tdstViewportAttributes *_p_stViewport
|
|
);
|
|
|
|
|
|
void GLI_vSetGlobalAlpha(float f);
|
|
float GLI_vGetGlobalAlpha(void);
|
|
|
|
|
|
|
|
long AGO_ulGetElderOne(void)
|
|
{
|
|
register unsigned long i;
|
|
register unsigned long ulOldestIndex;
|
|
register float fOldestTime;
|
|
|
|
ulOldestIndex=0;
|
|
fOldestTime=g_AGO[0].fCreationTime;
|
|
|
|
i=0;
|
|
while ((g_AGO[i].ulType != AGO_STILL | AGO_REMANANCE3) && (i<AGO_MAX_NUMBER_OF_AGOS)) i++;
|
|
if (i>=AGO_MAX_NUMBER_OF_AGOS-1) return -1;
|
|
|
|
ulOldestIndex=i;
|
|
fOldestTime=g_AGO[i].fCreationTime;
|
|
i++;
|
|
|
|
for(;i<AGO_MAX_NUMBER_OF_AGOS;i++)
|
|
{
|
|
if ((g_AGO[i].fCreationTime<fOldestTime) &&
|
|
(g_AGO[i].ulType != AGO_STILL | AGO_REMANANCE3))
|
|
{
|
|
ulOldestIndex=i;
|
|
fOldestTime=g_AGO[i].fCreationTime;
|
|
}
|
|
}
|
|
return ulOldestIndex;
|
|
}
|
|
|
|
/******************************************************/
|
|
/* ************************************************ ***/
|
|
/* AGO_vCreatePart : AGO Creation Function ***/
|
|
/* ************************************************ ***/
|
|
/******************************************************/
|
|
AGO_Part *AGO_vCreatePart(unsigned long parm_ulType, float *parm_a3_fPosition, float *parm_a3_fDirection, float TimeLimit, float fScaleX, float fScaleY, void *pVisualMaterial)
|
|
{
|
|
register AGO_Part *p;
|
|
|
|
|
|
/* We also check for Zelda effect*/
|
|
if ((parm_ulType & AGO_ZELDA) && (g_ulNumberOfAgos!=AGO_MAX_NUMBER_OF_AGOS))
|
|
{
|
|
if (g_NumberOfZeldaAgos==MAX_NUMBER_OF_ZELDA_AGOS) return NULL;
|
|
g_NumberOfZeldaAgos++;
|
|
}
|
|
|
|
/**/
|
|
/* New : If we reached the max amount of AGOs, we 'kill' the elder one, */
|
|
/* to be able to create a new one :-)*/
|
|
/* */
|
|
if (g_ulNumberOfAgos==AGO_MAX_NUMBER_OF_AGOS)
|
|
{
|
|
long i;
|
|
i=AGO_ulGetElderOne();
|
|
if (i!=-1) AGO_vDestroyPart(i); else return NULL;
|
|
}
|
|
|
|
/* We take the next available AGO*/
|
|
p=&(g_AGO[g_ulNumberOfAgos++]);
|
|
|
|
|
|
p->ulType=parm_ulType;
|
|
Copy_a3f_Array(p->a3_fPosition,parm_a3_fPosition);
|
|
Copy_a3f_Array(p->a3_fInitialPosition,parm_a3_fPosition);
|
|
if (parm_a3_fDirection!=NULL) { Copy_a3f_Array(p->a3_fDirection,parm_a3_fDirection); }
|
|
|
|
|
|
g_ffFrameTime=AGO_fGetTimeInSeconds();
|
|
p->fCreationTime=g_ffFrameTime;
|
|
|
|
/* We copy the given scale*/
|
|
p->fScale[0]=fScaleX; p->fScale[1]=fScaleY;
|
|
|
|
/* The 'time limit' may also be the Z limit */
|
|
/* or anything else according to the given type*/
|
|
p->LimitParam.fTimeLimit=TimeLimit;
|
|
|
|
/* We copy the visual material*/
|
|
p->VisualMaterial=pVisualMaterial;
|
|
|
|
/* We record the creation time, to allow texture animation start at the begining*/
|
|
#ifdef U64
|
|
p->AnimTime=g_ulVBLTime;
|
|
#else
|
|
p->AnimTime = (long)gs_fCoefOfMultiplicationForAnimatedTexture ;
|
|
#endif /* U64*/
|
|
|
|
/* External desynchro parameter*/
|
|
p->fAnimTimeScale=g_AGO_AnimTimeScale;
|
|
|
|
/* The default transparency is 255 except for some special cases*/
|
|
p->Transparency=255.0f;
|
|
if ((parm_ulType == AGO_RAYMAN_PLOUF) && (parm_a3_fDirection!=NULL))
|
|
p->Transparency=parm_a3_fDirection[0];
|
|
if (( parm_ulType & AGO_SHADEMASK) ==AGO_APPEAR)
|
|
p->Transparency=5.0f;
|
|
|
|
|
|
/* Special cases for magical effect*/
|
|
if ((parm_ulType & AGO_TYPEMASK) == AGO_ROTATING_SLOW)
|
|
{
|
|
/* Center is Direction*/
|
|
/* Angles are in parm_a3_fPosition*/
|
|
/* Radius = p->LimitParam.fTimeLimit*/
|
|
p->a3_fInitialPosition[0]=FLOAT_RANGED_RANDOM(-3.5f,3.5f);
|
|
p->a3_fInitialPosition[1]=FLOAT_RANGED_RANDOM(-3.5f,3.5f);
|
|
p->a3_fInitialPosition[2]=FLOAT_RANGED_RANDOM(-3.5f,3.5f);
|
|
}
|
|
|
|
if (((parm_ulType & AGO_TYPEMASK) == AGO_MOVINGSINXY) || ((parm_ulType & AGO_TYPEMASK) == AGO_MOVINGSINXYUP))
|
|
{
|
|
if (parm_ulType & AGO_ZELDA)
|
|
{
|
|
/* Sinus amplitude*/
|
|
p->a3_fInitialPosition[0]=FLOAT_RANGED_RANDOM(-1.5f,1.5f);
|
|
/* Time multiplier for the sinus effect*/
|
|
p->a3_fInitialPosition[2]=FLOAT_RANGED_RANDOM(1.0f,4.0f);
|
|
}
|
|
else
|
|
{
|
|
/* Sinus amplitude*/
|
|
p->a3_fInitialPosition[0]=FLOAT_RANGED_RANDOM(-0.5f,0.5f);
|
|
/* Time multiplier for the sinus effect*/
|
|
p->a3_fInitialPosition[2]=FLOAT_RANGED_RANDOM(1.0f,2.0f);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
if ((parm_ulType & AGO_TYPEMASK) == AGO_SPIRALE)
|
|
{
|
|
/* Sinus amplitude*/
|
|
p->a3_fInitialPosition[0]=FLOAT_RANGED_RANDOM(0.0f,0.005f);
|
|
p->a3_fInitialPosition[1]=FLOAT_RANGED_RANDOM(-0.05f,0.05f);
|
|
/* Time multiplier for the sinus effect*/
|
|
p->a3_fInitialPosition[2]=FLOAT_RANGED_RANDOM(5.0f,6.0f);
|
|
p->Transparency=200.0f;
|
|
}
|
|
|
|
if ((parm_ulType & AGO_TYPEMASK) == AGO_GOTO)
|
|
{
|
|
register int i;
|
|
p->LimitParam.fTimeLimit=0.0f;
|
|
|
|
for(i=0;i<3;i++)
|
|
{
|
|
p->a3_fInitialPosition[i]=(p->a3_fDirection[i]-p->a3_fPosition[i])/AGO_GOTO_STEP;
|
|
}
|
|
}
|
|
|
|
if ((parm_ulType & AGO_TYPEMASK) == AGO_2DSPIRALE)
|
|
{
|
|
MTH3D_tdstVector V1,V2;
|
|
float Sin1,Cos1,Angle;
|
|
|
|
Copy_a3f_Array(p->a3_fInitialPosition,parm_a3_fPosition);
|
|
/*p->a3_fInitialPosition[0]=parm_a3_fPosition[0];
|
|
p->a3_fInitialPosition[1]=parm_a3_fPosition[1];
|
|
p->a3_fInitialPosition[2]=parm_a3_fPosition[2];*/
|
|
AGO_Define_OrthogonalVectors((MTH3D_tdstVector *)parm_a3_fDirection,&V1,&V2);
|
|
Angle=FLOAT_RANGED_RANDOM(0.0f,7.0f);
|
|
p->fAnimTimeScale=Angle;
|
|
|
|
*((float *)(&p->AnimTime))=FLOAT_RANGED_RANDOM(0.5f,1.0f);
|
|
|
|
Sin1=SINUS(Angle)*TimeLimit;
|
|
Cos1=COSINUS(Angle)*TimeLimit;
|
|
p->a3_fPosition[0]=parm_a3_fPosition[0]+V1.xX*Sin1+V2.xX*Cos1;
|
|
p->a3_fPosition[1]=parm_a3_fPosition[1]+V1.xY*Sin1+V2.xY*Cos1;
|
|
p->a3_fPosition[2]=parm_a3_fPosition[2]+V1.xZ*Sin1+V2.xZ*Cos1;
|
|
}
|
|
|
|
return p;
|
|
}
|
|
|
|
|
|
/******************************************************/
|
|
/* ************************************************ ***/
|
|
/* AGO_vDestroyPart : Destroys the given AGO ***/
|
|
/* ************************************************ ***/
|
|
/******************************************************/
|
|
void AGO_vDestroyPart(unsigned long ulPartNumber)
|
|
{
|
|
register unsigned long i;
|
|
register AGO_Part *psrc, *pdst;
|
|
|
|
pdst=&(g_AGO[ulPartNumber]);
|
|
psrc=pdst+1;
|
|
|
|
if (pdst->ulType & AGO_ZELDA)
|
|
g_NumberOfZeldaAgos--;
|
|
|
|
for(i=ulPartNumber+1; i<g_ulNumberOfAgos;i++)
|
|
{
|
|
memcpy(pdst,psrc,sizeof(AGO_Part));
|
|
psrc++;
|
|
pdst++;
|
|
}
|
|
g_ulNumberOfAgos--;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************/
|
|
/* NEW PART FOR MISC DISPLAYING */
|
|
/* GAUGES & ICONS */
|
|
/*******************************************************************************/
|
|
|
|
|
|
typedef struct AGO_Gauge_
|
|
{
|
|
float Coords[4];
|
|
void *EmptyMaterial;
|
|
void *FullMaterial;
|
|
float Position;
|
|
int Transparency;
|
|
} AGO_Gauge;
|
|
|
|
typedef struct AGO_Icone_
|
|
{
|
|
float Coords[4];
|
|
void *Material;
|
|
int Transparency;
|
|
} AGO_Icone;
|
|
|
|
#define MAX_ICONES 35
|
|
#define MAX_GAUGES 8
|
|
|
|
AGO_Icone g_TheIcones[MAX_ICONES];
|
|
AGO_Gauge g_TheGauges[MAX_GAUGES];
|
|
|
|
/*
|
|
This function draws a sprite
|
|
With "percent of the screen" coordinates
|
|
And uses global transparency level.
|
|
*/
|
|
void GLI_vDraw2DSpriteWithPercent( GLD_tdstViewportAttributes *p_stVpt,
|
|
float XMin,
|
|
float YMin,
|
|
float XMax,
|
|
float YMax,
|
|
ACP_tdxHandleOfMaterial hMaterial );
|
|
|
|
#ifdef U64
|
|
#define M_vSetZValueForSprites(Z)
|
|
#else /* U64 */
|
|
/* On PC, we need to set different Z value for icones and texts. */
|
|
extern float GLI_g_fZValueForSprite;
|
|
#define M_vSetZValueForSprites(Z) GLI_g_fZValueForSprite = Z;
|
|
#endif /* U64 */
|
|
|
|
|
|
void InitGauges(void)
|
|
{
|
|
int i;
|
|
for(i=0;i<MAX_GAUGES;i++)
|
|
{
|
|
g_TheGauges[i].Transparency=0;
|
|
g_TheGauges[i].Position=0;
|
|
}
|
|
}
|
|
|
|
void InitIcones(void)
|
|
{
|
|
int i;
|
|
for(i=0;i<MAX_ICONES;i++)
|
|
{
|
|
g_TheIcones[i].Transparency=0;
|
|
}
|
|
}
|
|
|
|
|
|
void AddGauge(float *V1, float *V2, float Num, void *EmptyMat, void *FullMat)
|
|
{
|
|
int i=(int)Num;
|
|
|
|
g_TheGauges[i].Coords[0]=V1[0];
|
|
g_TheGauges[i].Coords[1]=V1[1];
|
|
g_TheGauges[i].Coords[2]=V2[0];
|
|
g_TheGauges[i].Coords[3]=V2[1];
|
|
g_TheGauges[i].EmptyMaterial=EmptyMat;
|
|
g_TheGauges[i].FullMaterial=FullMat;
|
|
g_TheGauges[i].Position=V1[2];
|
|
g_TheGauges[i].Transparency=V2[2];
|
|
}
|
|
|
|
|
|
void AddIcone(float *V1, float *V2, float Num, void *Mat)
|
|
{
|
|
int i=(int)Num;
|
|
|
|
|
|
g_TheIcones[i].Coords[0]=V1[0];
|
|
g_TheIcones[i].Coords[1]=V1[1];
|
|
g_TheIcones[i].Coords[2]=V2[0];
|
|
g_TheIcones[i].Coords[3]=V2[1];
|
|
g_TheIcones[i].Material=Mat;
|
|
g_TheIcones[i].Transparency=V2[2];
|
|
}
|
|
|
|
void AGO_vDisplayIcones(GLD_tdstViewportAttributes *p_stVpt)
|
|
{
|
|
int i;
|
|
|
|
for(i=0;i<MAX_ICONES;i++)
|
|
{
|
|
if ((!g_stEngineStructure.bEngineFrozen) || ((i>14) && (i<25)))
|
|
if (g_TheIcones[i].Transparency>0)
|
|
{
|
|
GLI_vSetGlobalAlpha(g_TheIcones[i].Transparency);
|
|
GLI_vDraw2DSpriteWithPercent( p_stVpt,
|
|
g_TheIcones[i].Coords[0],
|
|
g_TheIcones[i].Coords[1],
|
|
g_TheIcones[i].Coords[2],
|
|
g_TheIcones[i].Coords[3],
|
|
g_TheIcones[i].Material);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void AGO_vDisplayGAUGES(GLD_tdstViewportAttributes *p_stVpt)
|
|
{
|
|
int i;
|
|
|
|
#ifdef U64
|
|
/* We re-init for N64*/
|
|
|
|
AGO_g_LastMaterialUsed=NULL;
|
|
g_GLI_SpritesUsed=0;
|
|
g_GLI_DontInitSprites=0;
|
|
g_GLI_DontReinitSprites=0;
|
|
AGO_SkipMaterial=0;
|
|
GLI_vPrepareViewPort();
|
|
#endif /* U64*/
|
|
|
|
|
|
for(i=0;i<MAX_GAUGES;i++)
|
|
{
|
|
|
|
|
|
#ifdef U64
|
|
if (((!g_stEngineStructure.bEngineFrozen) && (i<MAX_GAUGES-2)) ||
|
|
((g_stEngineStructure.bEngineFrozen) && (i>=MAX_GAUGES-2)))
|
|
#endif
|
|
|
|
if (g_TheGauges[i].Transparency>0)
|
|
{
|
|
float diffx,diffy;
|
|
float position;
|
|
|
|
diffx=g_TheGauges[i].Coords[2]-g_TheGauges[i].Coords[0];
|
|
diffy=g_TheGauges[i].Coords[3]-g_TheGauges[i].Coords[1];
|
|
|
|
if (diffx>diffy) /* horizontal gauge */
|
|
{
|
|
position=g_TheGauges[i].Coords[0]+(g_TheGauges[i].Position*diffx/100.0f);
|
|
GLI_vSetGlobalAlpha(g_TheGauges[i].Transparency);
|
|
|
|
GLI_vDraw2DSpriteWithPercent( p_stVpt,
|
|
g_TheGauges[i].Coords[0],
|
|
g_TheGauges[i].Coords[1],
|
|
position,
|
|
g_TheGauges[i].Coords[3],
|
|
g_TheGauges[i].FullMaterial);
|
|
|
|
if (g_TheGauges[i].Position<100.0f)
|
|
{
|
|
GLI_vDraw2DSpriteWithPercent( p_stVpt,
|
|
position,
|
|
g_TheGauges[i].Coords[1],
|
|
g_TheGauges[i].Coords[2],
|
|
g_TheGauges[i].Coords[3],
|
|
g_TheGauges[i].EmptyMaterial);
|
|
}
|
|
|
|
}
|
|
else /* vertical gauge */
|
|
{
|
|
position=g_TheGauges[i].Coords[3]-(g_TheGauges[i].Position*diffy/100.0f);
|
|
GLI_vSetGlobalAlpha(g_TheGauges[i].Transparency);
|
|
|
|
GLI_vDraw2DSpriteWithPercent( p_stVpt,
|
|
g_TheGauges[i].Coords[0],
|
|
position,
|
|
g_TheGauges[i].Coords[2],
|
|
g_TheGauges[i].Coords[3],
|
|
g_TheGauges[i].FullMaterial);
|
|
|
|
if (g_TheGauges[i].Position<100.0f)
|
|
{
|
|
GLI_vDraw2DSpriteWithPercent( p_stVpt,
|
|
g_TheGauges[i].Coords[0],
|
|
g_TheGauges[i].Coords[1],
|
|
g_TheGauges[i].Coords[2],
|
|
position,
|
|
g_TheGauges[i].EmptyMaterial);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
M_vSetZValueForSprites( 0.998f );
|
|
|
|
AGO_vDisplayIcones(p_stVpt);
|
|
|
|
if (g_LogoTransparency>0.01f)
|
|
{
|
|
M_vSetZValueForSprites( 0.999f );
|
|
AGO_vDisplayLogo(p_stVpt);
|
|
}
|
|
|
|
M_vSetZValueForSprites( 1.0f );
|
|
|
|
JFFTXT_vAffiche(p_stVpt);
|
|
}
|
|
|
|
|
|
/***************************************************************/
|
|
/**/
|
|
/* Main AGO function : Processes all the parts, destroys them */
|
|
/* When limits have been reached ...*/
|
|
/**/
|
|
/***************************************************************/
|
|
|
|
|
|
void AGO_vProcessAllParts(GLD_tdstViewportAttributes *_p_stViewport)
|
|
{
|
|
register AGO_Part *p;
|
|
register unsigned long i;
|
|
register unsigned long MustDestroy;
|
|
register unsigned long Type;
|
|
float AlphaTemp;
|
|
static int LastFrozen=0;
|
|
|
|
|
|
g_ffFrameTime=AGO_fGetTimeInSeconds();
|
|
if (g_ffLastFrameTime!=0.0f)
|
|
{
|
|
g_fTimeDifference=g_ffFrameTime - g_ffLastFrameTime;
|
|
g_ffLastFrameTime=g_ffFrameTime;
|
|
}
|
|
else
|
|
{
|
|
/* Dummy value for the first time.. who cares ;-) */
|
|
g_fTimeDifference=0.0f;
|
|
g_ffLastFrameTime=g_ffFrameTime;
|
|
return;
|
|
}
|
|
|
|
if ((g_bInGameMenu) && (!LastFrozen) && (g_bUsingMapMondeAGOs==0))
|
|
{
|
|
LastFrozen=1;
|
|
g_ulNumberOfAgos=0;
|
|
g_NumberOfZeldaAgos=0;
|
|
}
|
|
else
|
|
if ((!g_bInGameMenu) && (LastFrozen) && (g_bUsingMapMondeAGOs==0))
|
|
{
|
|
LastFrozen=0;
|
|
g_ulNumberOfAgos=0;
|
|
g_NumberOfZeldaAgos=0;
|
|
}
|
|
|
|
|
|
if (g_bForceWhiteFog)
|
|
{
|
|
g_bForceWhiteFog++;
|
|
if (g_bForceWhiteFog==3)
|
|
{
|
|
g_bForceWhiteFog=0;
|
|
}
|
|
}
|
|
|
|
/* If no AGO, we simply return ;-)*/
|
|
/* But we must display the jauges !! */
|
|
if (g_ulNumberOfAgos==0)
|
|
{
|
|
/* AGO_vDisplayGAUGES(_p_stViewport); */
|
|
|
|
#ifdef INFODESIGN_RESEARCH
|
|
AGO_vDisplayTriangles(_p_stViewport);
|
|
#endif /* INFODESIGN_RESEARCH */
|
|
|
|
return;
|
|
}
|
|
|
|
/* Simply for alternate display*/
|
|
AGO_g_OddFrame=(AGO_g_OddFrame)?0:1;
|
|
|
|
/* Various N64 initializations*/
|
|
|
|
#ifdef U64
|
|
AGO_g_LastMaterialUsed=NULL;
|
|
g_GLI_SpritesUsed=0;
|
|
g_GLI_DontInitSprites=0;
|
|
g_GLI_DontReinitSprites=0;
|
|
AGO_SkipMaterial=0;
|
|
g_iCurrentPlanarSprite=0;
|
|
GLI_vPrepareViewPort();
|
|
#endif /* U64*/
|
|
|
|
/* We save the original global transparency*/
|
|
AlphaTemp = GLI_vGetGlobalAlpha();
|
|
|
|
i=0;
|
|
/********************************/
|
|
/* First we kill the particles*/
|
|
/* that must die !*/
|
|
/********************************/
|
|
while(i<g_ulNumberOfAgos)
|
|
{
|
|
|
|
p=&(g_AGO[i]);
|
|
Type=p->ulType;
|
|
MustDestroy=0;
|
|
|
|
if (Type & AGO_TIMELIMITED)
|
|
{
|
|
if (g_ffFrameTime-p->fCreationTime>p->LimitParam.fTimeLimit) MustDestroy=1;
|
|
}
|
|
if (Type & AGO_ZLIMITED)
|
|
{
|
|
if (p->a3_fPosition[2] > p->LimitParam.f_ZLimit) MustDestroy=1;
|
|
}
|
|
|
|
if (p->Transparency<=0.0f)
|
|
{
|
|
MustDestroy=1;
|
|
}
|
|
|
|
|
|
|
|
if ((MustDestroy) || (p->ulType & AGO_MUSTDIE))
|
|
{
|
|
if (p->ulType & AGO_ENDASPLOUF)
|
|
if (p->ulType & AGO_ZELDA)
|
|
{
|
|
if (FLOAT_RANGED_RANDOM(-6.0f,1.0f)>0.0f)
|
|
{
|
|
AGO_vAddParticle(68,
|
|
(MTH3D_tdstVector *)p->a3_fPosition,
|
|
(MTH3D_tdstVector *)p->a3_fDirection,
|
|
p->VisualMaterial,
|
|
1.0f);
|
|
}
|
|
}
|
|
AGO_vDestroyPart(i);
|
|
}
|
|
else
|
|
{
|
|
i++;
|
|
}
|
|
}
|
|
|
|
i=0;
|
|
|
|
/* Now we can process and display every remaining AGO*/
|
|
while(i<g_ulNumberOfAgos)
|
|
{
|
|
AGO_vProcessPart(i, _p_stViewport);
|
|
i++;
|
|
};
|
|
|
|
|
|
|
|
#ifdef U64
|
|
/* We re-init for N64*/
|
|
|
|
AGO_g_LastMaterialUsed=NULL;
|
|
g_GLI_SpritesUsed=0;
|
|
g_GLI_DontInitSprites=0;
|
|
g_GLI_DontReinitSprites=0;
|
|
AGO_SkipMaterial=0;
|
|
GLI_vPrepareViewPort();
|
|
#endif /* U64*/
|
|
|
|
/*AGO_vDisplayGAUGES(_p_stViewport); */
|
|
|
|
#ifdef INFODESIGN_RESEARCH
|
|
AGO_vDisplayTriangles(_p_stViewport);
|
|
#endif /* INFODESIGN_RESEARCH */
|
|
|
|
|
|
GLI_vSetGlobalAlpha(AlphaTemp);
|
|
|
|
g_AGO_MustReinitStaticVars=0;
|
|
}
|
|
|
|
#ifndef U64
|
|
void AGO_vReDisplayAllParts(GLD_tdstViewportAttributes *_p_stViewport)
|
|
{
|
|
register unsigned long i;
|
|
float AlphaTemp;
|
|
|
|
|
|
/* If no AGO, we simply return ;-)*/
|
|
if (g_ulNumberOfAgos==0) return;
|
|
|
|
/* Various N64 initializations*/
|
|
|
|
/* We save the original global transparency*/
|
|
AlphaTemp = GLI_vGetGlobalAlpha();
|
|
|
|
i=0;
|
|
|
|
/* Now we can process and display every remaining AGO*/
|
|
while(i<g_ulNumberOfAgos)
|
|
{
|
|
AGO_vDisplayPart(i, _p_stViewport);
|
|
i++;
|
|
};
|
|
|
|
GLI_vSetGlobalAlpha(AlphaTemp);
|
|
}
|
|
|
|
#endif
|
|
|
|
void AGO_vDisplayPart(unsigned long ulPartNumber, GLD_tdstViewportAttributes *_p_stViewport)
|
|
{
|
|
register AGO_Part *p;
|
|
register unsigned long ulTemp;
|
|
float AddX=0.0f;
|
|
float AddY=0.0f;
|
|
float AddZ=0.0f;
|
|
|
|
p=&(g_AGO[ulPartNumber]);
|
|
|
|
ulTemp=(p->ulType & AGO_TYPEMASK);
|
|
|
|
switch(ulTemp)
|
|
{
|
|
/* If the part is still, no need for any calculation*/
|
|
case AGO_STILL: break;
|
|
case AGO_MOVINGSINXYUP:
|
|
case AGO_MOVINGSINXY:
|
|
{
|
|
float timet=p->a3_fInitialPosition[2]*(g_ffFrameTime-p->fCreationTime);
|
|
float *pp2=p->a3_fPosition;
|
|
AddX=p->a3_fInitialPosition[0]*SINUS(timet);
|
|
AddY=p->a3_fInitialPosition[0]*COSINUS(timet);
|
|
pp2[0]+=AddX;
|
|
pp2[1]+=AddY;
|
|
pp2[2]+=AddX+AddY;
|
|
}
|
|
break;
|
|
|
|
case AGO_SPIRALE:
|
|
{
|
|
float *pp=p->a3_fInitialPosition;
|
|
float *pp2=p->a3_fPosition;
|
|
float timet=p->a3_fInitialPosition[2]*(g_ffFrameTime-p->fCreationTime)+p->a3_fDirection[2];
|
|
|
|
AddX=pp[0]*SINUS(timet);
|
|
AddY=pp[0]*COSINUS(timet);
|
|
AddX+=pp[1]*COSINUS(timet);
|
|
AddZ=pp[1]*SINUS(timet);
|
|
pp2[0]+=AddX;
|
|
pp2[1]+=AddY;
|
|
pp2[2]+=AddZ;
|
|
}
|
|
break;
|
|
|
|
default: break;
|
|
|
|
};
|
|
|
|
|
|
#ifdef U64
|
|
/* determine if there must be an anim loop*/
|
|
if (p->ulType & AGO_LOOPANIM) g_bLoopAnim=1; else g_bLoopAnim=0;
|
|
#endif
|
|
|
|
/* Setting the "Used By GLI" variable */
|
|
/* for texture animation desynchro*/
|
|
|
|
if ((p->ulType & AGO_TYPEMASK) == AGO_2DSPIRALE)
|
|
{
|
|
g_AGO_AnimTimeScale=1.0f;
|
|
}
|
|
else
|
|
{
|
|
g_AGO_AnimTimeScale=p->fAnimTimeScale;
|
|
}
|
|
|
|
|
|
/* This allows a better transparency handling*/
|
|
if (p->Transparency>=255.0f)
|
|
GLI_vSetGlobalAlpha(255.0f);
|
|
else
|
|
GLI_vSetGlobalAlpha(p->Transparency);
|
|
|
|
|
|
/* Drawing the AGO :*/
|
|
if (p->VisualMaterial!=NULL)
|
|
{
|
|
if ((p->ulType & AGO_TYPEMASK) == AGO_FRAME)
|
|
{
|
|
GLI_vDisplayFrame(p->a3_fPosition, p->a3_fDirection, p->Transparency,_p_stViewport);
|
|
p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
else
|
|
if ((p->ulType & AGO_GEOMETRY_TYPE_MASK)==AGO_ORIENTEDXYPLAN)
|
|
{
|
|
/***************************************************************/
|
|
/* This is an XY "sprite" that is oriented along X and Y axes*/
|
|
/* The a3_fDirection represent the main direction of the sprite*/
|
|
/***************************************************************/
|
|
MTH3D_tdstVector stV1, stV2;
|
|
float fNorm;
|
|
stV2.xX=-p->a3_fDirection[0];
|
|
stV2.xY=-p->a3_fDirection[1];
|
|
stV2.xZ=0.0f;
|
|
fNorm=MTH_M_xSqrt(stV2.xX*stV2.xX+stV2.xY*stV2.xY);
|
|
if (fNorm>=0.01f)
|
|
{
|
|
fNorm=1.0f/fNorm;
|
|
stV1.xX=-p->a3_fDirection[1]*fNorm;
|
|
stV1.xY=p->a3_fDirection[0]*fNorm;
|
|
stV1.xZ=0.0f;
|
|
stV2.xX*=fNorm;
|
|
stV2.xY*=fNorm;
|
|
if (GLI_vDrawWorldOrthoPlanarSprite(p->a3_fPosition,(void *)p->VisualMaterial,p->fScale[0],p->fScale[1],_p_stViewport,p->AnimTime,&stV1, &stV2,0))
|
|
{
|
|
/* This means it has finished the texture animation*/
|
|
p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
}
|
|
else { p->ulType |= AGO_MUSTDIE; }
|
|
}
|
|
else
|
|
if (((p->ulType & AGO_GEOMETRY_TYPE_MASK)==AGO_REMANANCE) || ((p->ulType & AGO_GEOMETRY_TYPE_MASK)==AGO_REMANANCE2) || ((p->ulType & AGO_GEOMETRY_TYPE_MASK)==AGO_REMANANCE3))
|
|
{
|
|
MTH3D_tdstVector stV1, stV2, stV3;
|
|
register float Val1, Val2;
|
|
float TempPos[3];
|
|
|
|
/***************************************************************/
|
|
/* This is an orthogonal-to-a-given-vector surface... We draw a */
|
|
/* half-cross that is inverted once every frame, giving a weird*/
|
|
/* manga-like blinking effect, and also reduces the number */
|
|
/* of drawn polygons by a factor of 2 !*/
|
|
/***************************************************************/
|
|
|
|
/* initial vector */
|
|
stV1.xX=p->a3_fPosition[0]-p->a3_fInitialPosition[0];
|
|
stV1.xY=p->a3_fPosition[1]-p->a3_fInitialPosition[1];
|
|
stV1.xZ=p->a3_fPosition[2]-p->a3_fInitialPosition[2];
|
|
|
|
if ((p->ulType & AGO_GEOMETRY_TYPE_MASK)==AGO_REMANANCE3) stV1.xZ=0.0f;
|
|
|
|
/* center position */
|
|
TempPos[0]=p->a3_fInitialPosition[0]+stV1.xX*0.5f;
|
|
TempPos[1]=p->a3_fInitialPosition[1]+stV1.xY*0.5f;
|
|
TempPos[2]=p->a3_fInitialPosition[2]+stV1.xZ*0.5f;
|
|
|
|
stV2.xX=-stV1.xY;
|
|
stV2.xY=stV1.xZ;
|
|
stV2.xZ=0;
|
|
|
|
if ((p->ulType & AGO_GEOMETRY_TYPE_MASK)==AGO_REMANANCE3) stV2.xY=stV1.xX;
|
|
|
|
|
|
Val1=stV1.xX*stV1.xX+stV1.xY*stV1.xY;
|
|
|
|
if (Val1>=0.05f)
|
|
{
|
|
|
|
Val2=stV1.xZ*stV1.xZ+Val1;
|
|
|
|
p->fScale[0]=MTH_M_xSqrt(Val2)*0.5f;
|
|
|
|
Val1=MTH_M_xInvSqrt(Val1);
|
|
Val2=MTH_M_xInvSqrt(Val2);
|
|
|
|
stV2.xX*=Val1; stV2.xY*=Val1;
|
|
stV1.xX*=Val2; stV1.xY*=Val2; stV1.xZ*=Val2;
|
|
|
|
if ((p->ulType & AGO_GEOMETRY_TYPE_MASK)==AGO_REMANANCE3)
|
|
{
|
|
if (!g_bInGameMenu)
|
|
GLI_vDrawWorldOrthoPlanarSprite(TempPos,(void *)p->VisualMaterial,0.4f,p->fScale[0],_p_stViewport,p->AnimTime,&stV2, &stV1,0);
|
|
}
|
|
else
|
|
if ((p->ulType & AGO_GEOMETRY_TYPE_MASK)==AGO_REMANANCE2)
|
|
{
|
|
GLI_vDrawWorldOrthoPlanarSprite(TempPos,(void *)p->VisualMaterial,0.3f,p->fScale[0],_p_stViewport,p->AnimTime,&stV2, &stV1,0);
|
|
stV3.xX=stV1.xY*stV2.xZ - stV1.xZ*stV2.xY;
|
|
stV3.xY=stV1.xZ*stV2.xX - stV1.xX*stV2.xZ;
|
|
stV3.xZ=stV1.xX*stV2.xY - stV1.xY*stV2.xX;
|
|
GLI_vDrawWorldOrthoPlanarSprite(TempPos,(void *)p->VisualMaterial,0.3f,p->fScale[0],_p_stViewport,p->AnimTime,&stV3, &stV1,0);
|
|
}
|
|
else
|
|
if (AGO_g_OddFrame)
|
|
GLI_vDrawWorldOrthoPlanarSprite(TempPos,(void *)p->VisualMaterial,0.1f,p->fScale[0],_p_stViewport,p->AnimTime,&stV2, &stV1,0);
|
|
else
|
|
{
|
|
/* we cross product the V1 and V2 to make the other part of the cross-polygons*/
|
|
|
|
stV3.xX=stV1.xY*stV2.xZ - stV1.xZ*stV2.xY;
|
|
stV3.xY=stV1.xZ*stV2.xX - stV1.xX*stV2.xZ;
|
|
stV3.xZ=stV1.xX*stV2.xY - stV1.xY*stV2.xX;
|
|
|
|
GLI_vDrawWorldOrthoPlanarSprite(TempPos,(void *)p->VisualMaterial,0.1f,p->fScale[0],_p_stViewport,p->AnimTime,&stV3, &stV1,0);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
if ((p->ulType & AGO_GEOMETRY_TYPE_MASK)==AGO_ORTHOPLAN)
|
|
{
|
|
MTH3D_tdstVector stV1, stV2;
|
|
MTH3D_tdstVector *p1,*p2;
|
|
|
|
/***************************************************************/
|
|
/* This is an "sprite" that is defined by a point and a normal vector*/
|
|
/* to its surface (stored in the direction vector).*/
|
|
/***************************************************************/
|
|
|
|
/* We get 2 vectors that define the orthogonal planar surface*/
|
|
AGO_Define_OrthogonalVectors((MTH3D_tdstVector *)p->a3_fDirection,&stV1,&stV2);
|
|
|
|
if ((p->ulType & AGO_FOLLOWZ) == AGO_FOLLOWZ)
|
|
{
|
|
/* The texture MUST be upside down*/
|
|
if (stV1.xZ>stV2.xZ)
|
|
{ p1=&stV2; p2=&stV1; }
|
|
else
|
|
{ p1=&stV1; p2=&stV2; }
|
|
}
|
|
else { p1=&stV1; p2=&stV2; }
|
|
|
|
if (GLI_vDrawWorldOrthoPlanarSprite(p->a3_fPosition,(void *)p->VisualMaterial,p->fScale[0],p->fScale[1],_p_stViewport,p->AnimTime, p1, p2,0))
|
|
{
|
|
/* This means it has finished the texture animation*/
|
|
p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
}
|
|
else
|
|
if ((p->ulType & AGO_GEOMETRY_TYPE_MASK)==AGO_XYPLAN)
|
|
{
|
|
/***************************************************************/
|
|
/* This is an simple XY "sprite" that is not oriented... */
|
|
/* like "ploufs"*/
|
|
/***************************************************************/
|
|
if (GLI_vDrawWorldPlanarSprite(p->a3_fPosition,(void *)p->VisualMaterial,p->fScale[0],p->fScale[1],_p_stViewport,p->AnimTime))
|
|
{
|
|
/* This means it has finished the texture animation*/
|
|
p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
#ifdef U64
|
|
char aamode=g_ulUseAntiAliasing;
|
|
if ((p->ulType & (AGO_ZELDA | AGO_MOVINGSINXYUP))== (AGO_ZELDA | AGO_MOVINGSINXYUP))
|
|
{
|
|
g_ulUseAntiAliasing=3;
|
|
}
|
|
#endif
|
|
/***************************************************************/
|
|
/* Then it's a simple 2D sprite :-)*/
|
|
/***************************************************************/
|
|
|
|
/* if this sprite is "based scale", it means that the sprite doesn't scale around its center,*/
|
|
/* but around it's base...*/
|
|
/* That's why we have to shift its position before displaying it*/
|
|
if (p->ulType & AGO_BASEDSCALE) p->a3_fPosition[2]+=p->fScale[1];
|
|
|
|
|
|
|
|
if (GLI_vDrawWorldSprite(p->a3_fPosition,(void *)p->VisualMaterial,p->fScale[0],p->fScale[1],_p_stViewport,p->AnimTime))
|
|
{
|
|
/* This means it has finished the texture animation*/
|
|
p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
|
|
/* And we restore it after...*/
|
|
if (p->ulType & AGO_BASEDSCALE) p->a3_fPosition[2]-=p->fScale[1];
|
|
|
|
#ifdef U64
|
|
if ((p->ulType & (AGO_ZELDA | AGO_MOVINGSINXYUP))== (AGO_ZELDA | AGO_MOVINGSINXYUP))
|
|
{
|
|
g_ulUseAntiAliasing=aamode;
|
|
}
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We restore original values for those types :*/
|
|
|
|
if (((p->ulType & AGO_TYPEMASK) == AGO_MOVINGSINXY) || ((p->ulType & AGO_TYPEMASK) == AGO_MOVINGSINXYUP))
|
|
{
|
|
p->a3_fPosition[0]-=AddX;
|
|
p->a3_fPosition[1]-=AddY;
|
|
p->a3_fPosition[2]-=(AddY+AddX);
|
|
}
|
|
|
|
if ((p->ulType & AGO_TYPEMASK) == AGO_SPIRALE)
|
|
{
|
|
p->a3_fPosition[0]-=AddX;
|
|
p->a3_fPosition[1]-=AddY;
|
|
p->a3_fPosition[2]-=AddZ;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
#ifdef U64
|
|
osSyncPrintf("Null visual material in particles !!!\n");
|
|
#endif
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void AGO_vVectorMulAddInternal(float *pfdest, float *pfsrc, float mul)
|
|
{
|
|
int i;
|
|
|
|
for(i=0;i<3;i++)
|
|
{
|
|
pfdest[i]+=pfsrc[i]*mul;
|
|
}
|
|
}
|
|
|
|
#define AGO_vVectorMulAdd(pfdest, pfsrc, mul) AGO_vVectorMulAddInternal((float *)(pfdest), (float *)(pfsrc), (float)(mul))
|
|
|
|
|
|
|
|
/***************************************************************/
|
|
/**/
|
|
/* Processes coordinates for a single part and displays it*/
|
|
/**/
|
|
/***************************************************************/
|
|
void AGO_vProcessPart(unsigned long ulPartNumber, GLD_tdstViewportAttributes *_p_stViewport)
|
|
{
|
|
register AGO_Part *p;
|
|
register unsigned long ulTemp;
|
|
float TempValue;
|
|
|
|
p=&(g_AGO[ulPartNumber]);
|
|
|
|
ulTemp=(p->ulType & AGO_TYPEMASK);
|
|
|
|
switch(ulTemp)
|
|
{
|
|
/* If the part is still, no need for any calculation*/
|
|
case AGO_STILL: break;
|
|
|
|
/* If the part is falling we must calculate this falling*/
|
|
|
|
case AGO_FALLING_MEGAFAST:
|
|
p->a3_fDirection[2]+=-AGO_G*g_fTimeDifference*4.0f;
|
|
case AGO_GEISER:
|
|
/* NO BREAK HERE ON PURPOSE !*/
|
|
case AGO_FALLING:
|
|
p->a3_fDirection[2]+=-AGO_G_SLOW*g_fTimeDifference;
|
|
/* NO BREAK HERE ON PURPOSE !*/
|
|
case AGO_FALLING_SLOW:
|
|
p->a3_fDirection[2]+=-AGO_G_SLOW*g_fTimeDifference;
|
|
/* NO BREAK HERE ON PURPOSE !*/
|
|
case AGO_MOVING:
|
|
{
|
|
|
|
AGO_vVectorMulAdd(p->a3_fPosition,p->a3_fDirection,g_fTimeDifference);
|
|
|
|
/* p->a3_fPosition[0]+=p->a3_fDirection[0]*g_fTimeDifference;
|
|
p->a3_fPosition[1]+=p->a3_fDirection[1]*g_fTimeDifference;
|
|
p->a3_fPosition[2]+=p->a3_fDirection[2]*g_fTimeDifference; */
|
|
}
|
|
break;
|
|
|
|
case AGO_FASEGOINGTO:
|
|
{
|
|
register float Val1, Val2;
|
|
register int Finished=0;
|
|
register int i;
|
|
|
|
for(i=0;i<3;i++)
|
|
{
|
|
Val1=(p->a3_fDirection[i]-p->a3_fPosition[i]);
|
|
if ((MTH_M_xAbs(Val1)<=0.1f)) Finished++;
|
|
else
|
|
{
|
|
p->a3_fInitialPosition[i]=p->a3_fPosition[i];
|
|
Val2=6.5f*Val1*g_fTimeDifference;
|
|
if (MTH_M_xAbs(Val2)>=MTH_M_xAbs(Val1))
|
|
{
|
|
Finished++;
|
|
p->a3_fPosition[i]=p->a3_fDirection[i];
|
|
}
|
|
else
|
|
p->a3_fPosition[i]+=Val2;
|
|
}
|
|
}
|
|
if (Finished) p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
break;
|
|
|
|
case AGO_GOINGTO:
|
|
{
|
|
register float Val1, Val2;
|
|
register int Finished=0;
|
|
register int i;
|
|
|
|
for(i=0;i<3;i++)
|
|
{
|
|
Val1=(p->a3_fDirection[i]-p->a3_fPosition[i]);
|
|
if ((MTH_M_xAbs(Val1)<=0.1f)) Finished++;
|
|
else
|
|
{
|
|
p->a3_fInitialPosition[i]=p->a3_fPosition[i];
|
|
Val2=1.5f*Val1*g_fTimeDifference;
|
|
if (MTH_M_xAbs(Val2)>=MTH_M_xAbs(Val1))
|
|
{
|
|
Finished++;
|
|
p->a3_fPosition[i]=p->a3_fDirection[i];
|
|
}
|
|
else
|
|
p->a3_fPosition[i]+=Val2;
|
|
}
|
|
}
|
|
if (Finished) p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
break;
|
|
|
|
case AGO_GOTO:
|
|
{
|
|
register int i;
|
|
for(i=0;i<3;i++)
|
|
{
|
|
p->a3_fPosition[i]+=p->a3_fInitialPosition[i];
|
|
}
|
|
p->LimitParam.fTimeLimit+=1.0f;
|
|
if (p->LimitParam.fTimeLimit>=AGO_GOTO_STEP - 1.0f) p->ulType |= AGO_MUSTDIE;
|
|
|
|
}
|
|
break;
|
|
|
|
case AGO_MOVING_AND_SLOWING:
|
|
{
|
|
float *pp=p->a3_fDirection;
|
|
float *pp2=p->a3_fPosition;
|
|
TempValue=-1.6f*g_fTimeDifference;
|
|
pp[0]+=TempValue;
|
|
pp[1]+=TempValue;
|
|
pp[2]+=TempValue;
|
|
|
|
AGO_vVectorMulAdd(pp2,pp,g_fTimeDifference);
|
|
/* pp2[0]+=pp[0]*g_fTimeDifference;
|
|
pp2[1]+=pp[1]*g_fTimeDifference;
|
|
pp2[2]+=pp[2]*g_fTimeDifference; */
|
|
}
|
|
break;
|
|
|
|
case AGO_MOVINGSINXYUP:
|
|
case AGO_MOVINGSINXY:
|
|
{
|
|
/* float *pp=p->a3_fDirection;
|
|
float *pp2=p->a3_fPosition; */
|
|
|
|
AGO_vVectorMulAdd(((float *)(p->a3_fPosition)),((float *)(p->a3_fDirection)),g_fTimeDifference);
|
|
|
|
/*pp2[0]+=pp[0]*g_fTimeDifference;
|
|
pp2[1]+=pp[1]*g_fTimeDifference;
|
|
pp2[2]+=pp[2]*g_fTimeDifference; */
|
|
}
|
|
break;
|
|
|
|
|
|
|
|
case AGO_SPIRALE:
|
|
{
|
|
float *pp=p->a3_fInitialPosition;
|
|
|
|
if (pp[0]<0.25f)
|
|
{
|
|
pp[0]*=1.51f;
|
|
pp[1]*=1.1f;
|
|
}
|
|
else
|
|
if (pp[0]<0.5f)
|
|
{
|
|
pp[0]*=1.1f;
|
|
pp[1]*=1.01f;
|
|
}
|
|
else
|
|
{
|
|
pp[0]*=0.9f;
|
|
pp[1]*=0.98f;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case AGO_2DSPIRALE:
|
|
{
|
|
MTH3D_tdstVector V1,V2;
|
|
float Sin1,Cos1,Angle;
|
|
|
|
p->fAnimTimeScale+=g_fTimeDifference*6.5f*(*((float *)(&p->AnimTime)));
|
|
|
|
(*((float *)(&p->AnimTime)))+=g_fTimeDifference*0.20f;
|
|
p->LimitParam.fTimeLimit-=g_fTimeDifference*1.00f;
|
|
if (p->LimitParam.fTimeLimit<=0.01f)
|
|
{
|
|
p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
|
|
Angle=p->fAnimTimeScale;
|
|
Sin1=SINUS(Angle)*p->LimitParam.fTimeLimit;
|
|
Cos1=COSINUS(Angle)*p->LimitParam.fTimeLimit;
|
|
|
|
AGO_Define_OrthogonalVectors((MTH3D_tdstVector *)p->a3_fDirection,&V1,&V2);
|
|
p->a3_fPosition[0]=p->a3_fInitialPosition[0]+V1.xX*Sin1+V2.xX*Cos1;
|
|
p->a3_fPosition[1]=p->a3_fInitialPosition[1]+V1.xY*Sin1+V2.xY*Cos1;
|
|
p->a3_fPosition[2]=p->a3_fInitialPosition[2]+V1.xZ*Sin1+V2.xZ*Cos1;
|
|
/*
|
|
Angle=g_fTimeDifference*2.0f;
|
|
Sin1=SINUS(Angle);
|
|
Cos1=COSINUS(Angle);
|
|
xx=p->a3_fDirection[0]*Cos1-p->a3_fDirection[1]*Sin1;
|
|
yy=p->a3_fDirection[0]*Sin1+p->a3_fDirection[1]*Cos1;
|
|
p->a3_fDirection[0]=xx;
|
|
p->a3_fDirection[1]=yy;
|
|
|
|
Angle=g_fTimeDifference*1.5f;
|
|
Sin1=SINUS(Angle);
|
|
Cos1=COSINUS(Angle);
|
|
xx=p->a3_fDirection[0]*Cos1-p->a3_fDirection[2]*Sin1;
|
|
yy=p->a3_fDirection[0]*Sin1+p->a3_fDirection[2]*Cos1;
|
|
p->a3_fDirection[0]=xx;
|
|
p->a3_fDirection[2]=yy;
|
|
*/
|
|
}
|
|
break;
|
|
|
|
|
|
case AGO_ROTATING_SLOW:
|
|
{
|
|
register float cosx, sinx, cosy,siny,cosz, sinz;
|
|
register float X,Y,Z;
|
|
register float pos0,pos1,pos2;
|
|
|
|
X=0.707f;
|
|
Y=0.50f;
|
|
Z=0.50f;
|
|
|
|
/* Center is Direction*/
|
|
/* Angles are in parm_a3_fPosition*/
|
|
/* Radius = p->LimitParam.fTimeLimit*/
|
|
pos0=p->a3_fInitialPosition[0]*g_ffFrameTime;
|
|
pos1=p->a3_fInitialPosition[1]*g_ffFrameTime;
|
|
pos2=p->a3_fInitialPosition[2]*g_ffFrameTime;
|
|
|
|
cosx=COSINUS(pos0); sinx=SINUS(pos0);
|
|
cosy=COSINUS(pos1); siny=SINUS(pos1);
|
|
cosz=COSINUS(pos2); sinz=SINUS(pos2);
|
|
|
|
/* We rotate the part around its own axis and add the translation*/
|
|
p->a3_fPosition[0]=p->a3_fDirection[0]+(p->LimitParam.fTimeLimit)*(
|
|
(cosy*cosz)*X +
|
|
(-siny*cosx*cosz - cosx*sinz)*Y +
|
|
(-siny*cosx*cosz + sinx /*+*/ * sinz)*Z
|
|
);
|
|
p->a3_fPosition[1]=p->a3_fDirection[1]+(p->LimitParam.fTimeLimit)*(
|
|
(cosy*sinz)*X +
|
|
(-sinz*siny*sinx+cosx*cosz)*Y +
|
|
(-sinz*siny*cosx-sinx*cosz)*Z
|
|
);
|
|
p->a3_fPosition[2]=p->a3_fDirection[2]+(p->LimitParam.fTimeLimit)*(
|
|
(siny)*X +
|
|
(sinx*siny)*Y +
|
|
(cosx*cosy)*Z
|
|
);
|
|
|
|
p->LimitParam.fTimeLimit-=4.5f*g_fTimeDifference;
|
|
if (p->LimitParam.fTimeLimit<=0.01f)
|
|
p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
break;
|
|
|
|
default: break;
|
|
|
|
};
|
|
|
|
|
|
if ((p->ulType & AGO_ENDASPLOUF) && (g_AGO_PloufMaterial!=NULL) && (!(p->ulType & AGO_ZELDA)))
|
|
{
|
|
if (p->a3_fPosition[2]<=p->LimitParam.fTimeLimit)
|
|
{
|
|
/* Must transform this AGO into a Plouf AGO !*/
|
|
p->a3_fPosition[2]=p->LimitParam.fTimeLimit;
|
|
p->ulType=AGO_RAYMAN_SMALL_PLOUF;
|
|
p->fScale[0]=0.1f;
|
|
p->fScale[1]=0.1f;
|
|
p->fCreationTime=g_ffFrameTime;
|
|
p->Transparency=250.0f;
|
|
p->VisualMaterial=g_AGO_PloufMaterial;
|
|
}
|
|
}
|
|
|
|
|
|
TempValue=0.0f;
|
|
|
|
/********************************/
|
|
/* Scale processing*/
|
|
/********************************/
|
|
switch (p->ulType & AGO_SCALEMASK)
|
|
{
|
|
case AGO_SCALING_MEGAFASTY:
|
|
p->fScale[0]+=5.3f*g_fTimeDifference;
|
|
p->fScale[1]+=20.5f*g_fTimeDifference;
|
|
break;
|
|
|
|
#define EXPLOSION_SPEED 3.0f
|
|
case AGO_SCALING_XTOY:
|
|
p->fScale[0]+=EXPLOSION_SPEED*20.0f*g_fTimeDifference;
|
|
p->fScale[1]-=EXPLOSION_SPEED*5.5f*g_fTimeDifference;
|
|
if (p->fScale[0]>=5.0f)
|
|
{
|
|
p->ulType &= (~AGO_SCALEMASK);
|
|
p->ulType |= AGO_SCALING_YTOX;
|
|
}
|
|
break;
|
|
case AGO_SCALING_YTOX:
|
|
p->fScale[0]-=EXPLOSION_SPEED*20.0f*g_fTimeDifference;
|
|
/* p->fScale[1]+=EXPLOSION_SPEED*10.5f*g_fTimeDifference;*/
|
|
if (p->fScale[0]<=1.0f)
|
|
{
|
|
p->fScale[0]=2.0f;
|
|
p->ulType &= (~AGO_SCALEMASK);
|
|
p->ulType |= AGO_SCALING_YTOX2;
|
|
}
|
|
break;
|
|
case AGO_SCALING_YTOX2:
|
|
p->fScale[0]-=EXPLOSION_SPEED*5.5f*g_fTimeDifference;
|
|
p->fScale[1]+=EXPLOSION_SPEED*20.5f*g_fTimeDifference;
|
|
if (p->fScale[1]>=10.0f)
|
|
{
|
|
p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
break;
|
|
case AGO_SCALING_MEGASLOW:
|
|
TempValue=0.05f;
|
|
break;
|
|
case AGO_SCALING_SLOW:
|
|
TempValue=1.3f;
|
|
break;
|
|
case AGO_SCALING_MID:
|
|
TempValue=3.7f;
|
|
break;
|
|
case AGO_SCALING_FAST:
|
|
TempValue=6.5f;
|
|
break;
|
|
case AGO_SCALING_FASTEST:
|
|
TempValue=9.5f;
|
|
break;
|
|
case AGO_UNSCALING_FAST:
|
|
TempValue=-0.5f;
|
|
break;
|
|
case AGO_UNSCALING_FASTEST:
|
|
TempValue=-3.5f;
|
|
break;
|
|
case AGO_UNSCALING_SLOW:
|
|
TempValue=-0.2f;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (TempValue!=0.0f)
|
|
{
|
|
TempValue*=g_fTimeDifference;
|
|
p->fScale[0]+=TempValue; p->fScale[1]+=TempValue;
|
|
}
|
|
|
|
if ( (p->ulType & AGO_SCALEMASK) == AGO_BIG_RANDOM_SCALE)
|
|
{
|
|
p->fScale[1]=p->fScale[0]=FLOAT_RANGED_RANDOM(0.0f,1.0f);
|
|
}
|
|
else if ( (p->ulType & AGO_SCALEMASK) == AGO_SMALL_RANDOM_SCALE)
|
|
{
|
|
p->fScale[1]=p->fScale[0]=FLOAT_RANGED_RANDOM(0.2f,0.6f);
|
|
}
|
|
|
|
if (p->fScale[0]<=0.0f)
|
|
{
|
|
p->fScale[0]=0.01f;
|
|
p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
if (p->fScale[1]<=0.0f)
|
|
{
|
|
p->fScale[1]=0.01f;
|
|
p->ulType |= AGO_MUSTDIE;
|
|
}
|
|
|
|
|
|
/********************************/
|
|
/* Shade processing*/
|
|
/********************************/
|
|
switch (p->ulType & AGO_SHADEMASK)
|
|
{
|
|
case AGO_WAIT:
|
|
if (g_ffFrameTime-p->fCreationTime>p->LimitParam.fTimeLimit)
|
|
{
|
|
p->ulType&=~AGO_SHADEMASK;
|
|
p->ulType|=AGO_SHADE_FAST;
|
|
|
|
}
|
|
break;
|
|
case AGO_APPEAR:
|
|
p->Transparency+=350.0f*g_fTimeDifference;
|
|
if (p->Transparency>=255.0f)
|
|
{
|
|
p->Transparency=255.0f;
|
|
p->ulType&=~AGO_SHADEMASK;
|
|
p->ulType|=AGO_WAIT;
|
|
p->fCreationTime=g_ffFrameTime;
|
|
}
|
|
break;
|
|
case AGO_SHADE_SLOW:
|
|
p->Transparency-=100.0f*g_fTimeDifference;
|
|
break;
|
|
case AGO_SHADE_MID:
|
|
p->Transparency-=160.0f*g_fTimeDifference;
|
|
break;
|
|
case AGO_SHADE_FAST:
|
|
p->Transparency-=260.0f*g_fTimeDifference;
|
|
break;
|
|
case AGO_SHADE_FASTEST:
|
|
p->Transparency-=350.0f*g_fTimeDifference;
|
|
break;
|
|
case AGO_SHADE_MEGAFAST:
|
|
p->Transparency-=850.0f*g_fTimeDifference;
|
|
break;
|
|
case AGO_SHADE_TWOFRAMES:
|
|
p->Transparency-=2500.0f*g_fTimeDifference;
|
|
break;
|
|
case AGO_RANDOM_SHADE:
|
|
p->Transparency=FLOAT_RANGED_RANDOM(100.0f,255.0f);
|
|
break;
|
|
case AGO_UNSHADE:
|
|
p->Transparency+=100.0f*g_fTimeDifference;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ((p->Transparency<0.0f) && ((p->ulType & AGO_SHADEMASK)!=AGO_APPEAR))
|
|
{
|
|
p->ulType |= AGO_MUSTDIE;
|
|
p->Transparency=0.0f;
|
|
}
|
|
|
|
AGO_vDisplayPart(ulPartNumber, _p_stViewport);
|
|
}
|
|
|
|
|
|
void CreateType5AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
|
|
p_stPosition->xZ+=0.6f;
|
|
|
|
g_AGO_AnimTimeScale=FLOAT_RANGED_RANDOM(0.7f,2.0f);
|
|
Pos[0]=p_stPosition->xX; Pos[1]=p_stPosition->xY+0.5f; Pos[2]=p_stPosition->xZ+0.8f;
|
|
Direction[0]=1.0f; Direction[1]=0.56f; Direction[2]=-0.53f;
|
|
AGO_vCreatePart( AGO_NAISSANCE_OBUS , Pos, Direction, parameter, 0.8f, 0.8f, hVisualMaterial );
|
|
|
|
g_AGO_AnimTimeScale=FLOAT_RANGED_RANDOM(0.7f,2.0f);
|
|
Pos[0]=p_stPosition->xX; Pos[1]=p_stPosition->xY-0.5f; Pos[2]=p_stPosition->xZ+1.5f;
|
|
Direction[0]=-0.50f; Direction[1]=-0.98f; Direction[2]=0.23f;
|
|
AGO_vCreatePart( AGO_NAISSANCE_OBUS , Pos, Direction, parameter, 0.5f, 0.6f, hVisualMaterial );
|
|
|
|
g_AGO_AnimTimeScale=FLOAT_RANGED_RANDOM(0.7f,2.0f);
|
|
Pos[0]=p_stPosition->xX; Pos[1]=p_stPosition->xY+0.5f; Pos[2]=p_stPosition->xZ-0.5f;
|
|
Direction[0]=0.5f; Direction[1]=0.16f; Direction[2]=0.13f;
|
|
AGO_vCreatePart( AGO_NAISSANCE_OBUS , Pos, Direction, parameter, 0.3f, 0.3f, hVisualMaterial );
|
|
|
|
g_AGO_AnimTimeScale=FLOAT_RANGED_RANDOM(0.7f,2.0f);
|
|
Pos[0]=p_stPosition->xX; Pos[1]=p_stPosition->xY-0.5f; Pos[2]=p_stPosition->xZ;
|
|
Direction[0]=1.0f; Direction[1]=-0.29f; Direction[2]=-0.63f;
|
|
AGO_vCreatePart( AGO_NAISSANCE_OBUS , Pos, Direction, parameter, 1.0f, 1.0f, hVisualMaterial );
|
|
}
|
|
|
|
void CreateType8AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
float Pos2[3];
|
|
float fNorm;
|
|
register float vx,vy;
|
|
|
|
Copy_a3f_Array(Pos,p_stPosition);
|
|
Pos[2]+=0.2f;
|
|
Copy_a3f_Array(Pos2,Pos);
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
vx=-Direction[1]; vy=Direction[0];
|
|
fNorm=MTH_M_xSqrt(vx*vx+vy*vy);
|
|
if (fNorm>=0.01f)
|
|
{
|
|
fNorm=0.4f/fNorm;
|
|
vx*=fNorm; vy*=fNorm;
|
|
|
|
fNorm=FLOAT_RANGED_RANDOM(-0.9f,0.0f);
|
|
|
|
Pos[0]+=-vx+fNorm*Direction[0];
|
|
Pos[1]+=-vy+fNorm*Direction[1];
|
|
|
|
fNorm=FLOAT_RANGED_RANDOM(-0.9f,0.0f);
|
|
Pos2[0]+=vx+fNorm*Direction[0];
|
|
Pos2[1]+=vy+fNorm*Direction[1];
|
|
|
|
AGO_vCreatePart( AGO_RAYMAN_PLOUF_SKI , Pos, Direction, 200.0f, 0.2f, 0.8f, hVisualMaterial );
|
|
AGO_vCreatePart( AGO_RAYMAN_PLOUF_SKI , Pos2, Direction, 200.0f, 0.2f, 0.8f, hVisualMaterial );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
void CreateType16AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
|
|
#ifndef _FIRE_DEADCODE_U64_
|
|
float Pos[3];
|
|
float Direction[3];
|
|
float Pos2[3];
|
|
MTH3D_tdstVector stV2;
|
|
float fNorm, PloufDirect;
|
|
float scale;
|
|
|
|
/* Direction[0]=p_stDirection->xX; Direction[1]=p_stDirection->xY; Direction[2]=p_stDirection->xZ;*/
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
Direction[0]-=g_OldPloufDirection[0];
|
|
Direction[1]-=g_OldPloufDirection[1];
|
|
|
|
g_OldPloufDirection[0]=p_stDirection->xX;
|
|
g_OldPloufDirection[1]=p_stDirection->xY;
|
|
|
|
fNorm=Direction[0]*Direction[0]+Direction[1]*Direction[1];
|
|
|
|
if (fNorm<0.000400f) return;
|
|
|
|
scale=fNorm;
|
|
|
|
if ((fNorm*Direction[0]+fNorm*Direction[1])<0.0f) PloufDirect=0; else PloufDirect=1;
|
|
|
|
Copy_a3f_Array(Pos,p_stPosition);
|
|
Pos[2]+=0.2f;
|
|
Copy_a3f_Array(Pos2,Pos);
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
stV2.xX=-Direction[1]; stV2.xY=Direction[0];
|
|
fNorm=MTH_M_xSqrt(stV2.xX*stV2.xX+stV2.xY*stV2.xY);
|
|
if (fNorm>=0.01f)
|
|
{
|
|
stV2.xX*=fNorm; stV2.xY*=fNorm;
|
|
|
|
fNorm=FLOAT_RANGED_RANDOM(0.0f,1.5f);
|
|
|
|
Pos[0]+=-0.4f*stV2.xX+fNorm*Direction[0];
|
|
Pos[1]+=-0.4f*stV2.xY+fNorm*Direction[1];
|
|
|
|
fNorm=FLOAT_RANGED_RANDOM(0.0f,1.3f);
|
|
Pos2[0]+=0.4f*stV2.xX+fNorm*Direction[0];
|
|
Pos2[1]+=0.4f*stV2.xY+fNorm*Direction[1];
|
|
|
|
Pos[0]-=0.4f*stV2.xX;
|
|
Pos[1]-=0.4f*stV2.xY;
|
|
Pos2[0]+=0.4f*stV2.xX;
|
|
Pos2[1]+=0.4f*stV2.xY;
|
|
|
|
|
|
#define ZVALUEFORSIDEPLOUFS 0.6f
|
|
|
|
stV2.xZ=ZVALUEFORSIDEPLOUFS;
|
|
|
|
/* We determine the normal vector using cross product :*/
|
|
|
|
|
|
Direction[0]=-stV2.xZ*p_stDirection->xY;
|
|
Direction[1]=stV2.xZ*p_stDirection->xX;
|
|
Direction[2]=stV2.xX*p_stDirection->xY-stV2.xY*p_stDirection->xX;
|
|
|
|
if (PloufDirect)
|
|
{
|
|
Direction[2]=-Direction[2];
|
|
AGO_vCreatePart( (AGO_STILL | AGO_ORTHOPLAN | AGO_FOLLOWZ | AGO_SCALING_FAST | AGO_SHADE_MEGAFAST), Pos, Direction, 200.0f, scale, scale, hVisualMaterial );
|
|
}
|
|
else
|
|
{
|
|
AGO_vCreatePart( (AGO_STILL | AGO_ORTHOPLAN | AGO_FOLLOWZ | AGO_SCALING_FAST | AGO_SHADE_MEGAFAST), Pos2, Direction, 200.0f, scale, scale, hVisualMaterial );
|
|
}
|
|
|
|
#undef ZVALUEFORSIDEPLOUFS
|
|
}
|
|
#endif /* _FIRE_DEADCODE_U64_ */
|
|
}
|
|
|
|
|
|
|
|
void CreateType72AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
int i;
|
|
float scale;
|
|
|
|
/* Copy_a3f_Array(Pos,p_stPosition); */
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
for(i=0;i<3;i++)
|
|
{
|
|
float f;
|
|
|
|
f=FLOAT_RANGED_RANDOM(0.05f,0.95f);
|
|
Pos[0]=p_stPosition->xX+f*(p_stDirection->xX-p_stPosition->xX);
|
|
Pos[1]=p_stPosition->xY+f*(p_stDirection->xY-p_stPosition->xY);
|
|
Pos[2]=p_stPosition->xZ+f*(p_stDirection->xZ-p_stPosition->xZ);
|
|
scale=FLOAT_RANGED_RANDOM(0.2f,1.0f);
|
|
AGO_vCreatePart( AGO_STILL | AGO_SHADE_MEGAFAST | AGO_SCALING_FASTEST, Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
|
|
void CreateType52AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
float scale;
|
|
int i;
|
|
|
|
Copy_a3f_Array(Pos,p_stPosition);
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
for(i=0;i<3;i++)
|
|
{
|
|
Pos[i]=((float *)p_stPosition)[i]+4.0f*((float *)p_stDirection)[i]+FLOAT_RANGED_RANDOM(-4.0f,4.0f)+0.3f*AGO_gExtraParameter1[i];
|
|
Direction[i]=FLOAT_RANGED_RANDOM(-0.2f,0.2f)+AGO_gExtraParameter1[i];
|
|
|
|
/*
|
|
Pos[1]=p_stPosition->xY+4.0f*p_stDirection->xY+FLOAT_RANGED_RANDOM(-4.0f,4.0f)+0.3f*AGO_gExtraParameter1[1];
|
|
Pos[2]=p_stPosition->xZ+4.0f*p_stDirection->xZ+FLOAT_RANGED_RANDOM(-4.0f,4.0f)+0.3f*AGO_gExtraParameter1[2];
|
|
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-0.2f,0.2f)+AGO_gExtraParameter1[1];
|
|
Direction[2]=FLOAT_RANGED_RANDOM(-0.2f,0.2f)+AGO_gExtraParameter1[2];
|
|
*/
|
|
}
|
|
|
|
scale=FLOAT_RANGED_RANDOM(0.40f,0.45f);
|
|
AGO_vCreatePart( AGO_ZELDA | AGO_MOVING | AGO_TIMELIMITED, Pos, Direction, 1.0f , scale, scale, hVisualMaterial );
|
|
}
|
|
|
|
|
|
void CreateType60AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
int i;
|
|
float scale;
|
|
|
|
if (g_DoSmallPlouf) return;
|
|
|
|
Copy_a3f_Array(Pos,p_stPosition);
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
/*
|
|
for(i=0;i<10;i++)
|
|
{
|
|
float a,b,c;
|
|
a=FLOAT_RANGED_RANDOM(-0.2f,0.2f);
|
|
b=FLOAT_RANGED_RANDOM(-0.4f,0.4f);
|
|
c=FLOAT_RANGED_RANDOM(-0.4f,0.4f);
|
|
Pos[1]+=b; Pos[0]+=c; Pos[2]+=a;
|
|
scale=FLOAT_RANGED_RANDOM(0.2f,0.5f);
|
|
** AGO_FALLING_SLOW
|
|
AGO_vCreatePart( AGO_STILL | AGO_SHADE_FASTEST | AGO_SCALING_SLOW, Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
Pos[2]-=a; Pos[1]-=b; Pos[0]-=c;
|
|
}
|
|
*/
|
|
|
|
for(i=0;i<10;i++)
|
|
{
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-3.0f,3.0f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-3.0f,3.0f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(2.0f,6.0f);
|
|
scale=FLOAT_RANGED_RANDOM(0.03f,0.05f);
|
|
AGO_vCreatePart( AGO_FALLING | AGO_SHADE_SLOW | AGO_ENDASPLOUF, Pos, Direction, Pos[2], scale, scale, hVisualMaterial );
|
|
}
|
|
|
|
}
|
|
|
|
void CreateType62AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
int i;
|
|
float scale;
|
|
float time;
|
|
|
|
Copy_a3f_Array(Pos,p_stPosition);
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
for(i=0;i<10;i++)
|
|
{
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[2]=0.0f;
|
|
scale=FLOAT_RANGED_RANDOM(0.01f,0.10f);
|
|
if (g_DoSmallPlouf)
|
|
{
|
|
time=FLOAT_RANGED_RANDOM(0.2f,1.0f);
|
|
}
|
|
else
|
|
{
|
|
time=FLOAT_RANGED_RANDOM(1.0f,3.0f);
|
|
}
|
|
|
|
|
|
AGO_vCreatePart( AGO_MOVING | AGO_TIMELIMITED, Pos, Direction, time, scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
|
|
|
|
void CreateType35AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
MTH3D_tdstVector stV1,stV2,stV3;
|
|
float Mul1,Mul2;
|
|
float cos1,sin1;
|
|
|
|
/******************************/
|
|
/* */
|
|
|
|
stV3.xX=p_stPosition->xX-p_stDirection->xX;
|
|
stV3.xY=p_stPosition->xY-p_stDirection->xY;
|
|
stV3.xZ=p_stPosition->xZ-p_stDirection->xZ;
|
|
|
|
Mul1=stV3.xX*stV3.xX+stV3.xY*stV3.xY+stV3.xZ*stV3.xZ;
|
|
Mul1=MTH_M_xInvSqrt(Mul1);
|
|
stV3.xX*=Mul1;
|
|
stV3.xY*=Mul1;
|
|
stV3.xZ*=Mul1;
|
|
|
|
AGO_Define_OrthogonalVectors(&stV3, &stV1, &stV2);
|
|
|
|
Mul1=FLOAT_RANGED_RANDOM(-6.28f,6.28f);
|
|
|
|
cos1=COSINUS(Mul1);
|
|
sin1=SINUS(Mul1);
|
|
|
|
stV3.xX=cos1*stV1.xX + sin1*stV2.xX;
|
|
stV3.xY=cos1*stV1.xY + sin1*stV2.xY;
|
|
stV3.xZ=cos1*stV1.xZ + sin1*stV2.xZ;
|
|
|
|
Mul2=stV3.xX*stV3.xX+stV3.xY*stV3.xY+stV3.xZ*stV3.xZ;
|
|
if ((Mul2<1.0f) && (AGO_g_OddFrame))
|
|
{
|
|
Mul2*=parameter;
|
|
}
|
|
else
|
|
{
|
|
Mul2=MTH_M_xInvSqrt(Mul2)*parameter;
|
|
}
|
|
Pos[0]=p_stDirection->xX+Mul2*stV3.xX;
|
|
Pos[1]=p_stDirection->xY+Mul2*stV3.xY;
|
|
Pos[2]=p_stDirection->xZ+Mul2*stV3.xZ;
|
|
Direction[0]=p_stPosition->xX; Direction[1]=p_stPosition->xY; Direction[2]=p_stPosition->xZ;
|
|
|
|
AGO_vCreatePart( AGO_REMANANCE | AGO_GOINGTO , Pos, Direction, 2.0f , 0.9f, 0.9f, hVisualMaterial );
|
|
|
|
|
|
}
|
|
|
|
void CreateType15AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3], scale;
|
|
int i,j;
|
|
float offset,offset2;
|
|
for(i=8;i;i--)
|
|
{
|
|
g_AGO_AnimTimeScale=FLOAT_RANGED_RANDOM(0.2f,3.0f);
|
|
offset=FLOAT_RANGED_RANDOM(-0.5f,0.8f);
|
|
offset2=FLOAT_RANGED_RANDOM(0.5f,2.2f)*parameter;
|
|
scale=FLOAT_RANGED_RANDOM(0.8f,1.5f);
|
|
/*
|
|
Direction[0]=p_stDirection->xX*offset2;
|
|
Direction[1]=p_stDirection->xY*offset2;
|
|
Direction[2]=p_stDirection->xZ*offset2;
|
|
Pos[0]=p_stPosition->xX+offset*p_stDirection->xX;
|
|
Pos[1]=p_stPosition->xY+offset*p_stDirection->xY;
|
|
Pos[2]=p_stPosition->xZ+offset*p_stDirection->xZ;
|
|
*/
|
|
|
|
for(j=0;j<3;j++)
|
|
{
|
|
Direction[j]=((float *)p_stDirection)[j]*offset2;
|
|
Pos[j]=((float *)p_stPosition)[j]+offset*((float *)p_stDirection)[j];
|
|
}
|
|
|
|
AGO_vCreatePart( AGO_MOVING_AND_SLOWING | AGO_SHADE_FAST, Pos, Direction, offset2 , scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
|
|
|
|
void CreateType158AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3], scale;
|
|
int i, j;
|
|
float offset2;
|
|
|
|
/*p_stPosition->xZ+=2.0f; */
|
|
/* parameter=0.3f; */
|
|
|
|
for(i=8;i;i--)
|
|
{
|
|
g_AGO_AnimTimeScale=FLOAT_RANGED_RANDOM(0.2f,3.0f);
|
|
offset2=FLOAT_RANGED_RANDOM(4.0f,6.5f);
|
|
scale=parameter;
|
|
|
|
/*
|
|
Direction[0]=p_stDirection->xX*offset2+p_stDirection->xX*FLOAT_RANGED_RANDOM(-1.5f,1.5f);
|
|
Direction[1]=p_stDirection->xY*offset2+p_stDirection->xY*FLOAT_RANGED_RANDOM(-1.5f,1.5f);
|
|
Direction[2]=p_stDirection->xZ*offset2+p_stDirection->xZ*FLOAT_RANGED_RANDOM(-1.5f,1.5f);
|
|
Pos[0]=p_stPosition->xX+FLOAT_RANGED_RANDOM(0.0f,0.3f)*p_stDirection->xZ;
|
|
Pos[1]=p_stPosition->xY+FLOAT_RANGED_RANDOM(0.0f,0.3f)*p_stDirection->xY;
|
|
Pos[2]=p_stPosition->xZ+FLOAT_RANGED_RANDOM(0.0f,0.3f)*p_stDirection->xZ;
|
|
*/
|
|
|
|
for(j=0;j<3;j++)
|
|
{
|
|
Direction[j]=((float *)p_stDirection)[j]*offset2+((float *)p_stDirection)[j]*FLOAT_RANGED_RANDOM(-1.5f,1.5f);
|
|
Pos[j]=((float *)p_stPosition)[j]+FLOAT_RANGED_RANDOM(0.0f,0.3f)*((float *)p_stDirection)[j];
|
|
}
|
|
|
|
AGO_vCreatePart( AGO_MOVING /*_AND_SLOWING */ | AGO_SHADE_MID | AGO_SCALING_SLOW, Pos, Direction, offset2 , scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
|
|
|
|
void CreateType21AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
int i;
|
|
int j;
|
|
static float Offset=0.0f;
|
|
float fTemp;
|
|
|
|
fTemp=1.0f/parameter;
|
|
|
|
for(j=0;j<3;j++)
|
|
{
|
|
Direction[j]=(((float *)p_stDirection)[j]-((float *)p_stPosition)[j])*fTemp;
|
|
}
|
|
for(i=0;i<parameter;i++)
|
|
{
|
|
AGO_Part *p;
|
|
|
|
for(j=0;j<3;j++)
|
|
{
|
|
Pos[j]=((float *)p_stPosition)[j]+((float)i+Offset)*Direction[j];
|
|
}
|
|
p=AGO_vCreatePart( AGO_STILL | AGO_SHADE_TWOFRAMES, Pos, NULL, 2.0f , 0.7f, 0.7f, hVisualMaterial);
|
|
if (p) p->Transparency=400.0f;
|
|
}
|
|
Offset+=6.123456f*g_fTimeDifference;
|
|
while (Offset>=1.0f) Offset-=1.0f;
|
|
}
|
|
|
|
|
|
#ifdef __CETTE_FONCTION_N_EST_QU_UN_PROTO_KI_SERT_A_RIEN__
|
|
|
|
void CreateTypeXAGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
|
|
Copy_a3f_Array(Pos,p_stPosition);
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
AGO_vCreatePart( AGO_STILL | AGO_SHADE_TWOFRAMES, Pos, NULL, 2.0f , 0.7f, 0.7f, hVisualMaterial);
|
|
}
|
|
|
|
#endif /* __CETTE_FONCTION_N_EST_QU_UN_PROTO_KI_SERT_A_RIEN__ */
|
|
|
|
void CreateType65AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
float scale;
|
|
|
|
/* LIMIT_AGO_TO_EVERY(0.01f);*/
|
|
|
|
Copy_a3f_Array(Pos,p_stPosition);
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
Direction[0]=0.0f;
|
|
Direction[1]=1.0f;
|
|
Direction[2]=0.0f;
|
|
|
|
/* scale=FLOAT_RANGED_RANDOM(0.030f,0.110f);*/
|
|
/*scale=FLOAT_RANGED_RANDOM(0.150f,0.250f);*/
|
|
scale=FLOAT_RANGED_RANDOM(0.100f,0.150f);
|
|
|
|
AGO_vCreatePart( AGO_2DSPIRALE, Pos, Direction, 3.0f*parameter , scale, scale, hVisualMaterial);
|
|
}
|
|
|
|
/* Heat Effet + Holbe*/
|
|
void CreateType28AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
float scale;
|
|
|
|
LIMIT_AGO_TO_EVERY(0.05f);
|
|
Pos[0]=p_stPosition->xX+8.0f*p_stDirection->xX+FLOAT_RANGED_RANDOM(-4.0f,4.0f);
|
|
Pos[1]=p_stPosition->xY+8.0f*p_stDirection->xY+FLOAT_RANGED_RANDOM(-4.0f,4.0f);
|
|
Pos[2]=p_stPosition->xZ+8.0f*p_stDirection->xZ+FLOAT_RANGED_RANDOM(-5.0f,-4.0f);
|
|
/*scale=FLOAT_RANGED_RANDOM(0.12f,0.19f);*/
|
|
/* parameter=2.0f; */
|
|
scale=FLOAT_RANGED_RANDOM(parameter*0.20f,parameter*0.25f);
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-0.2f,0.2f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-0.2f,0.2f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(2.5f,4.5f);
|
|
AGO_vCreatePart( AGO_ZELDA | AGO_MOVINGSINXYUP | AGO_APPEAR, Pos, Direction, 0.5f , scale, scale, hVisualMaterial );
|
|
|
|
}
|
|
|
|
void CreateType67AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
float scale;
|
|
|
|
LIMIT_AGO_TO_EVERY(0.05f);
|
|
Pos[0]=p_stPosition->xX+8.0f*p_stDirection->xX+2.0f*FLOAT_RANGED_RANDOM(-4.0f,4.0f);
|
|
Pos[1]=p_stPosition->xY+8.0f*p_stDirection->xY+2.0f*FLOAT_RANGED_RANDOM(-4.0f,4.0f);
|
|
Pos[2]=p_stPosition->xZ+8.0f*p_stDirection->xZ+2.0f*FLOAT_RANGED_RANDOM(-5.0f,-4.0f);
|
|
/*scale=FLOAT_RANGED_RANDOM(0.12f,0.19f);*/
|
|
/* parameter=2.0f;*/
|
|
scale=FLOAT_RANGED_RANDOM(parameter*0.10f,parameter*0.15f);
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-0.2f,0.2f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-0.2f,0.2f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(2.5f,4.5f);
|
|
AGO_vCreatePart( AGO_ENDASPLOUF | AGO_ZELDA | AGO_MOVINGSINXYUP | AGO_APPEAR, Pos, Direction, 0.5f , scale, scale, hVisualMaterial );
|
|
|
|
}
|
|
|
|
void CreateType83AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
float scale;
|
|
|
|
LIMIT_AGO_TO_EVERY(0.05f);
|
|
Pos[0]=p_stPosition->xX+5.0f*p_stDirection->xX+2.0f*FLOAT_RANGED_RANDOM(-2.0f,2.0f);
|
|
Pos[1]=p_stPosition->xY+5.0f*p_stDirection->xY+2.0f*FLOAT_RANGED_RANDOM(-2.0f,2.0f);
|
|
Pos[2]=p_stPosition->xZ+5.0f*p_stDirection->xZ-4.0f;
|
|
/*scale=FLOAT_RANGED_RANDOM(0.12f,0.19f);*/
|
|
/* parameter=2.0f;*/
|
|
scale=FLOAT_RANGED_RANDOM(parameter*0.20f,parameter*0.25f);
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-0.2f,0.2f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-0.2f,0.2f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(2.5f,4.5f);
|
|
AGO_vCreatePart( AGO_ZELDA | AGO_MOVINGSINXY | AGO_APPEAR, Pos, Direction, 0.5f , scale, scale, hVisualMaterial );
|
|
|
|
}
|
|
|
|
|
|
void CreateType104AGO( MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
int i;
|
|
|
|
Copy_a3f_Array(Pos,p_stPosition);
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
for(i=0;i<10;i++)
|
|
{
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[2]=0.0f;
|
|
AGO_vCreatePart( AGO_FALLING | AGO_TIMELIMITED, Pos, Direction, FLOAT_RANGED_RANDOM(1.0f,3.0f), 0.0f, 0.0f, hVisualMaterial );
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int AGO_CompareVector(float *v1, float *v2)
|
|
{
|
|
int i;
|
|
|
|
for(i=0;i<3;i++)
|
|
{
|
|
if (v1[i]!=v2[i]) return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
void AGO_vTransformHandVector(float *Position, float *Direction)
|
|
{
|
|
float other[3];
|
|
Position[0]+=Direction[0]*0.13f;
|
|
Position[1]+=Direction[1]*0.13f;
|
|
Position[2]+=Direction[2]*0.1f+0.2f;
|
|
|
|
|
|
other[0]=Direction[1];
|
|
other[1]=-Direction[0];
|
|
other[2]=0.0f;
|
|
Position[0]+=0.3f*other[0];
|
|
Position[1]+=0.3f*other[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
void AGO_vAddParticleContd(unsigned long PartType,
|
|
MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter);
|
|
|
|
|
|
|
|
void AGO_vAddParticle(unsigned long PartType,
|
|
MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
int i;
|
|
float scale;
|
|
|
|
g_AGO_AnimTimeScale=1.0f;
|
|
|
|
Copy_a3f_Array(Pos,p_stPosition);
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
switch(PartType)
|
|
{
|
|
|
|
/************************************************/
|
|
/* Nuage de fumée simple */
|
|
/* LanceAGO(1,Position, rien, Materiau, Taille) */
|
|
/************************************************/
|
|
case 1:
|
|
parameter+=1.0f;
|
|
AGO_vCreatePart( AGO_STILL | AGO_TIMELIMITED, Pos, NULL, 2.0f , parameter, parameter, hVisualMaterial );
|
|
break;
|
|
|
|
case 2:
|
|
parameter+=1.0f;
|
|
AGO_vCreatePart( AGO_STILL | AGO_TIMELIMITED, Pos, NULL, Direction[0] , parameter, parameter, hVisualMaterial );
|
|
break;
|
|
|
|
|
|
/***************************************************************/
|
|
/* Nuages de fumée pour la naissance de l'obus */
|
|
/* LanceAGO(5,Position Obus, rien, "AGO_Fumee", 1.0) */
|
|
/***************************************************************/
|
|
case 5:
|
|
CreateType5AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
break;
|
|
|
|
/*************************************************************************/
|
|
/* Ondes (ploufs) de raymond 1 */
|
|
/* Petite astuce : Direction->xX = Transparence initiale (0.0 -> 255.0) */
|
|
/* Petite astuce : Direction->xZ = Taille (Par défaut : 1.0) */
|
|
/*************************************************************************/
|
|
case 7:
|
|
g_AGO_PloufMaterial=hVisualMaterial;
|
|
|
|
{
|
|
g_ffFrameTime=AGO_fGetTimeInSeconds();
|
|
if (g_fNextPlouf==0.0f) g_fNextPlouf=g_ffFrameTime;
|
|
if (g_fNextPlouf>g_ffFrameTime) return;
|
|
g_fNextPlouf=g_ffFrameTime+0.2f;
|
|
}
|
|
|
|
/* LIMIT_AGO_TO_EVERY(0.2f); */
|
|
|
|
if (Direction[0]>300) Direction[0]=250;
|
|
|
|
if (g_DoSmallPlouf)
|
|
{
|
|
AGO_vCreatePart( AGO_RAYMAN_SMALL_PLOUF , Pos, Direction, Direction[0], Direction[2], Direction[2], hVisualMaterial);
|
|
}
|
|
else
|
|
{
|
|
AGO_vCreatePart( AGO_RAYMAN_PLOUF , Pos, Direction, Direction[0], Direction[2], Direction[2], hVisualMaterial);
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
/***************************************************************/
|
|
/* Ondes du ski nautique */
|
|
/* Vecteur Position */
|
|
/* Vecteur Directeur */
|
|
/***************************************************************/
|
|
case 8:
|
|
CreateType8AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
break;
|
|
/***************************************************************/
|
|
|
|
|
|
/***************************************************************/
|
|
/* REBOND DU POINT*/
|
|
/***************************************************************/
|
|
case 9:
|
|
{
|
|
scale=FLOAT_RANGED_RANDOM(0.5f,0.8f);
|
|
AGO_vCreatePart( AGO_STILL | AGO_SHADE_FASTEST | AGO_UNSCALING_FAST, Pos, NULL, parameter, scale, scale, hVisualMaterial );
|
|
for(i=8;i;i--)
|
|
{
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-2.0f,2.0f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-2.0f,2.0f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(-0.2f,6.0f);
|
|
scale=FLOAT_RANGED_RANDOM(0.19f,0.35f);
|
|
AGO_vCreatePart( AGO_FALLING | AGO_SHADE_FAST, Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************/
|
|
/* TRAINEE DU POINT*/
|
|
/***************************************************************/
|
|
case 10:
|
|
{
|
|
LIMIT_AGO_TO_EVERY(0.1f);
|
|
Direction[0]=0.0f; Direction[1]=0.0f; Direction[2]=0.0f;
|
|
scale=0.40f;
|
|
AGO_vCreatePart( AGO_FALLING_SLOW | AGO_UNSCALING_SLOW | AGO_SHADE_SLOW , Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
|
|
|
|
/***************************************************************/
|
|
/* Nuages circulaires de fumée pour une apparition (Explosion)*/
|
|
/***************************************************************/
|
|
/**/
|
|
/* Arg1 = position*/
|
|
/* Arg2 = Vecteur -> [0] = Rayon, [1] = Nb Particules*/
|
|
/**/
|
|
case 11:
|
|
{
|
|
float fRadius= p_stDirection->xX;
|
|
float cos1,sin1;
|
|
int Number= (int)p_stDirection->xY;
|
|
|
|
for(i=0;i<Number;i++)
|
|
{
|
|
float angle=((float)i)*6.28f/((float)Number);
|
|
|
|
cos1=COSINUS(angle);
|
|
sin1=SINUS(angle);
|
|
g_AGO_AnimTimeScale=FLOAT_RANGED_RANDOM(0.2f,3.0f);
|
|
Pos[0]=p_stPosition->xX+fRadius*cos1; Pos[1]=p_stPosition->xY+fRadius*sin1; Pos[2]=p_stPosition->xZ;
|
|
Direction[0]=fRadius*cos1; Direction[1]=fRadius*sin1; Direction[2]=1.53f;
|
|
scale=FLOAT_RANGED_RANDOM(0.2f,1.2f);
|
|
AGO_vCreatePart( AGO_APPARITION_FUMEE , Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
|
|
/***************************************************************/
|
|
/* "Bouche à Feu" (Mic Janod)*/
|
|
/***************************************************************/
|
|
/**/
|
|
/* Arg1 = position*/
|
|
/* Arg2 = Vecteur Directeur*/
|
|
/* Arg3 = Materiau*/
|
|
/* Arg4 = Vitesse*/
|
|
/**/
|
|
case 15:
|
|
{
|
|
CreateType15AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
/***************************************************************/
|
|
/* Gerbes du Ski nautique*/
|
|
/* Memes parametres que le type 8*/
|
|
/***************************************************************/
|
|
case 16:
|
|
CreateType16AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
break;
|
|
/***************************************************************/
|
|
|
|
|
|
/***************************************************************/
|
|
/* MEGA-TIR*/
|
|
/* Arg1 = position*/
|
|
/* Arg2 = Vecteur Directeur du tir*/
|
|
/* Arg3 = Materiau*/
|
|
/* Arg4 = unused*/
|
|
/***************************************************************/
|
|
case 19:
|
|
{
|
|
float fNorm;
|
|
/* Test if normal vector is null*/
|
|
fNorm=p_stDirection->xX*p_stDirection->xX+p_stDirection->xY*p_stDirection->xY+p_stDirection->xZ*p_stDirection->xZ;
|
|
if (fNorm<=0.001f) return;
|
|
fNorm=MTH_M_xInvSqrt(fNorm);
|
|
p_stDirection->xX*=fNorm; p_stDirection->xY*=fNorm; p_stDirection->xZ*=fNorm;
|
|
/* Direction = normal vector*/
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
scale=0.5f;
|
|
AGO_vCreatePart( AGO_STILL | AGO_ORTHOPLAN | AGO_SCALING_SLOW | AGO_SHADE_MID , Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
/***************************************************************/
|
|
/* MEGA-TIR TRES RAPIDE (BOSS_RHOP)*/
|
|
/* Arg1 = position*/
|
|
/* Arg2 = Vecteur Directeur du tir*/
|
|
/* Arg3 = Materiau*/
|
|
/* Arg4 = unused*/
|
|
/***************************************************************/
|
|
case 20:
|
|
{
|
|
float fNorm;
|
|
/* Test if normal vector is null*/
|
|
fNorm=p_stDirection->xX*p_stDirection->xX+p_stDirection->xY*p_stDirection->xY+p_stDirection->xZ*p_stDirection->xZ;
|
|
if (fNorm<=0.001f) return;
|
|
fNorm=MTH_M_xInvSqrt(fNorm);
|
|
p_stDirection->xX*=fNorm; p_stDirection->xY*=fNorm; p_stDirection->xZ*=fNorm;
|
|
/* Direction = normal vector*/
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
scale=0.5f;
|
|
AGO_vCreatePart( AGO_STILL | AGO_ORTHOPLAN | AGO_SCALING_FASTEST | AGO_SHADE_MEGAFAST , Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
/***************************************************************/
|
|
/* Faisceau*/
|
|
/***************************************************************/
|
|
/* Arg2 = Position Rayman*/
|
|
/* Arg3 = Position Lumsx*/
|
|
/* Arg5 = Number of particles*/
|
|
/***************************************************************/
|
|
case 21:
|
|
{
|
|
CreateType21AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
|
|
|
|
/***************************************************************/
|
|
/* Magic*/
|
|
/***************************************************************/
|
|
/* Arg2 = Position centre*/
|
|
/* Arg5 = Rayon*/
|
|
/***************************************************************/
|
|
|
|
case 23:
|
|
{
|
|
/* LIMIT_AGO_TO_EVERY(0.05f);*/
|
|
/* We save the center in the direction*/
|
|
|
|
AGO_vTransformHandVector(Pos,Direction);
|
|
Copy_a3f_Array(Direction,p_stPosition);
|
|
/* We define the position randomly according to the Rotation Angles*/
|
|
|
|
scale=FLOAT_RANGED_RANDOM(0.10f,0.15f);
|
|
/* AGO_vCreatePart( AGO_ROTATING_SLOW | AGO_SHADE_SLOW, Pos, Direction, parameter , scale, scale, hVisualMaterial);*/
|
|
/* AGO_vCreatePart( AGO_ROTATING_SLOW | AGO_SHADE_SLOW | AGO_APPEAR , Pos, Direction, parameter, scale, scale, hVisualMaterial);*/
|
|
|
|
for(i=0;i<3;i++) Pos[i]=Direction[i]+FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
|
|
/*
|
|
Pos[0]=Direction[0]+FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Pos[1]=Direction[1]+FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Pos[2]=Direction[2]+FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
*/
|
|
|
|
AGO_vCreatePart( AGO_FASEGOINGTO , Pos, Direction, parameter , scale, scale, hVisualMaterial);
|
|
|
|
|
|
break;
|
|
}
|
|
break;
|
|
|
|
/***************************************************************/
|
|
/* ZLimited "Bubbles"*/
|
|
/***************************************************************/
|
|
/**/
|
|
/* Arg1 = position*/
|
|
/* Arg2 = Vecteur Directeur*/
|
|
/* Arg3 = Materiau*/
|
|
/* Arg4 = Z limit */
|
|
/**/
|
|
case 26:
|
|
{
|
|
LIMIT_AGO_TO_EVERY(FLOAT_RANGED_RANDOM(0.0f,0.5f));
|
|
|
|
if (Pos[2]<parameter) return;
|
|
|
|
if (Pos[2]-parameter>20.0f) parameter=Pos[2]+20.0f;
|
|
|
|
scale=FLOAT_RANGED_RANDOM(0.02f,0.1f);
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(1.0f,4.0f);
|
|
AGO_vCreatePart( AGO_MOVINGSINXY | AGO_ZLIMITED | AGO_SCALING_MEGASLOW, Pos, Direction, parameter , scale, scale, hVisualMaterial );
|
|
|
|
/* more bubbles by Christophe giraud...*/
|
|
Pos[1]+=0.2f; Pos[2]+=0.2f;
|
|
if (Pos[2]<parameter)
|
|
AGO_vCreatePart( AGO_MOVINGSINXY | AGO_ZLIMITED | AGO_SCALING_MEGASLOW, Pos, Direction, parameter , scale, scale, hVisualMaterial );
|
|
Pos[1]-=0.5f; Pos[2]+=0.1f;
|
|
if (Pos[2]<parameter)
|
|
AGO_vCreatePart( AGO_MOVINGSINXY | AGO_ZLIMITED | AGO_SCALING_MEGASLOW, Pos, Direction, parameter , scale, scale, hVisualMaterial );
|
|
/* end more bubbles by Christophe giraud...*/
|
|
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
/***************************************************************/
|
|
/* "Bubbles"*/
|
|
/***************************************************************/
|
|
/**/
|
|
/* Arg1 = position*/
|
|
/* Arg2 = Vecteur Directeur*/
|
|
/* Arg3 = Materiau*/
|
|
/* Arg4 = Duree*/
|
|
/**/
|
|
case 27:
|
|
{
|
|
LIMIT_AGO_TO_EVERY(FLOAT_RANGED_RANDOM(0.0f,0.5f));
|
|
|
|
if (parameter>7.0f) parameter=7.0f;
|
|
|
|
scale=FLOAT_RANGED_RANDOM(0.02f,0.1f);
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(2.0f,4.0f);
|
|
AGO_vCreatePart( AGO_MOVINGSINXY | AGO_TIMELIMITED | AGO_SCALING_MEGASLOW, Pos, Direction, parameter , scale, scale, hVisualMaterial );
|
|
|
|
/* more bubbles by Christophe giraud...*/
|
|
Pos[1]+=0.2f; Pos[2]+=0.2f;
|
|
AGO_vCreatePart( AGO_MOVINGSINXY | AGO_TIMELIMITED | AGO_SCALING_MEGASLOW, Pos, Direction, parameter , scale, scale, hVisualMaterial );
|
|
Pos[1]-=0.5f; Pos[2]+=0.1f;
|
|
AGO_vCreatePart( AGO_MOVINGSINXY | AGO_TIMELIMITED | AGO_SCALING_MEGASLOW, Pos, Direction, parameter , scale, scale, hVisualMaterial );
|
|
/* end more bubbles by Christophe giraud...*/
|
|
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
/***************************************************************/
|
|
/* "Plancton" (Zelda effect moving up !)*/
|
|
/***************************************************************/
|
|
/**/
|
|
case 28:
|
|
{
|
|
CreateType28AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
|
|
/***************************************************************/
|
|
/* "Plancton" (Zelda effect)*/
|
|
/***************************************************************/
|
|
/**/
|
|
case 29:
|
|
{
|
|
for(i=0;i<3;i++)
|
|
{
|
|
Pos[i]=((float *)p_stPosition)[i]+8.0f*((float *)p_stDirection)[i]+FLOAT_RANGED_RANDOM(-4.0f,4.0f);
|
|
Direction[i]=FLOAT_RANGED_RANDOM(-0.5f,0.5f);
|
|
}
|
|
|
|
/*
|
|
Pos[0]=p_stPosition->xX+8.0f*p_stDirection->xX+FLOAT_RANGED_RANDOM(-4.0f,4.0f);
|
|
Pos[1]=p_stPosition->xY+8.0f*p_stDirection->xY+FLOAT_RANGED_RANDOM(-4.0f,4.0f);
|
|
Pos[2]=p_stPosition->xZ+8.0f*p_stDirection->xZ+FLOAT_RANGED_RANDOM(-4.0f,4.0f);
|
|
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-0.5f,0.5f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-0.5f,0.5f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(-0.5f,0.5f);
|
|
*/
|
|
|
|
scale=FLOAT_RANGED_RANDOM(0.12f,0.19f);
|
|
AGO_vCreatePart( AGO_ZELDA | AGO_MOVINGSINXY | AGO_APPEAR, Pos, Direction, 0.5f , scale, scale, hVisualMaterial );
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
|
|
/***************************************************************/
|
|
/* Seat effect*/
|
|
/* Seat Position*/
|
|
/* rien, ... , nombre de particules*/
|
|
/***************************************************************/
|
|
case 30:
|
|
{
|
|
scale=FLOAT_RANGED_RANDOM(0.5f,0.8f);
|
|
AGO_vCreatePart( AGO_STILL | AGO_SHADE_FASTEST | AGO_UNSCALING_FAST, Pos, NULL, parameter, scale, scale, hVisualMaterial );
|
|
for(i=parameter;i;i--)
|
|
{
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-2.0f,2.0f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-2.0f,2.0f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(-0.2f,3.0f);
|
|
scale=FLOAT_RANGED_RANDOM(0.10f,0.15f);
|
|
AGO_vCreatePart( AGO_FALLING | AGO_SHADE_FAST, Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
/***************************************************************/
|
|
/* Spiral effect*/
|
|
/* Position*/
|
|
/***************************************************************/
|
|
case 31:
|
|
{
|
|
LIMIT_AGO_TO_EVERY(0.5f);
|
|
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-2.0f,2.0f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-2.0f,2.0f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(0.0f,6.0f);
|
|
scale=FLOAT_RANGED_RANDOM(0.35f,0.65f);
|
|
AGO_vCreatePart( AGO_SPIRALE | AGO_SHADE_SLOW, Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
break;
|
|
|
|
/***************************************************************/
|
|
/* FireWall effect (too slow to be used)*/
|
|
/* Position*/
|
|
/* Normal*/
|
|
/* GMT*/
|
|
/* Size*/
|
|
/***************************************************************/
|
|
case 33:
|
|
{
|
|
scale=FLOAT_RANGED_RANDOM(-parameter,parameter);
|
|
Pos[0]-=scale*p_stDirection->xY;
|
|
Pos[1]+=scale*p_stDirection->xX;
|
|
AGO_vCreatePart( AGO_STILL | AGO_SHADE_FAST, Pos, NULL, 2.0f , 2.0f, 2.0f, hVisualMaterial );
|
|
}
|
|
break;
|
|
|
|
/***************************************************************/
|
|
/* Aspiration effect*/
|
|
/* Position (destination)*/
|
|
/* Center of the Origin*/
|
|
/* GMT*/
|
|
/* Size of the origin circle*/
|
|
/***************************************************************/
|
|
case 35:
|
|
{
|
|
CreateType35AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
|
|
/**/
|
|
/* Plouf gerbe*/
|
|
/**/
|
|
case 39:
|
|
{
|
|
scale=p_stDirection->xY*0.5f;
|
|
/* scale=0.8f;*/
|
|
/*AGO_vCreatePart( AGO_STILL | AGO_SCALING_MEGAFASTY | AGO_BASEDSCALE | AGO_SHADE_FAST, Pos, NULL, 0.01f , scale, scale, hVisualMaterial );*/
|
|
AGO_vCreatePart( AGO_STILL | AGO_SCALING_SLOW | AGO_BASEDSCALE | AGO_SHADE_SLOW, Pos, NULL, 0.01f , scale, scale, hVisualMaterial );
|
|
}
|
|
break;
|
|
|
|
/**/
|
|
/* GAZ TOXIQUE*/
|
|
/**/
|
|
case 42:
|
|
{
|
|
g_AGO_AnimTimeScale=FLOAT_RANGED_RANDOM(0.7f,1.8f);
|
|
scale=FLOAT_RANGED_RANDOM(0.2f,0.8f);
|
|
Pos[0]+=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Pos[1]+=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-0.2f,0.2f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-0.2f,0.2f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(1.0f,2.0f);
|
|
AGO_vCreatePart( AGO_MOVING | AGO_SCALING_SLOW, Pos, Direction, 0.01f , scale, scale, hVisualMaterial );
|
|
}
|
|
break;
|
|
|
|
/***************************************************/
|
|
/* Explosion : Particles*/
|
|
/***************************************************/
|
|
case 45:
|
|
{
|
|
for(i=9;i;i--)
|
|
{
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-2.0f*parameter,2.0f*parameter);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-2.0f*parameter,2.0f*parameter);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(-0.2f*parameter,6.0f*parameter);
|
|
scale=FLOAT_RANGED_RANDOM(0.8f*parameter,0.16f*parameter);
|
|
AGO_vCreatePart( AGO_FALLING | AGO_SHADE_MID | AGO_UNSCALING_FAST , Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
break;
|
|
|
|
/***************************************************/
|
|
/* Explosion : Smoke*/
|
|
/***************************************************/
|
|
case 46:
|
|
{
|
|
g_AGO_AnimTimeScale=0.7f;
|
|
AGO_vCreatePart( AGO_STILL | AGO_SCALING_SLOW, Pos, NULL, 0.01f , 0.5f*parameter, 0.5f*parameter, hVisualMaterial );
|
|
Pos[0]+=FLOAT_RANGED_RANDOM(-2.0f*parameter,2.0f*parameter);
|
|
Pos[1]+=FLOAT_RANGED_RANDOM(-2.0f*parameter,2.0f*parameter);
|
|
g_AGO_AnimTimeScale=1.25f;
|
|
AGO_vCreatePart( AGO_STILL | AGO_SCALING_SLOW, Pos, NULL, 0.01f , 0.5f*parameter, 0.5f*parameter, hVisualMaterial );
|
|
|
|
}
|
|
break;
|
|
|
|
/***************************************************/
|
|
/* Explosion : Big explosion*/
|
|
/***************************************************/
|
|
case 47:
|
|
{
|
|
AGO_vCreatePart( AGO_STILL | AGO_SCALING_FASTEST | AGO_SHADE_TWOFRAMES, Pos, NULL, 0.01f , parameter, parameter, hVisualMaterial );
|
|
}
|
|
break;
|
|
|
|
/***************************************************/
|
|
/* Explosion : Nuclear effect*/
|
|
/***************************************************/
|
|
case 48:
|
|
{
|
|
if (parameter>=9.0f)
|
|
{
|
|
AGO_vCreatePart( AGO_STILL | AGO_XYPLAN | AGO_SCALING_FASTEST | AGO_SHADE_MID, Pos, NULL, 0.1f , parameter*0.7f, parameter*0.7f, hVisualMaterial );
|
|
}
|
|
else
|
|
{
|
|
AGO_vCreatePart( AGO_STILL | AGO_XYPLAN | AGO_SCALING_FASTEST | AGO_SHADE_FAST, Pos, NULL, 0.1f , 0.05f*parameter, 0.05f*parameter, hVisualMaterial );
|
|
}
|
|
// g_bForceWhiteFog=1;
|
|
|
|
}
|
|
break;
|
|
|
|
/* Explosion Manga (PAF)*/
|
|
case 49:
|
|
{
|
|
AGO_Part *p;
|
|
/* if (g_ulNumberOfAgos==AGO_MAX_NUMBER_OF_AGOS) return; */
|
|
// p=&(g_AGO[g_ulNumberOfAgos]);
|
|
p=AGO_vCreatePart( AGO_STILL | AGO_SCALING_XTOY | AGO_SHADE_MEGAFAST, Pos, NULL, 255.0f , 0.7f*parameter, 0.7f*parameter, hVisualMaterial );
|
|
if (p) p->Transparency=300.0f;
|
|
}
|
|
break;
|
|
|
|
case 50:
|
|
{
|
|
Copy_a3f_Array(AGO_gExtraParameter1,Pos);
|
|
Copy_a3f_Array(AGO_gExtraParameter2,Direction);
|
|
/* XB 10/06/99 */
|
|
#ifdef INFODESIGN_RESEARCH
|
|
AGO_gExtraFloatParameter=parameter;
|
|
#endif /* INFODESIGN_RESEARCH */
|
|
/* End XB 10/06/99 */
|
|
|
|
AGO_gExtraMaterial=hVisualMaterial;
|
|
}
|
|
break;
|
|
|
|
/* Lasers*/
|
|
case 51:
|
|
{
|
|
AGO_Part *p;
|
|
p=AGO_vCreatePart(AGO_STILL | AGO_REMANANCE2 | AGO_SHADE_MEGAFAST, Pos, NULL, 0.1f , 1.0f, 1.0f, hVisualMaterial );
|
|
if (p) for(i=0;i<3;i++) p->a3_fInitialPosition[i]=Direction[i];
|
|
}
|
|
break;
|
|
|
|
|
|
|
|
/***************************************************************/
|
|
/* "Gone with the Wind" */
|
|
/* LanceAGO(50,Direction du vent, ..)
|
|
/* LanceAGO(52,Pos Camera, Direct Camera, Mat, ....)
|
|
/***************************************************************/
|
|
case 52:
|
|
{
|
|
CreateType52AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
|
|
/**************************************************************/
|
|
/* etoile : Particules qui partent dans toutes les directions */
|
|
/* */
|
|
/* parameter = vitesse (1.0) */
|
|
/* Direction[0] = taille (1.0) */
|
|
/* Direction[1] = Nombre */
|
|
/**************************************************************/
|
|
case 55:
|
|
{
|
|
int j;
|
|
scale=Direction[0];
|
|
i=((int)Direction[1])+1;
|
|
for(;i;i--)
|
|
{
|
|
for(j=0;j<3;j++) Direction[j]=FLOAT_RANGED_RANDOM(-parameter,parameter);
|
|
AGO_vCreatePart( AGO_MOVING | AGO_SHADE_FAST, Pos, Direction, 1.0f , scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
break;
|
|
|
|
/*************************************************/
|
|
/* Gouttes d'eau qui font des ploufs */
|
|
/* LanceAGO(60, Position, ....) */
|
|
/*************************************************/
|
|
case 60:
|
|
{
|
|
CreateType60AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
|
|
/*************************************************/
|
|
/* Bulles du ploufs */
|
|
/*************************************************/
|
|
case 62:
|
|
{
|
|
CreateType62AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
|
|
|
|
/*************************************************/
|
|
/* Spirale vers mapmonde (TEST) */
|
|
/* Position = Position du centre */
|
|
/* Direction = Normale au plan */
|
|
/* Parameter = Rayon */
|
|
/*************************************************/
|
|
case 65:
|
|
{
|
|
CreateType65AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
|
|
/***************************************************************/
|
|
/* Plum_10 Zelda effect : */
|
|
/* Zelda effect, with random sparks */
|
|
/***************************************************************/
|
|
case 67:
|
|
{
|
|
CreateType67AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
|
|
|
|
default:
|
|
AGO_vAddParticleContd(PartType,p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
break;
|
|
};
|
|
}
|
|
|
|
|
|
void AGO_vAddParticleContd(unsigned long PartType,
|
|
MTH3D_tdstVector *p_stPosition,
|
|
MTH3D_tdstVector *p_stDirection,
|
|
void *hVisualMaterial,
|
|
float parameter)
|
|
{
|
|
float Pos[3];
|
|
float Direction[3];
|
|
int i;
|
|
float scale;
|
|
|
|
g_AGO_AnimTimeScale=1.0f;
|
|
|
|
Copy_a3f_Array(Pos,p_stPosition);
|
|
Copy_a3f_Array(Direction,p_stDirection);
|
|
|
|
switch(PartType)
|
|
{
|
|
|
|
/***************************************************************/
|
|
/* sparks*/
|
|
/***************************************************************/
|
|
case 68:
|
|
{
|
|
for(i=6;i;i--)
|
|
{
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-1.0f,1.0f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(-0.2f,4.0f);
|
|
scale=FLOAT_RANGED_RANDOM(0.05f,0.12f);
|
|
AGO_vCreatePart( AGO_FALLING_SLOW | AGO_SHADE_FAST, Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
break;
|
|
|
|
/*****************************************************/
|
|
/* Super-shoot flashs */
|
|
/*****************************************************/
|
|
case 69:
|
|
{
|
|
AGO_Part *p;
|
|
int j;
|
|
|
|
AGO_vTransformHandVector(Pos,Direction);
|
|
|
|
for(j=0;j<3;j++)
|
|
{
|
|
for(i=0;i<3;i++) Direction[i]=Pos[i]+FLOAT_RANGED_RANDOM(-1.5f,1.5f);
|
|
p=AGO_vCreatePart(AGO_STILL | AGO_REMANANCE2 | AGO_SHADE_TWOFRAMES, Pos, NULL, 0.1f , 5.0f, 5.0f, hVisualMaterial );
|
|
if (p) for(i=0;i<3;i++) p->a3_fInitialPosition[i]=Direction[i];
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
/***************************************************************/
|
|
/* Poing qui grossi! */
|
|
/***************************************************************/
|
|
case 71:
|
|
{
|
|
AGO_Part *p;
|
|
AGO_vTransformHandVector(Pos,Direction);
|
|
scale=FLOAT_RANGED_RANDOM(0.3f*parameter,0.3f*parameter);
|
|
p=AGO_vCreatePart(AGO_STILL | AGO_SHADE_TWOFRAMES, Pos, NULL, 0.1f , scale, scale, hVisualMaterial );
|
|
if (p) p->Transparency=500.0f;
|
|
}
|
|
break;
|
|
|
|
/***************************************************************/
|
|
/* bouillon sous la cascade ! */
|
|
/* Ca a un peu tendance à ramer ! */
|
|
/***************************************************************/
|
|
case 72:
|
|
{
|
|
CreateType72AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
|
|
/***************************************************************/
|
|
/* AGOs du Menu (effet Zelda) ! */
|
|
/***************************************************************/
|
|
case 83:
|
|
{
|
|
CreateType83AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
}
|
|
break;
|
|
|
|
|
|
/***************************************************************/
|
|
/* REBOND DU POINT version 2 */
|
|
/***************************************************************/
|
|
case 99:
|
|
{
|
|
|
|
scale=FLOAT_RANGED_RANDOM(0.5f,0.8f);
|
|
AGO_vCreatePart( AGO_STILL | AGO_SHADE_FASTEST | AGO_UNSCALING_FAST, Pos, NULL, parameter, scale, scale, hVisualMaterial );
|
|
|
|
for(i=(int)(4+4*parameter);i;i--)
|
|
{
|
|
Direction[0]=FLOAT_RANGED_RANDOM(-2.0f,2.0f);
|
|
Direction[1]=FLOAT_RANGED_RANDOM(-2.0f,2.0f);
|
|
Direction[2]=FLOAT_RANGED_RANDOM(-0.2f,6.0f);
|
|
scale=FLOAT_RANGED_RANDOM(0.19f,0.35f);
|
|
AGO_vCreatePart( AGO_FALLING | AGO_SHADE_FAST, Pos, Direction, parameter, scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
break;
|
|
/***************************************************************/
|
|
|
|
|
|
/*****************************************************/
|
|
/* Fire Effect */
|
|
/* Enables or disables sinus on camera parameters */
|
|
/*****************************************************/
|
|
case 100:
|
|
{
|
|
#ifdef U64
|
|
g_bWeirdFireEffect=1;
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
case 101:
|
|
{
|
|
#ifdef U64
|
|
g_bWeirdFireEffect=0;
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
/*****************************************************/
|
|
/* Clipping */
|
|
/* Enables or disables far clipping */
|
|
/*****************************************************/
|
|
case 102:
|
|
#ifdef U64
|
|
GLI_vExtendedFarClipping(1);
|
|
#endif
|
|
break;
|
|
|
|
case 103:
|
|
#ifdef U64
|
|
GLI_vExtendedFarClipping(0);
|
|
#endif
|
|
break;
|
|
|
|
/*****************************************************/
|
|
/* FireWorks */
|
|
/* For the Credit Map */
|
|
/*****************************************************/
|
|
case 104:
|
|
CreateType104AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
break;
|
|
|
|
case 105:
|
|
{
|
|
int j;
|
|
scale=Direction[0];
|
|
i=((int)Direction[1])+1;
|
|
for(;i;i--)
|
|
{
|
|
for(j=0;j<3;j++) Direction[j]=FLOAT_RANGED_RANDOM(-parameter,parameter);
|
|
AGO_vCreatePart( AGO_FALLING_MEGAFAST | AGO_BIG_RANDOM_SCALE | AGO_SHADE_FAST, Pos, Direction, 1.0f , scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 110:
|
|
{
|
|
AGO_Part *p;
|
|
p=AGO_vCreatePart( AGO_FRAME, Pos, Direction, parameter, 1.0f, 1.0f, hVisualMaterial );
|
|
if (p) p->Transparency=parameter;
|
|
}
|
|
break;
|
|
|
|
/********************************/
|
|
/* GAUGE */
|
|
/********************************/
|
|
case 120:
|
|
{
|
|
AddGauge(Pos, Direction, parameter, AGO_gExtraMaterial, hVisualMaterial);
|
|
}
|
|
break;
|
|
|
|
case 125:
|
|
{
|
|
AddIcone(Pos, Direction, parameter, hVisualMaterial);
|
|
}
|
|
break;
|
|
|
|
|
|
/***********************************/
|
|
/* TEST (spirale bizarre aura) */
|
|
/***********************************/
|
|
case 132:
|
|
{
|
|
#ifndef _FIRE_DEAD_CODE_N64_
|
|
static float XAngle=0.0f;
|
|
static float YAngle=0.0f;
|
|
static float ZAngle=0.0f;
|
|
#define VECT_132_VALUE 0.5773502691896f
|
|
float Norm;
|
|
|
|
/* scale=FLOAT_RANGED_RANDOM(0.9f*parameter,0.9f*parameter); */
|
|
scale=FLOAT_RANGED_RANDOM(0.6f*parameter,0.8f*parameter);
|
|
|
|
Direction[0]=VECT_132_VALUE*COSINUS(XAngle)-VECT_132_VALUE*SINUS(YAngle);
|
|
Direction[1]=VECT_132_VALUE*SINUS(XAngle)+VECT_132_VALUE*COSINUS(YAngle)+VECT_132_VALUE*COSINUS(ZAngle)-VECT_132_VALUE*SINUS(XAngle);
|
|
Direction[2]=VECT_132_VALUE*COSINUS(XAngle)-VECT_132_VALUE*COSINUS(YAngle)+VECT_132_VALUE*SINUS(ZAngle)-VECT_132_VALUE*COSINUS(YAngle);
|
|
|
|
XAngle+=g_fTimeDifference*1.0f;
|
|
YAngle+=g_fTimeDifference*6.9f;
|
|
ZAngle+=g_fTimeDifference*3.1564f;
|
|
|
|
Norm=Direction[0]*Direction[0]+Direction[1]*Direction[1]+Direction[2]*Direction[2];
|
|
Norm=MTH_M_xInvSqrt(Norm);
|
|
|
|
Direction[0]*=Norm;
|
|
Direction[1]*=Norm;
|
|
Direction[2]*=Norm;
|
|
|
|
AGO_vCreatePart(AGO_ORTHOPLAN | AGO_STILL | AGO_SHADE_FASTEST, Pos, Direction, 0.1f , scale, scale, hVisualMaterial );
|
|
|
|
Pos[0]+=p_stDirection->xX;
|
|
Pos[1]+=p_stDirection->xY;
|
|
Pos[2]+=p_stDirection->xZ;
|
|
Norm=Direction[0];
|
|
Direction[0]=Direction[2];
|
|
Direction[2]=Norm;
|
|
|
|
AGO_vCreatePart(AGO_ORTHOPLAN | AGO_STILL | AGO_SHADE_FASTEST, Pos, Direction, 0.1f , scale, scale, hVisualMaterial );
|
|
#endif
|
|
}
|
|
break;
|
|
|
|
/************************/
|
|
/* DEFILEMENT D'ETOILES */
|
|
/* Fred Houde */
|
|
/************************/
|
|
case 151:
|
|
{
|
|
AGO_Part *p;
|
|
scale=FLOAT_RANGED_RANDOM(0.1f,0.5f);
|
|
p=AGO_vCreatePart(AGO_MOVING | AGO_TIMELIMITED | AGO_UNSHADE, Pos, Direction, parameter , scale, scale, hVisualMaterial );
|
|
if (p) p->Transparency=0.01f;
|
|
}
|
|
break;
|
|
|
|
/**************************************************************/
|
|
/* etoile : Particules qui partent dans toutes les directions */
|
|
/* */
|
|
/* parameter = vitesse (1.0) */
|
|
/* Direction[0] = taille (1.0) */
|
|
/* Direction[1] = Nombre */
|
|
/**************************************************************/
|
|
case 155:
|
|
{
|
|
int j;
|
|
scale=Direction[0];
|
|
i=((int)Direction[1])+1;
|
|
for(;i;i--)
|
|
{
|
|
for(j=0;j<3;j++) Direction[j]=FLOAT_RANGED_RANDOM(-parameter,parameter);
|
|
AGO_vCreatePart( AGO_MOVING | AGO_SHADE_MEGAFAST, Pos, Direction, 1.0f , scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
/************************************************/
|
|
/* Nuage de fumée simple */
|
|
/* LanceAGO(1,Position, rien, Materiau, Taille) */
|
|
/************************************************/
|
|
case 156:
|
|
parameter+=1.0f;
|
|
g_AGO_AnimTimeScale=0.3333333f;
|
|
AGO_vCreatePart( AGO_STILL | AGO_TIMELIMITED, Pos, NULL, 2.0f , parameter, parameter, hVisualMaterial );
|
|
break;
|
|
|
|
/************************************************/
|
|
/* OmbroSol */
|
|
/* LanceAGO(157,Position, rien, Materiau, Taille) */
|
|
/************************************************/
|
|
case 157:
|
|
AGO_vCreatePart( AGO_STILL | AGO_XYPLAN | AGO_SHADE_TWOFRAMES, Pos, NULL, 2.0f , parameter, parameter, hVisualMaterial );
|
|
break;
|
|
|
|
case 158:
|
|
CreateType158AGO(p_stPosition,p_stDirection,hVisualMaterial,parameter);
|
|
break;
|
|
|
|
/* LanceAGO(163,Position1, Position2, "AGO_Laser",1.0) */
|
|
/* Faisceau mapmonde */
|
|
case 163:
|
|
{
|
|
AGO_Part *p;
|
|
int i;
|
|
|
|
for(i=0;i<g_ulNumberOfAgos;i++)
|
|
{
|
|
p=&(g_AGO[i]);
|
|
if (p->ulType == AGO_STILL | AGO_REMANANCE3)
|
|
{
|
|
if ((AGO_CompareVector(p->a3_fInitialPosition, Pos)) &&
|
|
(AGO_CompareVector(p->a3_fPosition, Direction))) return;
|
|
if ((AGO_CompareVector(p->a3_fInitialPosition, Direction)) &&
|
|
(AGO_CompareVector(p->a3_fPosition, Pos))) return;
|
|
}
|
|
}
|
|
|
|
p=&(g_AGO[g_ulNumberOfAgos]);
|
|
AGO_vCreatePart(AGO_STILL | AGO_REMANANCE3, Pos, NULL, 0.1f , 1.0f, 1.0f, hVisualMaterial );
|
|
|
|
for(i=0;i<3;i++)
|
|
p->a3_fInitialPosition[i]=Direction[i];
|
|
|
|
g_bUsingMapMondeAGOs=1;
|
|
}
|
|
break;
|
|
|
|
case 167:
|
|
{
|
|
if (parameter<=0.01f) g_DoSmallPlouf=0;
|
|
else g_DoSmallPlouf=1;
|
|
}
|
|
break;
|
|
|
|
case 170:
|
|
{
|
|
AGO_vAddLogoPart(parameter, hVisualMaterial);
|
|
}
|
|
break;
|
|
|
|
case 171:
|
|
{
|
|
AGO_vActivateLogoDisplay((float *)p_stPosition,(float *)p_stDirection,parameter);
|
|
}
|
|
break;
|
|
|
|
|
|
/* Hole Aspiration effect */
|
|
case 175:
|
|
{
|
|
int j;
|
|
float fNorm1=0.0f;
|
|
float V1[3],V2[3],V3[3],V4[3];
|
|
|
|
if (parameter==0.0f) return;
|
|
|
|
parameter*=0.5f;
|
|
|
|
for(i=0;i<3;i++)
|
|
{
|
|
V4[i]=Direction[i];
|
|
Direction[i]-=Pos[i];
|
|
fNorm1+=Direction[i]*Direction[i];
|
|
}
|
|
if (fNorm1!=0.0f)
|
|
{
|
|
|
|
fNorm1=MTH_M_xInvSqrt(fNorm1);
|
|
for(i=0;i<3;i++) Direction[i]*=fNorm1;
|
|
|
|
AGO_Define_OrthogonalVectors((MTH3D_tdstVector *)Direction,(MTH3D_tdstVector *)&V1,(MTH3D_tdstVector *)&V2);
|
|
|
|
for(j=0;j<12;j++)
|
|
{
|
|
fNorm1=0.0f;
|
|
for(i=0;i<3;i++)
|
|
{
|
|
V3[i]=V1[i]*FLOAT_RANGED_RANDOM(-8.0f,8.0f)+V2[i]*FLOAT_RANGED_RANDOM(-8.0f,8.0f);
|
|
fNorm1+=V3[i]*V3[i];
|
|
}
|
|
|
|
if (fNorm1!=0.0f)
|
|
{
|
|
fNorm1=MTH_M_xInvSqrt(fNorm1)*parameter;
|
|
for(i=0;i<3;i++) V3[i]=V4[i]+V3[i]*fNorm1;
|
|
}
|
|
|
|
scale=FLOAT_RANGED_RANDOM(0.05f,0.3f);
|
|
AGO_vCreatePart( AGO_GOTO /*| AGO_APPEAR */, V3, Pos, 2.0f , scale, scale, hVisualMaterial );
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 260:
|
|
{
|
|
#ifdef U64
|
|
fn_vFadeIn();
|
|
#endif /* U64 */
|
|
}
|
|
break;
|
|
|
|
case 261:
|
|
{
|
|
#ifdef U64
|
|
fn_vBlackScreenForNFrames((int)parameter);
|
|
#endif /* U64 */
|
|
}
|
|
break;
|
|
|
|
|
|
case 300:
|
|
{
|
|
#ifdef U64
|
|
GLI_vSaveCenteringParameters();
|
|
#endif /* U64 */
|
|
}
|
|
break;
|
|
|
|
|
|
case 500:
|
|
{
|
|
#ifdef INFODESIGN_RESEARCH
|
|
unsigned long IntParam=(int)parameter;
|
|
|
|
/*
|
|
TEMPORARY SETTING !!
|
|
JUST FOR TEST PURPOSE !!!
|
|
|
|
Direction[2]=0.0f;
|
|
Direction[0]=-Pos[1];
|
|
Direction[1]=Pos[0];
|
|
|
|
Pos[0]=AGO_gExtraParameter1[0]+Direction[0];
|
|
Pos[1]=AGO_gExtraParameter1[1]+Direction[1];
|
|
Pos[2]=AGO_gExtraParameter1[2]+Direction[2]+0.5f;
|
|
|
|
DO NOT REMOVE THIS COMMENT !!!
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
Procedure(Proc_SetAGO,1)
|
|
Constant(50,2)
|
|
Operator(Operator_VectorPlusVector,2)
|
|
Field(Position,2)
|
|
Vector(Unused,2)
|
|
Real("0.0",3)
|
|
Real("0.0",3)
|
|
Real("2.0",3)
|
|
Operator(Operator_VectorPlusVector,2)
|
|
Operator(Operator_VectorPlusVector,3)
|
|
Field(Position,4)
|
|
Vector(Unused,4)
|
|
Real("0.0",5)
|
|
Real("0.0",5)
|
|
Real("2.0",5)
|
|
Function(Func_GetPersoSighting,3)
|
|
GameMaterialRef("AGOs\AGOs.gmt^GameMaterial:AGO_etincelle_bleue",2)
|
|
Real("1.00000",2)
|
|
Procedure(Proc_SetAGO,1)
|
|
Constant(500,2)
|
|
Function(Func_GetPersoSighting,2)
|
|
Function(Func_GetPersoSighting,2)
|
|
GameMaterialRef("AGOs\AGOs.gmt^GameMaterial:AGO_etincelle_bleue",2)
|
|
Real("0.00000",2)
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
|
END OF TEMPORARY SETTING !
|
|
*/
|
|
|
|
AGO_vCreateTriangle(
|
|
AGO_gExtraParameter1,
|
|
AGO_gExtraParameter2,
|
|
Pos,
|
|
AGO_gExtraMaterial,
|
|
0.0f,0.0f,
|
|
1.0f,0.0f,
|
|
1.0f,1.0f,
|
|
AGO_gExtraFloatParameter,
|
|
IntParam);
|
|
|
|
|
|
if (IntParam & 1)
|
|
{
|
|
AGO_vCreateTriangle(
|
|
Direction,
|
|
AGO_gExtraParameter1,
|
|
Pos,
|
|
AGO_gExtraMaterial,
|
|
0.0f,1.0f,
|
|
0.0f,0.0f,
|
|
1.0f,1.0f,
|
|
AGO_gExtraFloatParameter,
|
|
IntParam);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
break;
|
|
|
|
|
|
case 0:
|
|
default:
|
|
AGO_vCreatePart( AGO_STILL | AGO_TIMELIMITED | AGO_LOOPANIM, Pos, NULL, 2.0f , 1.0f, 1.0f, hVisualMaterial );
|
|
break;
|
|
};
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* AGO_Define_OrthogonalVectors */
|
|
/* */
|
|
/*****************************************************************************/
|
|
/* Given one NORMAL 3D vector, this function returns 2 orthogonal vectors */
|
|
/* that define the orthogonal planar surface. */
|
|
/*****************************************************************************/
|
|
void AGO_Define_OrthogonalVectors(MTH3D_tdstVector *p_stDirection,MTH3D_tdstVector *p_stV1,MTH3D_tdstVector *p_stV2)
|
|
{
|
|
register MTH3D_tdstVector stV1, stV2, stV3;
|
|
register float fNorm1,fNorm2,fNorm3;
|
|
|
|
/* The first normal vector is easy to find */
|
|
/* For better accuracy, we take the 3 possibilities */
|
|
/* and then get the biggest one */
|
|
stV1.xX=-p_stDirection->xY; stV1.xY=p_stDirection->xX; stV1.xZ=0.0f;
|
|
stV2.xX=-p_stDirection->xZ; stV2.xY=0.0f; stV2.xZ=p_stDirection->xX;
|
|
stV3.xX=0.0f; stV3.xY=-p_stDirection->xZ; stV3.xZ=p_stDirection->xY;
|
|
|
|
/* So we calculate ||Vx||² */
|
|
fNorm1=stV1.xX*stV1.xX+stV1.xY*stV1.xY+stV1.xZ+stV1.xZ;
|
|
fNorm2=stV2.xX*stV2.xX+stV2.xY*stV2.xY+stV2.xZ+stV2.xZ;
|
|
fNorm3=stV3.xX*stV3.xX+stV3.xY*stV3.xY+stV3.xZ+stV3.xZ;
|
|
|
|
/* To avoid problems, we choose the greatest size */
|
|
if (fNorm3>fNorm1) { stV1.xX=stV3.xX; stV1.xY=stV3.xY; stV1.xZ=stV3.xZ; fNorm1=fNorm3; }
|
|
if (fNorm2>fNorm1) { stV1.xX=stV2.xX; stV1.xY=stV2.xY; stV1.xZ=stV2.xZ; fNorm1=fNorm2; }
|
|
|
|
fNorm1=MTH_M_xInvSqrt(fNorm1);
|
|
|
|
/* Now, we can normalize the choosen vector */
|
|
stV1.xX*=fNorm1; stV1.xY*=fNorm1; stV1.xZ*=fNorm1;
|
|
|
|
/* Now stV1 is the greatest normal */
|
|
/* Now we use a cross product to get the second orthogonal vector */
|
|
|
|
p_stV2->xX=p_stDirection->xY*stV1.xZ - p_stDirection->xZ*stV1.xY;
|
|
p_stV2->xY=p_stDirection->xZ*stV1.xX - p_stDirection->xX*stV1.xZ;
|
|
p_stV2->xZ=p_stDirection->xX*stV1.xY - p_stDirection->xY*stV1.xX;
|
|
|
|
/* So now, we have stV1 & stV2 that define the */
|
|
/* orthogonal surface to the given direction vector */
|
|
p_stV1->xX=stV1.xX; p_stV1->xY=stV1.xY; p_stV1->xZ=stV1.xZ;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
void *LogoMaterials[6*3];
|
|
unsigned char g_LogoTransparency=0;
|
|
float g_LogoPosition[4];
|
|
*/
|
|
void AGO_vAddLogoPart(float parameter, void *hVisualMaterial)
|
|
{
|
|
LogoMaterials[(int)parameter]=hVisualMaterial;
|
|
}
|
|
|
|
void AGO_vActivateLogoDisplay(float *p_stPosition, float *p_stDirection, float parameter)
|
|
{
|
|
/*
|
|
g_LogoPosition[0]=p_stPosition[0];
|
|
g_LogoPosition[1]=p_stPosition[1];
|
|
g_LogoPosition[2]=p_stDirection[0];
|
|
g_LogoPosition[3]=p_stDirection[1];
|
|
*/
|
|
g_LogoPosition[0]=15.0f; /* Finally I decided to force the correct values */
|
|
g_LogoPosition[1]=20.0f;
|
|
g_LogoPosition[2]=85.0f;
|
|
g_LogoPosition[3]=60.0f;
|
|
g_LogoTransparency=parameter;
|
|
}
|
|
|
|
|
|
extern int SCREEN_WD;
|
|
extern int SCREEN_HT;
|
|
|
|
void AGO_vDisplayLogo(GLD_tdstViewportAttributes *p_stVpt)
|
|
{
|
|
int i,j;
|
|
float x,y;
|
|
float dx,dy;
|
|
float dx2,dy2;
|
|
|
|
if (g_stEngineStructure.bEngineFrozen)
|
|
return;
|
|
|
|
x=g_LogoPosition[0];
|
|
y=g_LogoPosition[1];
|
|
|
|
dx2=dx=(g_LogoPosition[2]-g_LogoPosition[0])/6.0f;
|
|
dy2=dy=(g_LogoPosition[3]-g_LogoPosition[1])/3.0f;
|
|
|
|
|
|
|
|
#ifdef U64
|
|
|
|
if (SCREEN_WD==300)
|
|
{
|
|
dx2-=3*0.20f;
|
|
dy2-=4*0.20f;
|
|
|
|
dx+=14*0.01f;
|
|
dy+=10*0.01f;
|
|
}
|
|
else
|
|
{
|
|
dx2-=3.0f*0.2f+4.0f*0.05f;
|
|
dy2-=3.0f*0.2f+6.0f*0.05f;
|
|
|
|
dx-=0.18f;
|
|
dy-=0.22f;
|
|
}
|
|
|
|
#else /* U64 */
|
|
dy2-=(220.0f)/(float)p_stVpt->dwBottomInPix;
|
|
dx2-=(220.0f)/(float)p_stVpt->dwRightInPix;
|
|
#endif /* U64 */
|
|
|
|
GLI_vSetGlobalAlpha(g_LogoTransparency);
|
|
|
|
for(i=0;i<6;i++)
|
|
{
|
|
y=g_LogoPosition[1];
|
|
for(j=0;j<3;j++)
|
|
{
|
|
GLI_vDraw2DSpriteWithPercent( p_stVpt,
|
|
x,
|
|
y,
|
|
x+dx,
|
|
y+dy,
|
|
LogoMaterials[j+3*i]);
|
|
y+=dy2;
|
|
}
|
|
x+=dx2;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/***************************************************************************************/
|
|
/** **/
|
|
/** SIMPLE TEXT DRAWING **/
|
|
/** **/
|
|
/***************************************************************************************/
|
|
|
|
/*
|
|
|
|
Number of strings per dsg :
|
|
|
|
YAM : 10
|
|
SDZ : 2
|
|
ARG : 2
|
|
GRP : 2
|
|
|
|
And because I'm sure they'll ask for more ;-)
|
|
EXTRA : 20
|
|
|
|
*/
|
|
|
|
#define MAX_JFFTXT 50
|
|
|
|
#define JFFTXT_FADEIN 0x01
|
|
#define JFFTXT_FADEOUT 0x02
|
|
#define JFFTXT_SELECTED 0x04
|
|
#define JFFTXT_AUTOFRAME 0x08
|
|
#define JFFTXT_FORCED_COLOR 0x10
|
|
|
|
|
|
typedef struct _JFFTXT_
|
|
{
|
|
unsigned char * pString;
|
|
float a3_Pos[3];
|
|
unsigned char ucTransparency;
|
|
unsigned char bFrozenDisplay;
|
|
unsigned char bWaveEffect;
|
|
unsigned char bOther;
|
|
int EffectParameter;
|
|
unsigned char ucForcedColor;
|
|
} tdst_JFFTXT;
|
|
|
|
|
|
/* THE GLOBAL ARRAY */
|
|
tdst_JFFTXT g_JFFTXT[MAX_JFFTXT];
|
|
|
|
|
|
|
|
/* PROTOs */
|
|
|
|
void JFFTXT_vInit(void);
|
|
void JFFTXT_vAffiche(GLD_tdstViewportAttributes *p_stVpt);
|
|
void JFFTXT_vDrawString(GLD_tdstViewportAttributes *p_stVpt, tdst_JFFTXT *p);
|
|
void JFFTXT_vAddText(int StringNumber, MTH3D_tdstVector *p_stPosition, unsigned char *pszString, float xParameter);
|
|
void JFFTXT_vExtendText(int StringNumber, int ID, float xParameter);
|
|
void JFFTXT_vGetStringExtents(tdst_JFFTXT *p,float *x1,float *x2);
|
|
|
|
void *GLI_pGetVisualMaterialForLetter(unsigned int Offset);
|
|
extern char g_GLI_bForceAAAColor;
|
|
extern unsigned char g_GLI_ForcedAAAColor[3];
|
|
|
|
|
|
|
|
#ifdef U64
|
|
|
|
extern unsigned char g_JFFTXT_DrawingText;
|
|
extern unsigned char g_JFFTXT_DrawingTextFirstChar;
|
|
// extern unsigned char g_JFFTXT_DrawingTextLastChar;
|
|
|
|
#endif /* U64 */
|
|
|
|
|
|
/* END OF PROTOs */
|
|
|
|
|
|
|
|
void JFFTXT_vInit(void)
|
|
{
|
|
int i;
|
|
|
|
for(i=0;i<MAX_JFFTXT;i++)
|
|
{
|
|
g_JFFTXT[i].pString=NULL;
|
|
g_JFFTXT[i].ucTransparency=0;
|
|
g_JFFTXT[i].bFrozenDisplay=0;
|
|
g_JFFTXT[i].bWaveEffect=0;
|
|
g_JFFTXT[i].bOther=0;
|
|
g_JFFTXT[i].EffectParameter=0;
|
|
}
|
|
|
|
/* TEST : DECOMMENTER CES LIGNES POUR TESTER : */
|
|
|
|
/*
|
|
|
|
g_JFFTXT[1].pString="/c:/o180:Ceci l'est, un test !/l:Et on verifie que ca/l:marche !";
|
|
g_JFFTXT[1].ucTransparency=1;
|
|
g_JFFTXT[1].bFrozenDisplay=0;
|
|
g_JFFTXT[1].a3_Pos[0]=500;
|
|
g_JFFTXT[1].a3_Pos[1]=300;
|
|
g_JFFTXT[1].a3_Pos[2]=14;
|
|
g_JFFTXT[1].bWaveEffect=0;
|
|
g_JFFTXT[1].bOther= JFFTXT_AUTOFRAME | JFFTXT_FADEIN; */
|
|
|
|
/*
|
|
// g_JFFTXT[0].pString="/c:CECI EST /o180:UN 0;50/c:/l:ET CA MaRchE/o240: BIEN/o0:/l:Ben evidemment je sais/c:/l:pas quoi dire !";
|
|
g_JFFTXT[0].pString="/C:/O300:g f h/O240:";
|
|
g_JFFTXT[0].ucTransparency=255;
|
|
g_JFFTXT[0].bFrozenDisplay=0;
|
|
g_JFFTXT[0].a3_Pos[0]=500;
|
|
g_JFFTXT[0].a3_Pos[1]=155;
|
|
g_JFFTXT[0].a3_Pos[2]=15;
|
|
g_JFFTXT[0].bWaveEffect=0;
|
|
g_JFFTXT[0].bOther=JFFTXT_AUTOFRAME;
|
|
g_JFFTXT[0].EffectParameter=0;
|
|
|
|
|
|
*/
|
|
|
|
// g_JFFTXT[6].pString="/c:/o240:use /o300:j/o240: to swim/L:press /o300:z/o240: to dive/L:press /o300:a/o240: to come back up";
|
|
/* g_JFFTXT[36].pString="/c:ICI = ùò !";
|
|
g_JFFTXT[36].ucTransparency=155;
|
|
g_JFFTXT[36].bFrozenDisplay=0;
|
|
g_JFFTXT[36].a3_Pos[0]=500;
|
|
g_JFFTXT[36].a3_Pos[1]=200;
|
|
g_JFFTXT[36].a3_Pos[2]=15;
|
|
g_JFFTXT[36].bWaveEffect=0;
|
|
g_JFFTXT[36].bOther= JFFTXT_AUTOFRAME | JFFTXT_FADEIN; */
|
|
|
|
/* TEST */
|
|
}
|
|
|
|
#ifdef U64
|
|
void JFFTXT_vCheckStringValidity(unsigned char *pString)
|
|
{
|
|
int i;
|
|
|
|
if (pString==NULL) return;
|
|
|
|
for(i=0;i<MAX_JFFTXT;i++)
|
|
{
|
|
if (g_JFFTXT[i].pString==pString)
|
|
{
|
|
#ifndef FINAL_VERSION
|
|
g_JFFTXT[i].pString="STRING KICKED FROM CACHE !";
|
|
#else
|
|
g_JFFTXT[i].pString=" ";
|
|
#endif /* FINAL_VERSION */
|
|
g_JFFTXT[i].a3_Pos[2]=13;
|
|
}
|
|
}
|
|
}
|
|
#endif /* U64 */
|
|
|
|
|
|
void JFFTXT_vAddText(int StringNumber, MTH3D_tdstVector *p_stPosition, unsigned char *pszString, float xParameter)
|
|
{
|
|
|
|
tdst_JFFTXT *p;
|
|
/*
|
|
if (pszString)
|
|
osSyncPrintf("Adding %s\n",pszString);
|
|
else
|
|
osSyncPrintf("Adding NULL STRING\n");
|
|
|
|
*/
|
|
|
|
if (StringNumber<MAX_JFFTXT)
|
|
{
|
|
p=&(g_JFFTXT[StringNumber]);
|
|
p->pString=pszString;
|
|
p->ucTransparency=(unsigned char)xParameter;
|
|
p->bFrozenDisplay=0;
|
|
p->a3_Pos[0]=p_stPosition->xX;
|
|
p->a3_Pos[1]=p_stPosition->xY;
|
|
p->a3_Pos[2]=p_stPosition->xZ;
|
|
p->bWaveEffect=0;
|
|
p->bOther=0;
|
|
}
|
|
}
|
|
|
|
void JFFTXT_vExtendText(int StringNumber, int ID, float xParameter)
|
|
{
|
|
tdst_JFFTXT *p;
|
|
|
|
if (StringNumber<MAX_JFFTXT)
|
|
{
|
|
p=&(g_JFFTXT[StringNumber]);
|
|
|
|
switch(ID)
|
|
{
|
|
case 0:
|
|
p->ucTransparency=(unsigned char)xParameter;
|
|
break;
|
|
case 1:
|
|
p->bWaveEffect=((unsigned char)xParameter)?1:0;
|
|
break;
|
|
case 2:
|
|
p->bOther=JFFTXT_FADEIN;
|
|
if (p->ucTransparency==0) p->ucTransparency=1;
|
|
break;
|
|
case 3:
|
|
p->bOther=JFFTXT_FADEOUT;
|
|
break;
|
|
case 4:
|
|
p->a3_Pos[2]=xParameter;
|
|
break;
|
|
case 5:
|
|
if ((int)xParameter==0)
|
|
{
|
|
p->bOther&=~JFFTXT_SELECTED;
|
|
}
|
|
else
|
|
{
|
|
p->bOther|=JFFTXT_SELECTED;
|
|
p->EffectParameter=xParameter;
|
|
}
|
|
break;
|
|
case 6:
|
|
if (xParameter==1.0f)
|
|
{
|
|
p->bOther|=JFFTXT_AUTOFRAME;
|
|
}
|
|
else
|
|
{
|
|
p->bOther&=~JFFTXT_AUTOFRAME;
|
|
}
|
|
break;
|
|
case 7:
|
|
{
|
|
switch ((int)xParameter)
|
|
{
|
|
case 0:
|
|
p->bOther&=~JFFTXT_FORCED_COLOR;
|
|
p->ucForcedColor=0;
|
|
break;
|
|
case 1:
|
|
p->bOther|=JFFTXT_FORCED_COLOR;
|
|
p->ucForcedColor=1;
|
|
break;
|
|
case 2:
|
|
p->bOther|=JFFTXT_FORCED_COLOR;
|
|
p->ucForcedColor=2;
|
|
break;
|
|
case 3:
|
|
p->bOther|=JFFTXT_FORCED_COLOR;
|
|
p->ucForcedColor=3;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
};
|
|
}
|
|
}
|
|
|
|
void JFFTXT_vModifyCaracter(int StringNumber, int Position, int newcar)
|
|
{
|
|
tdst_JFFTXT *p;
|
|
|
|
if (StringNumber<MAX_JFFTXT)
|
|
{
|
|
p=&(g_JFFTXT[StringNumber]);
|
|
|
|
if (p->pString!=NULL)
|
|
{
|
|
p->pString[Position]=newcar;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void JFFTXT_vAffiche(GLD_tdstViewportAttributes *p_stVpt)
|
|
{
|
|
tdst_JFFTXT *p;
|
|
int i;
|
|
|
|
#ifdef U64
|
|
|
|
g_JFFTXT_DrawingText=1;
|
|
g_JFFTXT_DrawingTextFirstChar=1;
|
|
|
|
#endif /* U64 */
|
|
|
|
|
|
for(i=0;i<MAX_JFFTXT;i++)
|
|
{
|
|
p=&(g_JFFTXT[i]);
|
|
|
|
/* This is a valid Text */
|
|
if ((p->ucTransparency!=0) && (p->pString!=NULL))
|
|
{
|
|
#ifdef U64
|
|
FON_fn_cRefreshCache(p->pString);
|
|
#endif
|
|
if ((i<15) || (!g_stEngineStructure.bEngineFrozen))
|
|
{
|
|
|
|
|
|
if (p->bOther & JFFTXT_FADEIN)
|
|
{
|
|
int trsp;
|
|
trsp=p->ucTransparency;
|
|
trsp+=g_fTimeDifference*200.0f;
|
|
if (trsp>=255)
|
|
{
|
|
trsp=255;
|
|
p->bOther &= ~JFFTXT_FADEIN;
|
|
/* p->bOther |= JFFTXT_FADEOUT; */
|
|
}
|
|
p->ucTransparency=(unsigned char)trsp;
|
|
}
|
|
else if (p->bOther & JFFTXT_FADEOUT)
|
|
{
|
|
int trsp;
|
|
trsp=p->ucTransparency;
|
|
trsp-=g_fTimeDifference*200.0f;
|
|
if (trsp<=0)
|
|
{
|
|
trsp=0;
|
|
p->bOther &= ~JFFTXT_FADEOUT;
|
|
/* trsp=1;
|
|
p->bOther |= JFFTXT_FADEIN; */
|
|
}
|
|
p->ucTransparency=(unsigned char)trsp;
|
|
}
|
|
|
|
if (p->bOther & JFFTXT_AUTOFRAME)
|
|
{
|
|
float x1[3];
|
|
float x2[3];
|
|
|
|
JFFTXT_vGetStringExtents(p,x1,x2);
|
|
|
|
GLI_vDisplayFrame( x1,
|
|
x2,
|
|
(int)((((float)p->ucTransparency)*0.7f)),
|
|
p_stVpt);
|
|
|
|
}
|
|
|
|
JFFTXT_vDrawString(p_stVpt,p);
|
|
}
|
|
}
|
|
}
|
|
g_GLI_bForceAAAColor=0;
|
|
|
|
#ifdef U64
|
|
GLI_vReinitRDPAfterDisplayingLetters();
|
|
g_JFFTXT_DrawingText=0;
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
#define FLOAT(x) ((float)(x))
|
|
|
|
|
|
|
|
unsigned int JFFTXT_toupper(unsigned int c)
|
|
{
|
|
if ((c>='a') && (c<='z'))
|
|
{
|
|
c=c-'a'+'A';
|
|
}
|
|
return c;
|
|
}
|
|
|
|
|
|
int JFFTXT_iGetStringLength(unsigned char *pt, int dx)
|
|
{
|
|
int i=0;
|
|
int Length=0;
|
|
unsigned char c;
|
|
|
|
c=pt[i];
|
|
|
|
while (c!=0)
|
|
{
|
|
if (c=='/')
|
|
{
|
|
c=JFFTXT_toupper(pt[++i]);
|
|
if (c=='L') return Length;
|
|
|
|
while (c!=':')
|
|
{
|
|
c=pt[++i];
|
|
};
|
|
}
|
|
else
|
|
{
|
|
if (c==32)
|
|
{
|
|
Length+=(int)(FLOAT(dx)*0.6f);
|
|
}
|
|
else
|
|
{
|
|
Length+=dx;
|
|
}
|
|
}
|
|
c=pt[++i];
|
|
};
|
|
|
|
return (Length);
|
|
}
|
|
|
|
void JFFTXT_GetSizeValues(float size, int *dx, int *dy, int *cx, int *cy)
|
|
{
|
|
/* osSyncPrintf("%f\n",size); */
|
|
|
|
/* if (size==35.0f) */
|
|
{
|
|
size-=15.0f;
|
|
*cy=(int)(38.0f+size*2.5f);
|
|
size*=2.0f;
|
|
*dx=(int)(32.0f+size);
|
|
*cx=(int)(32.0f+size);
|
|
*dy=(int)(46.0f+size*2.0f);
|
|
}
|
|
/* else
|
|
{
|
|
size-=15.0f;
|
|
*cy=(int)(38.0f+size*1.0f);
|
|
size*=2.0f;
|
|
*dx=(int)(32.0f+size);
|
|
*cx=(int)(32.0f+size);
|
|
*dy=(int)(46.0f+size*1.0f);
|
|
}*/
|
|
|
|
|
|
}
|
|
|
|
|
|
#define FRAME_BORDER_X 10
|
|
#define FRAME_BORDER_Y 10
|
|
|
|
void JFFTXT_vGetStringExtents(tdst_JFFTXT *p,float *x1,float *x2)
|
|
{
|
|
int i=0;
|
|
unsigned char *pt;
|
|
char c;
|
|
float x,y; /* screen position */
|
|
int dx,dy; /* next character deltas */
|
|
int cx,cy; /* character sizes */
|
|
int bCentering=0;
|
|
|
|
pt=p->pString;
|
|
|
|
x=p->a3_Pos[0];
|
|
y=p->a3_Pos[1];
|
|
|
|
x2[0]=x1[0]=x;
|
|
x2[1]=x1[1]=y;
|
|
|
|
JFFTXT_GetSizeValues(p->a3_Pos[2], &dx, &dy, &cx, &cy);
|
|
|
|
c=JFFTXT_toupper(pt[i]);
|
|
|
|
while(c!=0)
|
|
{
|
|
if (c=='/')
|
|
{
|
|
c=JFFTXT_toupper(pt[++i]);
|
|
if (!c) return;
|
|
|
|
if (c=='L') /* LINE SKIP */
|
|
{
|
|
c=pt[++i];
|
|
if (!c) return;
|
|
if (c==':')
|
|
{
|
|
if (bCentering)
|
|
x=(1000-JFFTXT_iGetStringLength(&pt[i+1], dx))>>1;
|
|
else
|
|
x=p->a3_Pos[0];
|
|
if (x<x1[0]) x1[0]=x;
|
|
y+=dy;
|
|
if (y>x2[1]) x2[1]=y;
|
|
} else return;
|
|
}
|
|
else if (c=='O') /* OFFSET */
|
|
{
|
|
c=pt[++i];
|
|
if (!c) return;
|
|
|
|
while(c!=':')
|
|
{
|
|
c=pt[++i];
|
|
if (!c) return;
|
|
}
|
|
}
|
|
else if (c=='C') /* CENTERING */
|
|
{
|
|
c=pt[++i];
|
|
if (!c) return;
|
|
if (c==':')
|
|
{
|
|
bCentering^=1;
|
|
if (bCentering)
|
|
{
|
|
x=(1000-JFFTXT_iGetStringLength(&pt[i+1], dx))>>1;
|
|
if (x<x1[0]) x1[0]=x;
|
|
if (x>x2[0]) x2[0]=x;
|
|
}
|
|
} else return;
|
|
}
|
|
}
|
|
else if (c==32)
|
|
{
|
|
x+=(int)(FLOAT(dx)*0.6f);
|
|
}
|
|
else /* Not a control character, we display the letter */
|
|
{
|
|
x+=dx;
|
|
}
|
|
|
|
if (x>x2[0]) x2[0]=x;
|
|
|
|
c=JFFTXT_toupper(pt[++i]);
|
|
}
|
|
|
|
x1[0]=(x1[0]-10.0f)*0.1f;
|
|
x1[1]=(x1[1]-10.0f)*0.1f;
|
|
|
|
x2[0]=(x2[0]+10.0f)*0.1f;
|
|
x2[1]=(x2[1]+dy+10.0f)*0.1f;
|
|
}
|
|
|
|
|
|
#define BLUE_R 110
|
|
#define BLUE_G 190
|
|
#define BLUE_B 255
|
|
|
|
#define RED_R 250
|
|
#define RED_G 70
|
|
#define RED_B 70
|
|
|
|
#define YELLOW_R 255
|
|
#define YELLOW_G 255
|
|
#define YELLOW_B 120
|
|
|
|
|
|
void JFFTXT_vDrawString(GLD_tdstViewportAttributes *p_stVpt, tdst_JFFTXT *p)
|
|
{
|
|
int i=0;
|
|
unsigned char *pt;
|
|
unsigned int c;
|
|
float x,y; /* screen position */
|
|
int dx,dy; /* next character deltas */
|
|
int cx,cy; /* character sizes */
|
|
void *hVisualMaterial;
|
|
unsigned int CurrentOffset=0;
|
|
int bCentering=0;
|
|
float Waveeffect=0.0f;
|
|
int RealChar=1;
|
|
|
|
g_GLI_bForceAAAColor=1;
|
|
|
|
|
|
pt=p->pString;
|
|
|
|
if (p->bOther & JFFTXT_FORCED_COLOR)
|
|
{
|
|
switch(p->ucForcedColor)
|
|
{
|
|
case 1:
|
|
g_GLI_ForcedAAAColor[0]=BLUE_R;
|
|
g_GLI_ForcedAAAColor[1]=BLUE_G;
|
|
g_GLI_ForcedAAAColor[2]=BLUE_B;
|
|
break;
|
|
case 2:
|
|
g_GLI_ForcedAAAColor[0]=RED_R;
|
|
g_GLI_ForcedAAAColor[1]=RED_G;
|
|
g_GLI_ForcedAAAColor[2]=RED_B;
|
|
break;
|
|
case 3:
|
|
g_GLI_ForcedAAAColor[0]=YELLOW_R;
|
|
g_GLI_ForcedAAAColor[1]=YELLOW_G;
|
|
g_GLI_ForcedAAAColor[2]=YELLOW_B;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
g_GLI_ForcedAAAColor[0]=BLUE_R;
|
|
g_GLI_ForcedAAAColor[1]=BLUE_G;
|
|
g_GLI_ForcedAAAColor[2]=BLUE_B;
|
|
}
|
|
|
|
|
|
if (p->bWaveEffect)
|
|
{
|
|
Waveeffect=7.0f*SINUS(g_ffFrameTime*5.0f);
|
|
}
|
|
|
|
|
|
x=p->a3_Pos[0];
|
|
y=p->a3_Pos[1];
|
|
|
|
JFFTXT_GetSizeValues(p->a3_Pos[2], &dx, &dy, &cx, &cy);
|
|
|
|
GLI_vSetGlobalAlpha(FLOAT(p->ucTransparency));
|
|
|
|
c=JFFTXT_toupper(pt[i]);
|
|
|
|
while(c!=0)
|
|
{
|
|
if (c=='/')
|
|
{
|
|
c=JFFTXT_toupper(pt[++i]);
|
|
if (!c) return;
|
|
|
|
if (c=='L') /* LINE SKIP */
|
|
{
|
|
c=pt[++i];
|
|
if (!c) return;
|
|
if (c==':')
|
|
{
|
|
if (bCentering)
|
|
{
|
|
x=(1000-JFFTXT_iGetStringLength(&pt[i+1], dx))>>1;
|
|
}
|
|
else
|
|
{
|
|
x=p->a3_Pos[0];
|
|
}
|
|
y+=dy;
|
|
} else return;
|
|
}
|
|
else if (c=='O') /* OFFSET */
|
|
{
|
|
/*
|
|
/o0: Blue
|
|
/o600: Blue
|
|
/o200: Red
|
|
/o400: Yellow
|
|
/o800: Pad signs
|
|
*/
|
|
|
|
CurrentOffset=0;
|
|
|
|
c=pt[++i];
|
|
if (!c) return;
|
|
|
|
while(c!=':')
|
|
{
|
|
CurrentOffset*=10;
|
|
CurrentOffset+=c-'0';
|
|
c=pt[++i];
|
|
if (!c) return;
|
|
}
|
|
|
|
if ((CurrentOffset==0) || (CurrentOffset==600))
|
|
{
|
|
g_GLI_ForcedAAAColor[0]=BLUE_R;
|
|
g_GLI_ForcedAAAColor[1]=BLUE_G;
|
|
g_GLI_ForcedAAAColor[2]=BLUE_B;
|
|
}
|
|
else if (CurrentOffset==200)
|
|
{
|
|
g_GLI_ForcedAAAColor[0]=RED_R;
|
|
g_GLI_ForcedAAAColor[1]=RED_G;
|
|
g_GLI_ForcedAAAColor[2]=RED_B;
|
|
}
|
|
else if (CurrentOffset==400)
|
|
{
|
|
g_GLI_ForcedAAAColor[0]=YELLOW_R;
|
|
g_GLI_ForcedAAAColor[1]=YELLOW_G;
|
|
g_GLI_ForcedAAAColor[2]=YELLOW_B;
|
|
}
|
|
}
|
|
else if (c=='C') /* CENTERING */
|
|
{
|
|
c=pt[++i];
|
|
if (!c) return;
|
|
if (c==':')
|
|
{
|
|
bCentering^=1;
|
|
if (bCentering)
|
|
{
|
|
x=(float)((1000-JFFTXT_iGetStringLength(&pt[i+1], dx))>>1);
|
|
}
|
|
|
|
} else return;
|
|
}
|
|
}
|
|
else if (c==32)
|
|
{
|
|
x+=(int)(FLOAT(dx)*0.6f);
|
|
RealChar++;
|
|
}
|
|
else /* Not a control character, we display the letter */
|
|
{
|
|
unsigned int c2;
|
|
float ftempy;
|
|
|
|
c2=(unsigned int)(c);
|
|
if (c>160) c2-=32;
|
|
c2-=32;
|
|
|
|
hVisualMaterial=(void *)GLI_pGetVisualMaterialForLetter(c2+CurrentOffset);
|
|
|
|
if (hVisualMaterial!=NULL)
|
|
{
|
|
if (CurrentOffset>=800) g_GLI_bForceAAAColor=0;
|
|
|
|
if (p->bOther & JFFTXT_SELECTED)
|
|
{
|
|
if (RealChar==p->EffectParameter)
|
|
{
|
|
GLI_vSetGlobalAlpha(FLOAT(p->ucTransparency>>1));
|
|
Waveeffect=7.0f*SINUS(g_ffFrameTime*5.0f);
|
|
}
|
|
else
|
|
{
|
|
GLI_vSetGlobalAlpha(FLOAT(p->ucTransparency));
|
|
Waveeffect=0.0f;
|
|
}
|
|
}
|
|
|
|
ftempy=(float)y;
|
|
|
|
if (c=='.')
|
|
{
|
|
ftempy+=(cy>>2);
|
|
}
|
|
else if (c==',')
|
|
{
|
|
ftempy+=(cy>>1);
|
|
}
|
|
else if (c=='\'')
|
|
{
|
|
ftempy-=(cy>>2);
|
|
}
|
|
|
|
|
|
GLI_vDraw2DSpriteWithPercent( p_stVpt,
|
|
FLOAT(x)*0.1f,
|
|
(ftempy-Waveeffect)*0.1f,
|
|
FLOAT(x+cx)*0.1f,
|
|
(FLOAT(ftempy+cy)+Waveeffect)*0.1f,
|
|
hVisualMaterial);
|
|
#ifdef U64
|
|
g_JFFTXT_DrawingTextFirstChar=0;
|
|
#endif
|
|
|
|
g_GLI_bForceAAAColor=1;
|
|
}
|
|
|
|
x+=dx;
|
|
RealChar++;
|
|
}
|
|
|
|
c=JFFTXT_toupper(pt[++i]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
**
|
|
** TRIANGLE GENERATION FOR INFO-DESIGN RESEARCH
|
|
**
|
|
*******************************************************************************/
|
|
|
|
|
|
#ifdef INFODESIGN_RESEARCH
|
|
|
|
|
|
#define MAX_AGO_TRIANGLES 200
|
|
|
|
#define AGO_TRI_FADE 0x00002
|
|
|
|
typedef struct AGO_Triangles_
|
|
{
|
|
float c[3][3];
|
|
float uv[3][2];
|
|
void *VisualMaterial;
|
|
unsigned long DelayTime;
|
|
unsigned long type;
|
|
float fTransparency;
|
|
unsigned long CreationTime;
|
|
|
|
} AGO_Triangles;
|
|
|
|
|
|
AGO_Triangles g_pAGO_Triangles[MAX_AGO_TRIANGLES];
|
|
unsigned long g_NbAGO_Triangles=0;
|
|
unsigned long g_AGO_NbEngineFramesSinceStart=0;
|
|
|
|
void AGO_vTrianglesInit(void)
|
|
{
|
|
g_NbAGO_Triangles=0;
|
|
}
|
|
|
|
void AGO_vCreateTriangle(float c1[3], float c2[3], float c3[3], void *VisualMat,
|
|
float U1, float V1,
|
|
float U2, float V2,
|
|
float U3, float V3,
|
|
float DelayTime,
|
|
unsigned long Parameter)
|
|
{
|
|
AGO_Triangles *p;
|
|
int i;
|
|
|
|
if (g_NbAGO_Triangles==MAX_AGO_TRIANGLES)
|
|
{
|
|
unsigned long Least;
|
|
int LeastIndex=0;
|
|
|
|
Least=g_pAGO_Triangles[0].CreationTime;
|
|
|
|
for(i=0;i<MAX_AGO_TRIANGLES;i++)
|
|
{
|
|
if (g_pAGO_Triangles[i].CreationTime<Least)
|
|
{
|
|
Least=g_pAGO_Triangles[i].CreationTime;
|
|
LeastIndex=i;
|
|
}
|
|
}
|
|
p=&(g_pAGO_Triangles[LeastIndex]);
|
|
}
|
|
else
|
|
{
|
|
p=&(g_pAGO_Triangles[g_NbAGO_Triangles++]);
|
|
}
|
|
|
|
p->CreationTime=g_AGO_NbEngineFramesSinceStart;
|
|
|
|
for(i=0;i<3;i++)
|
|
{
|
|
p->c[0][i]=c1[i];
|
|
p->c[1][i]=c2[i];
|
|
p->c[2][i]=c3[i];
|
|
}
|
|
p->uv[0][0]=U1; p->uv[0][1]=V1;
|
|
p->uv[1][0]=U2; p->uv[1][1]=V2;
|
|
p->uv[2][0]=U3; p->uv[2][1]=V3;
|
|
|
|
p->fTransparency=255.0f;
|
|
|
|
p->VisualMaterial=VisualMat;
|
|
p->DelayTime=(unsigned long)DelayTime;
|
|
|
|
p->type=0;
|
|
|
|
if (Parameter & 0x02) p->type|=AGO_TRI_FADE;
|
|
|
|
}
|
|
|
|
|
|
void AGO_vDisplayTriangles(GLD_tdstViewportAttributes *p_stVpt)
|
|
{
|
|
AGO_Triangles *p;
|
|
int i;
|
|
|
|
g_AGO_NbEngineFramesSinceStart++;
|
|
|
|
for(i=0;i<g_NbAGO_Triangles;i++)
|
|
{
|
|
p=&(g_pAGO_Triangles[i]);
|
|
|
|
if (p->type & AGO_TRI_FADE)
|
|
{
|
|
p->fTransparency=255.0f-255.0f*FLOAT(g_AGO_NbEngineFramesSinceStart-p->CreationTime-1)/FLOAT(p->DelayTime);
|
|
}
|
|
|
|
GLI_vSetGlobalAlpha(p->fTransparency);
|
|
|
|
GLI_vDisplayWorldTriangle(
|
|
p_stVpt,
|
|
p->c,
|
|
p->uv,
|
|
p->VisualMaterial);
|
|
|
|
if (g_AGO_NbEngineFramesSinceStart-p->CreationTime>=p->DelayTime)
|
|
{
|
|
p->type|=0x80000000;
|
|
}
|
|
}
|
|
|
|
i=0;
|
|
while(i<g_NbAGO_Triangles)
|
|
{
|
|
p=&(g_pAGO_Triangles[i]);
|
|
|
|
if (p->type & 0x80000000)
|
|
{
|
|
int j;
|
|
AGO_Triangles *p1;
|
|
AGO_Triangles *p2;
|
|
|
|
for(j=i+1;j<g_NbAGO_Triangles;j++)
|
|
{
|
|
p1=&(g_pAGO_Triangles[j-1]);
|
|
p2=&(g_pAGO_Triangles[j]);
|
|
memcpy(p1,p2,sizeof(AGO_Triangles));
|
|
}
|
|
|
|
g_NbAGO_Triangles--;
|
|
}
|
|
else i++;
|
|
}
|
|
}
|
|
|
|
|
|
#endif /* INFODESIGN_RESEARCH */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|