t_vb_texgen.c revision a2ea606377ed5679dc513eabcf2d398216b47d61
1cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* 2cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Mesa 3-D graphics library 3a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol * Version: 6.5 4cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 5a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 6cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 7cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 8cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * copy of this software and associated documentation files (the "Software"), 9cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * to deal in the Software without restriction, including without limitation 10cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 12cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Software is furnished to do so, subject to the following conditions: 13cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 14cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * The above copyright notice and this permission notice shall be included 15cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * in all copies or substantial portions of the Software. 16cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 17cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 24cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Authors: 2505a4b37707d2c598ea68c05d07a3d65bcbf5a076Brian Paul * Brian Paul 2605a4b37707d2c598ea68c05d07a3d65bcbf5a076Brian Paul * Keith Whitwell <keith@tungstengraphics.com> 27cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 28cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 29ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul/* 30ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * Regarding GL_NV_texgen_reflection: 31ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * 32ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * Portions of this software may use or implement intellectual 33ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * property owned and licensed by NVIDIA Corporation. NVIDIA disclaims 34ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * any and all warranties with respect to such intellectual property, 35ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * including any use thereof or modifications thereto. 36ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul */ 37cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 38cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "glheader.h" 39cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "colormac.h" 40cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "context.h" 41cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "macros.h" 423c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 43cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "mtypes.h" 44cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 45cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "math/m_xform.h" 46cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 47cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "t_context.h" 48cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "t_pipeline.h" 49cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 50cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 51cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/*********************************************************************** 52cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Automatic texture coordinate generation (texgen) code. 53cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 54cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 55cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 56cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstruct texgen_stage_data; 57cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 58cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwelltypedef void (*texgen_func)( GLcontext *ctx, 59cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store, 60cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint unit); 61cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 62cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 63cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstruct texgen_stage_data { 64cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 65cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Per-texunit derived state. 66cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 67610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul GLuint TexgenSize[MAX_TEXTURE_COORD_UNITS]; 68610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul texgen_func TexgenFunc[MAX_TEXTURE_COORD_UNITS]; 69cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 70cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Temporary values used in texgen. 71cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 72cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*tmp_f)[3]; 73cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *tmp_m; 74cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 75cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Buffered outputs of the stage. 76cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 77610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul GLvector4f texcoord[MAX_TEXTURE_COORD_UNITS]; 78cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 79cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 80cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 81b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul#define TEXGEN_STAGE_DATA(stage) ((struct texgen_stage_data *)stage->privatePtr) 82cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 83cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 84cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 85cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic GLuint all_bits[5] = { 86cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 0, 87cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell VEC_SIZE_1, 88cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell VEC_SIZE_2, 89cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell VEC_SIZE_3, 90cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell VEC_SIZE_4, 91cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 92cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 93cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define VEC_SIZE_FLAGS (VEC_SIZE_1|VEC_SIZE_2|VEC_SIZE_3|VEC_SIZE_4) 94cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 95ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell#define TEXGEN_NEED_M (TEXGEN_SPHERE_MAP) 96ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell#define TEXGEN_NEED_F (TEXGEN_SPHERE_MAP | \ 97ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell TEXGEN_REFLECTION_MAP_NV) 98ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell 99ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell 100ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell 1015e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughesstatic void build_m3( GLfloat f[][3], GLfloat m[], 102bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal, 1035e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes const GLvector4f *eye ) 104cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 105cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint stride = eye->stride; 106cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *coord = (GLfloat *)eye->start; 107cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = eye->count; 108cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *norm = normal->start; 109cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 110cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 111908be619fdba608b057ae512834dcc7a76aa3224Keith Whitwell for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(norm,normal->stride)) { 112cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat u[3], two_nu, fx, fy, fz; 11322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes COPY_3V( u, coord ); 114cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV( u ); 115cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell two_nu = 2.0F * DOT3(norm,u); 116cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fx = f[i][0] = u[0] - norm[0] * two_nu; 117cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fy = f[i][1] = u[1] - norm[1] * two_nu; 118cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fz = f[i][2] = u[2] - norm[2] * two_nu; 119cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell m[i] = fx * fx + fy * fy + (fz + 1.0F) * (fz + 1.0F); 120cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (m[i] != 0.0F) { 121f9b1e5241facc8cf255c258082d5cb5b04783e93Brian Paul m[i] = 0.5F * _mesa_inv_sqrtf(m[i]); 122cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 123cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 124cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 125cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 126cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 127cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 1285e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughesstatic void build_m2( GLfloat f[][3], GLfloat m[], 129bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal, 1305e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes const GLvector4f *eye ) 131cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 132cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint stride = eye->stride; 133cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *coord = eye->start; 134cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = eye->count; 135cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 136cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *norm = normal->start; 137cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 138cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 139908be619fdba608b057ae512834dcc7a76aa3224Keith Whitwell for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(norm,normal->stride)) { 140cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat u[3], two_nu, fx, fy, fz; 14122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes COPY_2V( u, coord ); 142cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell u[2] = 0; 143cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV( u ); 144cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell two_nu = 2.0F * DOT3(norm,u); 145cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fx = f[i][0] = u[0] - norm[0] * two_nu; 146cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fy = f[i][1] = u[1] - norm[1] * two_nu; 147cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fz = f[i][2] = u[2] - norm[2] * two_nu; 148cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell m[i] = fx * fx + fy * fy + (fz + 1.0F) * (fz + 1.0F); 149cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (m[i] != 0.0F) { 150f9b1e5241facc8cf255c258082d5cb5b04783e93Brian Paul m[i] = 0.5F * _mesa_inv_sqrtf(m[i]); 151cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 152cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 153cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 154cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 155cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 156cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 1575e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughestypedef void (*build_m_func)( GLfloat f[][3], 1585e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes GLfloat m[], 159bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal, 1605e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes const GLvector4f *eye ); 161cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 162cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 163cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic build_m_func build_m_tab[5] = { 164b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell NULL, 165b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell NULL, 166cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_m2, 167cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_m3, 168cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_m3 169cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 170cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 171cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 172cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* This is unusual in that we respect the stride of the output vector 173cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * (f). This allows us to pass in either a texcoord vector4f, or a 17422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * temporary vector3f. 175cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 17622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic void build_f3( GLfloat *f, 177cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint fstride, 178bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal, 179cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvector4f *eye ) 180cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 181cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint stride = eye->stride; 182cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *coord = eye->start; 183cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = eye->count; 184cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 185cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *norm = normal->start; 186cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 187cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 188cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++) { 189cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat u[3], two_nu; 19022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes COPY_3V( u, coord ); 191cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV( u ); 192cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell two_nu = 2.0F * DOT3(norm,u); 193cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[0] = u[0] - norm[0] * two_nu; 194cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[1] = u[1] - norm[1] * two_nu; 195cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[2] = u[2] - norm[2] * two_nu; 196cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell STRIDE_F(coord,stride); 19722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes STRIDE_F(f,fstride); 198cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell STRIDE_F(norm, normal->stride); 199cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 200cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 201cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 202cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 20322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic void build_f2( GLfloat *f, 204cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint fstride, 205bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal, 206cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvector4f *eye ) 207cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 208cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint stride = eye->stride; 209cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *coord = eye->start; 210cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = eye->count; 211cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *norm = normal->start; 212cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 213cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 214cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++) { 215cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 216cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat u[3], two_nu; 21722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes COPY_2V( u, coord ); 218cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell u[2] = 0; 219cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV( u ); 220cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell two_nu = 2.0F * DOT3(norm,u); 221cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[0] = u[0] - norm[0] * two_nu; 222cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[1] = u[1] - norm[1] * two_nu; 223cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[2] = u[2] - norm[2] * two_nu; 224cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 225cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell STRIDE_F(coord,stride); 226cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell STRIDE_F(f,fstride); 227cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell STRIDE_F(norm, normal->stride); 228cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 229cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 230cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 231cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwelltypedef void (*build_f_func)( GLfloat *f, 232cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint fstride, 233bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal_vec, 234cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvector4f *eye ); 235cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 236cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 237cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 23822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes/* Just treat 4-vectors as 3-vectors. 239cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 240cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic build_f_func build_f_tab[5] = { 241b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell NULL, 242b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell NULL, 243cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_f2, 244cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_f3, 24522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes build_f3 246cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 247cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 248cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 2495fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell 250cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* Special case texgen functions. 251cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 252cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void texgen_reflection_map_nv( GLcontext *ctx, 253cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store, 254cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint unit ) 255cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 256cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 257cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *in = VB->TexCoordPtr[unit]; 258cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *out = &store->texcoord[unit]; 259cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 260cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_f_tab[VB->EyePtr->size]( out->start, 261cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell out->stride, 26222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes VB->NormalPtr, 26322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes VB->EyePtr ); 26422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 2655fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_3; 2665fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->count = VB->Count; 2675fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->size = MAX2(in->size, 3); 2685fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell if (in->size == 4) 2695fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell _mesa_copy_tab[0x8]( out, in ); 270cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 271cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 272cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 273cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 274cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void texgen_normal_map_nv( GLcontext *ctx, 275cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store, 276cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint unit ) 277cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 278cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 279cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *in = VB->TexCoordPtr[unit]; 280cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *out = &store->texcoord[unit]; 281bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul GLvector4f *normal = VB->NormalPtr; 282cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*texcoord)[4] = (GLfloat (*)[4])out->start; 283cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = VB->Count; 284cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 285cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *norm = normal->start; 286cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 287cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) { 288cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][0] = norm[0]; 289cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][1] = norm[1]; 290cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][2] = norm[2]; 291cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 292cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 293cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 2945fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_3; 2955fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->count = count; 2965fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->size = MAX2(in->size, 3); 2975fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell if (in->size == 4) 2985fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell _mesa_copy_tab[0x8]( out, in ); 299cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 300cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 301cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 302cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void texgen_sphere_map( GLcontext *ctx, 303cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store, 304cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint unit ) 305cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 306cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 307cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *in = VB->TexCoordPtr[unit]; 308cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *out = &store->texcoord[unit]; 309cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*texcoord)[4] = (GLfloat (*)[4]) out->start; 310cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = VB->Count; 311cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 312cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*f)[3] = store->tmp_f; 313cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *m = store->tmp_m; 314cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 31522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes (build_m_tab[VB->EyePtr->size])( store->tmp_f, 31622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes store->tmp_m, 31722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes VB->NormalPtr, 31822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes VB->EyePtr ); 319cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3205fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->size = MAX2(in->size,2); 3215fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell 322cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++) { 323cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][0] = f[i][0] * m[i] + 0.5F; 324cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][1] = f[i][1] * m[i] + 0.5F; 325cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 326cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3275fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->count = count; 3285fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_2; 3295fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell if (in->size > 2) 3305fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell _mesa_copy_tab[all_bits[in->size] & ~0x3]( out, in ); 331cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 332cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 333cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 334cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 33522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic void texgen( GLcontext *ctx, 336cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store, 337cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint unit ) 338cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 339cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell TNLcontext *tnl = TNL_CONTEXT(ctx); 340cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB = &tnl->vb; 341cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *in = VB->TexCoordPtr[unit]; 342cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *out = &store->texcoord[unit]; 3432655e68504786b62a8463d04eaa74a953e5d2871Brian Paul const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 344cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvector4f *obj = VB->ObjPtr; 345cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvector4f *eye = VB->EyePtr; 346bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal = VB->NormalPtr; 3472655e68504786b62a8463d04eaa74a953e5d2871Brian Paul const GLfloat *m = store->tmp_m; 3482655e68504786b62a8463d04eaa74a953e5d2871Brian Paul const GLuint count = VB->Count; 349cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*texcoord)[4] = (GLfloat (*)[4])out->data; 350cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*f)[3] = store->tmp_f; 3515fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell GLuint copy; 352cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 353cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->_GenFlags & TEXGEN_NEED_M) { 3542655e68504786b62a8463d04eaa74a953e5d2871Brian Paul build_m_tab[eye->size]( store->tmp_f, store->tmp_m, normal, eye ); 355cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } else if (texUnit->_GenFlags & TEXGEN_NEED_F) { 3562655e68504786b62a8463d04eaa74a953e5d2871Brian Paul build_f_tab[eye->size]( (GLfloat *)store->tmp_f, 3, normal, eye ); 357cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 358cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 35922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 3605fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->size = MAX2(in->size, store->TexgenSize[unit]); 3615fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->flags |= (in->flags & VEC_SIZE_FLAGS) | texUnit->TexGenEnabled; 3625fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->count = count; 363cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3645fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell copy = (all_bits[in->size] & ~texUnit->TexGenEnabled); 3655fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell if (copy) 3665fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell _mesa_copy_tab[copy]( out, in ); 367cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 368cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled & S_BIT) { 369cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 370cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell switch (texUnit->GenModeS) { 371cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_OBJECT_LINEAR: 3725e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[obj->size]( (GLfloat *)out->data, 3735e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), obj, 3745e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes texUnit->ObjectPlaneS ); 375cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 376cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_EYE_LINEAR: 3775e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[eye->size]( (GLfloat *)out->data, 3785e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), eye, 3795e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes texUnit->EyePlaneS ); 380cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 38122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes case GL_SPHERE_MAP: 3822655e68504786b62a8463d04eaa74a953e5d2871Brian Paul for (i = 0; i < count; i++) 3832655e68504786b62a8463d04eaa74a953e5d2871Brian Paul texcoord[i][0] = f[i][0] * m[i] + 0.5F; 384cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 38522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes case GL_REFLECTION_MAP_NV: 38622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes for (i=0;i<count;i++) 387cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][0] = f[i][0]; 388cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 389cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_NORMAL_MAP_NV: { 390cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *norm = normal->start; 391cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) { 392cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][0] = norm[0]; 393cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 394cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 395cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 396cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell default: 39708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad S texgen"); 398cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 39922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 400cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 401cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled & T_BIT) { 402cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 403cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell switch (texUnit->GenModeT) { 404cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_OBJECT_LINEAR: 4055e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[obj->size]( &(out->data[0][1]), 4065e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), obj, 4075e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes texUnit->ObjectPlaneT ); 408cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 409cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_EYE_LINEAR: 4105e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[eye->size]( &(out->data[0][1]), 4115e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), eye, 4125e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes texUnit->EyePlaneT ); 41322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes break; 41422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes case GL_SPHERE_MAP: 4152655e68504786b62a8463d04eaa74a953e5d2871Brian Paul for (i = 0; i < count; i++) 4162655e68504786b62a8463d04eaa74a953e5d2871Brian Paul texcoord[i][1] = f[i][1] * m[i] + 0.5F; 41722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes break; 41822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes case GL_REFLECTION_MAP_NV: 41922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes for (i=0;i<count;i++) 4208fee8dfcaaf2dae5a8a022077f2d888b9943b5a2Daniel Borca texcoord[i][1] = f[i][1]; 421cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 422cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_NORMAL_MAP_NV: { 423cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *norm = normal->start; 424cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) { 425cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][1] = norm[1]; 426cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 427cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 428cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 429cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell default: 43008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad T texgen"); 431cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 432cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 433cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 434cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled & R_BIT) { 435cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 436cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell switch (texUnit->GenModeR) { 437cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_OBJECT_LINEAR: 4385e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[obj->size]( &(out->data[0][2]), 4395e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), obj, 4405e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes texUnit->ObjectPlaneR ); 441cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 442cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_EYE_LINEAR: 4435e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[eye->size]( &(out->data[0][2]), 4445e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), eye, 4455e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes texUnit->EyePlaneR ); 446cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 44722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes case GL_REFLECTION_MAP_NV: 44822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes for (i=0;i<count;i++) 449cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][2] = f[i][2]; 450cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 451cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_NORMAL_MAP_NV: { 452cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *norm = normal->start; 453cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++,STRIDE_F(norm, normal->stride)) { 454cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][2] = norm[2]; 455cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 456cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 457cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 458cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell default: 45908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad R texgen"); 460cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 461cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 462cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 463cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled & Q_BIT) { 464cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell switch (texUnit->GenModeQ) { 465cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_OBJECT_LINEAR: 4665e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[obj->size]( &(out->data[0][3]), 4675e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), obj, 4685e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes texUnit->ObjectPlaneQ ); 469cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 470cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_EYE_LINEAR: 4715e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[eye->size]( &(out->data[0][3]), 4725e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), eye, 4735e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes texUnit->EyePlaneQ ); 474cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 475cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell default: 47608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad Q texgen"); 477cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 478cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 479cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 480cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 481cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 482cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 4836f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell 48422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic GLboolean run_texgen_stage( GLcontext *ctx, 485ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_pipeline_stage *stage ) 486cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 48722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 4886f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage); 489cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 490cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 491a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol if (ctx->ShaderObjects.CurrentProgram != NULL) 492a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol return GL_TRUE; 493a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol 4946f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell if (!ctx->Texture._TexGenEnabled || ctx->VertexProgram._Enabled) 4956f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell return GL_TRUE; 4966f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell 4976f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) { 4986f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i]; 4996f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell 5006f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell if (texUnit->TexGenEnabled) { 5016f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell 5026f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell store->TexgenFunc[i]( ctx, store, i ); 503cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 504790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell VB->AttribPtr[VERT_ATTRIB_TEX0+i] = 505790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell VB->TexCoordPtr[i] = &store->texcoord[i]; 506cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 5076f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell } 508cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 509cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_TRUE; 510cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 511cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 512cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 5136f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwellstatic void validate_texgen_stage( GLcontext *ctx, 5146f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell struct tnl_pipeline_stage *stage ) 515cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 516cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage); 517cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 518cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 519a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol if (ctx->ShaderObjects.CurrentProgram != NULL) 520a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol return; 521a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol 5226f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell if (!ctx->Texture._TexGenEnabled || ctx->VertexProgram._Enabled) 5236f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell return; 5246f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell 52592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) { 526cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i]; 527cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 528cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled) { 529cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint sz; 530cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 531a4e65d69dc745a78fb3dbcbb0ee194e1b6877c5dBrian Paul if (texUnit->TexGenEnabled & Q_BIT) 532cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell sz = 4; 533a4e65d69dc745a78fb3dbcbb0ee194e1b6877c5dBrian Paul else if (texUnit->TexGenEnabled & R_BIT) 534cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell sz = 3; 535cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else if (texUnit->TexGenEnabled & T_BIT) 536cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell sz = 2; 537cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else 538cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell sz = 1; 53922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 540cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->TexgenSize[i] = sz; 5412655e68504786b62a8463d04eaa74a953e5d2871Brian Paul store->TexgenFunc[i] = texgen; /* general solution */ 54222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 5432655e68504786b62a8463d04eaa74a953e5d2871Brian Paul /* look for special texgen cases */ 544cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled == (S_BIT|T_BIT|R_BIT)) { 545cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->_GenFlags == TEXGEN_REFLECTION_MAP_NV) { 546cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->TexgenFunc[i] = texgen_reflection_map_nv; 547cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 548cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else if (texUnit->_GenFlags == TEXGEN_NORMAL_MAP_NV) { 549cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->TexgenFunc[i] = texgen_normal_map_nv; 550cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 551cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 552cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else if (texUnit->TexGenEnabled == (S_BIT|T_BIT) && 553cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texUnit->_GenFlags == TEXGEN_SPHERE_MAP) { 554cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->TexgenFunc[i] = texgen_sphere_map; 555cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 556cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 557cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 558cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 559cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 560cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 561cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 562cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 563cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 564cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* Called the first time stage->run() is invoked. 565cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 56622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic GLboolean alloc_texgen_data( GLcontext *ctx, 567ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_pipeline_stage *stage ) 568cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 56922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 570cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store; 571cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 572cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 573b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul stage->privatePtr = CALLOC(sizeof(*store)); 574cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store = TEXGEN_STAGE_DATA(stage); 575cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (!store) 576cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 577cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 57892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) 57908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_vector4f_alloc( &store->texcoord[i], 0, VB->Size, 32 ); 580cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 581cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->tmp_f = (GLfloat (*)[3]) MALLOC(VB->Size * sizeof(GLfloat) * 3); 582cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->tmp_m = (GLfloat *) MALLOC(VB->Size * sizeof(GLfloat)); 583cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 5846f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell return GL_TRUE; 585cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 586cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 587cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 588ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstatic void free_texgen_data( struct tnl_pipeline_stage *stage ) 589cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 590cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 591cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage); 592cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 593cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 594cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (store) { 595610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul for (i = 0 ; i < MAX_TEXTURE_COORD_UNITS ; i++) 59622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes if (store->texcoord[i].data) 59708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_vector4f_free( &store->texcoord[i] ); 598cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 59922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 600cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (store->tmp_f) FREE( store->tmp_f ); 601cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (store->tmp_m) FREE( store->tmp_m ); 602cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell FREE( store ); 603b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul stage->privatePtr = NULL; 604cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 605cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 606cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 607cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 60822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 609ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellconst struct tnl_pipeline_stage _tnl_texgen_stage = 61022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes{ 61186b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul "texgen", /* name */ 61286b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul NULL, /* private data */ 6136f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell alloc_texgen_data, /* destructor */ 614cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell free_texgen_data, /* destructor */ 6156f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell validate_texgen_stage, /* check */ 6166f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell run_texgen_stage /* run -- initially set to alloc data */ 617cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 618