📄 tnl.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.
**
** ************************************************************************* **
\* ************************************************************************* */
/**************************************************************************
* 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, ¶m ); 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, ¶m ); 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, ¶m );
break;
default:
SetError( gc, GL_INVALID_ENUM );
break;
} // switch
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -