📄 texcombine.c
字号:
/******************************************************************************
* Name : texcombine.c
* Title : Texture combine functions
* Author : BCB
* Created : 28/11/2003
*
* Copyright : 2004 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.
*
* Description : Uses table generated by textool
*
* Platform : ANSI
*
* Modifications:
* $Log: texcombine.c $
*****************************************************************************/
#define MODULE_ID MODID_TEXCOMBINE
#if defined(SUPPORT_MBX1)
#include "context.h"
#include "tstable.h"
#include "texcombine.h"
const static IMG_UINT32 aui32InvSwiz[2][8][4] =
{
{
{ MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS4SHIFT },
{ MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS4SHIFT },
{ MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS3SHIFT },
{ MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS3SHIFT },
{ MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS2SHIFT },
{ MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS1SHIFT, MBX1_TSPPL3_INVCS2SHIFT },
{ MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS1SHIFT },
{ MBX1_TSPPL3_INVCS4SHIFT, MBX1_TSPPL3_INVCS3SHIFT, MBX1_TSPPL3_INVCS2SHIFT, MBX1_TSPPL3_INVCS1SHIFT }
},
{
{ MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS4SHIFT },
{ MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS4SHIFT },
{ MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS3SHIFT },
{ MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS3SHIFT },
{ MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS2SHIFT },
{ MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS1SHIFT, MBX1_TSPPL3_INVAS2SHIFT },
{ MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS1SHIFT },
{ MBX1_TSPPL3_INVAS4SHIFT, MBX1_TSPPL3_INVAS3SHIFT, MBX1_TSPPL3_INVAS2SHIFT, MBX1_TSPPL3_INVAS1SHIFT }
}
};
const static IMG_UINT32 aui32Op3Count[2] = {GLES_COLOROP3_COUNT, GLES_ALPHAOP3_COUNT};
IMG_VOID TexEnvCombine(GLESContext *gc, GLenum pname, GLenum e)
{
IMG_UINT8 ui8Op, ui8Scale, ui8Src;
IMG_UINT32 ui32SrcIndex, ui32Unit;
GLEStextureEnvState *psEnvState = &gc->sState.sTexture.psActive->sEnv;
ui32Unit = gc->sState.sTexture.ui32ActiveTexture;
switch (pname)
{
case GL_COMBINE_RGB:
switch(e)
{
case GL_REPLACE:
ui8Op = GLES_COMBINEOP_REPLACE;
break;
case GL_MODULATE:
ui8Op = GLES_COMBINEOP_MODULATE;
break;
case GL_ADD:
ui8Op = GLES_COMBINEOP_ADD;
break;
case GL_ADD_SIGNED:
ui8Op = GLES_COMBINEOP_ADD_SIGNED;
break;
case GL_INTERPOLATE:
ui8Op = GLES_COMBINEOP_INTERPOLATE;
break;
case GL_SUBTRACT:
ui8Op = GLES_COMBINEOP_SUBTRACT;
break;
case GL_DOT3_RGB:
ui8Op = GLES_COMBINEOP_DOT3_RGB;
break;
case GL_DOT3_RGBA:
ui8Op = GLES_COMBINEOP_DOT3_RGBA;
break;
default:
bad_enum:
SetError(gc, GL_INVALID_ENUM);
return;
}
psEnvState->ui8ScaleOp[GLES_COMBINE_COLOR] &= GLES_COMBINEOP_OPCLEAR;
psEnvState->ui8ScaleOp[GLES_COMBINE_COLOR] |= (ui8Op << GLES_COMBINEOP_OPSHIFT);
break;
case GL_COMBINE_ALPHA:
switch(e)
{
case GL_REPLACE:
ui8Op = GLES_COMBINEOP_REPLACE;
break;
case GL_MODULATE:
ui8Op = GLES_COMBINEOP_MODULATE;
break;
case GL_ADD:
ui8Op = GLES_COMBINEOP_ADD;
break;
case GL_ADD_SIGNED:
ui8Op = GLES_COMBINEOP_ADD_SIGNED;
break;
case GL_INTERPOLATE:
ui8Op = GLES_COMBINEOP_INTERPOLATE;
break;
case GL_SUBTRACT:
ui8Op = GLES_COMBINEOP_SUBTRACT;
break;
default:
goto bad_enum;
}
psEnvState->ui8ScaleOp[GLES_COMBINE_ALPHA] &= GLES_COMBINEOP_OPCLEAR;
psEnvState->ui8ScaleOp[GLES_COMBINE_ALPHA] |= (ui8Op << GLES_COMBINEOP_OPSHIFT);
break;
case GL_SOURCE0_RGB:
case GL_SOURCE1_RGB:
case GL_SOURCE2_RGB:
ui32SrcIndex = pname - GL_SOURCE0_RGB;
switch(e)
{
case GL_TEXTURE:
ui8Src = GLES_COMBINESRC_TEXTURE;
break;
case GL_CONSTANT:
ui8Src = GLES_COMBINESRC_CONSTANT;
break;
case GL_PRIMARY_COLOR:
ui8Src = GLES_COMBINESRC_PRIMARY;
break;
case GL_PREVIOUS:
if(ui32Unit == 0)
ui8Src = GLES_COMBINESRC_PRIMARY;
else
ui8Src = GLES_COMBINESRC_PREVIOUS;
break;
default:
goto bad_enum;
}
psEnvState->aui8Src[GLES_COMBINE_COLOR][ui32SrcIndex] &= GLES_COMBINESRC_SRCCLEAR;
psEnvState->aui8Src[GLES_COMBINE_COLOR][ui32SrcIndex] |= (ui8Src << GLES_COMBINESRC_SRCSHIFT);
break;
case GL_SOURCE0_ALPHA:
case GL_SOURCE1_ALPHA:
case GL_SOURCE2_ALPHA:
ui32SrcIndex = pname - GL_SOURCE0_ALPHA;
switch(e)
{
case GL_TEXTURE:
ui8Src = GLES_COMBINESRC_TEXTURE;
break;
case GL_CONSTANT:
ui8Src = GLES_COMBINESRC_CONSTANT;
break;
case GL_PRIMARY_COLOR:
ui8Src = GLES_COMBINESRC_PRIMARY;
break;
case GL_PREVIOUS:
if(ui32Unit == 0)
ui8Src = GLES_COMBINESRC_PRIMARY;
else
ui8Src = GLES_COMBINESRC_PREVIOUS;
break;
default:
goto bad_enum;
}
psEnvState->aui8Src[GLES_COMBINE_ALPHA][ui32SrcIndex] &= GLES_COMBINESRC_SRCCLEAR;
psEnvState->aui8Src[GLES_COMBINE_ALPHA][ui32SrcIndex] |= (ui8Src << GLES_COMBINESRC_SRCSHIFT);
break;
case GL_OPERAND0_RGB:
case GL_OPERAND1_RGB:
case GL_OPERAND2_RGB:
ui32SrcIndex = pname - GL_OPERAND0_RGB;
switch(e)
{
case GL_SRC_COLOR:
/* Don't need an operand to get color */
ui8Src = 0;
break;
case GL_ONE_MINUS_SRC_COLOR:
ui8Src = GLES_COMBINESRC_OPERANDONEMINUS;
break;
case GL_SRC_ALPHA:
ui8Src = GLES_COMBINESRC_OPERANDALPHA;
break;
case GL_ONE_MINUS_SRC_ALPHA:
ui8Src = GLES_COMBINESRC_OPERANDALPHA | GLES_COMBINESRC_OPERANDONEMINUS;
break;
default:
goto bad_enum;
}
psEnvState->aui8Src[GLES_COMBINE_COLOR][ui32SrcIndex] &= GLES_COMBINESRC_OPERANDCLEAR;
psEnvState->aui8Src[GLES_COMBINE_COLOR][ui32SrcIndex] |= ui8Src;
break;
case GL_OPERAND0_ALPHA:
case GL_OPERAND1_ALPHA:
case GL_OPERAND2_ALPHA:
ui32SrcIndex = pname - GL_OPERAND0_ALPHA;
switch(e)
{
case GL_SRC_ALPHA:
/* Don't need an operand to get alpha */
ui8Src = 0;
break;
case GL_ONE_MINUS_SRC_ALPHA:
ui8Src = GLES_COMBINESRC_OPERANDONEMINUS;
break;
default:
goto bad_enum;
}
psEnvState->aui8Src[GLES_COMBINE_ALPHA][ui32SrcIndex] &= GLES_COMBINESRC_OPERANDCLEAR;
psEnvState->aui8Src[GLES_COMBINE_ALPHA][ui32SrcIndex] |= ui8Src;
break;
case GL_RGB_SCALE:
switch(e)
{
case 1:
ui8Scale = GLES_COMBINEOP_SCALE_ONE;
break;
case 2:
ui8Scale = GLES_COMBINEOP_SCALE_TWO;
break;
case 4:
ui8Scale = GLES_COMBINEOP_SCALE_FOUR;
break;
default:
goto bad_enum;
}
psEnvState->ui8ScaleOp[GLES_COMBINE_COLOR] &= GLES_COMBINEOP_SCALECLEAR;
psEnvState->ui8ScaleOp[GLES_COMBINE_COLOR] |= ui8Scale;
break;
case GL_ALPHA_SCALE:
switch(e)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -