88 lines
3.5 KiB
C
88 lines
3.5 KiB
C
/*============================ ==============================================;
|
|
*
|
|
* Copyright (C) 1998 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: pvvid.h
|
|
* Content: Common defines for the geometry inner loop
|
|
*
|
|
***************************************************************************/
|
|
#ifndef _PVVID_H
|
|
#define _PVVID_H
|
|
|
|
#include "clipper.h"
|
|
// This function should be called every time FVF ID is changed
|
|
// All pv flags, input and output FVF id should be set before calling the
|
|
// function.
|
|
extern void UpdateGeometryLoopData(LPD3DFE_PROCESSVERTICES pv);
|
|
// Set stride pointers for non-strided case
|
|
extern void SetupStrides(D3DFE_PROCESSVERTICES* pv, UINT stride);
|
|
// We use power of 2 because it preserves the mantissa when we multiply
|
|
const D3DVALUE __HUGE_PWR2 = 1024.0f*1024.0f*2.0f;
|
|
|
|
//--------------------------------------------------------------------------
|
|
#define D3DFE_SET_ALPHA(color, a) ((char*)&color)[3] = (unsigned char)a;
|
|
//--------------------------------------------------------------------------
|
|
inline void ComputeFogFactor(LPD3DFE_PROCESSVERTICES pv, D3DVALUE dist, DWORD *pOutput)
|
|
{
|
|
if (pv->lighting.fog_mode == D3DFOG_LINEAR)
|
|
{
|
|
if (dist < pv->lighting.fog_start)
|
|
D3DFE_SET_ALPHA((*pOutput), 255)
|
|
else
|
|
if (dist >= pv->lighting.fog_end)
|
|
D3DFE_SET_ALPHA((*pOutput), 0)
|
|
else
|
|
{
|
|
D3DVALUE v = (pv->lighting.fog_end - dist) * pv->lighting.fog_factor;
|
|
int f = FTOI(v);
|
|
D3DFE_SET_ALPHA((*pOutput), f)
|
|
}
|
|
}
|
|
else
|
|
{
|
|
D3DVALUE tmp = dist*pv->lighting.fog_density;
|
|
if (pv->lighting.fog_mode == D3DFOG_EXP2)
|
|
{
|
|
tmp *= tmp;
|
|
}
|
|
tmp = (D3DVALUE)exp(-tmp) * 255.0f;
|
|
int f = FTOI(tmp);
|
|
D3DFE_SET_ALPHA((*pOutput), f)
|
|
}
|
|
}
|
|
//--------------------------------------------------------------------------
|
|
// Input:
|
|
// v - input vertex in the model space
|
|
// pCoord - vertex, transformed to the camera space
|
|
// pWeights - pointer to the vertex weights
|
|
// Output:
|
|
// Alpha component of pv->lighting.outSpecular is set
|
|
//
|
|
void ComputeFog(LPD3DFE_PROCESSVERTICES pv, D3DVECTOR &v, D3DVECTOR* pCoord,
|
|
D3DVALUE* pWeights, BYTE* pMatrixIndices);
|
|
//---------------------------------------------------------------------
|
|
typedef void (*PFN_TEXTURETRANSFORM)(D3DVALUE *pIn, D3DVALUE *pOut, D3DMATRIXI *m);
|
|
typedef void (*PFN_TEXTURETRANSFORMLOOP)(D3DVALUE *pIn, D3DVALUE *pOut, D3DMATRIXI *m,
|
|
DWORD dwCount, DWORD dwInpStride, DWORD dwOutStride);
|
|
|
|
extern PFN_TEXTURETRANSFORM g_pfnTextureTransform[16];
|
|
extern PFN_TEXTURETRANSFORMLOOP g_pfnTextureTransformLoop[16];
|
|
//---------------------------------------------------------------------
|
|
inline void ComputeReflectionVector(D3DVECTOR *vertexPosition, D3DVECTOR *normal, D3DVECTOR *reflectionVector)
|
|
{
|
|
D3DVECTOR vertex = *vertexPosition;
|
|
VecNormalizeFast(vertex);
|
|
D3DVALUE dot = 2*(vertex.x * normal->x + vertex.y * normal->y + vertex.z * normal->z);
|
|
reflectionVector->x = vertex.x - dot*normal->x;
|
|
reflectionVector->y = vertex.y - dot*normal->y;
|
|
reflectionVector->z = vertex.z - dot*normal->z;
|
|
}
|
|
//---------------------------------------------------------------------
|
|
inline void ComputeReflectionVectorInfiniteViewer(D3DVECTOR *normal, D3DVECTOR *reflectionVector)
|
|
{
|
|
D3DVALUE dot = 2*normal->z;
|
|
reflectionVector->x = - dot*normal->x;
|
|
reflectionVector->y = - dot*normal->y;
|
|
reflectionVector->z = 1.0f - dot*normal->z;
|
|
}
|
|
#endif // _PVVID_H
|