reman3/Rayman_X/cpa/tempgrp/GliGlou/MultiDRV/Src/PrCoVert.c

230 lines
10 KiB
C

/*
Tested with LINT
*/
#include"gli_st.h"
#include "GLI_Defn.h"
#include "light_st.h"
#include "PvObj_st.h"
#include "PRF.h"
#ifdef __cplusplus
extern "C"
{
#endif
#define GLI_C_fMagicNumber (16384.0f + 8192.0f)
#define M_vComputeMagicColor()\
stTempColor.xR = p_stGP->GLI_stColorsAdd.xR + GLI_C_fMagicNumber;\
stTempColor.xG = p_stGP->GLI_stColorsAdd.xG + GLI_C_fMagicNumber;\
stTempColor.xB = p_stGP->GLI_stColorsAdd.xB + GLI_C_fMagicNumber;\
stTempColor.xA = p_stGP->GLI_stColorsAdd.xA + GLI_C_fMagicNumber;
/*
----------------------------------------------------------------------------------------
Description : compute screen color (not alpha) for some vertices (index of vertices are in list)
Author : Steve McCalla
Optimized : Yes - got rid of almost all branches
----------------------------------------------------------------------------------------
*/
void GLI_vSerialComputeVertexColorIndexedNoAlpha(GLI_tdstInternalGlobalValuesFor3dEngine *p_stGP, ACP_tdxIndex xNumber, ACP_tdxIndex *p_ListOfIndexes)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
unsigned long *p_ulFirstColor;
unsigned long Alpha;
unsigned long ulRed, ulGreen, ulBlue;
GEO_tdstColor stComputedColor,*p_SRCColors;
GEO_tdstColor stTempColor;
ACP_tdxIndex *p_ListOfIndexesLast;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
M_vComputeMagicColor()
p_ListOfIndexesLast = p_ListOfIndexes + xNumber;
p_ulFirstColor = &p_stGP->GLI_ScreenPoint->ulPackedColor;
Alpha = (*((unsigned long *)&stTempColor.xA) & 0x00400000) ? ( (*((unsigned long *)&stTempColor.xA) & 0x0000FF00) ? 0xFF : (*((unsigned long *)&stTempColor.xA) & 0x000000FF) ) : 0;
Alpha <<= 24;
while (p_ListOfIndexes < p_ListOfIndexesLast)
{
p_SRCColors = p_stGP->GLI_aDEF_stColorsRLID + *p_ListOfIndexes;
stComputedColor.xR = p_SRCColors->xR * p_stGP->GLI_stColorsMul.xR + stTempColor.xR ;
stComputedColor.xG = p_SRCColors->xG * p_stGP->GLI_stColorsMul.xG + stTempColor.xG ;
stComputedColor.xB = p_SRCColors->xB * p_stGP->GLI_stColorsMul.xB + stTempColor.xB ;
ulRed = (*((unsigned long *)&stComputedColor.xR) & 0x00400000) ? ( (*((unsigned long *)&stComputedColor.xR) & 0x0000FF00) ? 0xFF0000 : (*((unsigned long *)&stComputedColor.xR) & 0x000000FF)<<16 ) : 0;
ulGreen = (*((unsigned long *)&stComputedColor.xG) & 0x00400000) ? ( (*((unsigned long *)&stComputedColor.xG) & 0x0000FF00) ? 0xFF00 : (*((unsigned long *)&stComputedColor.xG) & 0x000000FF)<<8 ) : 0;
ulBlue = (*((unsigned long *)&stComputedColor.xB) & 0x00400000) ? ( (*((unsigned long *)&stComputedColor.xB) & 0x0000FF00) ? 0xFF : (*((unsigned long *)&stComputedColor.xB) & 0x000000FF) ) : 0;
/* p_ulFirstColor + 4 * index because size of GLI_tdstAligned2DVector is 4*/
*(p_ulFirstColor + ((*p_ListOfIndexes++) << 2)) = Alpha | ulRed | ulGreen | ulBlue;
}
}
/*
----------------------------------------------------------------------------------------
Description : compute screen color (but not alpha) for a number of sequential vertices
Author : Steve McCalla
Optimized : Yes
----------------------------------------------------------------------------------------
*/
void GLI_vSerialComputeVertexColor2NoAlpha(GLI_tdstInternalGlobalValuesFor3dEngine *p_stGP, ACP_tdxIndex xNumber)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
GLI_tdstAligned2DVector *p_Baseu32Colors;
GEO_tdstColor stComputedColor,*p_SRCColors;
GEO_tdstColor stTempColor;
unsigned long ulRed, ulGreen, ulBlue;
unsigned long Alpha;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
M_vComputeMagicColor();
p_Baseu32Colors = (GLI_tdstAligned2DVector *) &p_stGP->GLI_ScreenPoint->ulPackedColor;
p_SRCColors = p_stGP -> GLI_aDEF_stColorsRLID;
Alpha = (*((unsigned long *)&stTempColor.xA) & 0x00400000) ? ( (*((unsigned long *)&stTempColor.xA) & 0x0000FF00) ? 0xFF : (*((unsigned long *)&stTempColor.xA) & 0x000000FF) ) : 0;
Alpha <<= 24;
while (xNumber--)
{
stComputedColor.xR = p_SRCColors->xR * p_stGP->GLI_stColorsMul.xR + stTempColor.xR ;
stComputedColor.xG = p_SRCColors->xG * p_stGP->GLI_stColorsMul.xG + stTempColor.xG ;
stComputedColor.xB = p_SRCColors->xB * p_stGP->GLI_stColorsMul.xB + stTempColor.xB ;
ulBlue = (*((unsigned long *)&stComputedColor.xB) & 0x00400000) ? ( (*((unsigned long *)&stComputedColor.xB) & 0x0000FF00) ? 0xFF : (*((unsigned long *)&stComputedColor.xB) & 0x000000FF) ) : 0;
ulRed = (*((unsigned long *)&stComputedColor.xR) & 0x00400000) ? ( (*((unsigned long *)&stComputedColor.xR) & 0x0000FF00) ? 0xFF0000 : (*((unsigned long *)&stComputedColor.xR) & 0x000000FF)<<16 ) : 0;
ulGreen = (*((unsigned long *)&stComputedColor.xG) & 0x00400000) ? ( (*((unsigned long *)&stComputedColor.xG) & 0x0000FF00) ? 0xFF00 : (*((unsigned long *)&stComputedColor.xG) & 0x000000FF)<<8 ) : 0;
*(long *) p_Baseu32Colors++ = Alpha | ulRed | ulGreen | ulBlue;
p_SRCColors++;
}
}
/*
----------------------------------------------------------------------------------------
Description : compute screen color for all vertex when Light is alpha sensitive
Author : Steve McCalla
Optimized : Yes
----------------------------------------------------------------------------------------
*/
void GLI_vSerialComputeVertexColorIndexedAlpha(GLI_tdstInternalGlobalValuesFor3dEngine *p_stGP, ACP_tdxIndex xNumber, ACP_tdxIndex *p_ListOfIndexes)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
unsigned long *p_Baseu32Colors;
GEO_tdstColor stTempColor, stComputedColor;
unsigned long ulTmpColor;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
M_vComputeMagicColor();
while (xNumber--)
{
p_Baseu32Colors = &(p_stGP->GLI_ScreenPoint + *p_ListOfIndexes)->ulPackedColor;
ulTmpColor = 0;
stComputedColor.xR = (p_stGP -> GLI_aDEF_stColorsRLID + (*p_ListOfIndexes)) -> xR * p_stGP -> GLI_stColorsMul . xR + stTempColor.xR;
stComputedColor.xG = (p_stGP -> GLI_aDEF_stColorsRLID + (*p_ListOfIndexes)) -> xG * p_stGP -> GLI_stColorsMul . xG + stTempColor.xG ;
stComputedColor.xB = (p_stGP -> GLI_aDEF_stColorsRLID + (*p_ListOfIndexes)) -> xB * p_stGP -> GLI_stColorsMul . xB + stTempColor.xB;
stComputedColor.xA = (p_stGP -> GLI_aDEF_stColorsRLID + (*p_ListOfIndexes)) -> xA * p_stGP -> GLI_stColorsMul . xA + stTempColor.xA ;
if (*((long *)&stComputedColor.xR) & 0x00400000)
{
if (*((unsigned long *)&stComputedColor.xR) & 0x0000FF00)
ulTmpColor |= 0x00FF0000;
else
ulTmpColor |= (*((unsigned long *)&stComputedColor.xR) & 0x000000FF) << 16;
}
if (*((long *)&stComputedColor.xG) & 0x00400000)
{
if (*((unsigned long *)&stComputedColor.xG) & 0x0000FF00)
ulTmpColor |= 0x0000FF00;
else
ulTmpColor |= (*((unsigned long *)&stComputedColor.xG) & 0x000000FF) << 8;
}
if (*((long *)&stComputedColor.xB) & 0x00400000)
{
if (*((unsigned long *)&stComputedColor.xB) & 0x0000FF00)
ulTmpColor |= 0x000000FF;
else
ulTmpColor |= (*((unsigned long *)&stComputedColor.xB) & 0x000000FF) ;
}
if (*((long *)&stComputedColor.xA) & 0x00400000)
{
if (*((unsigned long *)&stComputedColor.xA) & 0x0000FF00)
ulTmpColor |= 0xFF000000;
else
ulTmpColor |= (*((unsigned long *)&stComputedColor.xA) & 0x000000FF) << 24;
}
*p_Baseu32Colors = ulTmpColor;
p_ListOfIndexes++;
}
}
/*
----------------------------------------------------------------------------------------
Description : compute screen color for all vertex when Light is alpha sensitive
Author : Steve McCalla
Optimized : No (not called very often)
----------------------------------------------------------------------------------------
*/
void GLI_vSerialComputeVertexColor2Alpha(GLI_tdstInternalGlobalValuesFor3dEngine *p_stGP, ACP_tdxIndex xNumber)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
GLI_tdstAligned2DVector *p_Baseu32Colors;
GEO_tdstColor stTempColor ,stComputedColor,*p_SRCColors;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
M_vComputeMagicColor();
p_Baseu32Colors = p_stGP->GLI_ScreenPoint;
p_SRCColors = p_stGP -> GLI_aDEF_stColorsRLID;
while (xNumber--)
{
p_Baseu32Colors->ulPackedColor = 0;
stComputedColor.xR = (p_SRCColors) ->xR * p_stGP->GLI_stColorsMul.xR + stTempColor.xR;
stComputedColor.xG = (p_SRCColors) ->xG * p_stGP->GLI_stColorsMul.xG + stTempColor.xG;
stComputedColor.xB = (p_SRCColors) ->xB * p_stGP->GLI_stColorsMul.xB + stTempColor.xB;
stComputedColor.xA = (p_SRCColors++)->xA * p_stGP->GLI_stColorsMul.xA + stTempColor.xA;
if (*((long *)&stComputedColor.xR) & 0x00400000)
{
if (*((unsigned long *)&stComputedColor.xR) & 0x0000FF00)
p_Baseu32Colors->ulPackedColor |= 0x00FF0000;
else
p_Baseu32Colors->ulPackedColor |= (*((unsigned long *)&stComputedColor.xR) & 0x000000FF) << 16;
}
if (*((long *)&stComputedColor.xG) & 0x00400000)
{
if (*((unsigned long *)&stComputedColor.xG) & 0x0000FF00)
p_Baseu32Colors->ulPackedColor |= 0x0000FF00;
else
p_Baseu32Colors->ulPackedColor |= (*((unsigned long *)&stComputedColor.xG) & 0x000000FF) << 8;
}
if (*((long *)&stComputedColor.xB) & 0x00400000)
{
if (*((unsigned long *)&stComputedColor.xB) & 0x0000FF00)
p_Baseu32Colors->ulPackedColor |= 0x000000FF;
else
p_Baseu32Colors->ulPackedColor |= (*((unsigned long *)&stComputedColor.xB) & 0x000000FF) ;
}
if (*((long *)&stComputedColor.xA) & 0x00400000)
{
if (*((unsigned long *)&stComputedColor.xA) & 0x0000FF00)
p_Baseu32Colors->ulPackedColor |= 0xFF000000;
else
p_Baseu32Colors->ulPackedColor |= (*((unsigned long *)&stComputedColor.xA) & 0x000000FF) << 24;
}
p_Baseu32Colors++;
}
}
#ifdef __cplusplus
}/* extern "C" */
#endif