⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fog.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 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, &param );
         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, &paramf );
         break;

      case GL_FOG_MODE:
         Fogv( gc, pname, (GLfloat*)&param );
         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, &param );
         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 + -