Add EXT_vertex_cull support to mesa
[mesa.git] / src / mesa / math / m_xform.h
index d8b019cc54824f95bded7d6c3226b9ae42c6b7b8..63f1062fc85a69e95e383d1d27812eaf208a5878 100644 (file)
@@ -1,21 +1,19 @@
-/* $Id: m_xform.h,v 1.7 2001/03/03 20:57:00 brianp Exp $ */
-
 /*
  * Mesa 3-D graphics library
- * Version:  3.3
- * 
- * Copyright (C) 1999  Brian Paul   All Rights Reserved.
- * 
+ * Version:  6.1
+ *
+ * Copyright (C) 1999-2004  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
@@ -25,9 +23,6 @@
  */
 
 
-
-
-
 #ifndef _M_XFORM_H
 #define _M_XFORM_H
 
 #define _XFORMAPIP *
 #endif
 
-/*
- * Transform a point (column vector) by a matrix:   Q = M * P
- */
-#define TRANSFORM_POINT( Q, M, P )                                     \
-   Q[0] = M[0] * P[0] + M[4] * P[1] + M[8] *  P[2] + M[12] * P[3];     \
-   Q[1] = M[1] * P[0] + M[5] * P[1] + M[9] *  P[2] + M[13] * P[3];     \
-   Q[2] = M[2] * P[0] + M[6] * P[1] + M[10] * P[2] + M[14] * P[3];     \
-   Q[3] = M[3] * P[0] + M[7] * P[1] + M[11] * P[2] + M[15] * P[3];
-
-
-#define TRANSFORM_POINT3( Q, M, P )                            \
-   Q[0] = M[0] * P[0] + M[4] * P[1] + M[8] *  P[2] + M[12];    \
-   Q[1] = M[1] * P[0] + M[5] * P[1] + M[9] *  P[2] + M[13];    \
-   Q[2] = M[2] * P[0] + M[6] * P[1] + M[10] * P[2] + M[14];    \
-   Q[3] = M[3] * P[0] + M[7] * P[1] + M[11] * P[2] + M[15];
 
+extern void
+_mesa_transform_vector(GLfloat u[4], CONST GLfloat v[4], CONST GLfloat m[16]);
 
-/*
- * Transform a normal (row vector) by a matrix:  [NX NY NZ] = N * MAT
- */
-#define TRANSFORM_NORMAL( TO, N, MAT )                         \
-do {                                                           \
-   TO[0] = N[0] * MAT[0] + N[1] * MAT[1] + N[2] * MAT[2];      \
-   TO[1] = N[0] * MAT[4] + N[1] * MAT[5] + N[2] * MAT[6];      \
-   TO[2] = N[0] * MAT[8] + N[1] * MAT[9] + N[2] * MAT[10];     \
-} while (0)
 
-
-extern void _mesa_transform_vector( GLfloat u[4],
-                                CONST GLfloat v[4],
-                                 CONST GLfloat m[16] );
-
-
-extern void 
-_math_init_transformation( void );
+extern void
+_math_init_transformation(void);
 
 
 /* KW: Clip functions now do projective divide as well.  The projected
@@ -94,7 +61,7 @@ _math_init_transformation( void );
  *
  * There are two cases where we wouldn't want to do the divide in cliptest:
  *    - When we aren't clipping.  We still might want to cull backfaces
- *      so the divide should be done elsewhere.  This currently never 
+ *      so the divide should be done elsewhere.  This currently never
  *      happens.
  *
  *    - When culling isn't likely to help us, such as when the GL culling
@@ -105,17 +72,17 @@ _math_init_transformation( void );
  *      application wouldn't turn on culling in such cases.
  *
  * We supply a buffer to hold the [x/w,y/w,z/w,1/w] values which
- * are the result of the projection.  This is only used in the 
+ * are the result of the projection.  This is only used in the
  * 4-vector case - in other cases, we just use the clip coordinates
  * as the projected coordinates - they are identical.
- * 
+ *
  * This is doubly convenient because it means the Win[] array is now
  * of the same stride as all the others, so I can now turn map_vertices
  * into a straight-forward matrix transformation, with asm acceleration
- * automatically available.  
+ * automatically available.
  */
 
-/* Vertex buffer clipping flags 
+/* Vertex buffer clipping flags
  */
 #define CLIP_RIGHT_SHIFT       0
 #define CLIP_LEFT_SHIFT        1
@@ -131,24 +98,23 @@ _math_init_transformation( void );
 #define CLIP_NEAR_BIT    0x10
 #define CLIP_FAR_BIT     0x20
 #define CLIP_USER_BIT    0x40
+#define CLIP_CULL_BIT    0x80
 #define CLIP_ALL_BITS    0x3f
 
 
 typedef GLvector4f * (_XFORMAPIP clip_func)( GLvector4f *vClip,
-                                            GLvector4f *vProj, 
+                                            GLvector4f *vProj,
                                             GLubyte clipMask[],
-                                            GLubyte *orMask, 
+                                            GLubyte *orMask,
                                             GLubyte *andMask );
 
