188 lines
5.9 KiB
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
|