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
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_
|