texgen.c revision 10db6c2d81506bb8cc5165d07b01e93d3830978d
110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul/*
210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * Mesa 3-D graphics library
310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * Version:  7.1
410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul *
510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul *
710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * copy of this software and associated documentation files (the "Software"),
910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * to deal in the Software without restriction, including without limitation
1010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * and/or sell copies of the Software, and to permit persons to whom the
1210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * Software is furnished to do so, subject to the following conditions:
1310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul *
1410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * The above copyright notice and this permission notice shall be included
1510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * in all copies or substantial portions of the Software.
1610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul *
1710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
2010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul */
2410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
2510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul/**
2610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * \file texgen.c
2710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul *
2810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul * glTexGen-related functions
2910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul */
3010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
3110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
3210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul#include "main/glheader.h"
3310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul#include "main/context.h"
3410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul#include "main/enums.h"
3510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul#include "main/macros.h"
3610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul#include "main/texgen.h"
3710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul#include "math/m_xform.h"
3810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
3910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
4010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul#define ENUM_TO_FLOAT(X) ((GLfloat)(GLint)(X))
4110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul#define ENUM_TO_DOUBLE(X) ((GLdouble)(GLint)(X))
4210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
4310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
4410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
4510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paulvoid GLAPIENTRY
4610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul_mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
4710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul{
4810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   GET_CURRENT_CONTEXT(ctx);
4910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   struct gl_texture_unit *texUnit;
5010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
5110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
5210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
5310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      _mesa_debug(ctx, "glTexGen %s %s %.1f(%s)...\n",
5410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  _mesa_lookup_enum_by_nr(coord),
5510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  _mesa_lookup_enum_by_nr(pname),
5610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  *params,
5710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul		  _mesa_lookup_enum_by_nr((GLenum) (GLint) *params));
5810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
5910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
6010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexGen(current unit)");
6110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      return;
6210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
6310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
6410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
6510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
6610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   switch (coord) {
6710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_S:
6810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
6910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLenum mode = (GLenum) (GLint) *params;
7010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLbitfield bits;
7110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    switch (mode) {
7210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_OBJECT_LINEAR:
7310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bits = TEXGEN_OBJ_LINEAR;
7410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
7510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_EYE_LINEAR:
7610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bits = TEXGEN_EYE_LINEAR;
7710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
7810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_REFLECTION_MAP_NV:
7910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bits = TEXGEN_REFLECTION_MAP_NV;
8010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
8110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_NORMAL_MAP_NV:
8210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bits = TEXGEN_NORMAL_MAP_NV;
8310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
8410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_SPHERE_MAP:
8510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bits = TEXGEN_SPHERE_MAP;
8610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
8710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    default:
8810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
8910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       return;
9010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    }
9110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (texUnit->GenModeS == mode)
9210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       return;
9310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
9410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    texUnit->GenModeS = mode;
9510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    texUnit->_GenBitS = bits;
9610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
9710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
9810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (TEST_EQ_4V(texUnit->ObjectPlaneS, params))
9910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul		return;
10010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
10110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4FV(texUnit->ObjectPlaneS, params);
10210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
10310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
10410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLfloat tmp[4];
10510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            /* Transform plane equation by the inverse modelview matrix */
10610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) {
10710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul               _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
10810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            }
10910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
11010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (TEST_EQ_4V(texUnit->EyePlaneS, tmp))
11110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       return;
11210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
11310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    COPY_4FV(texUnit->EyePlaneS, tmp);
11410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
11510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
11610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
11710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
11810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
11910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
12010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_T:
12110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
12210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLenum mode = (GLenum) (GLint) *params;
12310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLbitfield bitt;
12410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    switch (mode) {
12510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul               case GL_OBJECT_LINEAR:
12610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  bitt = TEXGEN_OBJ_LINEAR;
12710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  break;
12810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul               case GL_EYE_LINEAR:
12910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  bitt = TEXGEN_EYE_LINEAR;
13010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  break;
13110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul               case GL_REFLECTION_MAP_NV:
13210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  bitt = TEXGEN_REFLECTION_MAP_NV;
13310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  break;
13410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul               case GL_NORMAL_MAP_NV:
13510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  bitt = TEXGEN_NORMAL_MAP_NV;
13610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  break;
13710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul               case GL_SPHERE_MAP:
13810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  bitt = TEXGEN_SPHERE_MAP;
13910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  break;
14010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul               default:
14110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
14210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul                  return;
14310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    }
14410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (texUnit->GenModeT == mode)
14510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       return;
14610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
14710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    texUnit->GenModeT = mode;
14810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    texUnit->_GenBitT = bitt;
14910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
15010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
15110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (TEST_EQ_4V(texUnit->ObjectPlaneT, params))
15210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul		return;
15310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
15410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4FV(texUnit->ObjectPlaneT, params);
15510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
15610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
15710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLfloat tmp[4];
15810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            /* Transform plane equation by the inverse modelview matrix */
15910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) {
16010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul               _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
16110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            }
16210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
16310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (TEST_EQ_4V(texUnit->EyePlaneT, tmp))
16410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul		return;
16510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
16610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    COPY_4FV(texUnit->EyePlaneT, tmp);
16710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
16810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
16910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
17010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
17110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
17210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
17310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_R:
17410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
17510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLenum mode = (GLenum) (GLint) *params;
17610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLbitfield bitr;
17710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    switch (mode) {
17810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_OBJECT_LINEAR:
17910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bitr = TEXGEN_OBJ_LINEAR;
18010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
18110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_REFLECTION_MAP_NV:
18210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bitr = TEXGEN_REFLECTION_MAP_NV;
18310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
18410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_NORMAL_MAP_NV:
18510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bitr = TEXGEN_NORMAL_MAP_NV;
18610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
18710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_EYE_LINEAR:
18810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bitr = TEXGEN_EYE_LINEAR;
18910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
19010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    default:
19110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
19210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       return;
19310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    }
19410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (texUnit->GenModeR == mode)
19510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       return;
19610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
19710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    texUnit->GenModeR = mode;
19810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    texUnit->_GenBitR = bitr;
19910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
20010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
20110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (TEST_EQ_4V(texUnit->ObjectPlaneR, params))
20210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul		return;
20310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
20410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    COPY_4FV(texUnit->ObjectPlaneR, params);
20510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
20610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
20710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLfloat tmp[4];
20810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            /* Transform plane equation by the inverse modelview matrix */
20910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) {
21010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul               _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
21110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            }
21210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
21310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (TEST_EQ_4V(texUnit->EyePlaneR, tmp))
21410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       return;
21510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
21610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    COPY_4FV(texUnit->EyePlaneR, tmp);
21710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
21810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
21910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
22010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
22110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
22210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
22310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_Q:
22410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
22510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLenum mode = (GLenum) (GLint) *params;
22610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLbitfield bitq;
22710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    switch (mode) {
22810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_OBJECT_LINEAR:
22910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bitq = TEXGEN_OBJ_LINEAR;
23010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
23110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    case GL_EYE_LINEAR:
23210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       bitq = TEXGEN_EYE_LINEAR;
23310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       break;
23410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    default:
23510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
23610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       return;
23710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    }
23810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (texUnit->GenModeQ == mode)
23910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       return;
24010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
24110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    texUnit->GenModeQ = mode;
24210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    texUnit->_GenBitQ = bitq;
24310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
24410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
24510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (TEST_EQ_4V(texUnit->ObjectPlaneQ, params))
24610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul		return;
24710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
24810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4FV(texUnit->ObjectPlaneQ, params);
24910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
25010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
25110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    GLfloat tmp[4];
25210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            /* Transform plane equation by the inverse modelview matrix */
25310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) {
25410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul               _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
25510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            }
25610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
25710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    if (TEST_EQ_4V(texUnit->EyePlaneQ, tmp))
25810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	       return;
25910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
26010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    COPY_4FV(texUnit->EyePlaneQ, tmp);
26110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
26210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
26310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
26410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
26510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
26610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
26710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      default:
26810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(coord)" );
26910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 return;
27010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
27110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
27210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   if (ctx->Driver.TexGen)
27310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      ctx->Driver.TexGen( ctx, coord, pname, params );
27410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul}
27510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
27610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
27710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paulvoid GLAPIENTRY
27810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul_mesa_TexGeniv(GLenum coord, GLenum pname, const GLint *params )
27910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul{
28010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   GLfloat p[4];
28110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   p[0] = (GLfloat) params[0];
28210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   if (pname == GL_TEXTURE_GEN_MODE) {
28310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      p[1] = p[2] = p[3] = 0.0F;
28410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
28510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   else {
28610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      p[1] = (GLfloat) params[1];
28710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      p[2] = (GLfloat) params[2];
28810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      p[3] = (GLfloat) params[3];
28910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
29010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   _mesa_TexGenfv(coord, pname, p);
29110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul}
29210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
29310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
29410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paulvoid GLAPIENTRY
29510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul_mesa_TexGend(GLenum coord, GLenum pname, GLdouble param )
29610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul{
29710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   GLfloat p = (GLfloat) param;
29810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   _mesa_TexGenfv( coord, pname, &p );
29910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul}
30010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
30110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
30210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paulvoid GLAPIENTRY
30310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul_mesa_TexGendv(GLenum coord, GLenum pname, const GLdouble *params )
30410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul{
30510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   GLfloat p[4];
30610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   p[0] = (GLfloat) params[0];
30710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   if (pname == GL_TEXTURE_GEN_MODE) {
30810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      p[1] = p[2] = p[3] = 0.0F;
30910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
31010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   else {
31110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      p[1] = (GLfloat) params[1];
31210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      p[2] = (GLfloat) params[2];
31310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      p[3] = (GLfloat) params[3];
31410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
31510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   _mesa_TexGenfv( coord, pname, p );
31610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul}
31710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
31810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
31910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paulvoid GLAPIENTRY
32010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul_mesa_TexGenf( GLenum coord, GLenum pname, GLfloat param )
32110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul{
32210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   _mesa_TexGenfv(coord, pname, &param);
32310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul}
32410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
32510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
32610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paulvoid GLAPIENTRY
32710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul_mesa_TexGeni( GLenum coord, GLenum pname, GLint param )
32810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul{
32910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   _mesa_TexGeniv( coord, pname, &param );
33010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul}
33110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
33210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
33310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
33410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paulvoid GLAPIENTRY
33510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul_mesa_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params )
33610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul{
33710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   const struct gl_texture_unit *texUnit;
33810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   GET_CURRENT_CONTEXT(ctx);
33910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
34010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
34110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
34210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexGendv(current unit)");
34310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      return;
34410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
34510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
34610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
34710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
34810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   switch (coord) {
34910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_S:
35010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
35110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = ENUM_TO_DOUBLE(texUnit->GenModeS);
35210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
35310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
35410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->ObjectPlaneS );
35510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
35610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
35710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->EyePlaneS );
35810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
35910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
36010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
36110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
36210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
36310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
36410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_T:
36510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
36610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = ENUM_TO_DOUBLE(texUnit->GenModeT);
36710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
36810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
36910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->ObjectPlaneT );
37010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
37110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
37210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->EyePlaneT );
37310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
37410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
37510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
37610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
37710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
37810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
37910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_R:
38010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
38110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = ENUM_TO_DOUBLE(texUnit->GenModeR);
38210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
38310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
38410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->ObjectPlaneR );
38510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
38610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
38710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->EyePlaneR );
38810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
38910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
39010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
39110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
39210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
39310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
39410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_Q:
39510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
39610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = ENUM_TO_DOUBLE(texUnit->GenModeQ);
39710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
39810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
39910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->ObjectPlaneQ );
40010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
40110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
40210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->EyePlaneQ );
40310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
40410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
40510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
40610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
40710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
40810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
40910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      default:
41010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(coord)" );
41110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 return;
41210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
41310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul}
41410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
41510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
41610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
41710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paulvoid GLAPIENTRY
41810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul_mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params )
41910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul{
42010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   const struct gl_texture_unit *texUnit;
42110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   GET_CURRENT_CONTEXT(ctx);
42210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
42310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
42410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
42510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexGenfv(current unit)");
42610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      return;
42710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
42810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
42910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
43010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
43110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   switch (coord) {
43210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_S:
43310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
43410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = ENUM_TO_FLOAT(texUnit->GenModeS);
43510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
43610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
43710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->ObjectPlaneS );
43810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
43910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
44010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->EyePlaneS );
44110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
44210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
44310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
44410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
44510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
44610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
44710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_T:
44810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
44910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = ENUM_TO_FLOAT(texUnit->GenModeT);
45010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
45110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
45210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->ObjectPlaneT );
45310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
45410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
45510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->EyePlaneT );
45610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
45710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
45810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
45910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
46010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
46110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
46210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_R:
46310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
46410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = ENUM_TO_FLOAT(texUnit->GenModeR);
46510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
46610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
46710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->ObjectPlaneR );
46810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
46910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
47010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->EyePlaneR );
47110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
47210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
47310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
47410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
47510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
47610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
47710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_Q:
47810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
47910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = ENUM_TO_FLOAT(texUnit->GenModeQ);
48010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
48110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
48210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->ObjectPlaneQ );
48310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
48410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
48510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            COPY_4V( params, texUnit->EyePlaneQ );
48610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
48710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
48810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
48910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
49010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
49110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
49210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      default:
49310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(coord)" );
49410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 return;
49510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
49610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul}
49710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
49810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
49910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
50010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paulvoid GLAPIENTRY
50110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul_mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params )
50210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul{
50310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   const struct gl_texture_unit *texUnit;
50410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   GET_CURRENT_CONTEXT(ctx);
50510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
50610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
50710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
50810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexGeniv(current unit)");
50910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      return;
51010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
51110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
51210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
51310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
51410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   switch (coord) {
51510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_S:
51610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
51710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = texUnit->GenModeS;
51810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
51910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
52010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = (GLint) texUnit->ObjectPlaneS[0];
52110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[1] = (GLint) texUnit->ObjectPlaneS[1];
52210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[2] = (GLint) texUnit->ObjectPlaneS[2];
52310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[3] = (GLint) texUnit->ObjectPlaneS[3];
52410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
52510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
52610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = (GLint) texUnit->EyePlaneS[0];
52710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[1] = (GLint) texUnit->EyePlaneS[1];
52810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[2] = (GLint) texUnit->EyePlaneS[2];
52910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[3] = (GLint) texUnit->EyePlaneS[3];
53010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
53110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
53210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
53310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
53410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
53510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
53610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_T:
53710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
53810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = texUnit->GenModeT;
53910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
54010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
54110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = (GLint) texUnit->ObjectPlaneT[0];
54210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[1] = (GLint) texUnit->ObjectPlaneT[1];
54310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[2] = (GLint) texUnit->ObjectPlaneT[2];
54410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[3] = (GLint) texUnit->ObjectPlaneT[3];
54510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
54610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
54710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = (GLint) texUnit->EyePlaneT[0];
54810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[1] = (GLint) texUnit->EyePlaneT[1];
54910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[2] = (GLint) texUnit->EyePlaneT[2];
55010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[3] = (GLint) texUnit->EyePlaneT[3];
55110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
55210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
55310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
55410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
55510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
55610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
55710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_R:
55810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
55910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = texUnit->GenModeR;
56010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
56110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
56210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = (GLint) texUnit->ObjectPlaneR[0];
56310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[1] = (GLint) texUnit->ObjectPlaneR[1];
56410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[2] = (GLint) texUnit->ObjectPlaneR[2];
56510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[3] = (GLint) texUnit->ObjectPlaneR[3];
56610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
56710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
56810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = (GLint) texUnit->EyePlaneR[0];
56910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[1] = (GLint) texUnit->EyePlaneR[1];
57010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[2] = (GLint) texUnit->EyePlaneR[2];
57110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[3] = (GLint) texUnit->EyePlaneR[3];
57210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
57310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
57410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
57510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
57610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
57710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
57810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      case GL_Q:
57910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         if (pname==GL_TEXTURE_GEN_MODE) {
58010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = texUnit->GenModeQ;
58110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
58210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_OBJECT_PLANE) {
58310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = (GLint) texUnit->ObjectPlaneQ[0];
58410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[1] = (GLint) texUnit->ObjectPlaneQ[1];
58510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[2] = (GLint) texUnit->ObjectPlaneQ[2];
58610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[3] = (GLint) texUnit->ObjectPlaneQ[3];
58710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
58810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else if (pname==GL_EYE_PLANE) {
58910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[0] = (GLint) texUnit->EyePlaneQ[0];
59010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[1] = (GLint) texUnit->EyePlaneQ[1];
59110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[2] = (GLint) texUnit->EyePlaneQ[2];
59210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul            params[3] = (GLint) texUnit->EyePlaneQ[3];
59310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         }
59410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 else {
59510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
59610db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	    return;
59710db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 }
59810db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 break;
59910db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul      default:
60010db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(coord)" );
60110db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul	 return;
60210db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul   }
60310db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul}
60410db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
60510db6c2d81506bb8cc5165d07b01e93d3830978dBrian Paul
606