summaryrefslogtreecommitdiff
path: root/src/mesa/swrast/s_feedback.c
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2000-11-05 18:24:40 +0000
committerKeith Whitwell <keith@tungstengraphics.com>2000-11-05 18:24:40 +0000
commitcd03ed4f54444d96e4e47cdb118a3dfd94d92bb0 (patch)
tree57d9620635286b4ee4b8adf950014113d5961017 /src/mesa/swrast/s_feedback.c
parent7c20642b1091df1aab7d9076a3fe2fb11c6f011c (diff)
Reorganized software rasterizer as a module which manages its own state,
with tighter interfaces with the rest of the world. Proper documentation to come.
Diffstat (limited to 'src/mesa/swrast/s_feedback.c')
-rw-r--r--src/mesa/swrast/s_feedback.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/mesa/swrast/s_feedback.c b/src/mesa/swrast/s_feedback.c
new file mode 100644
index 0000000000..501f3721c6
--- /dev/null
+++ b/src/mesa/swrast/s_feedback.c
@@ -0,0 +1,153 @@
+/* $Id: s_feedback.c,v 1.1 2000/11/05 18:24:40 keithw Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.3
+ *
+ * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "glheader.h"
+#include "colormac.h"
+#include "context.h"
+#include "enums.h"
+#include "feedback.h"
+#include "macros.h"
+#include "mmath.h"
+
+#include "s_context.h"
+#include "s_feedback.h"
+#include "s_triangle.h"
+
+
+#define FB_3D 0x01
+#define FB_4D 0x02
+#define FB_INDEX 0x04
+#define FB_COLOR 0x08
+#define FB_TEXTURE 0X10
+
+
+
+
+static void feedback_vertex( GLcontext *ctx, SWvertex *v )
+{
+ GLfloat win[4];
+ GLfloat color[4];
+ GLfloat tc[4];
+ GLuint texUnit = ctx->Texture.CurrentTransformUnit;
+ GLuint index;
+
+ win[0] = v->win[0];
+ win[1] = v->win[1];
+ win[2] = v->win[2] / ctx->Visual.DepthMaxF;
+ win[3] = 1.0 / v->win[3];
+
+ color[0] = CHAN_TO_FLOAT(v->color[0]);
+ color[1] = CHAN_TO_FLOAT(v->color[1]);
+ color[2] = CHAN_TO_FLOAT(v->color[2]);
+ color[3] = CHAN_TO_FLOAT(v->color[3]);
+
+ if (v->texcoord[texUnit][3] != 1.0 &&
+ v->texcoord[texUnit][3] != 0.0) {
+ GLfloat invq = 1.0F / v->texcoord[texUnit][3];
+ tc[0] = v->texcoord[texUnit][0] * invq;
+ tc[1] = v->texcoord[texUnit][1] * invq;
+ tc[2] = v->texcoord[texUnit][2] * invq;
+ tc[3] = v->texcoord[texUnit][3];
+ }
+ else {
+ COPY_4V(tc, v->texcoord[texUnit]);
+ }
+
+ index = v->index;
+
+ gl_feedback_vertex( ctx, win, color, index, tc );
+}
+
+
+/*
+ * Put triangle in feedback buffer.
+ */
+void gl_feedback_triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1,
+ SWvertex *v2)
+{
+ if (gl_cull_triangle( ctx, v0, v1, v2 )) {
+ FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_POLYGON_TOKEN );
+ FEEDBACK_TOKEN( ctx, (GLfloat) 3 ); /* three vertices */
+
+ feedback_vertex( ctx, v0 );
+ feedback_vertex( ctx, v1 );
+ feedback_vertex( ctx, v2 );
+ }
+}
+
+
+void gl_feedback_line( GLcontext *ctx, SWvertex *v0, SWvertex *v1 )
+{
+ GLenum token = GL_LINE_TOKEN;
+ SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+ if (swrast->StippleCounter==0)
+ token = GL_LINE_RESET_TOKEN;
+
+ FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) token );
+
+ feedback_vertex( ctx, v0 );
+ feedback_vertex( ctx, v1 );
+
+ swrast->StippleCounter++;
+}
+
+
+void gl_feedback_point( GLcontext *ctx, SWvertex *v )
+{
+ FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_POINT_TOKEN );
+ feedback_vertex( ctx, v );
+}
+
+
+void gl_select_triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1,
+ SWvertex *v2)
+{
+ if (gl_cull_triangle( ctx, v0, v1, v2 )) {
+ const GLfloat zs = 1.0F / ctx->Visual.DepthMaxF;
+ gl_update_hitflag( ctx, v0->win[2] * zs );
+ gl_update_hitflag( ctx, v1->win[2] * zs );
+ gl_update_hitflag( ctx, v2->win[2] * zs );
+ }
+}
+
+
+void gl_select_line( GLcontext *ctx, SWvertex *v0, SWvertex *v1 )
+{
+ const GLfloat zs = 1.0F / ctx->Visual.DepthMaxF;
+ gl_update_hitflag( ctx, v0->win[2] * zs );
+ gl_update_hitflag( ctx, v1->win[2] * zs );
+}
+
+
+void gl_select_point( GLcontext *ctx, SWvertex *v )
+{
+ const GLfloat zs = 1.0F / ctx->Visual.DepthMaxF;
+ gl_update_hitflag( ctx, v->win[2] * zs );
+}
+
+
+