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

📄 tnl.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ************************************************************************* *\
** ************************************************************************* **
**
**    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.
**
** ************************************************************************* **
\* ************************************************************************* */

/**************************************************************************
 * Name         : tnl.c
 * Author       : BCB
 * Created      : 01/05/2003
 *
 * Copyright    : 2003 by Imagination Technologies Limited. All rights reserved.
 *              : No part of this software, either material or conceptual
 *              : may be copied or distributed, transmitted, transcribed,
 *              : stored in a retrieval system or translated into any
 *              : human or computer language in any form by any means,
 *              : electronic, mechanical, manual or other-wise, or
 *              : disclosed to third parties without the express written
 *              : permission of Imagination Technologies Limited, Unit 8, HomePark
 *              : Industrial Estate, King's Langley, Hertfordshire,
 *              : WD4 8LZ, U.K.
 *
 * Platform     : ANSI
 **************************************************************************/
 #define MODULE_ID MODID_TNL

#include "context.h"
#include "slaveport.h"
#include "tnlstate.h"
#include "HXFProfiler.h"
#include "CTL.h"

/***********************************************************************************
 Function Name      : glLightModel[f/fv/x/xv]
 Inputs             : pname, param
 Outputs            : -
 Returns            : -
 Description        : ENTRYPOINT: Sets light model parameter specified by pname
					  Stored internally, used to control VGP code+constants/SW TNL.
************************************************************************************/
#if defined( PROFILE_COMMON )

GLAPI void APIENTRY glLightModelfv( GLenum pname, GLfloat const * params )
   {
   GLESlightModelState *psModel = 0;
   __GL_GET_CONTEXT();

   HXF_PROFILER_START( HXFPROFILE_STATE_LIGHT );

   psModel = &gc->sState.sLight.sModel;
   switch( pname )
      {
      case GL_LIGHT_MODEL_AMBIENT:
         memcpy( &psModel->Ambient, params, 4 * sizeof( GLfloat ));
         break;  /* GL_LIGHT_MODEL_AMBIENT */

      case GL_LIGHT_MODEL_TWO_SIDE:
         psModel->bTwoSided = ( nZERO != params[0] ) ? CTLTRUE : CTLFALSE;
         CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_LIGHT_TWOSIDED, psModel->bTwoSided );
         break;  /* GL_LIGHT_MODEL_TWO_SIDE */

      default:
         SetError( gc, GL_INVALID_ENUM );
         break;
      }  // switch

   HXF_PROFILER_STOP( HXFPROFILE_STATE_LIGHT );
   
   }  /* glLightModelfv */

// Forwards to vector version.
GLAPI void APIENTRY glLightModelf( GLenum pname, GLfloat param )
   {
   __GL_GET_CONTEXT();
   switch( pname )
      {
      case GL_LIGHT_MODEL_TWO_SIDE: glLightModelfv( pname, &param ); break;
      default: SetError( gc, GL_INVALID_ENUM ); break;
      }  // switch

   }  /* glLightModelf */

// Do fixed to float translations and forward to respective float version.
GLAPI void APIENTRY glLightModelxv( GLenum pname, GLfixed const * params )
   {
   GLfloat paramsf[4] = { 0.0f };

   __GL_GET_CONTEXT();
   switch( pname )
      {
      case GL_LIGHT_MODEL_AMBIENT:  ArrayXtoF( paramsf, params, 4 ); break;
      case GL_LIGHT_MODEL_TWO_SIDE: paramsf[0] = XtoF( *params );    break;
      default: SetError( gc, GL_INVALID_ENUM ); return;
      }  // switch

   glLightModelfv( pname, paramsf );

   }  /* glLightModelxv */

GLAPI void APIENTRY glLightModelx( GLenum pname, GLfixed param )
   {
   glLightModelf( pname, XtoF( param ));
   }  /* glLightModelx */

#elif defined( PROFILE_COMMON_LITE )

GLAPI void APIENTRY glLightModelxv( GLenum pname, GLfixed const * params )
   {
   GLESlightModelState *psModel = 0;
   __GL_GET_CONTEXT();

   HXF_PROFILER_START( HXFPROFILE_STATE_LIGHT );

   psModel = &gc->sState.sLight.sModel;
   switch( pname )
      {
      case GL_LIGHT_MODEL_AMBIENT:
         memcpy( &psModel->Ambient, params, 4 * sizeof( GLfixed ));
         break;  /* GL_LIGHT_MODEL_AMBIENT */

      case GL_LIGHT_MODEL_TWO_SIDE:
         psModel->bTwoSided = ( nZERO != params[0] ) ? CTLTRUE : CTLFALSE;
         CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_LIGHT_TWOSIDED, psModel->bTwoSided );
         break;  /* GL_LIGHT_MODEL_TWO_SIDE */

      default:
         SetError( gc, GL_INVALID_ENUM );
         break;
      }  // switch

   HXF_PROFILER_STOP( HXFPROFILE_STATE_LIGHT );
   
   }  /* glLightModelxv */

// Forwards to vector version.
GLAPI void APIENTRY glLightModelx( GLenum pname, GLfixed param )
   {
	__GL_GET_CONTEXT();
   switch( pname )
      {
      case GL_LIGHT_MODEL_TWO_SIDE: glLightModelxv( pname, &param ); break;
      default: SetError( gc, GL_INVALID_ENUM ); break;
      }  // switch

   }  /* glLightModelx */

#else
#error "*** Profile not defined for glLightModel."
#endif  /* PROFILE */


