Windows2003-3790/multimedia/opengl/dlist/dl_pdata.h

301 lines
10 KiB
C
Raw Permalink Normal View History

2001-01-01 00:00:00 +01:00
/******************************Module*Header*******************************\
* Module Name: dl_pdata.h
*
* Routines to execute fast PolyData primitives.
*
* Created: 1-10-1996
* Author: Hock San Lee [hockl]
*
* Copyright (c) 1996 Microsoft Corporation
\**************************************************************************/
#ifndef __dl_pdata_h_
#define __dl_pdata_h_
#define __PDATA_SIZE_T2F (2 * sizeof(__GLfloat))
#define __PDATA_SIZE_C3F (3 * sizeof(__GLfloat))
#define __PDATA_SIZE_C4F (sizeof(__GLcolor))
#define __PDATA_SIZE_N3F (3 * sizeof(__GLfloat))
//#define __PDATA_SIZE_V2F (2 * sizeof(__GLfloat))
#define __PDATA_SIZE_V3F (3 * sizeof(__GLfloat))
// We always set the POLYDATA_DLIST_COLOR_SLOW flag for colors. It allows us
// to eliminate the flags field in the fast PolyData records.
#define __PDATA_PD_FLAGS_T2F (POLYDATA_TEXTURE_VALID|POLYDATA_DLIST_TEXTURE2)
#define __PDATA_PD_FLAGS_C3F (POLYDATA_COLOR_VALID)
#define __PDATA_PD_FLAGS_C4F (POLYDATA_COLOR_VALID|POLYDATA_DLIST_COLOR_4)
#define __PDATA_PD_FLAGS_N3F (POLYDATA_NORMAL_VALID)
//#define __PDATA_PD_FLAGS_V2F (POLYDATA_VERTEX2)
#define __PDATA_PD_FLAGS_V3F (POLYDATA_VERTEX3)
#define __PDATA_PA_FLAGS_T2F (POLYARRAY_TEXTURE2)
#define __PDATA_PA_FLAGS_C3F (0)
#define __PDATA_PA_FLAGS_C4F (0)
#define __PDATA_PA_FLAGS_N3F (0)
//#define __PDATA_PA_FLAGS_V2F (POLYARRAY_VERTEX2)
#define __PDATA_PA_FLAGS_V3F (POLYARRAY_VERTEX3)
#endif // __dl_pdata_h_
#ifndef __BUILD_GLI386__
#ifdef __GLLE_POLYDATA_C3F_V3F
#define __DL_PDATA_NAME __glle_PolyData_C3F_V3F
#define __DL_PDATA_T2F 0
#define __DL_PDATA_C3F 1
#define __DL_PDATA_C4F 0
#define __DL_PDATA_N3F 0
// #define __DL_PDATA_V2F 0
#define __DL_PDATA_V3F 1
#endif
#ifdef __GLLE_POLYDATA_N3F_V3F
#define __DL_PDATA_NAME __glle_PolyData_N3F_V3F
#define __DL_PDATA_T2F 0
#define __DL_PDATA_C3F 0
#define __DL_PDATA_C4F 0
#define __DL_PDATA_N3F 1
// #define __DL_PDATA_V2F 0
#define __DL_PDATA_V3F 1
#endif
#ifdef __GLLE_POLYDATA_C3F_N3F_V3F
#define __DL_PDATA_NAME __glle_PolyData_C3F_N3F_V3F
#define __DL_PDATA_T2F 0
#define __DL_PDATA_C3F 1
#define __DL_PDATA_C4F 0
#define __DL_PDATA_N3F 1
// #define __DL_PDATA_V2F 0
#define __DL_PDATA_V3F 1
#endif
#ifdef __GLLE_POLYDATA_C4F_N3F_V3F
#define __DL_PDATA_NAME __glle_PolyData_C4F_N3F_V3F
#define __DL_PDATA_T2F 0
#define __DL_PDATA_C3F 0
#define __DL_PDATA_C4F 1
#define __DL_PDATA_N3F 1
// #define __DL_PDATA_V2F 0
#define __DL_PDATA_V3F 1
#endif
#ifdef __GLLE_POLYDATA_T2F_V3F
#define __DL_PDATA_NAME __glle_PolyData_T2F_V3F
#define __DL_PDATA_T2F 1
#define __DL_PDATA_C3F 0
#define __DL_PDATA_C4F 0
#define __DL_PDATA_N3F 0
// #define __DL_PDATA_V2F 0
#define __DL_PDATA_V3F 1
#endif
#ifdef __GLLE_POLYDATA_T2F_C3F_V3F
#define __DL_PDATA_NAME __glle_PolyData_T2F_C3F_V3F
#define __DL_PDATA_T2F 1
#define __DL_PDATA_C3F 1
#define __DL_PDATA_C4F 0
#define __DL_PDATA_N3F 0
// #define __DL_PDATA_V2F 0
#define __DL_PDATA_V3F 1
#endif
#ifdef __GLLE_POLYDATA_T2F_N3F_V3F
#define __DL_PDATA_NAME __glle_PolyData_T2F_N3F_V3F
#define __DL_PDATA_T2F 1
#define __DL_PDATA_C3F 0
#define __DL_PDATA_C4F 0
#define __DL_PDATA_N3F 1
// #define __DL_PDATA_V2F 0
#define __DL_PDATA_V3F 1
#endif
#ifdef __GLLE_POLYDATA_T2F_C3F_N3F_V3F
#define __DL_PDATA_NAME __glle_PolyData_T2F_C3F_N3F_V3F
#define __DL_PDATA_T2F 1
#define __DL_PDATA_C3F 1
#define __DL_PDATA_C4F 0
#define __DL_PDATA_N3F 1
// #define __DL_PDATA_V2F 0
#define __DL_PDATA_V3F 1
#endif
#ifdef __GLLE_POLYDATA_T2F_C4F_N3F_V3F
#define __DL_PDATA_NAME __glle_PolyData_T2F_C4F_N3F_V3F
#define __DL_PDATA_T2F 1
#define __DL_PDATA_C3F 0
#define __DL_PDATA_C4F 1
#define __DL_PDATA_N3F 1
// #define __DL_PDATA_V2F 0
#define __DL_PDATA_V3F 1
#endif
/*************************************************************************/
// Compute record size, pd flags and pa flags
#if __DL_PDATA_T2F
#define __DL_PDATA_SIZE_T __PDATA_SIZE_T2F
#define __DL_PDATA_PD_FLAGS_T __PDATA_PD_FLAGS_T2F
#define __DL_PDATA_PA_FLAGS_T __PDATA_PA_FLAGS_T2F
#else
#define __DL_PDATA_SIZE_T 0
#define __DL_PDATA_PD_FLAGS_T 0
#define __DL_PDATA_PA_FLAGS_T 0
#endif
#if __DL_PDATA_C3F
#define __DL_PDATA_SIZE_C __PDATA_SIZE_C3F
#define __DL_PDATA_PD_FLAGS_C __PDATA_PD_FLAGS_C3F
#define __DL_PDATA_PA_FLAGS_C __PDATA_PA_FLAGS_C3F
#elif __DL_PDATA_C4F
#define __DL_PDATA_SIZE_C __PDATA_SIZE_C4F
#define __DL_PDATA_PD_FLAGS_C __PDATA_PD_FLAGS_C4F
#define __DL_PDATA_PA_FLAGS_C __PDATA_PA_FLAGS_C4F
#else
#define __DL_PDATA_SIZE_C 0
#define __DL_PDATA_PD_FLAGS_C 0
#define __DL_PDATA_PA_FLAGS_C 0
#endif
#if __DL_PDATA_N3F
#define __DL_PDATA_SIZE_N __PDATA_SIZE_N3F
#define __DL_PDATA_PD_FLAGS_N __PDATA_PD_FLAGS_N3F
#define __DL_PDATA_PA_FLAGS_N __PDATA_PA_FLAGS_N3F
#else
#define __DL_PDATA_SIZE_N 0
#define __DL_PDATA_PD_FLAGS_N 0
#define __DL_PDATA_PA_FLAGS_N 0
#endif
#if __DL_PDATA_V2F
#define __DL_PDATA_SIZE_V __PDATA_SIZE_V2F
#define __DL_PDATA_PD_FLAGS_V __PDATA_PD_FLAGS_V2F
#define __DL_PDATA_PA_FLAGS_V __PDATA_PA_FLAGS_V2F
#elif __DL_PDATA_V3F
#define __DL_PDATA_SIZE_V __PDATA_SIZE_V3F
#define __DL_PDATA_PD_FLAGS_V __PDATA_PD_FLAGS_V3F
#define __DL_PDATA_PA_FLAGS_V __PDATA_PA_FLAGS_V3F
#else
#define __DL_PDATA_SIZE_V 0
#define __DL_PDATA_PD_FLAGS_V 0
#define __DL_PDATA_PA_FLAGS_V 0
#endif
#define __DL_PDATA_SIZE \
(__DL_PDATA_SIZE_T+__DL_PDATA_SIZE_C+__DL_PDATA_SIZE_N+__DL_PDATA_SIZE_V)
#define __DL_PDATA_PD_FLAGS \
(__DL_PDATA_PD_FLAGS_T|__DL_PDATA_PD_FLAGS_C|__DL_PDATA_PD_FLAGS_N|__DL_PDATA_PD_FLAGS_V)
#define __DL_PDATA_PA_FLAGS \
(__DL_PDATA_PA_FLAGS_T|__DL_PDATA_PA_FLAGS_C|__DL_PDATA_PA_FLAGS_N|__DL_PDATA_PA_FLAGS_V)
/*************************************************************************/
// Compute data offsets. This is here only because our compiler generates
// better x86 assembly output!
#define __DL_PDATA_TEXTURE_OFFSET (0)
#define __DL_PDATA_COLOR_OFFSET (__DL_PDATA_SIZE_T)
#define __DL_PDATA_NORMAL_OFFSET (__DL_PDATA_SIZE_T+__DL_PDATA_SIZE_C)
#define __DL_PDATA_VERTEX_OFFSET (__DL_PDATA_SIZE_T+__DL_PDATA_SIZE_C+__DL_PDATA_SIZE_N)
/*************************************************************************/
// Playback a fast __glle_PolyData record in Begin.
const GLubyte * FASTCALL __DL_PDATA_NAME(__GLcontext *gc, const GLubyte *PC)
{
POLYARRAY *pa;
POLYDATA *pd;
pa = gc->paTeb;
if (pa->flags & POLYARRAY_IN_BEGIN)
{
// Update pa fields.
pa->flags |= __DL_PDATA_PA_FLAGS;
pd = pa->pdNextVertex++;
#if __DL_PDATA_T2F
pa->pdCurTexture = pd;
#endif
#if __DL_PDATA_C3F || __DL_PDATA_C4F
pa->pdCurColor = pd;
#endif
#if __DL_PDATA_N3F
pa->pdCurNormal = pd;
#endif
// Update pd attributes.
pd->flags |= __DL_PDATA_PD_FLAGS;
#if __DL_PDATA_V2F
// Vertex
pd->obj.x = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->x;
pd->obj.y = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->y;
pd->obj.z = __glZero;
pd->obj.w = __glOne;
#elif __DL_PDATA_V3F
// Vertex
pd->obj.x = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->x;
pd->obj.y = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->y;
pd->obj.z = ((__GLcoord *) &PC[__DL_PDATA_VERTEX_OFFSET])->z;
pd->obj.w = __glOne;
#endif
#if __DL_PDATA_T2F
// Texture coord
pd->texture.x = ((__GLcoord *) &PC[__DL_PDATA_TEXTURE_OFFSET])->x;
pd->texture.y = ((__GLcoord *) &PC[__DL_PDATA_TEXTURE_OFFSET])->y;
pd->texture.z = __glZero;
pd->texture.w = __glOne;
#endif
#if __DL_PDATA_C3F
// Color
pd->color[0].r = ((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET])->r;
pd->color[0].g = ((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET])->g;
pd->color[0].b = ((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET])->b;
pd->color[0].a = gc->alphaVertexScale;
#elif __DL_PDATA_C4F
// Color
pd->color[0] = *((__GLcolor *) &PC[__DL_PDATA_COLOR_OFFSET]);
#endif
#if __DL_PDATA_N3F
// Normal
pd->normal.x = ((__GLcoord *) &PC[__DL_PDATA_NORMAL_OFFSET])->x;
pd->normal.y = ((__GLcoord *) &PC[__DL_PDATA_NORMAL_OFFSET])->y;
pd->normal.z = ((__GLcoord *) &PC[__DL_PDATA_NORMAL_OFFSET])->z;
#endif
pd[1].flags = 0;
if (pd >= pa->pdFlush)
PolyArrayFlushPartialPrimitive();
}
else
{
// Something went wrong at playback time! We can either try to playback
// this record using the regular API or punt it altogether. I cannot think
// of a situation when this can happen, so we will punt it for now.
WARNING("Display list: playing back POLYDATA outside BEGIN!\n");
}
return PC + __DL_PDATA_SIZE;
}
#undef __DL_PDATA_NAME
#undef __DL_PDATA_T2F
#undef __DL_PDATA_C3F
#undef __DL_PDATA_C4F
#undef __DL_PDATA_N3F
#undef __DL_PDATA_V2F
#undef __DL_PDATA_V3F
#undef __DL_PDATA_SIZE_T
#undef __DL_PDATA_SIZE_C
#undef __DL_PDATA_SIZE_N
#undef __DL_PDATA_SIZE_V
#undef __DL_PDATA_PD_FLAGS_T
#undef __DL_PDATA_PD_FLAGS_C
#undef __DL_PDATA_PD_FLAGS_N
#undef __DL_PDATA_PD_FLAGS_V
#undef __DL_PDATA_PA_FLAGS_T
#undef __DL_PDATA_PA_FLAGS_C
#undef __DL_PDATA_PA_FLAGS_N
#undef __DL_PDATA_PA_FLAGS_V
#undef __DL_PDATA_SIZE
#undef __DL_PDATA_PD_FLAGS
#undef __DL_PDATA_PA_FLAGS
#undef __DL_PDATA_TEXTURE_OFFSET
#undef __DL_PDATA_COLOR_OFFSET
#undef __DL_PDATA_NORMAL_OFFSET
#undef __DL_PDATA_VERTEX_OFFSET
#endif // __BUILD_GLI386__