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

188 lines
5.9 KiB
C

/*
=======================================================================================
Name : Fog.c
Description : Fog high level functions
=======================================================================================
*/
/*
Tested with LINT
*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define MTH_LOW
#include "gli_st.h"
#include "GLI_Defn.h"
#include "light_st.h"
#include "PvObj_st.h"
#include "Liste.h"
#include "vpt3D.h"
#include "camera.h"
#include "light.h"
#include "PRF.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
extern GLI_tdstInternalGlobalValuesFor3dEngine *GLI_BIG_GLOBALS;
/*
=======================================================================================
Globals
=======================================================================================
*/
/* Global variables for a global fog */
tdstFogParams GLI_g_stSaveFog;
ACP_tdxBool GLI_g_bSaveFog;
char GLI_cGlobalFogIsOn = 0;
MTH_tdxReal GLI_xFogNear, GLI_xFogFar, GLI_xFogInfinite;
MTH_tdxReal GLI_xFogBlendNear, GLI_xFogBlendFar;
GEO_tdstColor GLI_stFogColor;
tdstFogParams GLI_ga_stFogTable[ GLI_C_lMaxFog ];
tdstFogParams *GLI_gp_stCurrentFog = GLI_ga_stFogTable;
tdstFogParams *GLI_gp_stLastFog = GLI_ga_stFogTable + GLI_C_lMaxFog;
/*
=======================================================================================
Functions
=======================================================================================
*/
#ifdef __cplusplus
extern "C"
{
#endif
#ifndef RETAIL
/*
----------------------------------------------------------------------------------------
Description : Set the Fog (old function kept for compatibility )
used only by editors
----------------------------------------------------------------------------------------
*/
void GLI_vSetFog(GLI_tdxValue xDepthStart, GLI_tdxValue xDepthEnd, GLI_tdxValue xInfinite, GEO_tdstColor *p_stFogColor)
{
long xDepthStartCOR, xDepthEndCOR ;
float xChange;
/*
* check params
*/
if (xDepthEnd < xDepthStart)
{
xChange = xDepthStart;
xDepthStart = xDepthEnd ;
xDepthEnd = xChange;
}
if (xInfinite < xDepthEnd)
xInfinite = xDepthEnd;
/* This is for correct a bug*/
if ( xInfinite != 0 )
{
xDepthStartCOR = (long)(xDepthStart*64.f / xInfinite) ;
xDepthEndCOR = (long)(xDepthEnd*64.f / xInfinite) ;
xDepthStart = (float)(pow(2.0f,3.0 + (double)(xDepthStartCOR>>2)) / (float)(8 - (xDepthStartCOR & 3)) * GLI_C_xZClippingNear);
xDepthEnd = (float)(pow(2.0f,3.0 + (double)(xDepthEndCOR>>2)) / (float)(8 - (xDepthEndCOR & 3)) * GLI_C_xZClippingNear);
}
GLI_vSetFog2(0.0f, xDepthStart / 4.0f, 255.0f, xDepthEnd / 4.0f, 0.0f,p_stFogColor);
}
#endif
/*
----------------------------------------------------------------------------------------
Description : Set the Fog (old function kept for compatibility )
----------------------------------------------------------------------------------------
*/
void GLI_vSetFog2( GLI_tdxValue xBlendStart, GLI_tdxValue xDepthStart, GLI_tdxValue xBlendEnd, GLI_tdxValue xDepthEnd, GLI_tdxValue xInfinite, GEO_tdstColor *p_stFogColor)
{
tdstFogParams *GLI_ga_stFogStart;
/*
* check params
*/
if (xDepthEnd < xDepthStart)
{
GLI_gp_stCurrentFog->xDepthStart = xDepthEnd;
GLI_gp_stCurrentFog->xDepthEnd = xDepthStart;
}
else
{
GLI_gp_stCurrentFog->xDepthStart = xDepthStart;
GLI_gp_stCurrentFog->xDepthEnd = xDepthEnd;
}
if (xInfinite < GLI_gp_stCurrentFog->xDepthEnd)
GLI_gp_stCurrentFog->xInfinite = xDepthEnd;
else
GLI_gp_stCurrentFog->xInfinite = xInfinite;
if (xBlendStart < 0.0f)
xBlendStart = 0.0f;
else if (xBlendStart > 255.0f)
xBlendStart = 255.0f;
if (xBlendEnd < 0.0f)
xBlendEnd = 0.0f;
else if (xBlendEnd > 255.0f)
xBlendEnd = 255.0f;
GLI_gp_stCurrentFog->xBlendStart = xBlendStart;
GLI_gp_stCurrentFog->xBlendEnd = xBlendEnd;
GLI_gp_stCurrentFog->stColor = *p_stFogColor;
for ( GLI_ga_stFogStart = GLI_ga_stFogTable; GLI_ga_stFogStart < GLI_gp_stCurrentFog; GLI_ga_stFogStart++ )
{
if (memcmp( GLI_gp_stCurrentFog, GLI_ga_stFogStart, sizeof(tdstFogParams) ) == 0)
{
GLI_BIG_GLOBALS->p_stActiveFog = GLI_ga_stFogStart;
return;
}
}
GLI_BIG_GLOBALS->p_stActiveFog = GLI_gp_stCurrentFog++;
if (GLI_gp_stCurrentFog == GLI_gp_stLastFog)
GLI_gp_stCurrentFog = GLI_ga_stFogTable;
}
/*
----------------------------------------------------------------------------------------
Description : Get the Fog (old function kept for compatibility )
----------------------------------------------------------------------------------------
*/
void GLI_vGetFog(GLI_tdxValue *p_xDepthStart, GLI_tdxValue *p_xDepthEnd, GEO_tdstColor *p_stFogColor)
{
*p_xDepthStart = GLI_BIG_GLOBALS->p_stActiveFog->xDepthStart;
*p_xDepthEnd = GLI_BIG_GLOBALS->p_stActiveFog->xDepthEnd;
*p_stFogColor = GLI_BIG_GLOBALS->p_stActiveFog->stColor;
}
/*
----------------------------------------------------------------------------------------
Description : set fog flag to indicate that fog is on
----------------------------------------------------------------------------------------
*/
void GLI_vFogOn(void)
{
GLI_BIG_GLOBALS->xFogIsOn = 1;
}
/*
----------------------------------------------------------------------------------------
Description : set fog flag for no fog
----------------------------------------------------------------------------------------
*/
void GLI_vFogOff(void)
{
GLI_BIG_GLOBALS->p_stLastComputedFog = NULL;
GLI_BIG_GLOBALS->p_stActiveFog = NULL;
GLI_BIG_GLOBALS->xFogIsOn = 0;
}
#ifdef __cplusplus
} /* extern "C" */
#endif