-typedef void (*dotprod_func)( GLfloat *out, 
+typedef void (*dotprod_func)( GLfloat *out,
                              GLuint out_stride,
-                             CONST GLvector4f *coord_vec, 
-                             CONST GLfloat plane[4], 
-                             CONST GLubyte mask[]);
+                             CONST GLvector4f *coord_vec,
+                             CONST GLfloat plane[4] );
 
-typedef void (*vec_copy_func)( GLvector4f *to, 
-                              CONST GLvector4f *from, 
-                              CONST GLubyte mask[]);
+typedef void (*vec_copy_func)( GLvector4f *to,
+                              CONST GLvector4f *from );
 
 
 
@@ -157,17 +123,16 @@ typedef void (*vec_copy_func)( GLvector4f *to,
  */
 typedef void (_NORMAPIP normal_func)( CONST GLmatrix *mat,
                                      GLfloat scale,
-                                     CONST GLvector3f *in,
+                                     CONST GLvector4f *in,
                                      CONST GLfloat lengths[],
-                                     CONST GLubyte mask[],
-                                     GLvector3f *dest );
+                                     GLvector4f *dest );
 
 
-/* Flags for selecting a normal transformation function. 
+/* Flags for selecting a normal transformation function.
  */
-#define NORM_RESCALE   0x1     /* apply the scale factor */
-#define NORM_NORMALIZE 0x2     /* normalize */
-#define NORM_TRANSFORM 0x4     /* apply the transformation matrix */
+#define NORM_RESCALE   0x1             /* apply the scale factor */
+#define NORM_NORMALIZE 0x2             /* normalize */
+#define NORM_TRANSFORM 0x4             /* apply the transformation matrix */
 #define NORM_TRANSFORM_NO_ROT 0x8      /* apply the transformation matrix */
 
 
@@ -176,47 +141,45 @@ typedef void (_NORMAPIP normal_func)( CONST GLmatrix *mat,
 /* KW: New versions of the transform function allow a mask array
  *     specifying that individual vector transform should be skipped
  *     when the mask byte is zero.  This is always present as a
- *     parameter, to allow a unified interface.  
+ *     parameter, to allow a unified interface.
  */
 typedef void (_XFORMAPIP transform_func)( GLvector4f *to_vec,
                                          CONST GLfloat m[16],
-                                         CONST GLvector4f *from_vec, 
-                                         CONST GLubyte *clipmask,
-                                         CONST GLubyte flag );
+                                         CONST GLvector4f *from_vec );
 
 
 extern GLvector4f *_mesa_project_points( GLvector4f *to,
-                                     CONST GLvector4f *from );
+                                        CONST GLvector4f *from );
 
 extern void _mesa_transform_bounds3( GLubyte *orMask, GLubyte *andMask,
-                                 CONST GLfloat m[16],
-                                 CONST GLfloat src[][3] );
+                                    CONST GLfloat m[16],
+                                    CONST GLfloat src[][3] );
 
 extern void _mesa_transform_bounds2( GLubyte *orMask, GLubyte *andMask,
-                                 CONST GLfloat m[16],
-                                 CONST GLfloat src[][3] );
+                                    CONST GLfloat m[16],
+                                    CONST GLfloat src[][3] );
 
 
-extern dotprod_func  _mesa_dotprod_tab[2][5];
-extern vec_copy_func _mesa_copy_tab[2][0x10];
-extern vec_copy_func _mesa_copy_clean_tab[2][5];
+extern dotprod_func  _mesa_dotprod_tab[5];
+extern vec_copy_func _mesa_copy_tab[0x10];
+extern vec_copy_func _mesa_copy_clean_tab[5];
 extern clip_func     _mesa_clip_tab[5];
 extern clip_func     _mesa_clip_np_tab[5];
-extern normal_func   _mesa_normal_tab[0xf][0x4];
+extern normal_func   _mesa_normal_tab[0xf];
 
-/* Use of 3 layers of linked 1-dimensional arrays to reduce
+/* Use of 2 layers of linked 1-dimensional arrays to reduce
  * cost of lookup.
  */
-extern transform_func **(_mesa_transform_tab[2]);
+extern transform_func *_mesa_transform_tab[5];
 
 
 extern void _mesa_transform_point_sz( GLfloat Q[4], CONST GLfloat M[16],
-                                  CONST GLfloat P[4], GLuint sz );
+                                     CONST GLfloat P[4], GLuint sz );
 
 
 #define TransformRaw( to, mat, from ) \
-      ( (*_mesa_transform_tab[0][(from)->size][(mat)->type])( to, (mat)->m, from, 0, 0 ), \
-        (to) )
+   ( _mesa_transform_tab[(from)->size][(mat)->type]( to, (mat)->m, from ), \
+     (to) )
 
 
 #endif