reman3/Rayman_X/cpa/tempgrp/GliGlou/MultiDRV/Src/sprite.c

1150 lines
48 KiB
C

/*
Tested with LINT
*/
#define MTH_LOW
#include "gli_st.h"
#include "GLI_Defn.h"
#include "mater_st.h"
#include "light_st.h"
#include "PvObj_st.h"
#include "material.h"
#include "GeoSprit.h"
#include "proj.h"
#include "linear.h"
#include "vpt3D.h"
#include "camera.h"
#include "DLLInter.h"
#include "sprite.h"
#include "GLI.h"
#include "sct.h"
#ifdef __cplusplus
extern "C"
{
#endif
/*
=======================================================================================
External & prototypes
=======================================================================================
*/
extern GLI_tdstInternalGlobalValuesFor3dEngine *GLI_BIG_GLOBALS;
extern ACP_tdxHandleOfMaterial gs_hDefaultMaterial;
extern void GLI_vDoMaterialSelection(GLI_tdstInternalGlobalValuesFor3dEngine *p_stGlobaleMT);
extern ACP_tdxBool HIE_fn_bIsSegmentIntersectedInCameraSector (POS_tdstCompletePosition *p_stCameraPos, POS_tdstCompletePosition *p_stSPOPos) ;
extern float GLI_vGetGlobalAlpha(void) ;
extern void GLI_vSetGlobalAlpha(float) ;
extern unsigned long fn_ulGetTrameNumber(void) ;
/*
* for AGO
*/
extern unsigned char g_bHasTextureAnimationFinished ;
extern MTH_tdxReal g_BaseTimeForParticleAnimation ;
extern unsigned char g_bHasTextureAnimationFinished ;
extern unsigned char g_bTakeCareOfAnimationCoordination ;
extern unsigned char g_bOneShotAnim ;
/*
=======================================================================================
Globals
=======================================================================================
*/
/*
* for lens flare
*/
tdstLensFlareTab g_stLensFlare ;
void *gp_vLensFlareRef = NULL;
/*
=======================================================================================
Function for Lens flare
=======================================================================================
*/
void GLI_vSetLensFlareRef ( void *p_vRef )
{
gp_vLensFlareRef = p_vRef ;
}
char GLI_cRegisterLensFlare (void *p_vRef)
{
long i ;
if ( p_vRef == NULL )
return (-1) ;
for ( i=0 ; i<g_stLensFlare.lNumberOfLensFlare ; i++ )
{
if ( g_stLensFlare.p_vReference[i] == p_vRef )
{
return ((char)i) ;
}
}
if ( g_stLensFlare.lNumberOfLensFlare < GLI_C_MaxLensFlare)
{
g_stLensFlare.p_vReference[g_stLensFlare.lNumberOfLensFlare] = p_vRef ;
g_stLensFlare.lApparitionTrame[g_stLensFlare.lNumberOfLensFlare] = fn_ulGetTrameNumber() ;
g_stLensFlare.lCounter[g_stLensFlare.lNumberOfLensFlare] = 0 ;
g_stLensFlare.bIntersect[g_stLensFlare.lNumberOfLensFlare] = 0 ;
g_stLensFlare.lNumberOfLensFlare++ ;
return (g_stLensFlare.lNumberOfLensFlare - 1) ;
}
return (-1) ;
}
void GLI_vUnregisterLensFlare(void *p_vRef)
{
int i ;
if ( p_vRef == NULL )
return ;
for ( i=0 ; i<g_stLensFlare.lNumberOfLensFlare ; i++ )
{
if ( g_stLensFlare.p_vReference[i] == p_vRef )
{
if ( i+1 < g_stLensFlare.lNumberOfLensFlare )
{
memcpy ( &g_stLensFlare.p_vReference[i], &g_stLensFlare.p_vReference[i+1], (g_stLensFlare.lNumberOfLensFlare-i)*sizeof(void *) ) ;
}
g_stLensFlare.lNumberOfLensFlare -- ;
break ;
}
}
}
long GLI_lLensFlareExist(void *p_vRef)
{
long i ;
if ( p_vRef == NULL )
return (-1) ;
for ( i=0 ; i<g_stLensFlare.lNumberOfLensFlare ; i++ )
{
if ( g_stLensFlare.p_vReference[i] == p_vRef )
return (i) ;
}
return (-1) ;
}
void GLI_vInitLensFlare (void)
{
g_stLensFlare.lNumberOfLensFlare = 0 ;
}
/*
----------------------------------------------------------------------------------------
Description : Draw specific sprite : lens flare as in Unreal game
Author : JM Drouaud
---------------------------------------------------------------------------------------
*/
void GLI_vDrawLensFlare
(
GLD_tdstViewportAttributes *p_stVpt ,
GEO_tdstGeometricObject *p_stObj ,
GEO_tdstIndexedSprite *p_stISpr ,
GLI_tdstInternalGlobalValuesFor3dEngine *p_stGlobaleMT
)
{
GLI_tdstAligned3DVector stScaledPt[3];
GLI_tdstAligned2DVector a4_st2DVertex[4];
ACP_tdxIndex xSpriteNumber;
unsigned long xSaveDrawMsk;
unsigned long lTrame ;
char cLensFlare ;
float alpha, percent ;
ACP_tdxBool bIntersected ;
cLensFlare = (char) GLI_lLensFlareExist( gp_vLensFlareRef );
lTrame = fn_ulGetTrameNumber() ;
if ( ( (lTrame & 0x1) ^ (cLensFlare & 0x1) ) )
{
bIntersected = HIE_fn_bIsSegmentIntersectedInCameraSector (p_stGlobaleMT->gs_st_CameraMatrix, p_stGlobaleMT->gs_st_CurrentMatrix) ;
if ( cLensFlare >= 0 )
{
if ( g_stLensFlare.bIntersect[cLensFlare] != bIntersected )
g_stLensFlare.lCounter[cLensFlare] = 0 ;
g_stLensFlare.bIntersect[cLensFlare] = bIntersected ;
}
}
else
{
if ( cLensFlare >= 0 )
{
if ( lTrame - g_stLensFlare.lApparitionTrame[cLensFlare] < GLI_C_lMaxTimeForLensFlare )
{
bIntersected = g_stLensFlare.bIntersect[cLensFlare] ;
}
else
{
bIntersected = HIE_fn_bIsSegmentIntersectedInCameraSector (p_stGlobaleMT->gs_st_CameraMatrix, p_stGlobaleMT->gs_st_CurrentMatrix) ;
if ( g_stLensFlare.bIntersect[cLensFlare] != bIntersected )
g_stLensFlare.lCounter[cLensFlare] = 0 ;
g_stLensFlare.bIntersect[cLensFlare] = bIntersected ;
}
}
else
{
return ;
}
}
percent = 1.0f ;
if ( bIntersected )
{
lTrame -= g_stLensFlare.lApparitionTrame[cLensFlare] ;
if ( cLensFlare >= 0 )
{
if ( lTrame < GLI_C_lMaxTimeForLensFlare )
{
percent = (float)(GLI_C_lMaxTimeForLensFlare - lTrame) / GLI_C_lMaxTimeForLensFlare ;
}
else
{
GLI_vUnregisterLensFlare (gp_vLensFlareRef) ;
return ;
}
}
else
{
return ;
}
}
else
{
cLensFlare = GLI_cRegisterLensFlare(gp_vLensFlareRef) ;
g_stLensFlare.lApparitionTrame[cLensFlare] = lTrame ;
if ( g_stLensFlare.lCounter[cLensFlare] < 4 )
{
percent = (float)(g_stLensFlare.lCounter[cLensFlare]) / GLI_C_lMaxTimeForLensFlare ;
g_stLensFlare.lCounter[cLensFlare]++ ;
}
}
xSpriteNumber = 0;
stScaledPt[0].xX = p_stISpr -> hSprite -> d_xSizeOfSprite[xSpriteNumber].xX;
stScaledPt[0].xY = 0.0;
stScaledPt[1].xX = 0.0;
stScaledPt[1].xY = -p_stISpr -> hSprite -> d_xSizeOfSprite[xSpriteNumber].xY;
if (!POS_fn_ulIsNotScaledMatrix ( &p_stGlobaleMT -> gs_st_CurrentMatrixMultiplyedWithCameraMatrix))
{
MTH_tdxReal xScaleX;
MTH_tdxReal xScaleY;
xScaleX = POS_fn_xGetXScale(&(p_stGlobaleMT->gs_st_CurrentMatrixMultiplyedWithCameraMatrix));
xScaleY = POS_fn_xGetYScale(&(p_stGlobaleMT->gs_st_CurrentMatrixMultiplyedWithCameraMatrix));
stScaledPt[0].xX = xScaleX * p_stISpr -> hSprite -> d_xSizeOfSprite[xSpriteNumber].xX;
stScaledPt[1].xY = xScaleY * (-p_stISpr -> hSprite -> d_xSizeOfSprite[xSpriteNumber].xY);
}
a4_st2DVertex [0] . xX = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX + (stScaledPt[0] . xX + stScaledPt[1] . xX)*percent);
a4_st2DVertex [0] . xY = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY + (stScaledPt[0] . xY + stScaledPt[1] . xY)*percent);
a4_st2DVertex [1] . xX = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX + (-stScaledPt[0] . xX + stScaledPt[1] . xX)*percent);
a4_st2DVertex [1] . xY = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY + (-stScaledPt[0] . xY + stScaledPt[1] . xY)*percent);
a4_st2DVertex [2] . xX = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX + (-stScaledPt[0] . xX - stScaledPt[1] . xX)*percent);
a4_st2DVertex [2] . xY = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY + (-stScaledPt[0] . xY - stScaledPt[1] . xY)*percent);
a4_st2DVertex [3] . xX = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX + (stScaledPt[0] . xX - stScaledPt[1] . xX)*percent);
a4_st2DVertex [3] . xY = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY + (stScaledPt[0] . xY - stScaledPt[1] . xY)*percent);
if ( percent < 100 )
{
alpha = GLI_vGetGlobalAlpha() * percent ;
GLI_vSetGlobalAlpha( alpha ) ;
}
p_stGlobaleMT -> hCurrentMaterial = GMT_fn_hGetVisualMaterial(p_stISpr -> hSprite -> d_hMaterial[xSpriteNumber]);
xSaveDrawMsk = p_stGlobaleMT -> lHierachDrawMask ;
p_stGlobaleMT -> lHierachDrawMask &= ~GLI_C_lIsTestingBackface;
p_stGlobaleMT->ulSpecularColorForSprite = ((unsigned long *) p_stGlobaleMT->GLI_aDEF_stColorsRLIS)[p_stISpr -> xCenterPoint];
GLI_vDoMaterialSelection(p_stGlobaleMT);
GLI_DRV_vSendSpriteToClip( a4_st2DVertex , MTH_M_xLongToReal(1), p_stGlobaleMT);
gp_vLensFlareRef = NULL ;
p_stGlobaleMT -> lHierachDrawMask = xSaveDrawMsk;
}
/*
=======================================================================================
Indexed sprite functions
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : Draw indexed sprite
This function assumes that scale is always diagonal
Author : Steve McCalla
---------------------------------------------------------------------------------------
*/
void GLI_vDrawIndexedSprite
(
GLD_tdstViewportAttributes *p_stVpt ,
GEO_tdstGeometricObject *p_stObj ,
GEO_tdstIndexedSprite *p_stISpr ,
GLI_tdstInternalGlobalValuesFor3dEngine *p_stGlobaleMT
)
{
GLI_tdstAligned3DVector stScaledPt[3];
GLI_tdstAligned2DVector a4_st2DVertex [4];
GLI_tdstAligned2DVector a2_st2DVertexLocal[3];
ACP_tdxIndex xSpriteNumber;
MTH_tdxReal xTempZ;
unsigned long xSaveDrawMsk;
xSpriteNumber = 0;
if ( (p_stISpr -> hSprite == NULL)
|| ( (p_stGlobaleMT->GLI_ScreenPoint + p_stISpr->xCenterPoint)->xOoZ < 0.0f)
|| ( p_stISpr->hSprite->d_xSpriteDrawMode[xSpriteNumber] & GEO_C_lSpriteDrawDisable) )
return;
assert (p_stISpr->hSprite->xNbSprites == 1);
assert (!(p_stISpr->hSprite->d_xSpriteDrawMode[xSpriteNumber] & GEO_C_lSpriteDrawMode2DRotativ));
assert (p_stISpr->stSize.xX == 1.0);
assert (p_stISpr->stSize.xY == 1.0);
stScaledPt[0].xX = p_stISpr->hSprite->d_xSizeOfSprite[xSpriteNumber].xX;
stScaledPt[0].xY = 0.0;
stScaledPt[1].xX = 0.0;
stScaledPt[1].xY = -p_stISpr->hSprite->d_xSizeOfSprite[xSpriteNumber].xY;
stScaledPt[2].xX = 0.0;
stScaledPt[2].xY = 0.0;
if ( (p_stISpr->hSprite->d_xSpriteDrawMode[xSpriteNumber] & GEO_C_lSpriteDrawModeLensFlare) )
{
GLI_vDrawLensFlare(p_stVpt, p_stObj, p_stISpr, p_stGlobaleMT) ;
return ;
}
if (!POS_fn_ulIsNotScaledMatrix ( &p_stGlobaleMT -> gs_st_CurrentMatrixMultiplyedWithCameraMatrix))
{
MTH_tdxReal xScaleX;
MTH_tdxReal xScaleY;
xScaleX = POS_fn_xGetXScale(&(p_stGlobaleMT->gs_st_CurrentMatrixMultiplyedWithCameraMatrix));
xScaleY = POS_fn_xGetYScale(&(p_stGlobaleMT->gs_st_CurrentMatrixMultiplyedWithCameraMatrix));
stScaledPt[0].xX = xScaleX * p_stISpr->hSprite->d_xSizeOfSprite[xSpriteNumber].xX;
stScaledPt[1].xY = xScaleY * (-p_stISpr->hSprite->d_xSizeOfSprite[xSpriteNumber].xY);
}
xTempZ = p_stGlobaleMT->GLI_TurnedScaledDisplecedPoint[p_stISpr->xCenterPoint].xZ;
stScaledPt[0].xZ = xTempZ;
stScaledPt[1].xZ = xTempZ;
stScaledPt[2].xZ = xTempZ;
if (p_stISpr->hSprite->d_xSpriteDrawMode[xSpriteNumber] & GEO_C_lSpriteDrawMode2DScaled)
{
GLI_xSerialProjectionNoTrans ( (( GLI_tdstSpecificAttributesFor3D *)p_stVpt->p_vSpecificToXD)->p_stCam, 3, stScaledPt, a2_st2DVertexLocal);
a4_st2DVertex[0].xX = p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xX - a2_st2DVertexLocal[0].xX - a2_st2DVertexLocal[1].xX + a2_st2DVertexLocal[2].xX;
a4_st2DVertex[0].xY = p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xY - a2_st2DVertexLocal[0].xY - a2_st2DVertexLocal[1].xY + a2_st2DVertexLocal[2].xY;
a4_st2DVertex[1].xX = p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xX + a2_st2DVertexLocal[0].xX - a2_st2DVertexLocal[1].xX + a2_st2DVertexLocal[2].xX;
a4_st2DVertex[1].xY = p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xY + a2_st2DVertexLocal[0].xY - a2_st2DVertexLocal[1].xY + a2_st2DVertexLocal[2].xY;
a4_st2DVertex[2].xX = p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xX + a2_st2DVertexLocal[0].xX + a2_st2DVertexLocal[1].xX + a2_st2DVertexLocal[2].xX;
a4_st2DVertex[2].xY = p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xY + a2_st2DVertexLocal[0].xY + a2_st2DVertexLocal[1].xY + a2_st2DVertexLocal[2].xY;
a4_st2DVertex[3].xX = p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xX - a2_st2DVertexLocal[0].xX + a2_st2DVertexLocal[1].xX + a2_st2DVertexLocal[2].xX;
a4_st2DVertex[3].xY = p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xY - a2_st2DVertexLocal[0].xY + a2_st2DVertexLocal[1].xY + a2_st2DVertexLocal[2].xY;
}
else
{
a4_st2DVertex[0].xX = (float)(p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xX + stScaledPt[0].xX + stScaledPt[1].xX);
a4_st2DVertex[0].xY = (float)(p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xY + stScaledPt[0].xY + stScaledPt[1].xY);
a4_st2DVertex[1].xX = (float)(p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xX - stScaledPt[0].xX + stScaledPt[1].xX);
a4_st2DVertex[1].xY = (float)(p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xY - stScaledPt[0].xY + stScaledPt[1].xY);
a4_st2DVertex[2].xX = (float)(p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xX - stScaledPt[0].xX - stScaledPt[1].xX);
a4_st2DVertex[2].xY = (float)(p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xY - stScaledPt[0].xY - stScaledPt[1].xY);
a4_st2DVertex[3].xX = (float)(p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xX + stScaledPt[0].xX - stScaledPt[1].xX);
a4_st2DVertex[3].xY = (float)(p_stGlobaleMT->GLI_ScreenPoint[ p_stISpr->xCenterPoint ].xY + stScaledPt[0].xY - stScaledPt[1].xY);
}
p_stGlobaleMT -> hCurrentMaterial = GMT_fn_hGetVisualMaterial(p_stISpr -> hSprite -> d_hMaterial[xSpriteNumber]);
xSaveDrawMsk = p_stGlobaleMT->lHierachDrawMask ;
p_stGlobaleMT->lHierachDrawMask &= ~GLI_C_lIsTestingBackface;
p_stGlobaleMT->ulSpecularColorForSprite = ((unsigned long *) p_stGlobaleMT->GLI_aDEF_stColorsRLIS)[p_stISpr->xCenterPoint];
GLI_vDoMaterialSelection(p_stGlobaleMT);
GLI_DRV_vSendSpriteToClip( a4_st2DVertex , p_stGlobaleMT->GLI_ScreenPoint[p_stISpr->xCenterPoint].xOoZ, p_stGlobaleMT);
p_stGlobaleMT->lHierachDrawMask = xSaveDrawMsk;
}
/*
----------------------------------------------------------------------------------------
Description : pick indexed sprite
return's !0 if p_stScreenCoord is in the sprite.
---------------------------------------------------------------------------------------
*/
#define GLI_M_bIsOnTheLeft(a,b) ( (a4_st2DVertex[b].xY - a4_st2DVertex[a].xY) * (p_stScreenCoord->xX - a4_st2DVertex[a].xX) > (a4_st2DVertex[b].xX - a4_st2DVertex[a].xX) * (p_stScreenCoord->xY - a4_st2DVertex[a].xY) )
long GLI_vPickIndexedSprite
(
GLD_tdstViewportAttributes *p_stVpt ,
GEO_tdstGeometricObject *p_stObj ,
GEO_tdstIndexedSprite *p_stISpr ,
MTH2D_tdstVector *p_stScreenCoord,
GLI_tdstInternalGlobalValuesFor3dEngine *p_stGlobaleMT
)
{
#ifdef _DEBUG
ACP_tdxHandleOfMaterial hVisualMat;
GLI_tdstAligned3DVector stScaledPt[3];
GLI_tdstAligned2DVector a4_st2DVertex [4];
GLI_tdstAligned2DVector a2_st2DVertexLocal[3];
ACP_tdxIndex xSpriteNumber;
MTH_tdxReal xTempZ; /* make this a MTH_XXX something or another*/
xSpriteNumber = 0;
if ((p_stISpr -> hSprite == NULL) || ((p_stGlobaleMT -> GLI_ScreenPoint + p_stISpr -> xCenterPoint) -> xOoZ < 0.0f) || (p_stISpr -> hSprite -> d_xSpriteDrawMode[xSpriteNumber] & GEO_C_lSpriteDrawDisable))
return 0;
assert (p_stISpr -> hSprite -> xNbSprites == 1);
assert (!(p_stISpr -> hSprite -> d_xSpriteDrawMode[xSpriteNumber] & GEO_C_lSpriteDrawMode2DRotativ));
assert (p_stISpr -> stSize.xX == 1.0);
assert (p_stISpr -> stSize.xY == 1.0);
stScaledPt[0].xX = p_stISpr -> hSprite -> d_xSizeOfSprite[xSpriteNumber].xX;
stScaledPt[0].xY = 0.0;
stScaledPt[1].xX = 0.0;
stScaledPt[1].xY = -p_stISpr -> hSprite -> d_xSizeOfSprite[xSpriteNumber].xY;
stScaledPt[2].xX = 0.0;
stScaledPt[2].xY = 0.0;
if (!POS_fn_ulIsNotScaledMatrix ( &p_stGlobaleMT -> gs_st_CurrentMatrixMultiplyedWithCameraMatrix))
{
MTH_tdxReal xScaleX;
MTH_tdxReal xScaleY;
xScaleX = POS_fn_xGetXScale(&(p_stGlobaleMT->gs_st_CurrentMatrixMultiplyedWithCameraMatrix));
xScaleY = POS_fn_xGetYScale(&(p_stGlobaleMT->gs_st_CurrentMatrixMultiplyedWithCameraMatrix));
stScaledPt[0].xX = xScaleX * p_stISpr -> hSprite -> d_xSizeOfSprite[xSpriteNumber].xX;
stScaledPt[1].xY = xScaleY * (-p_stISpr -> hSprite -> d_xSizeOfSprite[xSpriteNumber].xY);
}
xTempZ = p_stGlobaleMT->GLI_TurnedScaledDisplecedPoint[p_stISpr->xCenterPoint].xZ;
stScaledPt[0].xZ = xTempZ;
stScaledPt[1].xZ = xTempZ;
stScaledPt[2].xZ = xTempZ;
if (p_stISpr -> hSprite -> d_xSpriteDrawMode[xSpriteNumber] & GEO_C_lSpriteDrawMode2DScaled)
{
GLI_xSerialProjectionNoTrans ( (( GLI_tdstSpecificAttributesFor3D *)p_stVpt->p_vSpecificToXD)->p_stCam, 3, stScaledPt, a2_st2DVertexLocal);
a4_st2DVertex [0] . xX = p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX - a2_st2DVertexLocal[0] . xX - a2_st2DVertexLocal[1] . xX + a2_st2DVertexLocal[2] . xX ;
a4_st2DVertex [0] . xY = p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY - a2_st2DVertexLocal[0] . xY - a2_st2DVertexLocal[1] . xY + a2_st2DVertexLocal[2] . xY ;
a4_st2DVertex [1] . xX = p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX + a2_st2DVertexLocal[0] . xX - a2_st2DVertexLocal[1] . xX + a2_st2DVertexLocal[2] . xX ;
a4_st2DVertex [1] . xY = p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY + a2_st2DVertexLocal[0] . xY - a2_st2DVertexLocal[1] . xY + a2_st2DVertexLocal[2] . xY ;
a4_st2DVertex [2] . xX = p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX + a2_st2DVertexLocal[0] . xX + a2_st2DVertexLocal[1] . xX + a2_st2DVertexLocal[2] . xX ;
a4_st2DVertex [2] . xY = p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY + a2_st2DVertexLocal[0] . xY + a2_st2DVertexLocal[1] . xY + a2_st2DVertexLocal[2] . xY ;
a4_st2DVertex [3] . xX = p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX - a2_st2DVertexLocal[0] . xX + a2_st2DVertexLocal[1] . xX + a2_st2DVertexLocal[2] . xX ;
a4_st2DVertex [3] . xY = p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY - a2_st2DVertexLocal[0] . xY + a2_st2DVertexLocal[1] . xY + a2_st2DVertexLocal[2] . xY ;
}
else
{
a4_st2DVertex [0] . xX = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX + stScaledPt[0] . xX + stScaledPt[1] . xX);
a4_st2DVertex [0] . xY = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY + stScaledPt[0] . xY + stScaledPt[1] . xY);
a4_st2DVertex [1] . xX = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX - stScaledPt[0] . xX + stScaledPt[1] . xX);
a4_st2DVertex [1] . xY = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY - stScaledPt[0] . xY + stScaledPt[1] . xY);
a4_st2DVertex [2] . xX = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX - stScaledPt[0] . xX - stScaledPt[1] . xX);
a4_st2DVertex [2] . xY = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY - stScaledPt[0] . xY - stScaledPt[1] . xY);
a4_st2DVertex [3] . xX = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xX + stScaledPt[0] . xX - stScaledPt[1] . xX);
a4_st2DVertex [3] . xY = (float)(p_stGlobaleMT->GLI_ScreenPoint [p_stISpr -> xCenterPoint] . xY + stScaledPt[0] . xY - stScaledPt[1] . xY);
}
hVisualMat=GMT_fn_hGetVisualMaterial(p_stISpr -> hSprite -> d_hMaterial[xSpriteNumber]);
if (GLI_M_bIsOnTheLeft(0,1))
if (GLI_M_bIsOnTheLeft(1,2))
if (GLI_M_bIsOnTheLeft(2,3))
if (GLI_M_bIsOnTheLeft(3,0))
return ( 1 );
#endif
return(0);
}
/*
=======================================================================================
2D Sprite
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : draw 2D sprite
---------------------------------------------------------------------------------------
*/
void GLI_vDraw2DSprite( GLD_tdstViewportAttributes *p_stVpt ,MTH_tdxReal xXMin,MTH_tdxReal xXMax,MTH_tdxReal xYMin,MTH_tdxReal xYMax,ACP_tdxHandleOfMaterial hMaterial)
{
GLI_tdstAligned2DVector a4_st2DVertex [5];
GEO_tdstColor stLocalColor;
stLocalColor.xG = stLocalColor.xB = stLocalColor.xR = 0.0f;
GLI_xSetMaterialAmbientCoef(hMaterial , &stLocalColor);
stLocalColor.xG = stLocalColor.xB = stLocalColor.xR = 1.0f;
GLI_xSetMaterialDiffuseCoef(hMaterial , &stLocalColor);
stLocalColor.xG = stLocalColor.xB = stLocalColor.xR = 0.0f;
GLI_xSetMaterialSpecularCoef(hMaterial , 0 , &stLocalColor);
a4_st2DVertex[0].xX = (float)(long)xXMin;
a4_st2DVertex[0].xY = (float)(long)xYMin;
a4_st2DVertex[0].xOoZ =1.0f;
a4_st2DVertex[1].xX = (float)(long)xXMax;
a4_st2DVertex[1].xY = (float)(long)xYMin;
a4_st2DVertex[1].xOoZ =1.0f;
a4_st2DVertex[2].xX = (float)(long)xXMax;
a4_st2DVertex[2].xY = (float)(long)xYMax;
a4_st2DVertex[2].xOoZ =1.0f;
a4_st2DVertex[3].xX = (float)(long)xXMin;
a4_st2DVertex[3].xY = (float)(long)xYMax;
a4_st2DVertex[3].xOoZ =1.0f;
GLI_BIG_GLOBALS->hCurrentMaterial = hMaterial;
GLI_BIG_GLOBALS->hCurrentMaterial->xMaterialType = 0xFFFFFFFF - GLI_C_lIsTestingBackface;
GLI_BIG_GLOBALS->lCurrentDrawMask = 0xFFFFFFFF - GLI_C_lIsTestingBackface;
GLI_BIG_GLOBALS->lHierachDrawMask = 0xFFFFFFFF - GLI_C_lIsTestingBackface;
GLI_vDoMaterialSelection(GLI_BIG_GLOBALS );
GLI_DRV_vSendSpriteToClip( a4_st2DVertex , 1.0f/*1.0f / GLI_C_xZClippingNear*/, GLI_BIG_GLOBALS);
}
/*
----------------------------------------------------------------------------------------
Description : draw 2D sprite with UV mapping coordinates
---------------------------------------------------------------------------------------
*/
void GLI_vDraw2DSpriteWithUV
(
GLD_tdstViewportAttributes *p_stVpt ,
MTH_tdxReal xXMin,
MTH_tdxReal xXMax,
MTH_tdxReal xYMin,
MTH_tdxReal xYMax,
MTH_tdxReal xUMin,
MTH_tdxReal xUMax,
MTH_tdxReal xVMin,
MTH_tdxReal xVMax,
ACP_tdxHandleOfMaterial hMaterial
)
{
GLI_tdstAligned2DVector a4_st2DVertex [5];
MTH_tdxReal a4_stUVVertex [10];
GEO_tdstColor stLocalColor;
stLocalColor.xG = stLocalColor.xB = stLocalColor.xR = 0.0f;
GLI_xSetMaterialAmbientCoef(hMaterial , &stLocalColor);
stLocalColor.xG = stLocalColor.xB = stLocalColor.xR = 1.0f;
GLI_xSetMaterialDiffuseCoef(hMaterial , &stLocalColor);
stLocalColor.xG = stLocalColor.xB = stLocalColor.xR = 0.0f;
GLI_xSetMaterialSpecularCoef(hMaterial , 0 , &stLocalColor);
a4_st2DVertex[0].xX = (float)(long)xXMin;
a4_st2DVertex[0].xY = (float)(long)xYMin;
a4_st2DVertex[0].xOoZ =1.0f;
a4_st2DVertex[1].xX = (float)(long)xXMax;
a4_st2DVertex[1].xY = (float)(long)xYMin;
a4_st2DVertex[1].xOoZ =1.0f;
a4_st2DVertex[2].xX = (float)(long)xXMax;
a4_st2DVertex[2].xY = (float)(long)xYMax;
a4_st2DVertex[2].xOoZ =1.0f;
a4_st2DVertex[3].xX = (float)(long)xXMin;
a4_st2DVertex[3].xY = (float)(long)xYMax;
a4_st2DVertex[3].xOoZ =1.0f;
a4_stUVVertex[0] = xUMin;
a4_stUVVertex[0+1] = xVMin;
a4_stUVVertex[2] = xUMax;
a4_stUVVertex[2+1] = xVMin;
a4_stUVVertex[4] = xUMax;
a4_stUVVertex[4+1] = xVMax;
a4_stUVVertex[6] = xUMin;
a4_stUVVertex[6+1] = xVMax;
GLI_BIG_GLOBALS->hCurrentMaterial = hMaterial;
GLI_BIG_GLOBALS->hCurrentMaterial->xMaterialType = 0xFFFFFFFF - GLI_C_lIsTestingBackface;
GLI_BIG_GLOBALS->lCurrentDrawMask = 0xFFFFFFFF - GLI_C_lIsTestingBackface;
GLI_BIG_GLOBALS->lHierachDrawMask = 0xFFFFFFFF - GLI_C_lIsTestingBackface;
GLI_vDoMaterialSelection(GLI_BIG_GLOBALS );
//GLI_DRV_vSendSpriteToClipWithUV ( a4_st2DVertex ,a4_stUVVertex ,1.0f / GLI_C_xZClippingNear,GLI_BIG_GLOBALS);
GLI_DRV_vSendSpriteToClipWithUV ( a4_st2DVertex ,a4_stUVVertex , 1.0f, GLI_BIG_GLOBALS);
}
/*
----------------------------------------------------------------------------------------
Description : draw 2D sprite but coordinates are percent of screen
---------------------------------------------------------------------------------------
*/
char g_GLI_bForceAAAColor = 0;
unsigned char g_GLI_ForcedAAAColor[3];
float GLI_g_fZValueForSprite = 1.0f;
void GLI_vDraw2DSpriteWithPercent( GLD_tdstViewportAttributes *_p_stViewport, float XMin, float YMin, float XMax, float YMax, ACP_tdxHandleOfMaterial hMaterial)
{
float x1, x2, y1, y2;
GLI_tdstAligned2DVector a4_st2DVertex[4];
x1 = (XMin / 100.0f) * _p_stViewport->dwWidth;
x2 = (XMax / 100.0f) * _p_stViewport->dwWidth;
y1 = (YMin / 100.0f) * _p_stViewport->dwHeight;
y2 = (YMax / 100.0f) * _p_stViewport->dwHeight;
a4_st2DVertex[0].xX = x2;
a4_st2DVertex[0].xY = y1;
a4_st2DVertex[0].xOoZ =1.0f;
a4_st2DVertex[1].xX = x1;
a4_st2DVertex[1].xY = y1;
a4_st2DVertex[1].xOoZ =1.0f;
a4_st2DVertex[2].xX = x1;
a4_st2DVertex[2].xY = y2;
a4_st2DVertex[2].xOoZ =1.0f;
a4_st2DVertex[3].xX = x2;
a4_st2DVertex[3].xY = y2;
a4_st2DVertex[3].xOoZ =1.0f;
GLI_BIG_GLOBALS->hCurrentMaterial = hMaterial;
GLI_BIG_GLOBALS->lCurrentDrawMask =
GLI_BIG_GLOBALS->lHierachDrawMask =
GLI_BIG_GLOBALS->hCurrentMaterial->xMaterialType = 0xFFFFFFFF - GLI_C_lIsTestingBackface - GLI_C_lIsNotGrided /* - GLI_C_lIsEnableZSorting*/ ;
GLI_vDoMaterialSelection(GLI_BIG_GLOBALS );
if( g_GLI_bForceAAAColor )
{
/* Keep computed alpha */
GLI_BIG_GLOBALS->ulColorInitForSprite &= 0xff000000;
/* Force color */
GLI_BIG_GLOBALS->ulColorInitForSprite |= g_GLI_ForcedAAAColor[0] << 16 | g_GLI_ForcedAAAColor[1] << 8 | g_GLI_ForcedAAAColor[2];
}
GLI_DRV_vSendSpriteToClip( a4_st2DVertex , GLI_g_fZValueForSprite/*1.0f / GLI_C_xZClippingNear*/, GLI_BIG_GLOBALS);
}
/*
----------------------------------------------------------------------------------------
Description : Display a black transparent rectangle
in : a3_fPosition -> X,Y in percent of screen size (Z is ignored) of UpperLeft
a3_fDirection -> X,Y in percent of screen size (Z is ignored) of LowerRight
Transparency -> Opacity of the black frame
----------------------------------------------------------------------------------------
*/
void GLI_vDisplayFrame( float *a3_fPosition, float *a3_fDirection, float _f_Transparency, GLD_tdstViewportAttributes *_p_stViewport )
{
float f_SaveAlpha;
f_SaveAlpha = GLI_vGetGlobalAlpha();
GLI_vSetGlobalAlpha( _f_Transparency );
gs_hDefaultMaterial->stAmbient.xR = gs_hDefaultMaterial->stAmbient.xG = gs_hDefaultMaterial->stAmbient.xB = 0;
GLI_vDraw2DSpriteWithPercent( _p_stViewport, a3_fPosition[0], a3_fPosition[1], a3_fDirection[0], a3_fDirection[1] , gs_hDefaultMaterial );
GLI_vSetGlobalAlpha( f_SaveAlpha );
}
/*
=======================================================================================
Special functions for AGO
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : draw a sprite (used by ago)
----------------------------------------------------------------------------------------
*/
int GLI_vDrawWorldSprite
(
float *a3_fPosition,
void *pVisualMaterial,
float fscaleX,
float fscaleY,
GLD_tdstViewportAttributes *_p_stViewport,
unsigned long AnimTime
)
{
GLI_tdstCamera *p_stCam ;
MTH3D_tdstVector stSrc, stDest;
unsigned long xSaveDrawMsk;
float xOoZ;
GLI_tdstAligned2DVector st2DDest, st2DVertex[4] ;
GLI_tdstAligned3DVector stScaledPt[3];
GLI_tdstAligned2DVector a3_st2DVertexLocal[3];
p_stCam = (( GLI_tdstSpecificAttributesFor3D *)_p_stViewport->p_vSpecificToXD)->p_stCam ;
g_bTakeCareOfAnimationCoordination = 1;
g_BaseTimeForParticleAnimation = (float)AnimTime;
g_bOneShotAnim=1;
g_bHasTextureAnimationFinished = 0 ;
stSrc.xX = a3_fPosition[0];
stSrc.xY = a3_fPosition[1];
stSrc.xZ = a3_fPosition[2];
POS_fn_vMulMatrixVertex( &stDest, &(p_stCam->stMatrix), &stSrc);
GLI_xSerialProjection (p_stCam, 1, (GLI_tdstAligned3DVector *)&stDest, &st2DDest ) ;
xOoZ = stDest.xZ ;
stScaledPt[0].xX = fscaleX ;
stScaledPt[0].xY = 0.0f ;
stScaledPt[0].xZ = xOoZ ;
stScaledPt[1].xX = 0.0f ;
stScaledPt[1].xY = -fscaleY ;
stScaledPt[1].xZ = xOoZ ;
stScaledPt[2].xX = 0.0f ;
stScaledPt[2].xY = 0.0f ;
stScaledPt[2].xZ = xOoZ ;
GLI_xSerialProjectionNoTrans ( p_stCam, 3, stScaledPt, a3_st2DVertexLocal);
st2DVertex[0].xX = (float)(st2DDest.xX - a3_st2DVertexLocal[0].xX - a3_st2DVertexLocal[1].xX + a3_st2DVertexLocal[2].xX);
st2DVertex[0].xY = (float)(st2DDest.xY - a3_st2DVertexLocal[0].xY - a3_st2DVertexLocal[1].xY + a3_st2DVertexLocal[2].xY);
st2DVertex[1].xX = (float)(st2DDest.xX + a3_st2DVertexLocal[0].xX - a3_st2DVertexLocal[1].xX + a3_st2DVertexLocal[2].xX);
st2DVertex[1].xY = (float)(st2DDest.xY + a3_st2DVertexLocal[0].xY - a3_st2DVertexLocal[1].xY + a3_st2DVertexLocal[2].xY);
st2DVertex[2].xX = (float)(st2DDest.xX + a3_st2DVertexLocal[0].xX + a3_st2DVertexLocal[1].xX + a3_st2DVertexLocal[2].xX);
st2DVertex[2].xY = (float)(st2DDest.xY + a3_st2DVertexLocal[0].xY + a3_st2DVertexLocal[1].xY + a3_st2DVertexLocal[2].xY);
st2DVertex[3].xX = (float)(st2DDest.xX - a3_st2DVertexLocal[0].xX + a3_st2DVertexLocal[1].xX + a3_st2DVertexLocal[2].xX);
st2DVertex[3].xY = (float)(st2DDest.xY - a3_st2DVertexLocal[0].xY + a3_st2DVertexLocal[1].xY + a3_st2DVertexLocal[2].xY);
g_bTakeCareOfAnimationCoordination=1;
g_BaseTimeForParticleAnimation = (float)AnimTime;
g_bOneShotAnim=1;
g_bHasTextureAnimationFinished = 0 ;
GLI_BIG_GLOBALS->hCurrentMaterial = (ACP_tdxHandleOfMaterial) pVisualMaterial;
xSaveDrawMsk = GLI_BIG_GLOBALS->lHierachDrawMask ;
GLI_BIG_GLOBALS->lHierachDrawMask = 0xFFFFFFFF - GLI_C_lIsTestingBackface - GLI_C_lIsNotGrided ;
/*GLI_BIG_GLOBALS -> lCurrentDrawMask = GLI_BIG_GLOBALS->lHierachDrawMask ;*/
GLI_vDoMaterialSelection(GLI_BIG_GLOBALS);
*(long *) &GLI_BIG_GLOBALS->xWaterPlaneDistance = 0;
if ( ( st2DDest.xOoZ > 0 ) && ( st2DDest.xOoZ <= 4 ) )
GLI_DRV_vSendSpriteToClip( st2DVertex, st2DDest.xOoZ, GLI_BIG_GLOBALS);
GLI_BIG_GLOBALS->lHierachDrawMask = xSaveDrawMsk ;
g_bTakeCareOfAnimationCoordination=0;
g_bOneShotAnim=0;
return (g_bHasTextureAnimationFinished) ;
}
/*
----------------------------------------------------------------------------------------
Description : draw a sprite on horizontal plane (World Z axis is a normal of sprite)
----------------------------------------------------------------------------------------
*/
int GLI_vDrawWorldPlanarSprite
(
float *a3_fPosition,
void *pVisualMaterial,
float fscaleX,
float fscaleY,
GLD_tdstViewportAttributes *_p_stViewport,
unsigned long AnimTime
)
{
GLI_tdstCamera *p_stCam ;
unsigned long xSaveDrawMsk;
MTH3D_tdstVector st3DVertex[5] ;
GLI_tdstAligned3DVector st3DTurnedVertex[5] ;
GLI_tdstAligned2DVector st2DVertex[5] ;
p_stCam = (( GLI_tdstSpecificAttributesFor3D *)_p_stViewport->p_vSpecificToXD)->p_stCam ;
st3DVertex[0].xX = a3_fPosition[0] - fscaleX ;
st3DVertex[0].xY = a3_fPosition[1] - fscaleY ;
st3DVertex[0].xZ = a3_fPosition[2] ;
st3DVertex[1].xX = a3_fPosition[0] + fscaleX ;
st3DVertex[1].xY = a3_fPosition[1] - fscaleY ;
st3DVertex[1].xZ = a3_fPosition[2] ;
st3DVertex[2].xX = a3_fPosition[0] + fscaleX ;
st3DVertex[2].xY = a3_fPosition[1] + fscaleY ;
st3DVertex[2].xZ = a3_fPosition[2] ;
st3DVertex[3].xX = a3_fPosition[0] - fscaleX ;
st3DVertex[3].xY = a3_fPosition[1] + fscaleY ;
st3DVertex[3].xZ = a3_fPosition[2] ;
st3DVertex[4].xX = a3_fPosition[0] ;
st3DVertex[4].xY = a3_fPosition[1] ;
st3DVertex[4].xZ = a3_fPosition[2] ;
memcpy( st3DTurnedVertex, GLI_BIG_GLOBALS->GLI_TurnedScaledDisplecedPoint, 5 );
GLI_xSerialLinearOp ( 5, st3DVertex, GLI_BIG_GLOBALS->GLI_TurnedScaledDisplecedPoint, &(p_stCam->stMatrix) ) ;
GLI_xSerialProjection (p_stCam ,5 , GLI_BIG_GLOBALS->GLI_TurnedScaledDisplecedPoint, st2DVertex ) ;
g_bTakeCareOfAnimationCoordination = 1;
g_BaseTimeForParticleAnimation = (float)AnimTime;
g_bOneShotAnim = 1;
g_bHasTextureAnimationFinished = 0 ;
GLI_BIG_GLOBALS->hCurrentMaterial = (ACP_tdxHandleOfMaterial) pVisualMaterial;
xSaveDrawMsk = GLI_BIG_GLOBALS->lHierachDrawMask ;
GLI_BIG_GLOBALS->lHierachDrawMask &= (~GLI_C_lIsTestingBackface & ~GLI_C_lIsNotGrided);
GLI_BIG_GLOBALS->lCurrentDrawMask = GLI_BIG_GLOBALS->lHierachDrawMask ;
GLI_vDoMaterialSelection( GLI_BIG_GLOBALS );
*(long *) &GLI_BIG_GLOBALS->xWaterPlaneDistance = 1;
GLI_DRV_vSendSpriteToClip( st2DVertex, st2DVertex[4].xOoZ, GLI_BIG_GLOBALS);
*(long *) &GLI_BIG_GLOBALS->xWaterPlaneDistance = 0;
memcpy( GLI_BIG_GLOBALS->GLI_TurnedScaledDisplecedPoint, st3DTurnedVertex, 5 );
GLI_BIG_GLOBALS->lHierachDrawMask = xSaveDrawMsk ;
g_bTakeCareOfAnimationCoordination = 0;
g_bOneShotAnim = 0;
return (g_bHasTextureAnimationFinished) ;
}
/*
----------------------------------------------------------------------------------------
Description : draw a sprite on plane given by 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
)
{
GLI_tdstCamera *p_stCam ;
unsigned long xSaveDrawMsk;
MTH3D_tdstVector st3DVertex[5] ;
GLI_tdstAligned3DVector st3DTurnedVertex[5] ;
GLI_tdstAligned2DVector st2DVertex[5] ;
float x1,x2,y1,y2,z1,z2;
p_stCam = (( GLI_tdstSpecificAttributesFor3D *)_p_stViewport->p_vSpecificToXD)->p_stCam ;
x1=(fscaleX*p_stV1->xX);
y1=(fscaleX*p_stV1->xY);
z1=(fscaleX*p_stV1->xZ);
x2=(fscaleY*p_stV2->xX);
y2=(fscaleY*p_stV2->xY);
z2=(fscaleY*p_stV2->xZ);
st3DVertex[0].xX = a3_fPosition[0] - x1+x2 ;
st3DVertex[0].xY = a3_fPosition[1] - y1+y2 ;
st3DVertex[0].xZ = a3_fPosition[2] - z1+z2;
st3DVertex[1].xX = a3_fPosition[0] + x1+x2 ;
st3DVertex[1].xY = a3_fPosition[1] + y1+y2;
st3DVertex[1].xZ = a3_fPosition[2] + z1+z2;
st3DVertex[2].xX = a3_fPosition[0] + x1-x2 ;
st3DVertex[2].xY = a3_fPosition[1] + y1-y2 ;
st3DVertex[2].xZ = a3_fPosition[2] + z1-z2;
st3DVertex[3].xX = a3_fPosition[0] - x1-x2 ;
st3DVertex[3].xY = a3_fPosition[1] - y1-y2 ;
st3DVertex[3].xZ = a3_fPosition[2] - z1-z2;
st3DVertex[4].xX = a3_fPosition[0] ;
st3DVertex[4].xY = a3_fPosition[1] ;
st3DVertex[4].xZ = a3_fPosition[2] ;
memcpy( st3DTurnedVertex, GLI_BIG_GLOBALS->GLI_TurnedScaledDisplecedPoint, 5 * sizeof( GLI_tdstAligned3DVector ) );
GLI_xSerialLinearOp ( 5, st3DVertex, GLI_BIG_GLOBALS->GLI_TurnedScaledDisplecedPoint, &(p_stCam->stMatrix) ) ;
GLI_xSerialProjection (p_stCam ,5 , GLI_BIG_GLOBALS->GLI_TurnedScaledDisplecedPoint, st2DVertex ) ;
g_bTakeCareOfAnimationCoordination=1;
g_BaseTimeForParticleAnimation = (float)AnimTime;
g_bOneShotAnim=1;
g_bHasTextureAnimationFinished = 0 ;
GLI_BIG_GLOBALS->hCurrentMaterial = (ACP_tdxHandleOfMaterial) pVisualMaterial;
xSaveDrawMsk = GLI_BIG_GLOBALS->lHierachDrawMask ;
GLI_BIG_GLOBALS->lHierachDrawMask &= (~GLI_C_lIsTestingBackface & ~GLI_C_lIsNotGrided);
GLI_BIG_GLOBALS -> lCurrentDrawMask = GLI_BIG_GLOBALS->lHierachDrawMask ;
GLI_vDoMaterialSelection(GLI_BIG_GLOBALS);
*(long *) &GLI_BIG_GLOBALS->xWaterPlaneDistance = 1;
GLI_DRV_vSendSpriteToClip( st2DVertex, st2DVertex[4].xOoZ, GLI_BIG_GLOBALS);
*(long *) &GLI_BIG_GLOBALS->xWaterPlaneDistance = 0;
memcpy( GLI_BIG_GLOBALS->GLI_TurnedScaledDisplecedPoint, st3DTurnedVertex, 5 * sizeof( GLI_tdstAligned3DVector ) );
GLI_BIG_GLOBALS->lHierachDrawMask = xSaveDrawMsk ;
g_bTakeCareOfAnimationCoordination=0;
g_bOneShotAnim=0;
return (g_bHasTextureAnimationFinished) ;
}
ACP_tdxBool fn_bDisplaySky( HIE_tdxHandleToSuperObject hSOSector, HIE_tdxHandleToSuperObject hSOCamera, GLD_tdstViewportAttributes *_p_stViewport )
{
MTH3D_tdstVector a3_stVector[3];
float fStartX, fStartY;
GLI_tdstAligned2DVector a4_st2DVertex[4];
MTH_tdxReal a8_stUVVertex[8];
SECT_tdxHandleOfSectorObject hSectorObject = (SECT_tdxHandleOfSectorObject)HIE_fn_hGetSuperObjectObject( hSOSector );
long lSaveFog;
static int iDisplaySky = 1;
if( ! hSectorObject->pSkyVisualMaterial )
return FALSE;
if( GetAsyncKeyState( 'L' ) & 0x8000 )
{
iDisplaySky = !iDisplaySky;
}
if( ! iDisplaySky )
return FALSE;
if( GetAsyncKeyState( 'M' ) & 0x8000 )
{
if( GetAsyncKeyState( VK_SHIFT ) & 0x8000 )
hSectorObject->FogIntensity --;
else
hSectorObject->FogIntensity ++;
}
POS_fn_vGetTransformMatrix(
HIE_fn_hGetSuperObjectGlobalMatrix(hSOCamera),
&a3_stVector[0],
&a3_stVector[1],
&a3_stVector[2] );
if( MTH_M_bGreater( MTH3D_M_xGetZofVector( &a3_stVector[0] ), MTH_M_xFloatToReal( 0.9f ) ) )
{
fStartX = 0.0f;
}
else
{
fStartX = -(float)(atan2( MTH3D_M_xGetYofVector( &a3_stVector[0] ), MTH3D_M_xGetXofVector( &a3_stVector[0] ) ) / MTH_C_Pi);
}
/*fStartX += ((ACP_tdxHandleOfMaterial)hSectorObject->pSkyVisualMaterial)->fAddU;*/
fStartY = MTH3D_M_xGetZofVector( &a3_stVector[2] ) /*+ ((ACP_tdxHandleOfMaterial)hSectorObject->pSkyVisualMaterial)->fAddV*/;
// We fill the destination structure
a4_st2DVertex[0].xX = (float)_p_stViewport->dwClipLeftInPix;
a4_st2DVertex[0].xY = (float)_p_stViewport->dwClipTopInPix;
a4_st2DVertex[1].xX = (float)(_p_stViewport->dwClipRightInPix-1);
a4_st2DVertex[1].xY = (float)_p_stViewport->dwClipTopInPix;
a4_st2DVertex[2].xX = (float)(_p_stViewport->dwClipRightInPix-1);
a4_st2DVertex[2].xY = (float)(_p_stViewport->dwClipBottomInPix-1);
a4_st2DVertex[3].xX = (float)_p_stViewport->dwClipLeftInPix;
a4_st2DVertex[3].xY = (float)(_p_stViewport->dwClipBottomInPix-1);
a8_stUVVertex[0] = fStartX;
a8_stUVVertex[1] = fStartY;
a8_stUVVertex[2] = fStartX + 1.0f;
a8_stUVVertex[3] = fStartY;
a8_stUVVertex[4] = fStartX + 1.0f;
a8_stUVVertex[5] = fStartY + 1.0f;
a8_stUVVertex[6] = fStartX;
a8_stUVVertex[7] = fStartY + 1.0f;
GLI_vSetGlobalAlpha( 255.0f );
GLI_BIG_GLOBALS->hCurrentMaterial = hSectorObject->pSkyVisualMaterial;
GLI_BIG_GLOBALS->lCurrentDrawMask =
GLI_BIG_GLOBALS->lHierachDrawMask =
GLI_BIG_GLOBALS->hCurrentMaterial->xMaterialType = 0xFFFFFFFF - GLI_C_lIsTestingBackface /*- GLI_C_lIsEnableZSorting - GLI_C_lIsWriteZBuffer - GLI_C_lIsNotComputeSpecular*/;
/* Set fog to ITERATED_ALPHA */
lSaveFog = GLI_BIG_GLOBALS->xFogIsOn;
GLI_BIG_GLOBALS->xFogIsOn = 2;
GLI_BIG_GLOBALS->ulSpecularColorForSprite = ((unsigned long)hSectorObject->FogIntensity) << 24;
GLI_vDoMaterialSelection(GLI_BIG_GLOBALS );
GLI_BIG_GLOBALS->ulColorInitForSprite =
(GLI_BIG_GLOBALS->ulColorInitForSprite & 0x00ffffff) | (((unsigned long)hSectorObject->FogIntensity) << 24);
GLI_DRV_vSetClipWindow( (float)_p_stViewport->dwClipLeftInPix, (float)_p_stViewport->dwClipRightInPix, (float)_p_stViewport->dwClipTopInPix, (float)_p_stViewport->dwClipBottomInPix, GLI_BIG_GLOBALS );
GLI_DRV_vSendSpriteToClipWithUV( a4_st2DVertex, a8_stUVVertex, 0.00006103515625f, GLI_BIG_GLOBALS);
GLI_BIG_GLOBALS->xFogIsOn = lSaveFog;
return TRUE;
}
/*
* For AGOs
*/
void GLI_vDisplayWorldTriangle(
GLD_tdstViewportAttributes *_p_stVpt,
float _a3_coordinates[3][3],
float _a3_uvs[3][2],
void *_p_stVisualMaterial)
{
GLI_tdstCamera *p_stCam ;
unsigned long xSaveDrawMsk;
GLI_tdstAligned3DVector st3DTurnedVertex[3] ;
MTH3D_tdstVector st3DVertex[3] ;
GLI_tdstAligned2DVector st2DVertex[3] ;
ACP_tdst2DUVValues stUV[3];
p_stCam = (( GLI_tdstSpecificAttributesFor3D *)_p_stVpt->p_vSpecificToXD)->p_stCam ;
MTH3D_M_vSetVectorElements( &st3DVertex[0], _a3_coordinates[0][0], _a3_coordinates[0][1], _a3_coordinates[0][2] );
MTH3D_M_vSetVectorElements( &st3DVertex[1], _a3_coordinates[1][0], _a3_coordinates[1][1], _a3_coordinates[1][2] );
MTH3D_M_vSetVectorElements( &st3DVertex[2], _a3_coordinates[2][0], _a3_coordinates[2][1], _a3_coordinates[2][2] );
stUV[0].xU = _a3_uvs[0][0];
stUV[0].xV = _a3_uvs[0][1];
stUV[1].xU = _a3_uvs[1][0];
stUV[1].xV = _a3_uvs[1][1];
stUV[2].xU = _a3_uvs[2][0];
stUV[2].xV = _a3_uvs[2][1];
GLI_xSerialLinearOp ( 3, st3DVertex, st3DTurnedVertex, &(p_stCam->stMatrix) ) ;
GLI_xSerialProjection (p_stCam, 3, st3DTurnedVertex, st2DVertex ) ;
GLI_BIG_GLOBALS->hCurrentMaterial = (ACP_tdxHandleOfMaterial) _p_stVisualMaterial;
xSaveDrawMsk = GLI_BIG_GLOBALS->lHierachDrawMask ;
GLI_BIG_GLOBALS->lHierachDrawMask &= (~GLI_C_lIsTestingBackface & ~GLI_C_lIsNotGrided);
GLI_BIG_GLOBALS->lCurrentDrawMask = GLI_BIG_GLOBALS->lHierachDrawMask ;
GLI_vDoMaterialSelection( GLI_BIG_GLOBALS );
GLI_DRV_xSendSingleTriangleToClip_TRIANGLES( st2DVertex, stUV, GLI_BIG_GLOBALS);
GLI_BIG_GLOBALS->lHierachDrawMask = xSaveDrawMsk ;
}
#if defined(USE_PROFILER) && !defined(RETAIL)
#define C_fYMinForFirstBar 1.0f
#define C_fYMinForSecondBar 8.5f
#define C_fBarWidth 10.0f
#define C_fBarHeight 4.0f
static int gs_iTotalEngineDuration = 0;
static int gs_iFlipDuration = 0;
static int gs_bShowFrameRate = 0;
static float gs_fGlobalAlphaForRasters = 128.0f;
static unsigned long a_ulBarColors[] = { 0x0000ff00, 0x00ff0000, 0x000080ff, 0x000000ff };
void GLI_fn_vPrepareShowFrameRate( int _iTotalEngineDuration, int _iFlipDuration )
{
gs_iTotalEngineDuration = (_iTotalEngineDuration + 5) / 10;
gs_iFlipDuration = (_iFlipDuration + 5) / 10;
gs_bShowFrameRate = 1;
}
void GLI_fn_vShowFrameRate( GLD_tdstViewportAttributes *_p_stViewport )
{
int iCurrentBar;
unsigned long ulCurrentColor;
float fSaveClipYMin = GLI_BIG_GLOBALS->fYMinClipping;
if( gs_bShowFrameRate )
gs_bShowFrameRate = 0;
else
return;
GLI_vSetGlobalAlpha( gs_fGlobalAlphaForRasters );
g_GLI_bForceAAAColor = 1;
GLI_g_fZValueForSprite = 1.0f;
gs_hDefaultMaterial->stAmbient.xR = gs_hDefaultMaterial->stAmbient.xG = gs_hDefaultMaterial->stAmbient.xB = 0;
GLI_BIG_GLOBALS->fYMinClipping = 0.0f;
gs_iFlipDuration += gs_iTotalEngineDuration;
/* Display whole bars */
for(
iCurrentBar = 0;
gs_iTotalEngineDuration >= 1000;
gs_iTotalEngineDuration -= 1000, gs_iFlipDuration-=1000, ++iCurrentBar )
{
ulCurrentColor = a_ulBarColors[iCurrentBar & 3];
g_GLI_ForcedAAAColor[0] = (unsigned char)ulCurrentColor;
g_GLI_ForcedAAAColor[1] = (unsigned char)(ulCurrentColor >> 8);
g_GLI_ForcedAAAColor[2] = (unsigned char)(ulCurrentColor >> 16);
/* First bar : time without flip */
GLI_vDraw2DSpriteWithPercent( _p_stViewport, (float)(iCurrentBar*C_fBarWidth), C_fYMinForFirstBar, (float)(iCurrentBar*C_fBarWidth+C_fBarWidth), C_fYMinForFirstBar+C_fBarHeight, gs_hDefaultMaterial );
/* Second bar : time with flip */
GLI_vDraw2DSpriteWithPercent( _p_stViewport, (float)(iCurrentBar*C_fBarWidth), C_fYMinForSecondBar, (float)(iCurrentBar*C_fBarWidth+C_fBarWidth), C_fYMinForSecondBar+C_fBarHeight, gs_hDefaultMaterial );
}
if( gs_iTotalEngineDuration != 0 )
{
/* Draw the last bar (not a whole one) */
ulCurrentColor = a_ulBarColors[iCurrentBar & 3];
g_GLI_ForcedAAAColor[0] = (unsigned char)ulCurrentColor;
g_GLI_ForcedAAAColor[1] = (unsigned char)(ulCurrentColor >> 8);
g_GLI_ForcedAAAColor[2] = (unsigned char)(ulCurrentColor >> 16);
/* First bar : time without flip */
GLI_vDraw2DSpriteWithPercent(
_p_stViewport,
(float)(iCurrentBar*C_fBarWidth), C_fYMinForFirstBar,
(float)(iCurrentBar*C_fBarWidth+(gs_iTotalEngineDuration)/(1000/C_fBarWidth)), C_fYMinForFirstBar+C_fBarHeight, gs_hDefaultMaterial );
}
/* if time with flip is greater than time without flip (common case), we display the remaining time */
for(
;
gs_iFlipDuration >= 1000;
gs_iFlipDuration -= 1000, ++iCurrentBar )
{
ulCurrentColor = a_ulBarColors[iCurrentBar & 3];
g_GLI_ForcedAAAColor[0] = (unsigned char)ulCurrentColor;
g_GLI_ForcedAAAColor[1] = (unsigned char)(ulCurrentColor >> 8);
g_GLI_ForcedAAAColor[2] = (unsigned char)(ulCurrentColor >> 16);
/* Second bar : time with flip */
GLI_vDraw2DSpriteWithPercent( _p_stViewport, (float)(iCurrentBar*C_fBarWidth), C_fYMinForSecondBar, (float)(iCurrentBar*C_fBarWidth+C_fBarWidth), C_fYMinForSecondBar+C_fBarHeight, gs_hDefaultMaterial );
}
if( gs_iFlipDuration != 0 )
{
/* Draw the last bar (not a whole one) */
ulCurrentColor = a_ulBarColors[iCurrentBar & 3];
g_GLI_ForcedAAAColor[0] = (unsigned char)ulCurrentColor;
g_GLI_ForcedAAAColor[1] = (unsigned char)(ulCurrentColor >> 8);
g_GLI_ForcedAAAColor[2] = (unsigned char)(ulCurrentColor >> 16);
/* First bar : time without flip */
GLI_vDraw2DSpriteWithPercent(
_p_stViewport,
(float)(iCurrentBar*C_fBarWidth), C_fYMinForSecondBar,
(float)(iCurrentBar*C_fBarWidth+gs_iFlipDuration/(1000/C_fBarWidth)), C_fYMinForSecondBar+C_fBarHeight, gs_hDefaultMaterial );
}
if( gs_fGlobalAlphaForRasters < 255.0f )
{
GLI_xSendListToViewport( _p_stViewport );
GLI_xClearViewingList();
}
GLI_BIG_GLOBALS->fYMinClipping = fSaveClipYMin;
g_GLI_bForceAAAColor = 0;
GLI_vSetGlobalAlpha( 255 );
}
#endif /*RETAIL*/
#ifdef __cplusplus
} /*extern "C"*/
#endif