From 049e320f46f3a3daaa36ef67cc680dc504c124d5 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 30 Jun 2005 14:22:23 +0000 Subject: Add a set of predicate functions for testing matrices instead of directly testing the flags field. Move definition of all the MAT_FLAGs into the m_matrix.c file since they're now private. --- src/mesa/main/attrib.c | 6 +- src/mesa/main/clip.c | 9 ++- src/mesa/main/enable.c | 2 +- src/mesa/main/light.c | 14 ++--- src/mesa/main/matrix.c | 53 +++++++---------- src/mesa/main/texstate.c | 10 ++-- src/mesa/math/m_matrix.c | 134 +++++++++++++++++++++++++++++++++++++++++++ src/mesa/math/m_matrix.h | 90 ++++++----------------------- src/mesa/shader/nvvertexec.c | 6 +- src/mesa/tnl/t_vb_normals.c | 7 +-- 10 files changed, 195 insertions(+), 136 deletions(-) diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index 21e22ccedd..28456942cb 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -2,7 +2,7 @@ * Mesa 3-D graphics library * Version: 6.3 * - * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2005 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"), @@ -945,7 +945,7 @@ _mesa_PopAttrib(void) /* lighting enable */ _mesa_set_enable(ctx, GL_LIGHTING, light->Enabled); /* per-light state */ - if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) + if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); for (i = 0; i < MAX_LIGHTS; i++) { @@ -1106,7 +1106,7 @@ _mesa_PopAttrib(void) const struct gl_transform_attrib *xform; xform = (const struct gl_transform_attrib *) attr->data; _mesa_MatrixMode(xform->MatrixMode); - if (ctx->ProjectionMatrixStack.Top->flags & MAT_DIRTY) + if (_math_matrix_is_dirty(ctx->ProjectionMatrixStack.Top)) _math_matrix_analyse( ctx->ProjectionMatrixStack.Top ); /* restore clip planes */ diff --git a/src/mesa/main/clip.c b/src/mesa/main/clip.c index a1eda32ebf..43ef55ee3b 100644 --- a/src/mesa/main/clip.c +++ b/src/mesa/main/clip.c @@ -1,9 +1,8 @@ - /* * Mesa 3-D graphics library - * Version: 5.1 + * Version: 6.3 * - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2005 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"), @@ -68,7 +67,7 @@ _mesa_ClipPlane( GLenum plane, const GLdouble *eq ) * clipping now takes place. The clip-space equations are recalculated * whenever the projection matrix changes. */ - if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY) + if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); _mesa_transform_vector( equation, equation, @@ -85,7 +84,7 @@ _mesa_ClipPlane( GLenum plane, const GLdouble *eq ) * code in _mesa_update_state(). */ if (ctx->Transform.ClipPlanesEnabled & (1 << p)) { - if (ctx->ProjectionMatrixStack.Top->flags & MAT_DIRTY) + if (_math_matrix_is_dirty(ctx->ProjectionMatrixStack.Top)) _math_matrix_analyse( ctx->ProjectionMatrixStack.Top ); _mesa_transform_vector( ctx->Transform._ClipUserPlane[p], diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c index 671db68ce8..67fd083ca8 100644 --- a/src/mesa/main/enable.c +++ b/src/mesa/main/enable.c @@ -257,7 +257,7 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state ) if (state) { ctx->Transform.ClipPlanesEnabled |= (1 << p); - if (ctx->ProjectionMatrixStack.Top->flags & MAT_DIRTY) + if (_math_matrix_is_dirty(ctx->ProjectionMatrixStack.Top)) _math_matrix_analyse( ctx->ProjectionMatrixStack.Top ); /* This derived state also calculated in clip.c and diff --git a/src/mesa/main/light.c b/src/mesa/main/light.c index 4c39d2ff4c..98934f3982 100644 --- a/src/mesa/main/light.c +++ b/src/mesa/main/light.c @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.1 + * Version: 6.3 * - * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2005 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"), @@ -114,7 +114,7 @@ _mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params ) case GL_SPOT_DIRECTION: { GLfloat tmp[4]; /* transform direction by inverse modelview */ - if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) { + if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) { _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); } TRANSFORM_NORMAL( tmp, params, ctx->ModelviewMatrixStack.Top->inv ); @@ -1107,10 +1107,7 @@ static void update_modelview_scale( GLcontext *ctx ) { ctx->_ModelViewInvScale = 1.0F; - if (ctx->ModelviewMatrixStack.Top->flags & (MAT_FLAG_UNIFORM_SCALE | - MAT_FLAG_GENERAL_SCALE | - MAT_FLAG_GENERAL_3D | - MAT_FLAG_GENERAL) ) { + if (!_math_matrix_is_length_preserving(ctx->ModelviewMatrixStack.Top)) { const GLfloat *m = ctx->ModelviewMatrixStack.Top->inv; GLfloat f = m[2] * m[2] + m[6] * m[6] + m[10] * m[10]; if (f < 1e-12) f = 1.0; @@ -1139,8 +1136,7 @@ _mesa_update_tnl_spaces( GLcontext *ctx, GLuint new_state ) ctx->_NeedEyeCoords = 1; if (ctx->Light.Enabled && - !TEST_MAT_FLAGS( ctx->ModelviewMatrixStack.Top, - MAT_FLAGS_LENGTH_PRESERVING)) + !_math_matrix_is_length_preserving(ctx->ModelviewMatrixStack.Top)) ctx->_NeedEyeCoords = 1; diff --git a/src/mesa/main/matrix.c b/src/mesa/main/matrix.c index 2f0a1fa8c6..f4ec973563 100644 --- a/src/mesa/main/matrix.c +++ b/src/mesa/main/matrix.c @@ -1,13 +1,3 @@ -/** - * \file matrix.c - * Matrix operations. - * - * \note - * -# 4x4 transformation matrices are stored in memory in column major order. - * -# Points/vertices are to be thought of as column vectors. - * -# Transformation of a point p by a matrix M is: p' = M * p - */ - /* * Mesa 3-D graphics library * Version: 6.3 @@ -33,6 +23,17 @@ */ +/** + * \file matrix.c + * Matrix operations. + * + * \note + * -# 4x4 transformation matrices are stored in memory in column major order. + * -# Points/vertices are to be thought of as column vectors. + * -# Transformation of a point p by a matrix M is: p' = M * p + */ + + #include "glheader.h" #include "imports.h" #include "context.h" @@ -601,18 +602,13 @@ _mesa_set_viewport( GLcontext *ctx, GLint x, GLint y, tmps = width; width = height; height = tmps; } - /* compute scale and bias values :: This is really driver-specific - * and should be maintained elsewhere if at all. NOTE: RasterPos - * uses this. + /* Compute scale and bias values. This is really driver-specific + * and should be maintained elsewhere if at all. + * NOTE: RasterPos uses this. */ - ctx->Viewport._WindowMap.m[MAT_SX] = (GLfloat) width / 2.0F; - ctx->Viewport._WindowMap.m[MAT_TX] = ctx->Viewport._WindowMap.m[MAT_SX] + x; - ctx->Viewport._WindowMap.m[MAT_SY] = (GLfloat) height / 2.0F; - ctx->Viewport._WindowMap.m[MAT_TY] = ctx->Viewport._WindowMap.m[MAT_SY] + y; - ctx->Viewport._WindowMap.m[MAT_SZ] = depthMax * ((f - n) / 2.0F); - ctx->Viewport._WindowMap.m[MAT_TZ] = depthMax * ((f - n) / 2.0F + n); - ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION; - ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT; + _math_matrix_viewport(&ctx->Viewport._WindowMap, x, y, width, height, + n, f, depthMax); + ctx->NewState |= _NEW_VIEWPORT; if (ctx->Driver.Viewport) { @@ -916,6 +912,8 @@ void _mesa_init_transform( GLcontext *ctx ) */ void _mesa_init_viewport( GLcontext *ctx ) { + GLfloat depthMax = 65535.0F; /* sorf of arbitrary */ + /* Viewport group */ ctx->Viewport.X = 0; ctx->Viewport.Y = 0; @@ -925,17 +923,8 @@ void _mesa_init_viewport( GLcontext *ctx ) ctx->Viewport.Far = 1.0; _math_matrix_ctr(&ctx->Viewport._WindowMap); -#if 0000 -#define Sz 10 -#define Tz 14 - ctx->Viewport._WindowMap.m[Sz] = 0.5F * ctx->DepthMaxF; - ctx->Viewport._WindowMap.m[Tz] = 0.5F * ctx->DepthMaxF; -#undef Sz -#undef Tz -#endif - - ctx->Viewport._WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION; - ctx->Viewport._WindowMap.type = MATRIX_3D_NO_ROT; + _math_matrix_viewport(&ctx->Viewport._WindowMap, 0, 0, 0, 0, + 0.0F, 1.0F, depthMax); } diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index 914518e416..92bd843b20 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -2176,7 +2176,7 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) GLfloat tmp[4]; /* Transform plane equation by the inverse modelview matrix */ - if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) { + if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) { _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); } _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv ); @@ -2232,7 +2232,7 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) else if (pname==GL_EYE_PLANE) { GLfloat tmp[4]; /* Transform plane equation by the inverse modelview matrix */ - if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) { + if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) { _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); } _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv ); @@ -2285,7 +2285,7 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) else if (pname==GL_EYE_PLANE) { GLfloat tmp[4]; /* Transform plane equation by the inverse modelview matrix */ - if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) { + if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) { _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); } _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv ); @@ -2332,7 +2332,7 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) else if (pname==GL_EYE_PLANE) { GLfloat tmp[4]; /* Transform plane equation by the inverse modelview matrix */ - if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) { + if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) { _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); } _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv ); @@ -2874,7 +2874,7 @@ update_texture_matrices( GLcontext *ctx ) ctx->Texture._TexMatEnabled = 0; for (i=0; i < ctx->Const.MaxTextureUnits; i++) { - if (ctx->TextureMatrixStack[i].Top->flags & MAT_DIRTY) { + if (_math_matrix_is_dirty(ctx->TextureMatrixStack[i].Top)) { _math_matrix_analyse( ctx->TextureMatrixStack[i].Top ); if (ctx->Texture.Unit[i]._ReallyEnabled && diff --git a/src/mesa/math/m_matrix.c b/src/mesa/math/m_matrix.c index 1f10800e17..408db9b963 100644 --- a/src/mesa/math/m_matrix.c +++ b/src/mesa/math/m_matrix.c @@ -42,6 +42,79 @@ #include "m_matrix.h" +/** + * \defgroup MatFlags MAT_FLAG_XXX-flags + * + * Bitmasks to indicate different kinds of 4x4 matrices in GLmatrix::flags + * It would be nice to make all these flags private to m_matrix.c + */ +/*@{*/ +#define MAT_FLAG_IDENTITY 0 /**< is an identity matrix flag. + * (Not actually used - the identity + * matrix is identified by the absense + * of all other flags.) + */ +#define MAT_FLAG_GENERAL 0x1 /**< is a general matrix flag */ +#define MAT_FLAG_ROTATION 0x2 /**< is a rotation matrix flag */ +#define MAT_FLAG_TRANSLATION 0x4 /**< is a translation matrix flag */ +#define MAT_FLAG_UNIFORM_SCALE 0x8 /**< is an uniform scaling matrix flag */ +#define MAT_FLAG_GENERAL_SCALE 0x10 /**< is a general scaling matrix flag */ +#define MAT_FLAG_GENERAL_3D 0x20 /**< general 3D matrix flag */ +#define MAT_FLAG_PERSPECTIVE 0x40 /**< is a perspective proj matrix flag */ +#define MAT_FLAG_SINGULAR 0x80 /**< is a singular matrix flag */ +#define MAT_DIRTY_TYPE 0x100 /**< matrix type is dirty */ +#define MAT_DIRTY_FLAGS 0x200 /**< matrix flags are dirty */ +#define MAT_DIRTY_INVERSE 0x400 /**< matrix inverse is dirty */ + +/** angle preserving matrix flags mask */ +#define MAT_FLAGS_ANGLE_PRESERVING (MAT_FLAG_ROTATION | \ + MAT_FLAG_TRANSLATION | \ + MAT_FLAG_UNIFORM_SCALE) + +/** geometry related matrix flags mask */ +#define MAT_FLAGS_GEOMETRY (MAT_FLAG_GENERAL | \ + MAT_FLAG_ROTATION | \ + MAT_FLAG_TRANSLATION | \ + MAT_FLAG_UNIFORM_SCALE | \ + MAT_FLAG_GENERAL_SCALE | \ + MAT_FLAG_GENERAL_3D | \ + MAT_FLAG_PERSPECTIVE | \ + MAT_FLAG_SINGULAR) + +/** length preserving matrix flags mask */ +#define MAT_FLAGS_LENGTH_PRESERVING (MAT_FLAG_ROTATION | \ + MAT_FLAG_TRANSLATION) + + +/** 3D (non-perspective) matrix flags mask */ +#define MAT_FLAGS_3D (MAT_FLAG_ROTATION | \ + MAT_FLAG_TRANSLATION | \ + MAT_FLAG_UNIFORM_SCALE | \ + MAT_FLAG_GENERAL_SCALE | \ + MAT_FLAG_GENERAL_3D) + +/** dirty matrix flags mask */ +#define MAT_DIRTY (MAT_DIRTY_TYPE | \ + MAT_DIRTY_FLAGS | \ + MAT_DIRTY_INVERSE) + +/*@}*/ + + +/** + * Test geometry related matrix flags. + * + * \param mat a pointer to a GLmatrix structure. + * \param a flags mask. + * + * \returns non-zero if all geometry related matrix flags are contained within + * the mask, or zero otherwise. + */ +#define TEST_MAT_FLAGS(mat, a) \ + ((MAT_FLAGS_GEOMETRY & (~(a)) & ((mat)->flags) ) == 0) + + + /** * Names of the corresponding GLmatrixtype values. */ @@ -1037,6 +1110,26 @@ _math_matrix_translate( GLmatrix *mat, GLfloat x, GLfloat y, GLfloat z ) MAT_DIRTY_INVERSE); } + +/** + * Set matrix to do viewport and depthrange mapping. + * Transforms Normalized Device Coords to window/Z values. + */ +void +_math_matrix_viewport(GLmatrix *m, GLint x, GLint y, GLint width, GLint height, + GLfloat zNear, GLfloat zFar, GLfloat depthMax) +{ + m->m[MAT_SX] = (GLfloat) width / 2.0F; + m->m[MAT_TX] = m->m[MAT_SX] + x; + m->m[MAT_SY] = (GLfloat) height / 2.0F; + m->m[MAT_TY] = m->m[MAT_SY] + y; + m->m[MAT_SZ] = depthMax * ((zFar - zNear) / 2.0F); + m->m[MAT_TZ] = depthMax * ((zFar - zNear) / 2.0F + zNear); + m->flags = MAT_FLAG_GENERAL_SCALE | MAT_FLAG_TRANSLATION; + m->type = MATRIX_3D_NO_ROT; +} + + /** * Set a matrix to the identity matrix. * @@ -1296,6 +1389,47 @@ _math_matrix_analyse( GLmatrix *mat ) /*@}*/ +/** + * Test if the given matrix preserves vector lengths. + */ +GLboolean +_math_matrix_is_length_preserving( const GLmatrix *m ) +{ + return TEST_MAT_FLAGS( m, MAT_FLAGS_LENGTH_PRESERVING); +} + + +/** + * Test if the given matrix does any rotation. + * (or perhaps if the upper-left 3x3 is non-identity) + */ +GLboolean +_math_matrix_has_rotation( const GLmatrix *m ) +{ + if (m->flags & (MAT_FLAG_GENERAL | + MAT_FLAG_ROTATION | + MAT_FLAG_GENERAL_3D | + MAT_FLAG_PERSPECTIVE)) + return GL_TRUE; + else + return GL_FALSE; +} + + +GLboolean +_math_matrix_is_general_scale( const GLmatrix *m ) +{ + return (m->flags & MAT_FLAG_GENERAL_SCALE) ? GL_TRUE : GL_FALSE; +} + + +GLboolean +_math_matrix_is_dirty( const GLmatrix *m ) +{ + return (m->flags & MAT_DIRTY) ? GL_TRUE : GL_FALSE; +} + + /**********************************************************************/ /** \name Matrix setup */ /*@{*/ diff --git a/src/mesa/math/m_matrix.h b/src/mesa/math/m_matrix.h index 04a5a3c2bc..e8303f3ac5 100644 --- a/src/mesa/math/m_matrix.h +++ b/src/mesa/math/m_matrix.h @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.2 + * Version: 6.3 * - * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2005 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"), @@ -48,77 +48,6 @@ /*@}*/ -/** - * \defgroup MatFlags MAT_FLAG_XXX-flags - * - * Bitmasks to indicate different kinds of 4x4 matrices in GLmatrix::flags - * It would be nice to make all these flags private to m_matrix.c - */ -/*@{*/ -#define MAT_FLAG_IDENTITY 0 /**< is an identity matrix flag. - * (Not actually used - the identity - * matrix is identified by the absense - * of all other flags.) - */ -#define MAT_FLAG_GENERAL 0x1 /**< is a general matrix flag */ -#define MAT_FLAG_ROTATION 0x2 /**< is a rotation matrix flag */ -#define MAT_FLAG_TRANSLATION 0x4 /**< is a translation matrix flag */ -#define MAT_FLAG_UNIFORM_SCALE 0x8 /**< is an uniform scaling matrix flag */ -#define MAT_FLAG_GENERAL_SCALE 0x10 /**< is a general scaling matrix flag */ -#define MAT_FLAG_GENERAL_3D 0x20 /**< general 3D matrix flag */ -#define MAT_FLAG_PERSPECTIVE 0x40 /**< is a perspective proj matrix flag */ -#define MAT_FLAG_SINGULAR 0x80 /**< is a singular matrix flag */ -#define MAT_DIRTY_TYPE 0x100 /**< matrix type is dirty */ -#define MAT_DIRTY_FLAGS 0x200 /**< matrix flags are dirty */ -#define MAT_DIRTY_INVERSE 0x400 /**< matrix inverse is dirty */ - -/** angle preserving matrix flags mask */ -#define MAT_FLAGS_ANGLE_PRESERVING (MAT_FLAG_ROTATION | \ - MAT_FLAG_TRANSLATION | \ - MAT_FLAG_UNIFORM_SCALE) - -/** length preserving matrix flags mask */ -#define MAT_FLAGS_LENGTH_PRESERVING (MAT_FLAG_ROTATION | \ - MAT_FLAG_TRANSLATION) - -/** 3D (non-perspective) matrix flags mask */ -#define MAT_FLAGS_3D (MAT_FLAG_ROTATION | \ - MAT_FLAG_TRANSLATION | \ - MAT_FLAG_UNIFORM_SCALE | \ - MAT_FLAG_GENERAL_SCALE | \ - MAT_FLAG_GENERAL_3D) - -/** geometry related matrix flags mask */ -#define MAT_FLAGS_GEOMETRY (MAT_FLAG_GENERAL | \ - MAT_FLAG_ROTATION | \ - MAT_FLAG_TRANSLATION | \ - MAT_FLAG_UNIFORM_SCALE | \ - MAT_FLAG_GENERAL_SCALE | \ - MAT_FLAG_GENERAL_3D | \ - MAT_FLAG_PERSPECTIVE | \ - MAT_FLAG_SINGULAR) - -/** dirty matrix flags mask */ -#define MAT_DIRTY (MAT_DIRTY_TYPE | \ - MAT_DIRTY_FLAGS | \ - MAT_DIRTY_INVERSE) - -/*@}*/ - - -/** - * Test geometry related matrix flags. - * - * \param mat a pointer to a GLmatrix structure. - * \param a flags mask. - * - * \returns non-zero if all geometry related matrix flags are contained within - * the mask, or zero otherwise. - */ -#define TEST_MAT_FLAGS(mat, a) \ - ((MAT_FLAGS_GEOMETRY & (~(a)) & ((mat)->flags) ) == 0) - - /** * Different kinds of 4x4 transformation matrices. * We use these to select specific optimized vertex transformation routines. @@ -188,6 +117,10 @@ _math_matrix_frustum( GLmatrix *mat, GLfloat bottom, GLfloat top, GLfloat nearval, GLfloat farval ); +extern void +_math_matrix_viewport(GLmatrix *m, GLint x, GLint y, GLint width, GLint height, + GLfloat zNear, GLfloat zFar, GLfloat depthMax); + extern void _math_matrix_set_identity( GLmatrix *dest ); @@ -200,6 +133,17 @@ _math_matrix_analyse( GLmatrix *mat ); extern void _math_matrix_print( const GLmatrix *m ); +extern GLboolean +_math_matrix_is_length_preserving( const GLmatrix *m ); + +extern GLboolean +_math_matrix_has_rotation( const GLmatrix *m ); + +extern GLboolean +_math_matrix_is_general_scale( const GLmatrix *m ); + +extern GLboolean +_math_matrix_is_dirty( const GLmatrix *m ); /** diff --git a/src/mesa/shader/nvvertexec.c b/src/mesa/shader/nvvertexec.c index 679400c13e..c294bca5c2 100644 --- a/src/mesa/shader/nvvertexec.c +++ b/src/mesa/shader/nvvertexec.c @@ -2,7 +2,7 @@ * Mesa 3-D graphics library * Version: 6.3 * - * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2005 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"), @@ -145,7 +145,7 @@ _mesa_init_vp_per_primitive_registers(GLcontext *ctx) } else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) { _math_matrix_analyse(mat); /* update the inverse */ - assert((mat->flags & MAT_DIRTY_INVERSE) == 0); + ASSERT(!math_matrix_is_dirty(mat)); load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv); } else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) { @@ -155,7 +155,7 @@ _mesa_init_vp_per_primitive_registers(GLcontext *ctx) assert(ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_TRANSPOSE_NV); _math_matrix_analyse(mat); /* update the inverse */ - assert((mat->flags & MAT_DIRTY_INVERSE) == 0); + ASSERT(!math_matrix_is_dirty(mat)); load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv); } } diff --git a/src/mesa/tnl/t_vb_normals.c b/src/mesa/tnl/t_vb_normals.c index 9bc6ab4996..7ac33f8bec 100644 --- a/src/mesa/tnl/t_vb_normals.c +++ b/src/mesa/tnl/t_vb_normals.c @@ -60,7 +60,7 @@ run_normal_stage(GLcontext *ctx, struct tnl_pipeline_stage *stage) /* We can only use the display list's saved normal lengths if we've * got a transformation matrix with uniform scaling. */ - if (ctx->ModelviewMatrixStack.Top->flags & MAT_FLAG_GENERAL_SCALE) + if (_math_matrix_is_general_scale(ctx->ModelviewMatrixStack.Top)) lengths = NULL; else lengths = VB->NormalLengthPtr; @@ -108,10 +108,7 @@ validate_normal_stage(GLcontext *ctx, struct tnl_pipeline_stage *stage) */ GLuint transform = NORM_TRANSFORM_NO_ROT; - if (ctx->ModelviewMatrixStack.Top->flags & (MAT_FLAG_GENERAL | - MAT_FLAG_ROTATION | - MAT_FLAG_GENERAL_3D | - MAT_FLAG_PERSPECTIVE)) { + if (_math_matrix_has_rotation(ctx->ModelviewMatrixStack.Top)) { /* need to do full (3x3) matrix transform */ transform = NORM_TRANSFORM; } -- cgit v1.2.3