reman3/Rayman_X/cpa/tempgrp/GAM/effect.c

774 lines
28 KiB
C

#define D_Effect_StructureDefine
#define D_Effect_VariableDefine
#include "ToolsCPA.h"
#include "Effect.h"
#include "GameEng.h"
#include "ia_dnm.h"
#include "Toolcam.h"
#include "Typecam.h"
#include "Structur/State.h"
#include "Actions/AllActs.h"
#include "Structur/GameScpt.h"
#include "Structur/ErrGame.h"
#include "Structur/MemGame.h"
#include "Structur/StdObjSt.h"
#include "Structur/EngMode.h"
#include "Structur/Objects.h"
#include "Basic.h"
#include "Zemem.h"
#define C_szWaterStreakEffectDescription "WaterStreakDescription"
#define C_Entry_WaterStreakNbFoams "NumberOfFoams"
#define C_Entry_WaterStreakZoomXY "StreakZoom"
#define C_Entry_WaterStreakGeometricObject "GraphicObject"
#define C_Entry_WaterStreakAttenuationCoeff "AttenuationCoeff"
#define C_Entry_WaterStreakLifeTime "LifeTime"
#define C_Entry_WaterStreakTimeBetweenTwoShifts "TimeBetweenShifts"
#define C_Entry_WaterStreakTimeWindow "TimeWindow"
#define C_Entry_WaterStreakGap "StreakGap"
#define C_ulTimeBetweenTwoShifts 50
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
ACP_tdxBool fn_bIsCharacterCrossingASurfaceOfWater(
HIE_tdxHandleToSuperObject _hCharacter,
MTH3D_tdstVector * _p_stRealPoint);
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#if defined(GAM_USE_SCRIPT)
SCR_tde_Anl_ReturnValue fn_eCallBackWaterStreakEffect(SCR_tdst_File_Description *_p_stFile,char *_p_szName,char *_ap_szParams[],SCR_tde_Anl_Action _eAction)
{
SCR_tde_Anl_ReturnValue eReturnValue = SCR_ERV_Anl_NormalReturn;
tdstWaterStreakEffect * p_stWSE;
_p_stFile=_p_stFile;
if(M_IsTitle)
{
M_CheckScriptParamNumber(2);
p_stWSE = (tdstWaterStreakEffect *)M_p_GameMallocInHLM(sizeof(tdstWaterStreakEffect));
p_stWSE->lNbFoams = atoi(_ap_szParams[0]);
p_stWSE->a_stFoams = (tdstWaterFoam *)M_p_GameMallocInHLM(sizeof(tdstWaterFoam)*p_stWSE->lNbFoams);
p_stWSE->lNbGraphicFoams = atoi(_ap_szParams[1]);
p_stWSE->a_hFoamObjectTable = (ACP_tdxHandleOfObject*)M_p_GameMallocInHLM(sizeof(ACP_tdxHandleOfObject)*p_stWSE->lNbGraphicFoams);
p_stWSE->lNbGraphicFoams = 0;
/*** Default values ***/
p_stWSE->xFoamXZoom = MTH_C_ONE;
p_stWSE->xFoamYZoom = MTH_C_ONE;
p_stWSE->lFoamFrameCounter = 0;
p_stWSE->ulLastTimeOfShift = 0;
p_stWSE->xAttenuationCoeff = 1.5f;
p_stWSE->lLifeTime = 500;
p_stWSE->xLifeTimeFrequency = p_stWSE->xAttenuationCoeff/((float)p_stWSE->lLifeTime);
p_stWSE->lTimeBetweenTwoShifts = 50;
SCR_M_RdL0_SetSectionLong(C_ThisSection,0,p_stWSE);
}
else if (M_IsEntry)
{
SCR_M_RdL0_GetSectionLong(C_ThisSection,0,tdstWaterStreakEffect *,p_stWSE);
if( M_ActionIs(C_Entry_WaterStreakGeometricObject) )
{
*(p_stWSE->a_hFoamObjectTable+p_stWSE->lNbGraphicFoams) = GLI_pLoadGeometricInFile(_ap_szParams[0]);
p_stWSE->lNbGraphicFoams++;
}
else if( M_ActionIs(C_Entry_WaterStreakZoomXY) )
{
p_stWSE->xFoamXZoom = MTH_M_xDoubleToReal(atof(_ap_szParams[0]));
p_stWSE->xFoamYZoom = MTH_M_xDoubleToReal(atof(_ap_szParams[1]));
}
else if( M_ActionIs(C_Entry_WaterStreakTimeBetweenTwoShifts) )
{
p_stWSE->lTimeBetweenTwoShifts = atoi(_ap_szParams[0]);
}
else if( M_ActionIs(C_Entry_WaterStreakAttenuationCoeff) )
{
p_stWSE->xAttenuationCoeff = MTH_M_xDoubleToReal(atof(_ap_szParams[0]));
}
else if( M_ActionIs(C_Entry_WaterStreakLifeTime) )
{
p_stWSE->lLifeTime = atoi(_ap_szParams[0]);
}
else if( M_ActionIs(C_Entry_WaterStreakTimeWindow) )
{
p_stWSE->xTimeWindow = MTH_M_xDoubleToReal(atof(_ap_szParams[0]));
}
else if( M_ActionIs(C_Entry_WaterStreakGap) )
{
p_stWSE->xGap = MTH_M_xDoubleToReal(atof(_ap_szParams[0]));
}
else
{
M_GameInformationError(E_uwGameScriptCallBackDescriptionUnknownAction);
}
}
else if( M_IsEnd )
{
SCR_M_RdL0_GetSectionLong(C_ThisSection,0,tdstWaterStreakEffect *,p_stWSE);
p_stWSE->xLifeTimeFrequency = p_stWSE->xAttenuationCoeff/((float)p_stWSE->lLifeTime);
}
return(eReturnValue);
}
#endif /* GAM_USE_SCRIPT */
/* Init water streak and bubble effects */
void fn_vInitWaterStreakEffect()
{
#if defined(GAM_USE_SCRIPT)
SCR_fn_v_RdL0_RegisterCallback(C_szWaterStreakEffectDescription,
fn_eCallBackWaterStreakEffect, SCR_CRC_c_RdL0_ForSection);
#endif /* GAM_USE_SCRIPT */
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vShiftTableOfPosition(GAM_tdxHandleToWaterStreakEffect _hWSE,MTH3D_tdstVector * _p_stV,ACP_tdxBool _bIsOK)
{
long lI;
tdstWaterFoam * p_stWF;
/* Taking in account real time */
if( (g_stEngineStructure.stEngineTimer.ulCurrentTimerCount-_hWSE->ulLastTimeOfShift) > C_ulTimeBetweenTwoShifts )
{
p_stWF = _hWSE->a_stFoams+_hWSE->lNbFoams-1;
_hWSE->ulLastTimeOfShift = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
for( lI=_hWSE->lNbFoams-1; lI>0; lI--,p_stWF-- )
{
MTH3D_M_vCopyVector(&p_stWF->stPosition,&(p_stWF-1)->stPosition);
p_stWF->bFoamIsActive = (p_stWF-1)->bFoamIsActive;
p_stWF->lLifeTime = (p_stWF-1)->lLifeTime - _hWSE->lTimeBetweenTwoShifts;
}
MTH3D_M_vCopyVector( &_hWSE->a_stFoams->stPosition,_p_stV );
_hWSE->a_stFoams->bFoamIsActive = _bIsOK;
_hWSE->a_stFoams->lLifeTime = _hWSE->lLifeTime;
_hWSE->lFoamFrameCounter++;
if( _hWSE->lFoamFrameCounter == _hWSE->lNbGraphicFoams )
_hWSE->lFoamFrameCounter = 0;
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vTreatWaterStreak(
GAM_tdxHandleToWaterStreakEffect _hWSE,long _lElapsedTime)
{
long lI;
tdstWaterFoam * p_stWF;
p_stWF = _hWSE->a_stFoams;
for( lI=0; lI<_hWSE->lNbFoams; lI++,p_stWF++ )
{
/* If foam is living*/
if( p_stWF->bFoamIsActive )
{
p_stWF->lLifeTime -= _lElapsedTime;
/* Is foam dead?*/
if( p_stWF->lLifeTime<=0 )
p_stWF->bFoamIsActive = FALSE;
}
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vGenerateFoamInStreak(
GAM_tdxHandleToWaterStreakEffect _hWSE,long _lElapsedTime,
MTH3D_tdstVector * _p_stPosition)
{
long lI;
tdstWaterFoam * p_stWF;
if( _hWSE->ulLastTimeOfShift - g_stEngineStructure.stEngineTimer.ulCurrentTimerCount>(unsigned long)_hWSE->lTimeBetweenTwoShifts )
{
_hWSE->ulLastTimeOfShift = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
p_stWF = _hWSE->a_stFoams;
for( lI=0; lI<_hWSE->lNbFoams; lI++,p_stWF++ )
{
/* Search for a dead foam*/
if( !p_stWF->bFoamIsActive )
{
/* Initialise datas for foam*/
p_stWF->lLifeTime = _hWSE->lLifeTime;
MTH3D_M_vCopyVector(&p_stWF->stPosition,_p_stPosition);
/* Activate the foam */
p_stWF->bFoamIsActive = TRUE;
break;
}
}
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vZoomAndDrawObjectOnXAndY(
GLD_tdstViewportAttributes * _p_stViewportAttr,
ACP_tdxHandleOfObject _hGeoObj,
MTH_tdxReal _xXScale,
MTH_tdxReal _xYScale,
long _lDrawMask);
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vDisplayWaterStreak(GLD_tdstViewportAttributes * _p_stViewportAttr,GAM_tdxHandleToWaterStreakEffect _hWSE,long _lDrawMask)
{
POS_tdstCompletePosition stMatrix;
long lI;
MTH_tdxReal xTmp;
long lTmp;
tdstWaterFoam * p_stWF;
p_stWF = _hWSE->a_stFoams;
POS_fn_vSetIdentityMatrix(&stMatrix);
for( lI=0; lI<_hWSE->lNbFoams; lI++,p_stWF++ )
{
/* if plouf state is correct */
if( p_stWF->bFoamIsActive )
{
/* Let's draw this plouf */
POS_fn_vSetTranslationVector(&stMatrix,&p_stWF->stPosition);
HIE_fn_bLoadMatrix(&stMatrix);
xTmp = _hWSE->xLifeTimeFrequency*(float)(_hWSE->lLifeTime - p_stWF->lLifeTime);
xTmp = 1.0f - _hWSE->xFoamXZoom*xTmp;
lTmp = lI + _hWSE->lFoamFrameCounter;
lTmp = ( lTmp>=_hWSE->lNbGraphicFoams ? lTmp%_hWSE->lNbGraphicFoams : lTmp );
fn_vZoomAndDrawObjectOnXAndY(
_p_stViewportAttr,_hWSE->a_hFoamObjectTable[lTmp],xTmp,xTmp,_lDrawMask);
HIE_fn_vPopMatrix();
}
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vZoomAndDrawObjectOnXAndY(
GLD_tdstViewportAttributes * _p_stViewportAttr,
ACP_tdxHandleOfObject _hGeoObj,
MTH_tdxReal _xXScale,
MTH_tdxReal _xYScale,
long _lDrawMask)
{
MTH3D_tdstVector a_stPoints[4];
MTH3D_tdstVector a_stScaledPoints[4];
MTH_tdxReal xX,xY,xZ;
MTH_tdxReal xXMin,xXMax,xYMin,xYMax;
GEO_vGetPointOfObject(_hGeoObj,&a_stPoints[0],0);
GEO_vGetPointOfObject(_hGeoObj,&a_stPoints[1],1);
GEO_vGetPointOfObject(_hGeoObj,&a_stPoints[2],2);
GEO_vGetPointOfObject(_hGeoObj,&a_stPoints[3],3);
MTH3D_M_vGetVectorElements(&xX,&xY,&xZ,&a_stPoints[0]);
xXMin = xX*_xXScale;
xYMin = xY*_xYScale;
MTH3D_M_vGetVectorElements(&xX,&xY,&xZ,&a_stPoints[2]);
xXMax = xX*_xXScale;
xYMax = xY*_xYScale;
MTH3D_M_vSetVectorElements(&a_stScaledPoints[0],xXMin,xYMin,xZ);
MTH3D_M_vSetVectorElements(&a_stScaledPoints[1],xXMax,xYMin,xZ);
MTH3D_M_vSetVectorElements(&a_stScaledPoints[2],xXMax,xYMax,xZ);
MTH3D_M_vSetVectorElements(&a_stScaledPoints[3],xXMin,xYMax,xZ);
GEO_vSetPointOfObject(_hGeoObj,&a_stScaledPoints[0],0);
GEO_vSetPointOfObject(_hGeoObj,&a_stScaledPoints[1],1);
GEO_vSetPointOfObject(_hGeoObj,&a_stScaledPoints[2],2);
GEO_vSetPointOfObject(_hGeoObj,&a_stScaledPoints[3],3);
GLI_xSendObjectToViewport(
_p_stViewportAttr,_hGeoObj,gp_stLight,
_lDrawMask&(GLI_C_lAllIsEnable-GLI_C_lNotForceZSorting));
GEO_vSetPointOfObject(_hGeoObj,&a_stPoints[0],0);
GEO_vSetPointOfObject(_hGeoObj,&a_stPoints[1],1);
GEO_vSetPointOfObject(_hGeoObj,&a_stPoints[2],2);
GEO_vSetPointOfObject(_hGeoObj,&a_stPoints[3],3);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
void fn_vWaterStreakEffect(
GLD_tdstViewportAttributes * _p_stViewportAttr,
HIE_tdxHandleToSuperObject _hCharacter,
long _lDrawMask)
{
#ifndef D_THROW_PRT
GAM_tdxHandleToWaterStreakEffect hWaterStreak;
long lElapsedTime;
MTH3D_tdstVector stV;
if( M_GetMSHandle(_hCharacter,MSPrtSrc) )
{
hWaterStreak = fn_hMSPrtSrcGetWaterStreakGenerator( M_GetMSHandle(_hCharacter,MSPrtSrc) );
if( !hWaterStreak )
return;
/* Computing elapsed time*/
lElapsedTime = g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime;
if( fn_bIsCharacterCrossingASurfaceOfWater(_hCharacter,&stV) )
{
/* Generate a foam*/
fn_vGenerateFoamInStreak(hWaterStreak,lElapsedTime,&stV);
}
/* Treat the water streak*/
fn_vTreatWaterStreak(hWaterStreak,lElapsedTime);
}
#endif /* D_THROW_PRT */
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
ACP_tdxBool fn_bIsCharacterCrossingASurfaceOfWater(
HIE_tdxHandleToSuperObject _hCharacter,
MTH3D_tdstVector * _p_stRealPoint)
{
/*
DNM_tdeFluidEnvironment eDnmEnvironment;
MTH3D_tdstVector stPositionOnWaterPlane;
MTH_tdxReal xDepth;
if( GAM_fn_bGetEnvironmentOfPointOfType(
_hCharacter,DNM_Point_Feet,&eDnmEnvironment) )
{
if( eDnmEnvironment==DNM_Fluid_Water )
{
if( GAM_fn_bGetEnvironmentOfPointOfType(
_hCharacter,DNM_Point_Head,&eDnmEnvironment) )
{
if( eDnmEnvironment==DNM_Fluid_Air )
{
POS_fn_vGetTranslationVector(HIE_fn_hGetSuperObjectGlobalMatrix(_hCharacter),&stPositionOnWaterPlane);
SECT_hGetDNMEnvironmentAndDepth(
NULL,
&stPositionOnWaterPlane,
fn_h_SectInfoGetCurrentSector(M_GetMSHandle(_hCharacter,SectInfo)),
&xDepth);
MTH3D_M_vSetZofVector(&stPositionOnWaterPlane,MTH3D_M_xGetZofVector(&stPositionOnWaterPlane)+xDepth+0.05f);
MTH3D_M_vCopyVector(_p_stRealPoint,&stPositionOnWaterPlane);
return TRUE;
}
}
}
}*/
return FALSE;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*ANNECY VL 03/11/97{*/
/*
=======================================================================================
=======================================================================================
special code for footpath effect
=======================================================================================
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : allocate and initialize a footpath effect structure
Returns (GAM_tdxHandleToFootPathEffect ) allocated footpath structure
----------------------------------------------------------------------------------------
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
GAM_tdxHandleToFootPathEffect fn_h_FootPath_Alloc()
{
tdstFootPath *p_stFootPath;
p_stFootPath = (tdstFootPath *) M_p_GameMallocInHLM ( sizeof( tdstFootPath) );
memset( p_stFootPath, 0, sizeof( tdstFootPath ) );
return (GAM_tdxHandleToFootPathEffect) p_stFootPath;
}
/*
----------------------------------------------------------------------------------------
Description : create footpath internal data ( geom object )
_hFootPath -> foot path that is to be created
----------------------------------------------------------------------------------------
*/
void fn_v_FootPath_Create( GAM_tdxHandleToFootPathEffect _hFootPath )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
tdstFootPath *p_stFP;
GMT_tdxHandleToGameMaterial hGMCopy;
ACP_tdxHandleOfMaterial hVisual;
GLI_tdstColor stColor;
ACP_tdxHandleOfElement hElement;
ACP_tdst2DUVValues a_stUV[4] = { {0.0f,0.0f}, {1.0f,0.0f}, {1.0f,1.0f}, {0.0f,1.0f} };
ACP_tdxIndex xPoint, xFace, xObj;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
p_stFP = (tdstFootPath *) _hFootPath;
/* creation of game material that represent a left foot print */
hVisual = GMT_fn_hGetVisualMaterial( p_stFP->hFootPrintMaterial );
GLI_xGetMaterialType( hVisual, (unsigned long *)&xPoint );
xPoint &= ~( GLI_C_lIsNotGrided | GLI_C_lIsNotLightAlphaSensitive );
GLI_xSetMaterialType( hVisual, xPoint );
for (xObj = 0; xObj < p_stFP->xNumberOfAlphaLevels; xObj ++)
{
/* creation of geometric object */
GEO_vCreateGeometricObject( &p_stFP->a8_hGeomObj[ xObj ], p_stFP->a8_xNumberOfPoints[ xObj ], 1 );
p_stFP->a8_xMaxNumberOfFaces[ xObj ] = (ACP_tdxIndex)(p_stFP->a8_xNumberOfPoints[ xObj ] >> 1);
/* creation of element */
GEO_vCreateElementIndexedTriangles( p_stFP->a8_hGeomObj[ xObj ], &hElement, p_stFP->a8_xMaxNumberOfFaces[ xObj ], 4);
/* set material of element */
if (xObj != 0)
{
hGMCopy = GMT_fn_hCreateGameMaterial();
GMT_fn_vCopyGameMaterial( hGMCopy, p_stFP->hFootPrintMaterial );
}
else
hGMCopy = p_stFP->hFootPrintMaterial;
#ifndef CONST_VMT
hVisual = GMT_fn_hGetVisualMaterial( hGMCopy );
GLI_xGetMaterialAmbientCoef( hVisual, &stColor );
stColor.xA = p_stFP->a8_xAlphaColor[ xObj ];
GLI_xSetMaterialAmbientCoef( hVisual, &stColor );
#endif
GEO_vSetGameMaterialOfIndexedTriangles( p_stFP->a8_hGeomObj[ xObj ], hElement, hGMCopy );
/* set uv coordinates */
for (xPoint = 0; xPoint < 4; xPoint++ )
GEO_vSetUVOfIndexedTriangles( p_stFP->a8_hGeomObj[ xObj ], hElement, xPoint, a_stUV + xPoint);
/*for (xPoint = 0, xFace = 0; xFace < g_stFootPath.a8_xMaxNumberOfFaces[ xObj ]; )*/
for (xPoint = 0, xFace = 0; xFace < p_stFP->a8_xMaxNumberOfFaces[ xObj ]; )
{
GEO_vSetFaceOfIndexedTriangles(p_stFP->a8_hGeomObj[ xObj ], hElement, xFace++, xPoint, (ACP_tdxIndex)(xPoint + 1), (ACP_tdxIndex)(xPoint + 3));
GEO_vSetFaceOfIndexedTriangles(p_stFP->a8_hGeomObj[ xObj ], hElement, xFace++, (ACP_tdxIndex)(xPoint + 1), (ACP_tdxIndex)(xPoint + 2), (ACP_tdxIndex)(xPoint + 3));
xPoint += 4;
}
((GEO_tdstElementIndexedTriangles *) p_stFP->a8_hGeomObj[xObj]->d_stListOfElements[ 0 ])->xNbFaces = 0;
}
GLI_vEndofGeometricLoad();
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*
----------------------------------------------------------------------------------------
Description : reinit (emptied the foot path)
_hFootPath -> footpath to clear
Returns (void )
----------------------------------------------------------------------------------------
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_v_FootPath_ReInit( GAM_tdxHandleToFootPathEffect _hFootPath )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
tdstFootPath *p_stFP;
ACP_tdxIndex xObj;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
p_stFP = (tdstFootPath *) _hFootPath;
if (p_stFP->a8_hGeomObj[0] == NULL )
return;
for (xObj = 0; xObj < p_stFP->xNumberOfAlphaLevels; xObj++)
{
p_stFP->a8_xNumberOfFaces[ xObj ] = p_stFP->a8_xNextFaces[ xObj ] = 0;
((GEO_tdstElementIndexedTriangles *) p_stFP->a8_hGeomObj[xObj]->d_stListOfElements[ 0 ])->xNbFaces = 0;
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_v_FootPath_Compute( HIE_tdxHandleToSuperObject _hCharacter, ACP_tdxIndex _xType );
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*
----------------------------------------------------------------------------------------
Description : add a footprint into the foot path
hHandleOfCharacter -> character that have a footpath
_xFootPrintType -> left (0) or right (1) foot print
----------------------------------------------------------------------------------------
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_v_FootPath_Add( HIE_tdxHandleToSuperObject _hCharacter, ACP_tdxIndex _xFootPrintType )
{
#ifndef D_THROW_PRT
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
MS_tdxHandleToMSPrtSrc hMSPrtSrc;
tdstFootPath *p_stFP;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* retrieve footpath information */
hMSPrtSrc = M_GetMSHandle(_hCharacter,MSPrtSrc);
if (hMSPrtSrc == NULL)
return;
p_stFP = (tdstFootPath *) fn_hMSPrtSrcGetFootPath( hMSPrtSrc );
if (p_stFP->a8_hGeomObj[0] == NULL)
return;
fn_v_FootPath_Compute( _hCharacter, _xFootPrintType );
return;
#endif /* D_THROW_PRT */
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*
----------------------------------------------------------------------------------------
Description : display a foot path
_hFootPath -> foot path that is to be displayed
_p_stViewportAttr ->
Returns (void )
----------------------------------------------------------------------------------------
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_v_FootPath_Display(GAM_tdxHandleToFootPathEffect _hFootPath, GLD_tdstViewportAttributes * _p_stViewportAttr, long _lDrawMask)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
tdstFootPath *p_stFP;
ACP_tdxIndex xObj;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
p_stFP = (tdstFootPath *) _hFootPath;
for (xObj = 0; xObj < p_stFP->xNumberOfAlphaLevels; xObj ++)
{
if (p_stFP->a8_hGeomObj[ xObj ] == NULL)
return;
HIE_fn_bLoadIdentity();
GLI_xSendObjectToViewport( _p_stViewportAttr, p_stFP->a8_hGeomObj[ xObj ], gp_stLight, _lDrawMask );
HIE_fn_vPopMatrix();
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/**********************************************************************************************/
/* Name: fn_v_FootPath_Compute*/
/* Goal: Compute geometric point to define a footprint*/
/**********************************************************************************************/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* Oliv' - Portage v15 - remove warnings and unused variables*/
#ifndef D_THROW_PRT
static float gs_fDeltaZ = 0.01f;
static float gs_fSPZ = 0.3f;
static MTH3D_tdstVector gs_stPicking = { 0, 0, -0.6f};
static ACP_tdxIndex gs_a2a6_xUV[2][6] = { {0,1,3,1,2,3}, {1,0,2,0,3,2} };
static ACP_tdxIndex gs_a4a2_xChangeSign[4][2] = { { 0, 0}, { 1, 0}, { 0, 1}, { 1,0} };
#endif /* D_THROW_PRT */
/* EndOfOliv'*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
----------------------------------------------------------------------------------------
Description : compute foot print emplacement
_hCharacter -> caractere that will have a new foot print in it's foot path
_xType -> type of foot print : 0 -> left, 1 -> right
----------------------------------------------------------------------------------------
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_v_FootPath_Compute( HIE_tdxHandleToSuperObject _hCharacter, ACP_tdxIndex _xType )
{
#ifndef D_THROW_PRT
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
tdstFootPath *p_stFP;
HIE_tdxHandleToSuperObject hSector;
GEO_tdxHandleToMatrix hGlobalMatrixOfCharacter;
MTH3D_tdstVector stVectX, stVectY, stVectZ, stTrans;
MTH3D_tdstVector stEndPicking;
MTH3D_tdstVector stStartPicking;
ACP_tdxIndex xResultIntersection = 0;
MTH3D_tdstVector a4_stPickedPoint[4];
/* HIE_tdxHandleToSuperObject hPickedSpObj;*/
ACP_tdxHandleOfObject hPickedObject = NULL;
ACP_tdxIndex xPickedElement = 0;
/* ACP_tdxIndex xPickedFace;*/
/*XB890504*/
/* short xNbObjPicked=0;*/
/*End XB*/
GMT_tdxHandleToGameMaterial hMaterial;
GMT_tdxHandleToCollideMaterial hCM;
ACP_tdxIndex xPoint, xObj;
ACP_tdxIndex *p_xFaceSource, *p_xFaceDest;
MTH3D_tdstVector *p_stPointSource, *p_stPointDest;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/* get foot path struct */
p_stFP = (tdstFootPath *) fn_hMSPrtSrcGetFootPath( M_GetMSHandle(_hCharacter,MSPrtSrc) );
/* get sector where perso is */
hSector = fn_h_SectInfoGetCurrentSector( M_GetMSHandle( _hCharacter, SectInfo) );
/* get matrix and position of character */
hGlobalMatrixOfCharacter = HIE_fn_hGetSuperObjectGlobalMatrix( _hCharacter );
POS_fn_vGetTranslationVector( hGlobalMatrixOfCharacter, &stTrans );
POS_fn_vGetRotationMatrix( hGlobalMatrixOfCharacter, &stVectX, &stVectY, &stVectZ );
/* ZVector of rotation matrix isn't used, use it to store rotation of footprint offset */
POS_fn_vRotateVector( &stVectZ, hGlobalMatrixOfCharacter, &p_stFP->a2_stOffset[ _xType ] );
/* shift position of foot print */
MTH3D_M_vAddVector( &stTrans, &stTrans, &stVectZ );
/* increase Z of position to be sure to be above the floor */
stTrans.xZ = MTH_M_xAdd(stTrans.xZ, gs_fSPZ);
/* set X and Y to good foot print dimension */
MTH3D_M_vMulScalarVector( &stVectX, p_stFP->a2_xScale[0], &stVectX );
MTH3D_M_vMulScalarVector( &stVectY, p_stFP->a2_xScale[1], &stVectY );
for ( xPoint = 0; xPoint < 4; xPoint++ )
{
/* compute point position */
if (gs_a4a2_xChangeSign[ xPoint ][ 0 ]) MTH3D_M_vNegVector( &stVectX, &stVectX );
if (gs_a4a2_xChangeSign[ xPoint ][ 1 ]) MTH3D_M_vNegVector( &stVectY, &stVectY );
MTH3D_M_vAddVector( &stStartPicking, &stVectX, &stVectY );
MTH3D_M_vAddVector( &stStartPicking, &stStartPicking, &stTrans );
MTH3D_M_vAddVector( &stEndPicking, &stStartPicking, &gs_stPicking );
/* get impact on the floor of sector */
/*
xResultIntersection = SHW_fn_bIntersectShadowSuperObject
(
&stStartPicking,
&stEndPicking,
&gs_stPicking,
1.1f,
hSector,
&a4_stPickedPoint[ xPoint ],
&hPickedSpObj,
&hPickedObject,
&xPickedElement,
&xPickedFace,
&xNbObjPicked
);
*/
/* xResultIntersection = SHW_fn_bIntersectShadowSuperObjectLevel1
(
&stStartPicking,
&stEndPicking,
&gs_stPicking,
hSector,
&a4_stPickedPoint[ xPoint ],
&hPickedSpObj,
&hPickedObject,
&xPickedElement,
&xPickedFace,
&stVectZ,
_hCharacter
);
*/ /* no impact : stop */
if (xResultIntersection == 0)
break;
/* get material of picked face to know if trace could be leaved */
if ( p_stFP->xConsiderMaterial )
{
hMaterial = NULL;
switch (GEO_xGetElementType( hPickedObject, xPickedElement ) )
{
case GEO_C_xElementIndexedTriangles:
GEO_vGetGameMaterialOfIndexedTriangles( hPickedObject, xPickedElement, &hMaterial );
break;
/* case GEO_C_xElementFaceMapDescriptors:*/
/* break;*/
}
if ( hMaterial == NULL)
break;
hCM = GMT_fn_hGetCollideMaterial( hMaterial );
if (hCM == GMT_C_InvalidCollideMaterial)
break;
if ( (GMT_fn_hGetCollideMaterialIdentifier( hCM ) & p_stFP->xConsiderMaterial ) == 0 )
break;
}
a4_stPickedPoint[ xPoint ].xZ += gs_fDeltaZ;
}
/* all 4 points of foot print are good : add it*/
if (xPoint == 4)
{
/* move erased point to more transparent object */
for (xObj = (ACP_tdxIndex)(p_stFP->xNumberOfAlphaLevels - 2); xObj >= 0; xObj-- )
{
if ( p_stFP->a8_xNextFaces[ xObj ] < p_stFP->a8_xNumberOfFaces[ xObj ] )
{
/* get pointer on data to be moved */
p_xFaceSource = (ACP_tdxIndex *) &((GEO_tdstElementIndexedTriangles *) p_stFP->a8_hGeomObj[ xObj ]->d_stListOfElements[ 0 ])->d_stListOfFacesTripledIndexUV[ p_stFP->a8_xNextFaces[xObj] ];
p_stPointSource = &p_stFP->a8_hGeomObj[ xObj ]->d_stListOfPoints[p_stFP->a8_xNextFaces[xObj] * 2];
/* get pointer where data will be moved (in next object) */
p_xFaceDest = (ACP_tdxIndex *) &((GEO_tdstElementIndexedTriangles *) p_stFP->a8_hGeomObj[ xObj + 1 ]->d_stListOfElements[ 0 ])->d_stListOfFacesTripledIndexUV[ p_stFP->a8_xNextFaces[xObj + 1] ];
p_stPointDest = &p_stFP->a8_hGeomObj[ xObj + 1 ]->d_stListOfPoints[p_stFP->a8_xNextFaces[xObj + 1] * 2];
/* move points : decrease Z of each point*/
memcpy( p_stPointDest, p_stPointSource, 4 * sizeof( MTH3D_tdstVector ) );
for (xPoint = 0; xPoint < 4; xPoint ++ )
p_stPointDest[ xPoint ].xZ -= 0.001f;
/* move uv indexes */
memcpy( p_xFaceDest, p_xFaceSource, 6 * sizeof( ACP_tdxIndex ) );
/* a face is added in object current + 1, change footpath data */
p_stFP->a8_xNextFaces[xObj + 1] += 2;
if (p_stFP->a8_xNextFaces[xObj + 1] > p_stFP->a8_xNumberOfFaces[ xObj + 1])
{
((GEO_tdstElementIndexedTriangles *) p_stFP->a8_hGeomObj[xObj+1]->d_stListOfElements[0])->xNbFaces = p_stFP->a8_xNextFaces[ xObj + 1];
p_stFP->a8_xNumberOfFaces[ xObj + 1] = p_stFP->a8_xNextFaces[ xObj + 1];
}
if (p_stFP->a8_xNextFaces[ xObj + 1] == p_stFP->a8_xMaxNumberOfFaces[ xObj + 1] )
p_stFP->a8_xNextFaces[ xObj + 1] = 0;
}
}
/* add new point to object 0 */
/* get pointer where data will be moved */
p_stPointDest = &p_stFP->a8_hGeomObj[ 0 ]->d_stListOfPoints[p_stFP->a8_xNextFaces[0] * 2];
p_xFaceDest = (ACP_tdxIndex *) &((GEO_tdstElementIndexedTriangles *) p_stFP->a8_hGeomObj[ 0 ]->d_stListOfElements[ 0 ])->d_stListOfFacesTripledIndexUV[ p_stFP->a8_xNextFaces[ 0 ] ];
/* copy point and UV indexes */
memcpy( p_stPointDest, a4_stPickedPoint, 4 * sizeof( MTH3D_tdstVector ) );
memcpy( p_xFaceDest, gs_a2a6_xUV[ _xType ], 6 * sizeof( ACP_tdxIndex ) );
/* update object 0 footpath data */
p_stFP->a8_xNextFaces[ 0 ] += 2;
if (p_stFP->a8_xNextFaces[ 0 ] > p_stFP->a8_xNumberOfFaces[ 0 ] )
{
((GEO_tdstElementIndexedTriangles *) p_stFP->a8_hGeomObj[0]->d_stListOfElements[ 0 ])->xNbFaces = p_stFP->a8_xNextFaces[ 0 ];
p_stFP->a8_xNumberOfFaces[ 0 ] = p_stFP->a8_xNextFaces[ 0 ];
}
if (p_stFP->a8_xNextFaces[ 0 ] == p_stFP->a8_xMaxNumberOfFaces[ 0 ] )
{
p_stFP->a8_xNextFaces[ 0 ] = 0;
}
}
#endif /* D_THROW_PRT */
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*ENDANNECY VL }*/