/***********************************************************************************
 Function Name      : Lightxv
 Inputs             : gc, eLight, ePname, pfParams
 Outputs            : -
 Returns            : -
 Description        :
************************************************************************************/
static IMG_VOID Lightv( GLESContext *gc, GLenum eLight, GLenum ePname, NATIVE const * pParams )
   {
   GLESlightSourceState *psLss = 0;
   eLight -= GL_LIGHT0;

   if( eLight >=  GLES_MAX_LIGHTS )
      {  // invalid light index
      SetError( gc, GL_INVALID_ENUM );
      return;
      }  // if 

   HXF_PROFILER_START( HXFPROFILE_STATE_LIGHT );

   psLss = &(gc->sState.sLight.sLights[eLight]);
   switch( ePname )
      {
      case GL_AMBIENT:
         memcpy( &psLss->ctlLight.sAmbient, pParams, 4 * sizeof( NATIVE ));
         break;  /* GL_AMBIENT */

      case GL_DIFFUSE:
         memcpy( &psLss->ctlLight.sDiffuse, pParams, 4 * sizeof( NATIVE ));
         break;  /* GL_DIFFUSE */

      case GL_SPECULAR:
         memcpy( &psLss->ctlLight.sSpecular, pParams, 4 * sizeof( NATIVE ));

         //psLss->Flags &= ~GLES_LIGHT_SPECULAR_ENABLE;
         //if( !Color4s_IsZero( (U16*)psLss->sSpecular.pClr ))
            {
         //   psLss->Flags |= GLES_LIGHT_SPECULAR_ENABLE;
            }  // if
         break;  /* GL_SPECULAR */

      case GL_POSITION:
         VECTOR4_TRANS( (NATIVE*)&psLss->ctlLight.sPosition, 
               (NATIVE*)pParams, (NATIVE*)ModelViewGetCurrentMatrix( gc, HFALSE ));
         
         psLss->Flags &= ~GLES_LIGHT_POINT;
         if( pParams[3] != nZERO )
            {
            psLss->Flags |= GLES_LIGHT_POINT;
            }  // if

         psLss->MVPositionChangeCount = GLES_MATRIX_CHANGECOUNT_INVALID;
         break;  /* GL_POSITION */

      case GL_SPOT_DIRECTION:
         VECTOR3_TRANS( (NATIVE*)&psLss->ctlLight.sDirection, 
               (NATIVE*)pParams, (NATIVE*)ModelViewGetCurrentMatrix( gc, HFALSE ));

         psLss->MVDirectionChangeCount = GLES_MATRIX_CHANGECOUNT_INVALID;
         break;  /* GL_DIRECTION */

      case GL_SPOT_CUTOFF:
         if(( pParams[0] != I32toNATIVE( 180 )) && 
            (( pParams[0] < nZERO ) || ( pParams[0] > I32toNATIVE( 90 ))))
            {
            SetError( gc, GL_INVALID_VALUE );
            return;
            }  // if
         psLss->ctlLight.SpotCutoff = pParams[0];
         break;  /* GL_SPOT_CUTOFF */

      case GL_SPOT_EXPONENT:
         if(( pParams[0] < nZERO ) || ( pParams[0] > I32toNATIVE( 128 )))
            {
            SetError( gc, GL_INVALID_VALUE );
            return;
            }
         psLss->ctlLight.SpotExponent = pParams[0];
         break;  /* GL_SPOT_EXPONENT */

      case GL_CONSTANT_ATTENUATION:
         if( pParams[0] < nZERO )
            {
            SetError( gc, GL_INVALID_VALUE );
            return;
            }
         psLss->ctlLight.Attenuation[0] = pParams[0];
         psLss->Flags |= GLES_LIGHT_ATTENUATION_DIRTY;
         break;  /* GL_CONSTANT_ATTENUATION */

      case GL_LINEAR_ATTENUATION:
         if( pParams[0] < nZERO )
            {
            SetError( gc, GL_INVALID_VALUE );
            return;
            }
         psLss->ctlLight.Attenuation[1] = pParams[0];
         psLss->Flags |= GLES_LIGHT_ATTENUATION_DIRTY;
         break;  /* GL_LINEAR_ATTENUATION */

      case GL_QUADRATIC_ATTENUATION:
         if( pParams[0] < nZERO )
            {
            SetError( gc, GL_INVALID_VALUE );
            return;
            }
         psLss->ctlLight.Attenuation[2] = pParams[0];
         psLss->Flags |= GLES_LIGHT_ATTENUATION_DIRTY;
         break;  /* GL_QUADRATIC_ATTENTUATION */

      default:
         SetError( gc, GL_INVALID_ENUM );
         break;
      }  // switch

   HXF_PROFILER_STOP( HXFPROFILE_STATE_LIGHT );

   }  /* Lightv */


   /***********************************************************************************
 Function Name      : glLight[f/fv/x/xv]
 Inputs             : light, pname, param
 Outputs            : -
 Returns            : -
 Description        : ENTRYPOINT: Sets light parameter specified by pname.
************************************************************************************/
#if defined( PROFILE_COMMON )

GLAPI void APIENTRY glLightfv( GLenum light, GLenum pname, GLfloat const * params )
   {
   __GL_GET_CONTEXT();
   Lightv( gc, light, pname, params );
   }  /* glLightfv */

GLAPI void APIENTRY glLightf( GLenum light, GLenum pname, GLfloat param )
   {
   __GL_GET_CONTEXT();
   switch( pname )
      {
      case GL_SPOT_CUTOFF:
      case GL_SPOT_EXPONENT:
      case GL_CONSTANT_ATTENUATION:
      case GL_LINEAR_ATTENUATION:
      case GL_QUADRATIC_ATTENUATION:
         Lightv( gc, light, pname, &param );
         break;
      
      default:
         SetError( gc, GL_INVALID_ENUM );
         break;
      }  // switch

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -