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, ¶m); 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, ¶m ); 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