📄 fog.c
字号:
/* ************************************************************************* *\
** ************************************************************************* **
**
** INTEL Corporation Proprietary Information
**
** This listing is supplied under the terms of a license
** agreement with INTEL Corporation and may not be copied
** nor disclosed except in accordance with the terms of
** that agreement.
**
** Copyright (c) 2003 Intel Corporation.
** All Rights Reserved.
**
** ************************************************************************* **
\* ************************************************************************* */
#define MODULE_ID MODID_FOG
#include "context.h"
#include "HXFProfiler.h"
#include "CTL.h"
// Non-format-converting typecast
#define VasI(f) *((CTLU32*)&(f))
#define IasF(i) *((F32*)&(i))
/***********************************************************************************
Function Name : Fogxv
Inputs : gc, pname, param[s]
Outputs : -
Returns : -
Description :
************************************************************************************/
static IMG_VOID Fogv( GLESContext* gc, GLenum ePName, NATIVE const * pParams )
{
HXF_PROFILER_START( HXFPROFILE_STATE_FOG );
switch( ePName )
{
case GL_FOG_COLOR:
{
#if defined( PROFILE_COMMON )
HUINT32 fc = ARGB_Color4f( pParams[0], pParams[1], pParams[2], fHALF );
#elif defined( PROFILE_COMMON_LITE )
HUINT32 fc = ARGB_Color4x( pParams[0], pParams[1], pParams[2], xHALF );
#endif
if( fc != gc->sState.sFog.ui32Color )
{
gc->sState.sFog.ui32Color = fc;
gc->bFogColorInvalid = IMG_TRUE;
} // if
}
break; /* GL_FOG_COLOR */
case GL_FOG_DENSITY:
gc->sState.sFog.Density = pParams[0];
CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_FOG_DENSITY, VasI( pParams[0] ));
break; /* GL_FOG_DENSITY */
case GL_FOG_END:
gc->sState.sFog.End = pParams[0];
gc->sState.sFog.bLinearDirty = IMG_TRUE;
CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_FOG_END, VasI( pParams[0] ));
break; /* GL_FOG_END */
case GL_FOG_START:
gc->sState.sFog.Start = pParams[0];
gc->sState.sFog.bLinearDirty = IMG_TRUE;
CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_FOG_START, VasI( pParams[0] ));
break; /* GL_FOG_START */
case GL_FOG_MODE:
switch ((GLenum) pParams[0])
{
case GL_EXP:
gc->sState.sFog.eMode = (GLenum)pParams[0];
CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_FOG_MODE, CTLFOG_EXP );
break; /* GL_EXP */
case GL_EXP2:
gc->sState.sFog.eMode = (GLenum)pParams[0];
CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_FOG_MODE, CTLFOG_EXP2 );
break; /* GL_EXP2 */
case GL_LINEAR:
gc->sState.sFog.eMode = (GLenum)pParams[0];
CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_FOG_MODE, CTLFOG_LINEAR );
break; /* GL_LINEAR */
default:
SetError( gc, GL_INVALID_ENUM );
break;
} // switch
break; /* GL_FOG_MODE */
default:
SetError( gc, GL_INVALID_ENUM );
break;
} // switch
HXF_PROFILER_STOP( HXFPROFILE_STATE_LIGHT );
} /* Fogv */
/***********************************************************************************
Function Name : glFog[f/fv/x/xv]
Inputs : gc, pname, param[s]
Outputs : -
Returns : -
Description : ENTRYPOINT: Sets fog state specified by pname.
************************************************************************************/
#if defined( PROFILE_COMMON )
GLAPI void APIENTRY glFogfv( GLenum pname, GLfloat const * params )
{
__GL_GET_CONTEXT();
Fogv( gc, pname, params );
} /* glFogfv */
GLAPI void APIENTRY glFogf( GLenum pname, GLfloat param )
{
__GL_GET_CONTEXT();
switch( pname )
{
case GL_FOG_DENSITY:
case GL_FOG_END:
case GL_FOG_START:
case GL_FOG_MODE:
Fogv( gc, pname, ¶m );
break;
default:
SetError( gc, GL_INVALID_ENUM );
break;
} // switch
} /* glFogf */
GLAPI void APIENTRY glFogxv( GLenum pname, GLfixed const * params )
{
GLfloat paramsf[4] = { 0.0f };
__GL_GET_CONTEXT();
switch( pname )
{
case GL_FOG_COLOR:
ArrayXtoF( paramsf, params, 4 );
break;
case GL_FOG_DENSITY:
case GL_FOG_END:
case GL_FOG_START:
paramsf[0] = XtoF( *params );
break;
case GL_FOG_MODE:
paramsf[0] = IasF( *params );
break;
default:
SetError(gc, GL_INVALID_ENUM);
break;
} // switch
glFogfv( pname, paramsf );
} /* glFogxv */
GLAPI void APIENTRY glFogx( GLenum pname, GLfixed param )
{
GLfloat paramf;
__GL_GET_CONTEXT();
switch( pname )
{
case GL_FOG_DENSITY:
case GL_FOG_END:
case GL_FOG_START:
paramf = XtoF( param );
Fogv( gc, pname, ¶mf );
break;
case GL_FOG_MODE:
Fogv( gc, pname, (GLfloat*)¶m );
break;
default:
SetError( gc, GL_INVALID_ENUM );
break;
} // switch
} /* glFogx */
#elif defined( PROFILE_COMMON_LITE )
GLAPI void APIENTRY glFogxv( GLenum pname, GLfixed const * params )
{
__GL_GET_CONTEXT();
Fogv( gc, pname, params );
} /* glFogxv */
GLAPI void APIENTRY glFogx(GLenum pname, GLfixed param)
{
__GL_GET_CONTEXT();
switch( pname )
{
case GL_FOG_MODE:
case GL_FOG_DENSITY:
case GL_FOG_START:
case GL_FOG_END:
Fogv( gc, pname, ¶m );
break;
default:
SetError(gc, GL_INVALID_ENUM);
break;
} // switch
} /* glFogx */
#else
#error "Profile not defined for glFog"
#endif /* PROFILE */
/***********************************************************************************
************************************************************************************/
void InitFogState(GLESContext *gc)
{
GLESfogState* pFog = &(gc->sState.sFog);
// Currently assume structure has already been initialized to zeros.
pFog->eMode = GL_EXP;
pFog->Density = nONE;
pFog->Start = nZERO;
pFog->End = nONE;
pFog->bLinearDirty = IMG_FALSE;
pFog->MVChangeCount = GLES_MATRIX_CHANGECOUNT_INVALID;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -