-/* $Id: lines.c,v 1.1 1999/08/19 00:55:41 jtg Exp $ */
+/* $Id: lines.c,v 1.10 2000/05/10 22:36:05 brianp Exp $ */
/*
* Mesa 3-D graphics library
- * Version: 3.1
+ * Version: 3.3
*
* Copyright (C) 1999 Brian Paul All Rights Reserved.
*
*/
-
-
-
#ifdef PC_HEADER
#include "all.h"
#else
-#include <assert.h>
+#include "glheader.h"
#include "context.h"
#include "depth.h"
#include "feedback.h"
#include "texstate.h"
#include "types.h"
#include "vb.h"
-#ifdef XFree86Server
-#include "GL/xf86glx.h"
-#endif
#endif
-void gl_LineWidth( GLcontext *ctx, GLfloat width )
+void
+_mesa_LineWidth( GLfloat width )
{
+ GET_CURRENT_CONTEXT(ctx);
if (width<=0.0) {
gl_error( ctx, GL_INVALID_VALUE, "glLineWidth" );
return;
ctx->TriangleCaps &= ~DD_LINE_WIDTH;
if (width != 1.0) ctx->TriangleCaps |= DD_LINE_WIDTH;
ctx->NewState |= NEW_RASTER_OPS;
+ if (ctx->Driver.LineWidth)
+ (*ctx->Driver.LineWidth)(ctx, width);
}
}
-void gl_LineStipple( GLcontext *ctx, GLint factor, GLushort pattern )
+void
+_mesa_LineStipple( GLint factor, GLushort pattern )
{
+ GET_CURRENT_CONTEXT(ctx);
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glLineStipple");
ctx->Line.StippleFactor = CLAMP( factor, 1, 256 );
ctx->Line.StipplePattern = pattern;
ctx->NewState |= NEW_RASTER_OPS;
+
+ if (ctx->Driver.LineStipple)
+ ctx->Driver.LineStipple( ctx, factor, pattern );
}
-static void feedback_line( GLcontext *ctx, GLuint v1, GLuint v2, GLuint pv )
-{
- struct vertex_buffer *VB = ctx->VB;
- GLfloat x1, y1, z1, w1;
- GLfloat x2, y2, z2, w2;
- GLfloat tex1[4], tex2[4], invq;
- GLuint texUnit = ctx->Texture.CurrentTransformUnit;
-
- x1 = VB->Win.data[v1][0];
- y1 = VB->Win.data[v1][1];
- z1 = VB->Win.data[v1][2] / DEPTH_SCALE;
- w1 = (VB->ClipPtr->size == 4 ? VEC_ELT(VB->ClipPtr, GLfloat, v1)[3] : 1.0);
-
- x2 = VB->Win.data[v2][0];
- y2 = VB->Win.data[v2][1];
- z2 = VB->Win.data[v2][2] / DEPTH_SCALE;
- w2 = (VB->ClipPtr->size == 4 ? VEC_ELT(VB->ClipPtr, GLfloat, v2)[3] : 1.0);
-
-
- if (VB->TexCoordPtr[texUnit]->size == 4) {
- invq = (VB->TexCoordPtr[texUnit]->data[v1][3]==0.0
- ? 1.0
- : 1.0F / VB->TexCoordPtr[texUnit]->data[v1][3]);
-
- tex1[0] = VB->TexCoordPtr[texUnit]->data[v1][0] * invq;
- tex1[1] = VB->TexCoordPtr[texUnit]->data[v1][1] * invq;
- tex1[2] = VB->TexCoordPtr[texUnit]->data[v1][2] * invq;
- tex1[3] = VB->TexCoordPtr[texUnit]->data[v1][3];
-
- invq = (VB->TexCoordPtr[texUnit]->data[v2][3]==0.0
- ? 1.0
- : 1.0F / VB->TexCoordPtr[texUnit]->data[v2][3]);
-
- tex2[0] = VB->TexCoordPtr[texUnit]->data[v2][0] * invq;
- tex2[1] = VB->TexCoordPtr[texUnit]->data[v2][1] * invq;
- tex2[2] = VB->TexCoordPtr[texUnit]->data[v2][2] * invq;
- tex2[3] = VB->TexCoordPtr[texUnit]->data[v2][3];
- } else {
- ASSIGN_4V(tex1, 0,0,0,1);
- ASSIGN_4V(tex2, 0,0,0,1);
- COPY_SZ_4V(tex1,
- VB->TexCoordPtr[texUnit]->size,
- VB->TexCoordPtr[texUnit]->data[v1]);
- COPY_SZ_4V(tex2,
- VB->TexCoordPtr[texUnit]->size,
- VB->TexCoordPtr[texUnit]->data[v2]);
- }
-
-
- if (ctx->StippleCounter==0) {
- FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_LINE_RESET_TOKEN );
- }
- else {
- FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_LINE_TOKEN );
- }
-
- {
- GLfloat color[4];
- GLubyte *ubc = VB->ColorPtr->data[pv];
- GLuint index = VB->IndexPtr->data[pv];
-
- UBYTE_RGBA_TO_FLOAT_RGBA( color, ubc );
- gl_feedback_vertex( ctx, x1,y1,z1,w1, color, (GLfloat) index, tex1 );
- gl_feedback_vertex( ctx, x2,y2,z2,w2, color, (GLfloat) index, tex2 );
- }
-
- ctx->StippleCounter++;
-}
-
-
-
-static void select_line( GLcontext *ctx, GLuint v1, GLuint v2, GLuint pv )
-{
- (void) pv;
- gl_update_hitflag( ctx, ctx->VB->Win.data[v1][2] / DEPTH_SCALE );
- gl_update_hitflag( ctx, ctx->VB->Win.data[v2][2] / DEPTH_SCALE );
-}
static void flat_ci_line( GLcontext *ctx,
GLuint vert0, GLuint vert1, GLuint pvert )
{
- GLint count;
- GLint *pbx = ctx->PB->x;
- GLint *pby = ctx->PB->y;
- PB_SET_INDEX( ctx, ctx->PB, ctx->VB->IndexPtr->data[pvert] );
- count = ctx->PB->count;
+ PB_SET_INDEX( ctx->PB, ctx->VB->IndexPtr->data[pvert] );
#define INTERP_XY 1
-
-#define PLOT(X,Y) \
- pbx[count] = X; \
- pby[count] = Y; \
- count++;
+#define PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, 0);
#include "linetemp.h"
- ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
static void flat_ci_z_line( GLcontext *ctx,
GLuint vert0, GLuint vert1, GLuint pvert )
{
- GLint count;
- GLint *pbx = ctx->PB->x;
- GLint *pby = ctx->PB->y;
- GLdepth *pbz = ctx->PB->z;
- PB_SET_INDEX( ctx, ctx->PB, ctx->VB->IndexPtr->data[pvert] );
- count = ctx->PB->count;
+ PB_SET_INDEX( ctx->PB, ctx->VB->IndexPtr->data[pvert] );
#define INTERP_XY 1
#define INTERP_Z 1
-
-#define PLOT(X,Y) \
- pbx[count] = X; \
- pby[count] = Y; \
- pbz[count] = Z; \
- count++;
+#define PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, Z);
#include "linetemp.h"
- ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
static void flat_rgba_line( GLcontext *ctx,
GLuint vert0, GLuint vert1, GLuint pvert )
{
- GLint count;
- GLint *pbx = ctx->PB->x;
- GLint *pby = ctx->PB->y;
- GLubyte *color = ctx->VB->ColorPtr->data[pvert];
- PB_SET_COLOR( ctx, ctx->PB, color[0], color[1], color[2], color[3] );
- count = ctx->PB->count;
+ const GLubyte *color = ctx->VB->ColorPtr->data[pvert];
+ PB_SET_COLOR( ctx->PB, color[0], color[1], color[2], color[3] );
#define INTERP_XY 1
-
-#define PLOT(X,Y) \
- pbx[count] = X; \
- pby[count] = Y; \
- count++;
+#define PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, 0);
#include "linetemp.h"
- ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
static void flat_rgba_z_line( GLcontext *ctx,
GLuint vert0, GLuint vert1, GLuint pvert )
{
- GLint count;
- GLint *pbx = ctx->PB->x;
- GLint *pby = ctx->PB->y;
- GLdepth *pbz = ctx->PB->z;
- GLubyte *color = ctx->VB->ColorPtr->data[pvert];
- PB_SET_COLOR( ctx, ctx->PB, color[0], color[1], color[2], color[3] );
- count = ctx->PB->count;
+ const GLubyte *color = ctx->VB->ColorPtr->data[pvert];
+ PB_SET_COLOR( ctx->PB, color[0], color[1], color[2], color[3] );
#define INTERP_XY 1
#define INTERP_Z 1
-
-#define PLOT(X,Y) \
- pbx[count] = X; \
- pby[count] = Y; \
- pbz[count] = Z; \
- count++;
+#define PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, Z);
#include "linetemp.h"
- ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLint count = ctx->PB->count;
GLint *pbx = ctx->PB->x;
GLint *pby = ctx->PB->y;
- GLuint *pbi = ctx->PB->i;
+ GLuint *pbi = ctx->PB->index;
(void) pvert;
+ ctx->PB->mono = GL_FALSE;
+
#define INTERP_XY 1
#define INTERP_INDEX 1
#include "linetemp.h"
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLint *pbx = ctx->PB->x;
GLint *pby = ctx->PB->y;
GLdepth *pbz = ctx->PB->z;
- GLuint *pbi = ctx->PB->i;
+ GLuint *pbi = ctx->PB->index;
(void) pvert;
+ ctx->PB->mono = GL_FALSE;
+
#define INTERP_XY 1
#define INTERP_Z 1
#define INTERP_INDEX 1
#include "linetemp.h"
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLubyte (*pbrgba)[4] = ctx->PB->rgba;
(void) pvert;
+ ctx->PB->mono = GL_FALSE;
+
#define INTERP_XY 1
#define INTERP_RGB 1
#define INTERP_ALPHA 1
#include "linetemp.h"
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLubyte (*pbrgba)[4] = ctx->PB->rgba;
(void) pvert;
+ ctx->PB->mono = GL_FALSE;
+
#define INTERP_XY 1
#define INTERP_Z 1
#define INTERP_RGB 1
#include "linetemp.h"
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLint *pbx = ctx->PB->x;
GLint *pby = ctx->PB->y;
GLdepth *pbz = ctx->PB->z;
- GLuint *pbi = ctx->PB->i;
+ GLuint *pbi = ctx->PB->index;
(void) pvert;
+ ctx->PB->mono = GL_FALSE;
+
if (ctx->Line.StippleFlag) {
/* stippled */
#define INTERP_XY 1
}
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLint *pbx = ctx->PB->x;
GLint *pby = ctx->PB->y;
GLdepth *pbz = ctx->PB->z;
- PB_SET_INDEX( ctx, ctx->PB, ctx->VB->IndexPtr->data[pvert] );
+ PB_SET_INDEX( ctx->PB, ctx->VB->IndexPtr->data[pvert] );
count = ctx->PB->count;
if (ctx->Line.StippleFlag) {
}
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLubyte (*pbrgba)[4] = ctx->PB->rgba;
(void) pvert;
+ ctx->PB->mono = GL_FALSE;
+
if (ctx->Line.StippleFlag) {
/* stippled */
#define INTERP_XY 1
}
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLint *pby = ctx->PB->y;
GLdepth *pbz = ctx->PB->z;
GLubyte *color = ctx->VB->ColorPtr->data[pvert];
- PB_SET_COLOR( ctx, ctx->PB, color[0], color[1], color[2], color[3] );
+ PB_SET_COLOR( ctx->PB, color[0], color[1], color[2], color[3] );
count = ctx->PB->count;
if (ctx->Line.StippleFlag) {
}
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLfloat *pbt = ctx->PB->t[0];
GLfloat *pbu = ctx->PB->u[0];
GLubyte *color = ctx->VB->ColorPtr->data[pv];
- PB_SET_COLOR( ctx, ctx->PB, color[0], color[1], color[2], color[3] );
+ PB_SET_COLOR( ctx->PB, color[0], color[1], color[2], color[3] );
count = ctx->PB->count;
if (ctx->Line.StippleFlag) {
}
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLubyte (*pbrgba)[4] = ctx->PB->rgba;
(void) pvert;
+ ctx->PB->mono = GL_FALSE;
+
if (ctx->Line.StippleFlag) {
/* stippled */
#define INTERP_XY 1
}
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
GLubyte (*pbspec)[3] = ctx->PB->spec;
(void) pvert;
+ ctx->PB->mono = GL_FALSE;
+
if (ctx->Line.StippleFlag) {
/* stippled */
#define INTERP_XY 1
}
ctx->PB->count = count;
- PB_CHECK_FLUSH( ctx, ctx->PB );
+ gl_flush_pb(ctx);
}
else {
if (ctx->Light.ShadeModel==GL_SMOOTH) {
/* Width==1, non-stippled, smooth-shaded */
- if (ctx->Depth.Test
- || (ctx->Fog.Enabled && ctx->Hint.Fog==GL_NICEST)) {
+ if (ctx->Depth.Test || ctx->FogMode == FOG_FRAGMENT) {
if (rgbmode)
ctx->Driver.LineFunc = smooth_rgba_z_line;
else
}
else {
/* Width==1, non-stippled, flat-shaded */
- if (ctx->Depth.Test
- || (ctx->Fog.Enabled && ctx->Hint.Fog==GL_NICEST)) {
+ if (ctx->Depth.Test || ctx->FogMode == FOG_FRAGMENT) {
if (rgbmode)
ctx->Driver.LineFunc = flat_rgba_z_line;
else
}
}
else if (ctx->RenderMode==GL_FEEDBACK) {
- ctx->Driver.LineFunc = feedback_line;
+ ctx->Driver.LineFunc = gl_feedback_line;
}
else {
/* GL_SELECT mode */
- ctx->Driver.LineFunc = select_line;
+ ctx->Driver.LineFunc = gl_select_line;
}
}