Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

210 lines
9.6 KiB

/*============================ ==============================================;
*
* Copyright (C) 1997 Microsoft Corporation. All Rights Reserved.
*
* File: clipper.h
* Content: Clipper definitions
*
***************************************************************************/
#ifndef _CLIPPER_H_
#define _CLIPPER_H_
#define INTERPOLATE_COLOR (1<< 0)
#define INTERPOLATE_SPECULAR (1<< 1)
#define INTERPOLATE_TEXTUREL (1<< 2) // legacy-related texture
#define INTERPOLATE_RCOLOR (1<< 3)
#define INTERPOLATE_TEXTURE3 (1<< 4) // interpolate Texture3
#define CLIPPED_LEFT (D3DCLIP_GEN5 << 1)
#define CLIPPED_RIGHT (D3DCLIP_GEN5 << 2)
#define CLIPPED_TOP (D3DCLIP_GEN5 << 3)
#define CLIPPED_BOTTOM (D3DCLIP_GEN5 << 4)
#define CLIPPED_FRONT (D3DCLIP_GEN5 << 5)
#define CLIPPED_BACK (D3DCLIP_GEN5 << 6)
#define CLIPPED_ENABLE (D3DCLIP_GEN5 << 7) /* wireframe enable flag */
#define CLIPPED_ALL (CLIPPED_LEFT|CLIPPED_RIGHT \
|CLIPPED_TOP|CLIPPED_BOTTOM \
|CLIPPED_FRONT|CLIPPED_BACK)
//---------------------------------------------------------------------
// Guard band clipping bits
//
// A guard bit is set when a point is out of guard band
// Guard bits should be cleared before a call to clip a triangle, because
// they are the same as CLIPPED_... bits
//
// Example of clipping bits setting for X coordinate:
//
// if -w < x < w no clipping bit is set
// if -w*ax1 < x <= -w D3DCLIP_LEFT bit is set
// if x < -w*ax1 __D3DCLIPGB_LEFT bit is set
//
#define __D3DCLIPGB_LEFT (D3DCLIP_GEN5 << 1)
#define __D3DCLIPGB_RIGHT (D3DCLIP_GEN5 << 2)
#define __D3DCLIPGB_TOP (D3DCLIP_GEN5 << 3)
#define __D3DCLIPGB_BOTTOM (D3DCLIP_GEN5 << 4)
#define __D3DCLIPGB_ALL (__D3DCLIPGB_LEFT | __D3DCLIPGB_RIGHT | \
__D3DCLIPGB_TOP | __D3DCLIPGB_BOTTOM)
// If only these bits are set, then this point is inside the guard band
//
#define __D3DCLIP_INGUARDBAND (D3DCLIP_LEFT | D3DCLIP_RIGHT | \
D3DCLIP_TOP | D3DCLIP_BOTTOM)
//---------------------------------------------------------------------
// Bit numbers for each clip flag
//
#define D3DCLIP_LEFTBIT 1
#define D3DCLIP_RIGHTBIT 2
#define D3DCLIP_TOPBIT 3
#define D3DCLIP_BOTTOMBIT 4
#define D3DCLIP_FRONTBIT 5
#define D3DCLIP_BACKBIT 6
#define D3DCLIPGB_LEFTBIT 13
#define D3DCLIPGB_RIGHTBIT 14
#define D3DCLIPGB_TOPBIT 15
#define D3DCLIPGB_BOTTOMBIT 16
//---------------------------------------------------------------------
// Make clip vertex from D3D vertex
//
// device - DIRECT3DDEVICEI *
// pp1 - clipVertex
// p1 - TL vertex
// clipMask is set to the guard band bits or 0xFFFFFFFFF
//
inline void MAKE_CLIP_VERTEX(D3DFE_PROCESSVERTICES *pv, ClipVertex& pp1,
D3DTLVERTEX* p1, DWORD clipFlag,
BOOL transformed, DWORD clipMaskOffScreen)
{
D3DFE_VIEWPORTCACHE& VPORT = pv->vcache;
if (transformed || !(clipFlag & clipMaskOffScreen))
{
pp1.sx = p1->sx;
pp1.sy = p1->sy;
pp1.sz = p1->sz;
pp1.hw = 1.0f / p1->rhw;
pp1.hx = (pp1.sx - VPORT.offsetX) * pp1.hw *
VPORT.scaleXi;
pp1.hy = (pp1.sy - VPORT.offsetY) * pp1.hw *
VPORT.scaleYi;
pp1.hz = pp1.sz * pp1.hw;
}
else
{
pp1.hx = p1->sx;
pp1.hy = p1->sy;
pp1.hz = p1->sz;
pp1.hw = p1->rhw;
}
pp1.color = p1->color;
pp1.specular= p1->specular;
pp1.tex[0].u = p1->tu;
pp1.tex[0].v = p1->tv;
pp1.clip = clipFlag & D3DSTATUS_CLIPUNIONALL;
}
//---------------------------------------------------------------------
// Make TL vertex from clip vertex
//
// device - DIRECT3DDEVICEI *
// in - clipVertex
// out - TL vertex
//
inline void MAKE_TL_VERTEX(D3DTLVERTEX* out, ClipVertex* in)
{
(out)->sx = (in)->sx;
(out)->sy = (in)->sy;
(out)->sz = (in)->sz;
(out)->rhw = D3DVAL(1)/(in)->hw;
(out)->color = (in)->color;
(out)->specular= (in)->specular;
(out)->tu = (in)->tex[0].u;
(out)->tv = (in)->tex[0].v;
}
//---------------------------------------------------------------------
// Make clip vertex from D3D vertex
//
// device - DIRECT3DDEVICEI *
// pp1 - clipVertex
// p1 - TL vertex
//
inline void MAKE_CLIP_VERTEX_FVF(D3DFE_PROCESSVERTICES *pv, ClipVertex& pp1, BYTE* p1,
DWORD clipFlag, BOOL transformed, DWORD clipMaskOffScreen)
{
D3DFE_VIEWPORTCACHE& VPORT = pv->vcache;
BYTE *v = (BYTE*)p1;
if (transformed || !(clipFlag & clipMaskOffScreen))
{
pp1.sx = ((D3DVALUE*)v)[0];
pp1.sy = ((D3DVALUE*)v)[1];
pp1.sz = ((D3DVALUE*)v)[2];
pp1.hw = 1.0f / ((D3DVALUE*)v)[3];
pp1.hx = (pp1.sx - VPORT.offsetX) * pp1.hw *
VPORT.scaleXi;
pp1.hy = (pp1.sy - VPORT.offsetY) * pp1.hw *
VPORT.scaleYi;
pp1.hz = pp1.sz * pp1.hw;
}
else
{
pp1.hx = ((D3DVALUE*)v)[0];
pp1.hy = ((D3DVALUE*)v)[1];
pp1.hz = ((D3DVALUE*)v)[2];
pp1.hw = ((D3DVALUE*)v)[3];
}
v += sizeof(D3DVALUE) * 4;
if (pv->dwVIDOut & D3DFVF_DIFFUSE)
{
pp1.color = *(DWORD*)v;
v += sizeof(D3DVALUE);
}
if (pv->dwVIDOut & D3DFVF_SPECULAR)
{
pp1.specular= *(DWORD*)v;
v += sizeof(DWORD);
}
for (DWORD ii=0; ii < pv->nTexCoord; ii++)
{
pp1.tex[ii].u = *(D3DVALUE*)v;
v += sizeof(D3DVALUE);
pp1.tex[ii].v = *(D3DVALUE*)v;
v += sizeof(D3DVALUE);
}
pp1.clip = clipFlag; // & D3DSTATUS_CLIPUNIONALL;
}
//---------------------------------------------------------------------
// Make TL vertex from clip vertex
//
// device - DIRECT3DDEVICEI *
// in - clipVertex
// out - TL vertex
//
inline void MAKE_TL_VERTEX_FVF(D3DFE_PROCESSVERTICES *pv, BYTE* out, ClipVertex* in)
{
BYTE *v = out;
((D3DVALUE*)v)[0] = (in)->sx;
((D3DVALUE*)v)[1] = (in)->sy;
((D3DVALUE*)v)[2] = (in)->sz;
((D3DVALUE*)v)[3] = D3DVAL(1)/(in)->hw;
v += sizeof(D3DVALUE)*4;
if (pv->dwVIDOut & D3DFVF_DIFFUSE)
{
*(DWORD*)v = (in)->color;
v += sizeof(DWORD);
}
if (pv->dwVIDOut & D3DFVF_SPECULAR)
{
*(DWORD*)v = (in)->specular;
v += sizeof(DWORD);
}
for (DWORD ii=0; ii < pv->nTexCoord; ii++)
{
*(D3DVALUE*)v = (in)->tex[ii].u;
v += sizeof(D3DVALUE);
*(D3DVALUE*)v = (in)->tex[ii].v;
v += sizeof(D3DVALUE);
}
}
#endif // _CLIPPER_H_