|
|
@@ -69,6 +69,17 @@ |
|
|
|
#define VERT_COPY_IND( v0, v1 ) |
|
|
|
#define VERT_SAVE_IND( idx ) |
|
|
|
#define VERT_RESTORE_IND( idx ) |
|
|
|
#if HAVE_BACK_COLORS |
|
|
|
#define VERT_SET_RGBA( v, c ) |
|
|
|
#endif |
|
|
|
#else |
|
|
|
#define VERT_SET_RGBA( v, c ) (void) c |
|
|
|
#define VERT_COPY_RGBA( v0, v1 ) |
|
|
|
#define VERT_SAVE_RGBA( idx ) |
|
|
|
#define VERT_RESTORE_RGBA( idx ) |
|
|
|
#if HAVE_BACK_COLORS |
|
|
|
#define VERT_SET_IND( v, c ) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#if !HAVE_SPEC |
|
|
@@ -76,8 +87,27 @@ |
|
|
|
#define VERT_COPY_SPEC( v0, v1 ) |
|
|
|
#define VERT_SAVE_SPEC( idx ) |
|
|
|
#define VERT_RESTORE_SPEC( idx ) |
|
|
|
#if HAVE_BACK_COLORS |
|
|
|
#define VERT_COPY_SPEC1( v ) |
|
|
|
#endif |
|
|
|
#else |
|
|
|
#if HAVE_BACK_COLORS |
|
|
|
#define VERT_SET_SPEC( v, c ) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#if !HAVE_BACK_COLORS |
|
|
|
#define VERT_COPY_SPEC1( v ) |
|
|
|
#define VERT_COPY_IND1( v ) |
|
|
|
#define VERT_COPY_RGBA1( v ) |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifndef INSANE_VERTICES |
|
|
|
#define VERT_SET_Z(v,val) VERT_Z(v) = val |
|
|
|
#define VERT_Z_ADD(v,val) VERT_Z(v) += val |
|
|
|
#endif |
|
|
|
|
|
|
|
#if DO_TRI |
|
|
|
static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) |
|
|
|
{ |
|
|
|
struct vertex_buffer *VB = &TNL_CONTEXT( ctx )->vb; |
|
|
@@ -125,26 +155,48 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) |
|
|
|
if (DO_TWOSIDE && facing == 1) |
|
|
|
{ |
|
|
|
if (HAVE_RGBA) { |
|
|
|
GLchan (*vbcolor)[4] = VB->ColorPtr[1]->data; |
|
|
|
ASSERT(VB->ColorPtr[1]->stride == 4*sizeof(GLchan)); |
|
|
|
|
|
|
|
if (!DO_FLAT) { |
|
|
|
VERT_SET_RGBA( v[0], vbcolor[e0] ); |
|
|
|
VERT_SET_RGBA( v[1], vbcolor[e1] ); |
|
|
|
} |
|
|
|
VERT_SET_RGBA( v[2], vbcolor[e2] ); |
|
|
|
if (HAVE_BACK_COLORS) { |
|
|
|
if (!DO_FLAT) { |
|
|
|
VERT_SAVE_RGBA( 0 ); |
|
|
|
VERT_SAVE_RGBA( 1 ); |
|
|
|
VERT_COPY_RGBA1( v[0] ); |
|
|
|
VERT_COPY_RGBA1( v[1] ); |
|
|
|
} |
|
|
|
VERT_SAVE_RGBA( 2 ); |
|
|
|
VERT_COPY_RGBA1( v[2] ); |
|
|
|
if (HAVE_SPEC) { |
|
|
|
if (!DO_FLAT) { |
|
|
|
VERT_SAVE_SPEC( 0 ); |
|
|
|
VERT_SAVE_SPEC( 1 ); |
|
|
|
VERT_COPY_SPEC1( v[0] ); |
|
|
|
VERT_COPY_SPEC1( v[1] ); |
|
|
|
} |
|
|
|
VERT_SAVE_SPEC( 2 ); |
|
|
|
VERT_COPY_SPEC1( v[2] ); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
GLchan (*vbcolor)[4] = VB->ColorPtr[1]->data; |
|
|
|
ASSERT(VB->ColorPtr[1]->stride == 4*sizeof(GLchan)); |
|
|
|
(void) vbcolor; |
|
|
|
|
|
|
|
if (HAVE_SPEC && VB->SecondaryColorPtr[1]) { |
|
|
|
GLchan (*vbspec)[4] = VB->SecondaryColorPtr[1]->data; |
|
|
|
ASSERT(VB->SecondaryColorPtr[1]->stride == 4*sizeof(GLchan)); |
|
|
|
|
|
|
|
if (!DO_FLAT) { |
|
|
|
VERT_SET_SPEC( v[0], vbspec[e0] ); |
|
|
|
VERT_SET_SPEC( v[1], vbspec[e1] ); |
|
|
|
VERT_SET_RGBA( v[0], vbcolor[e0] ); |
|
|
|
VERT_SET_RGBA( v[1], vbcolor[e1] ); |
|
|
|
} |
|
|
|
VERT_SET_SPEC( v[2], vbspec[e2] ); |
|
|
|
} |
|
|
|
} |
|
|
|
VERT_SET_RGBA( v[2], vbcolor[e2] ); |
|
|
|
|
|
|
|
if (HAVE_SPEC && VB->SecondaryColorPtr[1]) { |
|
|
|
GLchan (*vbspec)[4] = VB->SecondaryColorPtr[1]->data; |
|
|
|
|
|
|
|
if (!DO_FLAT) { |
|
|
|
VERT_SET_SPEC( v[0], vbspec[e0] ); |
|
|
|
VERT_SET_SPEC( v[1], vbspec[e1] ); |
|
|
|
} |
|
|
|
VERT_SET_SPEC( v[2], vbspec[e2] ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
GLuint *vbindex = VB->IndexPtr[1]->data; |
|
|
|
if (!DO_FLAT) { |
|
|
@@ -202,23 +254,23 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) |
|
|
|
|
|
|
|
if (mode == GL_POINT) { |
|
|
|
if (DO_OFFSET && ctx->Polygon.OffsetPoint) { |
|
|
|
VERT_Z(v[0]) += offset; |
|
|
|
VERT_Z(v[1]) += offset; |
|
|
|
VERT_Z(v[2]) += offset; |
|
|
|
VERT_Z_ADD(v[0], offset); |
|
|
|
VERT_Z_ADD(v[1], offset); |
|
|
|
VERT_Z_ADD(v[2], offset); |
|
|
|
} |
|
|
|
UNFILLED_TRI( ctx, GL_POINT, e0, e1, e2 ); |
|
|
|
} else if (mode == GL_LINE) { |
|
|
|
if (DO_OFFSET && ctx->Polygon.OffsetLine) { |
|
|
|
VERT_Z(v[0]) += offset; |
|
|
|
VERT_Z(v[1]) += offset; |
|
|
|
VERT_Z(v[2]) += offset; |
|
|
|
VERT_Z_ADD(v[0], offset); |
|
|
|
VERT_Z_ADD(v[1], offset); |
|
|
|
VERT_Z_ADD(v[2], offset); |
|
|
|
} |
|
|
|
UNFILLED_TRI( ctx, GL_LINE, e0, e1, e2 ); |
|
|
|
} else { |
|
|
|
if (DO_OFFSET && ctx->Polygon.OffsetFill) { |
|
|
|
VERT_Z(v[0]) += offset; |
|
|
|
VERT_Z(v[1]) += offset; |
|
|
|
VERT_Z(v[2]) += offset; |
|
|
|
VERT_Z_ADD(v[0], offset); |
|
|
|
VERT_Z_ADD(v[1], offset); |
|
|
|
VERT_Z_ADD(v[2], offset); |
|
|
|
} |
|
|
|
if (DO_UNFILLED) |
|
|
|
RASTERIZE( GL_TRIANGLES ); |
|
|
@@ -227,32 +279,45 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) |
|
|
|
|
|
|
|
if (DO_OFFSET) |
|
|
|
{ |
|
|
|
VERT_Z(v[0]) = z[0]; |
|
|
|
VERT_Z(v[1]) = z[1]; |
|
|
|
VERT_Z(v[2]) = z[2]; |
|
|
|
VERT_SET_Z(v[0], z[0]); |
|
|
|
VERT_SET_Z(v[1], z[1]); |
|
|
|
VERT_SET_Z(v[2], z[2]); |
|
|
|
} |
|
|
|
|
|
|
|
if (DO_TWOSIDE && facing == 1) |
|
|
|
{ |
|
|
|
if (HAVE_RGBA) { |
|
|
|
GLchan (*vbcolor)[4] = VB->ColorPtr[0]->data; |
|
|
|
ASSERT(VB->ColorPtr[0]->stride == 4*sizeof(GLchan)); |
|
|
|
|
|
|
|
if (!DO_FLAT) { |
|
|
|
VERT_SET_RGBA( v[0], vbcolor[e0] ); |
|
|
|
VERT_SET_RGBA( v[1], vbcolor[e1] ); |
|
|
|
} |
|
|
|
VERT_SET_RGBA( v[2], vbcolor[e2] ); |
|
|
|
|
|
|
|
if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { |
|
|
|
GLchan (*vbspec)[4] = VB->SecondaryColorPtr[0]->data; |
|
|
|
ASSERT(VB->SecondaryColorPtr[0]->stride == 4*sizeof(GLchan)); |
|
|
|
|
|
|
|
if (HAVE_BACK_COLORS) { |
|
|
|
VERT_RESTORE_RGBA( 0 ); |
|
|
|
VERT_RESTORE_RGBA( 1 ); |
|
|
|
VERT_RESTORE_RGBA( 2 ); |
|
|
|
if (HAVE_SPEC) { |
|
|
|
VERT_RESTORE_SPEC( 0 ); |
|
|
|
VERT_RESTORE_SPEC( 1 ); |
|
|
|
VERT_RESTORE_SPEC( 2 ); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
GLchan (*vbcolor)[4] = VB->ColorPtr[0]->data; |
|
|
|
ASSERT(VB->ColorPtr[0]->stride == 4*sizeof(GLchan)); |
|
|
|
(void) vbcolor; |
|
|
|
|
|
|
|
if (!DO_FLAT) { |
|
|
|
VERT_SET_SPEC( v[0], vbspec[e0] ); |
|
|
|
VERT_SET_SPEC( v[1], vbspec[e1] ); |
|
|
|
VERT_SET_RGBA( v[0], vbcolor[e0] ); |
|
|
|
VERT_SET_RGBA( v[1], vbcolor[e1] ); |
|
|
|
} |
|
|
|
VERT_SET_RGBA( v[2], vbcolor[e2] ); |
|
|
|
|
|
|
|
if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { |
|
|
|
GLchan (*vbspec)[4] = VB->SecondaryColorPtr[0]->data; |
|
|
|
ASSERT(VB->SecondaryColorPtr[0]->stride == 4*sizeof(GLchan)); |
|
|
|
|
|
|
|
if (!DO_FLAT) { |
|
|
|
VERT_SET_SPEC( v[0], vbspec[e0] ); |
|
|
|
VERT_SET_SPEC( v[1], vbspec[e1] ); |
|
|
|
} |
|
|
|
VERT_SET_SPEC( v[2], vbspec[e2] ); |
|
|
|
} |
|
|
|
VERT_SET_SPEC( v[2], vbspec[e2] ); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
@@ -280,11 +345,11 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) |
|
|
|
VERT_RESTORE_IND( 1 ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
#if (DO_FULL_QUAD) |
|
|
|
#if DO_QUAD |
|
|
|
#if DO_FULL_QUAD |
|
|
|
static void TAG(quad)( GLcontext *ctx, |
|
|
|
GLuint e0, GLuint e1, GLuint e2, GLuint e3 ) |
|
|
|
{ |
|
|
@@ -333,6 +398,7 @@ static void TAG(quad)( GLcontext *ctx, |
|
|
|
{ |
|
|
|
if (HAVE_RGBA) { |
|
|
|
GLchan (*vbcolor)[4] = VB->ColorPtr[1]->data; |
|
|
|
(void)vbcolor; |
|
|
|
|
|
|
|
if (!DO_FLAT) { |
|
|
|
VERT_SET_RGBA( v[0], vbcolor[e0] ); |
|
|
@@ -418,26 +484,26 @@ static void TAG(quad)( GLcontext *ctx, |
|
|
|
|
|
|
|
if (mode == GL_POINT) { |
|
|
|
if (( DO_OFFSET) && ctx->Polygon.OffsetPoint) { |
|
|
|
VERT_Z(v[0]) += offset; |
|
|
|
VERT_Z(v[1]) += offset; |
|
|
|
VERT_Z(v[2]) += offset; |
|
|
|
VERT_Z(v[3]) += offset; |
|
|
|
VERT_Z_ADD(v[0], offset); |
|
|
|
VERT_Z_ADD(v[1], offset); |
|
|
|
VERT_Z_ADD(v[2], offset); |
|
|
|
VERT_Z_ADD(v[3], offset); |
|
|
|
} |
|
|
|
UNFILLED_QUAD( ctx, GL_POINT, e0, e1, e2, e3 ); |
|
|
|
} else if (mode == GL_LINE) { |
|
|
|
if (DO_OFFSET && ctx->Polygon.OffsetLine) { |
|
|
|
VERT_Z(v[0]) += offset; |
|
|
|
VERT_Z(v[1]) += offset; |
|
|
|
VERT_Z(v[2]) += offset; |
|
|
|
VERT_Z(v[3]) += offset; |
|
|
|
VERT_Z_ADD(v[0], offset); |
|
|
|
VERT_Z_ADD(v[1], offset); |
|
|
|
VERT_Z_ADD(v[2], offset); |
|
|
|
VERT_Z_ADD(v[3], offset); |
|
|
|
} |
|
|
|
UNFILLED_QUAD( ctx, GL_LINE, e0, e1, e2, e3 ); |
|
|
|
} else { |
|
|
|
if (DO_OFFSET && ctx->Polygon.OffsetFill) { |
|
|
|
VERT_Z(v[0]) += offset; |
|
|
|
VERT_Z(v[1]) += offset; |
|
|
|
VERT_Z(v[2]) += offset; |
|
|
|
VERT_Z(v[3]) += offset; |
|
|
|
VERT_Z_ADD(v[0], offset); |
|
|
|
VERT_Z_ADD(v[1], offset); |
|
|
|
VERT_Z_ADD(v[2], offset); |
|
|
|
VERT_Z_ADD(v[3], offset); |
|
|
|
} |
|
|
|
RASTERIZE( GL_TRIANGLES ); |
|
|
|
QUAD( (v[0]), (v[1]), (v[2]), (v[3]) ); |
|
|
@@ -445,10 +511,10 @@ static void TAG(quad)( GLcontext *ctx, |
|
|
|
|
|
|
|
if (DO_OFFSET) |
|
|
|
{ |
|
|
|
VERT_Z(v[0]) = z[0]; |
|
|
|
VERT_Z(v[1]) = z[1]; |
|
|
|
VERT_Z(v[2]) = z[2]; |
|
|
|
VERT_Z(v[3]) = z[3]; |
|
|
|
VERT_SET_Z(v[0], z[0]); |
|
|
|
VERT_SET_Z(v[1], z[1]); |
|
|
|
VERT_SET_Z(v[2], z[2]); |
|
|
|
VERT_SET_Z(v[3], z[3]); |
|
|
|
} |
|
|
|
|
|
|
|
if (DO_TWOSIDE && facing == 1) |
|
|
@@ -456,6 +522,7 @@ static void TAG(quad)( GLcontext *ctx, |
|
|
|
if (HAVE_RGBA) { |
|
|
|
GLchan (*vbcolor)[4] = VB->ColorPtr[0]->data; |
|
|
|
ASSERT(VB->ColorPtr[0]->stride == 4*sizeof(GLchan)); |
|
|
|
(void) vbcolor; |
|
|
|
|
|
|
|
if (!DO_FLAT) { |
|
|
|
VERT_SET_RGBA( v[0], vbcolor[e0] ); |
|
|
@@ -526,8 +593,9 @@ static void TAG(quad)( GLcontext *ctx, GLuint e0, |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if DO_LINE |
|
|
|
static void TAG(line)( GLcontext *ctx, GLuint e0, GLuint e1 ) |
|
|
|
{ |
|
|
|
TNLvertexbuffer *VB = &TNL_CONTEXT(ctx)->vb; |
|
|
@@ -567,8 +635,9 @@ static void TAG(line)( GLcontext *ctx, GLuint e0, GLuint e1 ) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if DO_POINT |
|
|
|
static void TAG(points)( GLcontext *ctx, GLuint first, GLuint last ) |
|
|
|
{ |
|
|
|
struct vertex_buffer *VB = &TNL_CONTEXT( ctx )->vb; |
|
|
@@ -592,13 +661,22 @@ static void TAG(points)( GLcontext *ctx, GLuint first, GLuint last ) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
static void TAG(init)( void ) |
|
|
|
{ |
|
|
|
#if DO_QUAD |
|
|
|
TAB[IND].quad = TAG(quad); |
|
|
|
#endif |
|
|
|
#if DO_TRI |
|
|
|
TAB[IND].triangle = TAG(triangle); |
|
|
|
#endif |
|
|
|
#if DO_LINE |
|
|
|
TAB[IND].line = TAG(line); |
|
|
|
#endif |
|
|
|
#if DO_POINT |
|
|
|
TAB[IND].points = TAG(points); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
#undef IND |
|
|
@@ -609,6 +687,17 @@ static void TAG(init)( void ) |
|
|
|
#undef VERT_COPY_IND |
|
|
|
#undef VERT_SAVE_IND |
|
|
|
#undef VERT_RESTORE_IND |
|
|
|
#if HAVE_BACK_COLORS |
|
|
|
#undef VERT_SET_RGBA |
|
|
|
#endif |
|
|
|
#else |
|
|
|
#undef VERT_SET_RGBA |
|
|
|
#undef VERT_COPY_RGBA |
|
|
|
#undef VERT_SAVE_RGBA |
|
|
|
#undef VERT_RESTORE_RGBA |
|
|
|
#if HAVE_BACK_COLORS |
|
|
|
#undef VERT_SET_IND |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#if !HAVE_SPEC |
|
|
@@ -616,4 +705,23 @@ static void TAG(init)( void ) |
|
|
|
#undef VERT_COPY_SPEC |
|
|
|
#undef VERT_SAVE_SPEC |
|
|
|
#undef VERT_RESTORE_SPEC |
|
|
|
#if HAVE_BACK_COLORS |
|
|
|
#undef VERT_COPY_SPEC1 |
|
|
|
#endif |
|
|
|
#else |
|
|
|
#if HAVE_BACK_COLORS |
|
|
|
#undef VERT_SET_SPEC |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#if !HAVE_BACK_COLORS |
|
|
|
#undef VERT_COPY_SPEC1 |
|
|
|
#undef VERT_COPY_IND1 |
|
|
|
#undef VERT_COPY_RGBA1 |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifndef INSANE_VERTICES |
|
|
|
#undef VERT_SET_Z |
|
|
|
#undef VERT_Z_ADD |
|
|
|
#endif |
|
|
|
|