added GL_SGIX/SGIS_pixel_texture
[mesa.git] / src / mesa / main / feedback.c
index 2b6ff083b85593373347aec5f5a4ac51d2ef7675..3a38db1d62ca727f205eb7eedf9cccfa7be258fa 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: feedback.c,v 1.7 2000/01/17 15:40:43 brianp Exp $ */
+/* $Id: feedback.c,v 1.9 2000/03/03 17:47:39 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -133,6 +133,7 @@ void gl_feedback_vertex( GLcontext *ctx,
    FEEDBACK_TOKEN( ctx, win[0] );
    FEEDBACK_TOKEN( ctx, win[1] );
    if (ctx->Feedback.Mask & FB_3D) {
+      printf("FB %g\n", win[2]);
       FEEDBACK_TOKEN( ctx, win[2] );
    }
    if (ctx->Feedback.Mask & FB_4D) {
@@ -157,17 +158,18 @@ void gl_feedback_vertex( GLcontext *ctx,
 
 
 
-static void gl_do_feedback_vertex( GLcontext *ctx, GLuint v, GLuint pv )
+static void feedback_vertex( GLcontext *ctx, GLuint v, GLuint pv )
 {
    GLfloat win[4];
    GLfloat color[4];
    GLfloat tc[4];
    GLuint texUnit = ctx->Texture.CurrentTransformUnit;
-   struct vertex_buffer *VB = ctx->VB;
+   const struct vertex_buffer *VB = ctx->VB;
+   GLuint index;
 
    win[0] = VB->Win.data[v][0];
    win[1] = VB->Win.data[v][1];
-   win[2] = VB->Win.data[v][2] / DEPTH_SCALE;
+   win[2] = VB->Win.data[v][2] / ctx->Visual->DepthMaxF;
    win[3] = 1.0 / VB->Win.data[v][3];
 
    if (ctx->Light.ShadeModel == GL_SMOOTH)
@@ -190,7 +192,12 @@ static void gl_do_feedback_vertex( GLcontext *ctx, GLuint v, GLuint pv )
                 VB->TexCoordPtr[texUnit]->data[v]);
    }
 
-   gl_feedback_vertex( ctx, win, color, VB->IndexPtr->data[v], tc );
+   if (VB->IndexPtr)
+      index = VB->IndexPtr->data[v];
+   else
+      index = 0;
+
+   gl_feedback_vertex( ctx, win, color, index, tc );
 }
 
 
@@ -205,9 +212,9 @@ void gl_feedback_triangle( GLcontext *ctx,
       FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_POLYGON_TOKEN );
       FEEDBACK_TOKEN( ctx, (GLfloat) 3 );        /* three vertices */
       
-      gl_do_feedback_vertex( ctx, v0, pv );
-      gl_do_feedback_vertex( ctx, v1, pv );
-      gl_do_feedback_vertex( ctx, v2, pv );
+      feedback_vertex( ctx, v0, pv );
+      feedback_vertex( ctx, v1, pv );
+      feedback_vertex( ctx, v2, pv );
    }
 }
 
@@ -221,8 +228,8 @@ void gl_feedback_line( GLcontext *ctx, GLuint v1, GLuint v2, GLuint pv )
 
    FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) token );
 
-   gl_do_feedback_vertex( ctx, v1, pv );
-   gl_do_feedback_vertex( ctx, v2, pv );
+   feedback_vertex( ctx, v1, pv );
+   feedback_vertex( ctx, v2, pv );
 
    ctx->StippleCounter++;
 }
@@ -230,13 +237,13 @@ void gl_feedback_line( GLcontext *ctx, GLuint v1, GLuint v2, GLuint pv )
 
 void gl_feedback_points( GLcontext *ctx, GLuint first, GLuint last )
 {
-   struct vertex_buffer *VB = ctx->VB;
+   const struct vertex_buffer *VB = ctx->VB;
    GLuint i;
 
    for (i=first;i<=last;i++) {
       if (VB->ClipMask[i]==0) {
          FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_POINT_TOKEN );
-        gl_do_feedback_vertex( ctx, i, i );
+        feedback_vertex( ctx, i, i );
       }
    }
 }
@@ -293,12 +300,13 @@ void gl_update_hitflag( GLcontext *ctx, GLfloat z )
 void gl_select_triangle( GLcontext *ctx,
                         GLuint v0, GLuint v1, GLuint v2, GLuint pv )
 {
-   struct vertex_buffer *VB = ctx->VB;
+   const struct vertex_buffer *VB = ctx->VB;
 
    if (gl_cull_triangle( ctx, v0, v1, v2, 0 )) {
-      gl_update_hitflag( ctx, VB->Win.data[v0][2] / DEPTH_SCALE );
-      gl_update_hitflag( ctx, VB->Win.data[v1][2] / DEPTH_SCALE );
-      gl_update_hitflag( ctx, VB->Win.data[v2][2] / DEPTH_SCALE );
+      const GLfloat zs = 1.0F / ctx->Visual->DepthMaxF;
+      gl_update_hitflag( ctx, VB->Win.data[v0][2] * zs );
+      gl_update_hitflag( ctx, VB->Win.data[v1][2] * zs );
+      gl_update_hitflag( ctx, VB->Win.data[v2][2] * zs );
    }
 }
 
@@ -306,21 +314,22 @@ void gl_select_triangle( GLcontext *ctx,
 void gl_select_line( GLcontext *ctx,
                     GLuint v0, GLuint v1, GLuint pv )
 {
-   struct vertex_buffer *VB = ctx->VB;
-
-   gl_update_hitflag( ctx, VB->Win.data[v0][2] / DEPTH_SCALE );
-   gl_update_hitflag( ctx, VB->Win.data[v1][2] / DEPTH_SCALE );
+   const struct vertex_buffer *VB = ctx->VB;
+   const GLfloat zs = 1.0F / ctx->Visual->DepthMaxF;
+   gl_update_hitflag( ctx, VB->Win.data[v0][2] * zs );
+   gl_update_hitflag( ctx, VB->Win.data[v1][2] * zs );
 }
 
 
 void gl_select_points( GLcontext *ctx, GLuint first, GLuint last )
 {
    struct vertex_buffer *VB = ctx->VB;
+   const GLfloat zs = 1.0F / ctx->Visual->DepthMaxF;
    GLuint i;
 
    for (i=first;i<=last;i++) {
       if (VB->ClipMask[i]==0) {
-         gl_update_hitflag( ctx, VB->Win.data[i][2] / DEPTH_SCALE);
+         gl_update_hitflag( ctx, VB->Win.data[i][2] * zs );
       }
    }
 }