|
|
/******************************Module*Header*******************************\
* Module Name: array.h * * Fast VA_ArrayElement functions. * * Created: 1-31-1996 * Author: Hock San Lee [hockl] * * Copyright (c) 1996 Microsoft Corporation \**************************************************************************/
#ifndef __array_h_
#define __array_h_
#define __VA_PD_FLAGS_T2F (POLYDATA_TEXTURE_VALID|POLYDATA_DLIST_TEXTURE2)
#define __VA_PD_FLAGS_C3F (POLYDATA_COLOR_VALID)
#define __VA_PD_FLAGS_C4F (POLYDATA_COLOR_VALID| POLYDATA_DLIST_COLOR_4)
#define __VA_PD_FLAGS_N3F (POLYDATA_NORMAL_VALID)
#define __VA_PD_FLAGS_V2F (POLYDATA_VERTEX2)
#define __VA_PD_FLAGS_V3F (POLYDATA_VERTEX3)
#define __VA_PD_FLAGS_V4F (POLYDATA_VERTEX4)
#define __VA_PA_FLAGS_T2F (POLYARRAY_TEXTURE2)
#define __VA_PA_FLAGS_C3F (0)
#define __VA_PA_FLAGS_C4F (0)
#define __VA_PA_FLAGS_N3F (0)
#define __VA_PA_FLAGS_V2F (POLYARRAY_VERTEX2)
#define __VA_PA_FLAGS_V3F (POLYARRAY_VERTEX3)
#define __VA_PA_FLAGS_V4F (POLYARRAY_VERTEX4)
#endif // __array_h_
#ifdef __VA_ARRAY_ELEMENT_V2F
#define __VA_NAME VA_ArrayElement_V2F
#define __VA_NAMEB VA_ArrayElement_V2F_B
#define __VA_NAMEBI VA_ArrayElement_V2F_BI
#define __VA_T2F 0
#define __VA_C3F 0
#define __VA_C4F 0
#define __VA_N3F 0
#define __VA_V2F 1
#define __VA_V3F 0
#define __VA_V4F 0
#endif
#ifdef __VA_ARRAY_ELEMENT_V3F
#define __VA_NAME VA_ArrayElement_V3F
#define __VA_NAMEB VA_ArrayElement_V3F_B
#define __VA_NAMEBI VA_ArrayElement_V3F_BI
#define __VA_T2F 0
#define __VA_C3F 0
#define __VA_C4F 0
#define __VA_N3F 0
#define __VA_V2F 0
#define __VA_V3F 1
#define __VA_V4F 0
#endif
#ifdef __VA_ARRAY_ELEMENT_C3F_V3F
#define __VA_NAME VA_ArrayElement_C3F_V3F
#define __VA_NAMEB VA_ArrayElement_C3F_V3F_B
#define __VA_NAMEBI VA_ArrayElement_C3F_V3F_BI
#define __VA_T2F 0
#define __VA_C3F 1
#define __VA_C4F 0
#define __VA_N3F 0
#define __VA_V2F 0
#define __VA_V3F 1
#define __VA_V4F 0
#endif
#ifdef __VA_ARRAY_ELEMENT_N3F_V3F
#define __VA_NAME VA_ArrayElement_N3F_V3F
#define __VA_NAMEB VA_ArrayElement_N3F_V3F_B
#define __VA_NAMEBI VA_ArrayElement_N3F_V3F_BI
#define __VA_T2F 0
#define __VA_C3F 0
#define __VA_C4F 0
#define __VA_N3F 1
#define __VA_V2F 0
#define __VA_V3F 1
#define __VA_V4F 0
#endif
#ifdef __VA_ARRAY_ELEMENT_C3F_N3F_V3F
#define __VA_NAME VA_ArrayElement_C3F_N3F_V3F
#define __VA_NAMEB VA_ArrayElement_C3F_N3F_V3F_B
#define __VA_NAMEBI VA_ArrayElement_C3F_N3F_V3F_BI
#define __VA_T2F 0
#define __VA_C3F 1
#define __VA_C4F 0
#define __VA_N3F 1
#define __VA_V2F 0
#define __VA_V3F 1
#define __VA_V4F 0
#endif
#ifdef __VA_ARRAY_ELEMENT_C4F_N3F_V3F
#define __VA_NAME VA_ArrayElement_C4F_N3F_V3F
#define __VA_NAMEB VA_ArrayElement_C4F_N3F_V3F_B
#define __VA_NAMEBI VA_ArrayElement_C4F_N3F_V3F_BI
#define __VA_T2F 0
#define __VA_C3F 0
#define __VA_C4F 1
#define __VA_N3F 1
#define __VA_V2F 0
#define __VA_V3F 1
#define __VA_V4F 0
#endif
#ifdef __VA_ARRAY_ELEMENT_T2F_V3F
#define __VA_NAME VA_ArrayElement_T2F_V3F
#define __VA_NAMEB VA_ArrayElement_T2F_V3F_B
#define __VA_NAMEBI VA_ArrayElement_T2F_V3F_BI
#define __VA_T2F 1
#define __VA_C3F 0
#define __VA_C4F 0
#define __VA_N3F 0
#define __VA_V2F 0
#define __VA_V3F 1
#define __VA_V4F 0
#endif
#ifdef __VA_ARRAY_ELEMENT_T2F_C3F_V3F
#define __VA_NAME VA_ArrayElement_T2F_C3F_V3F
#define __VA_NAMEB VA_ArrayElement_T2F_C3F_V3F_B
#define __VA_NAMEBI VA_ArrayElement_T2F_C3F_V3F_BI
#define __VA_T2F 1
#define __VA_C3F 1
#define __VA_C4F 0
#define __VA_N3F 0
#define __VA_V2F 0
#define __VA_V3F 1
#define __VA_V4F 0
#endif
#ifdef __VA_ARRAY_ELEMENT_T2F_N3F_V3F
#define __VA_NAME VA_ArrayElement_T2F_N3F_V3F
#define __VA_NAMEB VA_ArrayElement_T2F_N3F_V3F_B
#define __VA_NAMEBI VA_ArrayElement_T2F_N3F_V3F_BI
#define __VA_T2F 1
#define __VA_C3F 0
#define __VA_C4F 0
#define __VA_N3F 1
#define __VA_V2F 0
#define __VA_V3F 1
#define __VA_V4F 0
#endif
#ifdef __VA_ARRAY_ELEMENT_T2F_C3F_N3F_V3F
#define __VA_NAME VA_ArrayElement_T2F_C3F_N3F_V3F
#define __VA_NAMEB VA_ArrayElement_T2F_C3F_N3F_V3F_B
#define __VA_NAMEBI VA_ArrayElement_T2F_C3F_N3F_V3F_BI
#define __VA_T2F 1
#define __VA_C3F 1
#define __VA_C4F 0
#define __VA_N3F 1
#define __VA_V2F 0
#define __VA_V3F 1
#define __VA_V4F 0
#endif
#ifdef __VA_ARRAY_ELEMENT_T2F_C4F_N3F_V3F
#define __VA_NAME VA_ArrayElement_T2F_C4F_N3F_V3F
#define __VA_NAMEB VA_ArrayElement_T2F_C4F_N3F_V3F_B
#define __VA_NAMEBI VA_ArrayElement_T2F_C4F_N3F_V3F_BI
#define __VA_T2F 1
#define __VA_C3F 0
#define __VA_C4F 1
#define __VA_N3F 1
#define __VA_V2F 0
#define __VA_V3F 1
#define __VA_V4F 0
#endif
/*************************************************************************/ // Compute pd flags and pa flags
#if __VA_T2F
#define __VA_PD_FLAGS_T __VA_PD_FLAGS_T2F
#define __VA_PA_FLAGS_T __VA_PA_FLAGS_T2F
#else
#define __VA_PD_FLAGS_T 0
#define __VA_PA_FLAGS_T 0
#endif
#if __VA_C3F
#define __VA_PD_FLAGS_C __VA_PD_FLAGS_C3F
#define __VA_PA_FLAGS_C __VA_PA_FLAGS_C3F
#elif __VA_C4F
#define __VA_PD_FLAGS_C __VA_PD_FLAGS_C4F
#define __VA_PA_FLAGS_C __VA_PA_FLAGS_C4F
#else
#define __VA_PD_FLAGS_C 0
#define __VA_PA_FLAGS_C 0
#endif
#if __VA_N3F
#define __VA_PD_FLAGS_N __VA_PD_FLAGS_N3F
#define __VA_PA_FLAGS_N __VA_PA_FLAGS_N3F
#else
#define __VA_PD_FLAGS_N 0
#define __VA_PA_FLAGS_N 0
#endif
#if __VA_V2F
#define __VA_PD_FLAGS_V __VA_PD_FLAGS_V2F
#define __VA_PA_FLAGS_V __VA_PA_FLAGS_V2F
#elif __VA_V3F
#define __VA_PD_FLAGS_V __VA_PD_FLAGS_V3F
#define __VA_PA_FLAGS_V __VA_PA_FLAGS_V3F
#elif __VA_V4F
#define __VA_PD_FLAGS_V __VA_PD_FLAGS_V4F
#define __VA_PA_FLAGS_V __VA_PA_FLAGS_V4F
#endif
#define __VA_PD_FLAGS \
(__VA_PD_FLAGS_T|__VA_PD_FLAGS_C|__VA_PD_FLAGS_N|__VA_PD_FLAGS_V) #define __VA_PA_FLAGS \
(__VA_PA_FLAGS_T|__VA_PA_FLAGS_C|__VA_PA_FLAGS_N|__VA_PA_FLAGS_V)
#define VA_COPY_VERTEX_V2F(dataCoord) \
pd->obj.x = ((__GLcoord *) dataCoord)->x; \ pd->obj.y = ((__GLcoord *) dataCoord)->y; \ pd->obj.z = __glZero; \ pd->obj.w = __glOne;
#define VA_COPY_VERTEX_V3F(dataCoord) \
pd->obj.x = ((__GLcoord *) dataCoord)->x; \ pd->obj.y = ((__GLcoord *) dataCoord)->y; \ pd->obj.z = ((__GLcoord *) dataCoord)->z; \ pd->obj.w = __glOne;
#define VA_COPY_VERTEX_V4F(dataCoord) \
pd->obj = *((__GLcoord *) data);
#define VA_COPY_TEXTURE_T2F(dataTexture) \
pd->texture.x = ((__GLcoord *) dataTexture)->x; \ pd->texture.y = ((__GLcoord *) dataTexture)->y; \ pd->texture.z = __glZero; \ pd->texture.w = __glOne;
#define VA_COPY_COLOR_C3F(dataColor) \
__GL_SCALE_AND_CHECK_CLAMP_RGB(pd->colors[0].r, \ pd->colors[0].g, \ pd->colors[0].b, \ gc, pa->flags, \ ((__GLcolor *) dataColor)->r, \ ((__GLcolor *) dataColor)->g, \ ((__GLcolor *) dataColor)->b); \ pd->colors[0].a = gc->alphaVertexScale;
#define VA_COPY_COLOR_C4F(dataColor) \
__GL_SCALE_AND_CHECK_CLAMP_RGBA(pd->colors[0].r, \ pd->colors[0].g, \ pd->colors[0].b, \ pd->colors[0].a, \ gc, pa->flags, \ ((__GLcolor *) dataColor)->r, \ ((__GLcolor *) dataColor)->g, \ ((__GLcolor *) dataColor)->b, \ ((__GLcolor *) dataColor)->a);
#define VA_COPY_NORMAL_N3F(dataNormal) \
pd->normal.x = ((__GLcoord *) dataNormal)->x; \ pd->normal.y = ((__GLcoord *) dataNormal)->y; \ pd->normal.z = ((__GLcoord *) dataNormal)->z;
/*************************************************************************/ // Define a fast VA_ArrayElement function for batch mode.
// This function is called in Begin and in RGBA mode only!
//
void FASTCALL __VA_NAMEB(__GLcontext *gc, GLint firstIndex, GLint nVertices) { POLYARRAY* const pa = gc->paTeb; POLYDATA* pd; const GLbyte *dataCoord = gc->vertexArray.vertex.pointer; const int coordStride = gc->vertexArray.vertex.ibytes; #if __VA_N3F
const GLbyte *dataNormal = gc->vertexArray.normal.pointer; const int normalStride = gc->vertexArray.normal.ibytes; #endif
#if __VA_T2F
const GLbyte *dataTexture = gc->vertexArray.texCoord.pointer; const int textureStride = gc->vertexArray.texCoord.ibytes; #endif
#if __VA_C3F || __VA_C4F
const GLbyte *dataColor = gc->vertexArray.color.pointer; const int colorStride = gc->vertexArray.color.ibytes; #endif
if (firstIndex != 0) { dataCoord += firstIndex*coordStride; #if __VA_N3F
dataNormal += firstIndex*normalStride; #endif
#if __VA_T2F
dataTexture+= firstIndex*textureStride; #endif
#if __VA_C3F || __VA_C4F
dataColor += firstIndex*colorStride; #endif
}
ASSERTOPENGL(pa->flags & POLYARRAY_IN_BEGIN, "VA_ArrayElement called outside Begin!\n");
while (nVertices > 0) { int n, nProcess; int needFlush = FALSE; pa->flags |= __VA_PA_FLAGS; pd = pa->pdNextVertex; if (&pd[nVertices-1] >= pa->pdFlush) { nProcess = (int)((ULONG_PTR)(pa->pdFlush - pd) + 1); needFlush = TRUE; } else nProcess = nVertices;
for (n=nProcess; n > 0; n--) {
// Update pd attributes.
pd->flags = __VA_PD_FLAGS;
#if __VA_V2F
VA_COPY_VERTEX_V2F(dataCoord); #elif __VA_V3F
VA_COPY_VERTEX_V3F(dataCoord); #elif __VA_V4F
VA_COPY_VERTEX_V4F(dataCoord); #endif
dataCoord += coordStride;
#if __VA_T2F
VA_COPY_TEXTURE_T2F(dataTexture); dataTexture += textureStride; #endif
#if __VA_C3F
// Color
VA_COPY_COLOR_C3F(dataColor); dataColor += colorStride; #elif __VA_C4F
// Color
VA_COPY_COLOR_C4F(dataColor); dataColor += colorStride; #endif
#if __VA_N3F
// Normal
VA_COPY_NORMAL_N3F(dataNormal); dataNormal += normalStride; #endif
pd++; } // End of loop
pa->pdNextVertex = pd; pd->flags = 0; pd--; #if __VA_T2F
pa->pdCurTexture = pd; #endif
#if __VA_C3F || __VA_C4F
pa->pdCurColor = pd; #endif
#if __VA_N3F
pa->pdCurNormal = pd; #endif
nVertices-= nProcess; if (needFlush) PolyArrayFlushPartialPrimitive(); } }
/*************************************************************************/ // Define a fast VA_ArrayElement function for batch indirect mode.
// This function is called in Begin and in RGBA mode only!
//
void FASTCALL __VA_NAMEBI(__GLcontext *gc, GLint nVertices, VAMAP* indices) { POLYARRAY* const pa = gc->paTeb; POLYDATA* pd; const GLbyte *dataCoord0 = gc->vertexArray.vertex.pointer; const int coordStride = gc->vertexArray.vertex.ibytes; #if __VA_N3F
const GLbyte *dataNormal0 = gc->vertexArray.normal.pointer; const int normalStride = gc->vertexArray.normal.ibytes; #endif
#if __VA_T2F
const GLbyte *dataTexture0 = gc->vertexArray.texCoord.pointer; const int textureStride = gc->vertexArray.texCoord.ibytes; #endif
#if __VA_C3F || __VA_C4F
const GLbyte *dataColor0 = gc->vertexArray.color.pointer; const int colorStride = gc->vertexArray.color.ibytes; #endif
ASSERTOPENGL(pa->flags & POLYARRAY_IN_BEGIN, "VA_ArrayElement called outside Begin!\n");
while (nVertices > 0) { int n, nProcess; int needFlush = FALSE;
pa->flags |= __VA_PA_FLAGS; pd = pa->pdNextVertex; if (&pd[nVertices-1] >= pa->pdFlush) { nProcess = (int)((ULONG_PTR)(pa->pdFlush - pd) + 1); needFlush = TRUE; } else nProcess = nVertices; for (n=nProcess; n > 0; n--) { int i = indices->iIn; const GLbyte* dataCoord; #if __VA_N3F
const GLbyte* dataNormal; #endif
#if __VA_C3F || __VA_C4F
const GLbyte* dataColor; #endif
#if __VA_T2F
const GLbyte* dataTexture; #endif
indices++;
// Update pd attributes.
pd->flags = __VA_PD_FLAGS;
dataCoord = dataCoord0 + i * coordStride; #if __VA_V2F
VA_COPY_VERTEX_V2F(dataCoord); #elif __VA_V3F
VA_COPY_VERTEX_V3F(dataCoord); #elif __VA_V4F
VA_COPY_VERTEX_V4F(dataCoord); #endif
#if __VA_T2F
dataTexture = dataTexture0 + i * textureStride; VA_COPY_TEXTURE_T2F(dataTexture); #endif
#if __VA_C3F
// Color
dataColor = dataColor0 + i * colorStride; VA_COPY_COLOR_C3F(dataColor); #elif __VA_C4F
// Color
dataColor = dataColor0 + i * colorStride; VA_COPY_COLOR_C4F(dataColor); #endif
#if __VA_N3F
// Normal
dataNormal = dataNormal0 + i * normalStride; VA_COPY_NORMAL_N3F(dataNormal); #endif
pd++; } // End of loop
pa->pdNextVertex = pd; pd->flags = 0; pd--; #if __VA_T2F
pa->pdCurTexture = pd; #endif
#if __VA_C3F || __VA_C4F
pa->pdCurColor = pd; #endif
#if __VA_N3F
pa->pdCurNormal = pd; #endif
nVertices-= nProcess; if (needFlush) PolyArrayFlushPartialPrimitive(); } } /*************************************************************************/ // Define a fast VA_ArrayElement function.
// This function is called in Begin and in RGBA mode only!
void FASTCALL __VA_NAME(__GLcontext *gc, GLint i) { POLYARRAY *pa; POLYDATA *pd; const GLbyte *data;
pa = gc->paTeb;
ASSERTOPENGL(pa->flags & POLYARRAY_IN_BEGIN, "VA_ArrayElement called outside Begin!\n");
// Update pa fields.
pa->flags |= __VA_PA_FLAGS; pd = pa->pdNextVertex++;
#if __VA_T2F
pa->pdCurTexture = pd; #endif
#if __VA_C3F || __VA_C4F
pa->pdCurColor = pd; #endif
#if __VA_N3F
pa->pdCurNormal = pd; #endif
// Update pd attributes.
pd->flags |= __VA_PD_FLAGS;
data = gc->vertexArray.vertex.pointer + i * gc->vertexArray.vertex.ibytes; #if __VA_V2F
VA_COPY_VERTEX_V2F(data); #elif __VA_V3F
VA_COPY_VERTEX_V3F(data); #elif __VA_V4F
VA_COPY_VERTEX_V4F(data); #endif
#if __VA_T2F
data = gc->vertexArray.texCoord.pointer + i * gc->vertexArray.texCoord.ibytes; VA_COPY_TEXTURE_T2F(data); #endif
#if __VA_C3F
data = gc->vertexArray.color.pointer + i * gc->vertexArray.color.ibytes; VA_COPY_COLOR_C3F(data); #elif __VA_C4F
data = gc->vertexArray.color.pointer + i * gc->vertexArray.color.ibytes; VA_COPY_COLOR_C4F(data); #endif
#if __VA_N3F
// Normal
data = gc->vertexArray.normal.pointer + i * gc->vertexArray.normal.ibytes; VA_COPY_NORMAL_N3F(data); #endif
pd[1].flags = 0; if (pd >= pa->pdFlush) PolyArrayFlushPartialPrimitive(); }
#undef __VA_NAMEB
#undef __VA_NAMEBI
#undef VA_COPY_VERTEX_V2F
#undef VA_COPY_VERTEX_V3F
#undef VA_COPY_VERTEX_V4F
#undef VA_COPY_TEXTURE
#undef VA_COPY_COLOR_C3F
#undef VA_COPY_COLOR_C4F
#undef VA_COPY_NORMAL
#undef __VA_NAME
#undef __VA_T2F
#undef __VA_C3F
#undef __VA_C4F
#undef __VA_N3F
#undef __VA_V2F
#undef __VA_V3F
#undef __VA_V4F
#undef __VA_PD_FLAGS_T
#undef __VA_PD_FLAGS_C
#undef __VA_PD_FLAGS_N
#undef __VA_PD_FLAGS_V
#undef __VA_PA_FLAGS_T
#undef __VA_PA_FLAGS_C
#undef __VA_PA_FLAGS_N
#undef __VA_PA_FLAGS_V
#undef __VA_PD_FLAGS
#undef __VA_PA_FLAGS
|