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 38bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h" 39bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/colormac.h" 40bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h" 41bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h" 42bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/mtypes.h" 43cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 44cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "math/m_xform.h" 45cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 46cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "t_context.h" 47cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "t_pipeline.h" 48cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 49cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 50cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/*********************************************************************** 51cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Automatic texture coordinate generation (texgen) code. 52cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 53cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 54cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 55cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstruct texgen_stage_data; 56cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 57f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergtypedef void (*texgen_func)( struct gl_context *ctx, 58cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store, 59cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint unit); 60cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 61cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 62cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstruct texgen_stage_data { 63cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 64cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Per-texunit derived state. 65cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 66610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul GLuint TexgenSize[MAX_TEXTURE_COORD_UNITS]; 67610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul texgen_func TexgenFunc[MAX_TEXTURE_COORD_UNITS]; 68cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 69cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Temporary values used in texgen. 70cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 71cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*tmp_f)[3]; 72cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *tmp_m; 73cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 74cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Buffered outputs of the stage. 75cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 76610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul GLvector4f texcoord[MAX_TEXTURE_COORD_UNITS]; 77cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 78cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 79cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 80b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul#define TEXGEN_STAGE_DATA(stage) ((struct texgen_stage_data *)stage->privatePtr) 81cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 82cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 83cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 84cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic GLuint all_bits[5] = { 85cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 0, 86cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell VEC_SIZE_1, 87cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell VEC_SIZE_2, 88cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell VEC_SIZE_3, 89cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell VEC_SIZE_4, 90cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 91cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 92cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define VEC_SIZE_FLAGS (VEC_SIZE_1|VEC_SIZE_2|VEC_SIZE_3|VEC_SIZE_4) 93cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 94ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell#define TEXGEN_NEED_M (TEXGEN_SPHERE_MAP) 95ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell#define TEXGEN_NEED_F (TEXGEN_SPHERE_MAP | \ 96ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell TEXGEN_REFLECTION_MAP_NV) 97ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell 98ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell 99ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell 1005e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughesstatic void build_m3( GLfloat f[][3], GLfloat m[], 101bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal, 1025e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes const GLvector4f *eye ) 103cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 104cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint stride = eye->stride; 105cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *coord = (GLfloat *)eye->start; 106cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = eye->count; 107cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *norm = normal->start; 108cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 109cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 110908be619fdba608b057ae512834dcc7a76aa3224Keith Whitwell for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(norm,normal->stride)) { 111cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat u[3], two_nu, fx, fy, fz; 11222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes COPY_3V( u, coord ); 113cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV( u ); 114cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell two_nu = 2.0F * DOT3(norm,u); 115cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fx = f[i][0] = u[0] - norm[0] * two_nu; 116cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fy = f[i][1] = u[1] - norm[1] * two_nu; 117cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fz = f[i][2] = u[2] - norm[2] * two_nu; 118cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell m[i] = fx * fx + fy * fy + (fz + 1.0F) * (fz + 1.0F); 119cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (m[i] != 0.0F) { 120f58ba6ca9147137c7a2d31a1014235f7077b7752Matt Turner m[i] = 0.5F * INV_SQRTF(m[i]); 121cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 122cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 123cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 124cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 125cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 126cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 1275e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughesstatic void build_m2( GLfloat f[][3], GLfloat m[], 128bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal, 1295e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes const GLvector4f *eye ) 130cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 131cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint stride = eye->stride; 132cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *coord = eye->start; 133cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = eye->count; 134cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 135cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *norm = normal->start; 136cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 137cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 138908be619fdba608b057ae512834dcc7a76aa3224Keith Whitwell for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(norm,normal->stride)) { 139cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat u[3], two_nu, fx, fy, fz; 14022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes COPY_2V( u, coord ); 141cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell u[2] = 0; 142cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV( u ); 143cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell two_nu = 2.0F * DOT3(norm,u); 144cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fx = f[i][0] = u[0] - norm[0] * two_nu; 145cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fy = f[i][1] = u[1] - norm[1] * two_nu; 146cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell fz = f[i][2] = u[2] - norm[2] * two_nu; 147cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell m[i] = fx * fx + fy * fy + (fz + 1.0F) * (fz + 1.0F); 148cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (m[i] != 0.0F) { 149f58ba6ca9147137c7a2d31a1014235f7077b7752Matt Turner m[i] = 0.5F * INV_SQRTF(m[i]); 150cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 151cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 152cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 153cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 154cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 155cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 1565e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughestypedef void (*build_m_func)( GLfloat f[][3], 1575e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes GLfloat m[], 158bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal, 1595e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes const GLvector4f *eye ); 160cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 161cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 162cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic build_m_func build_m_tab[5] = { 163b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell NULL, 164b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell NULL, 165cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_m2, 166cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_m3, 167cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_m3 168cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 169cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 170cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 171cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* This is unusual in that we respect the stride of the output vector 172cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * (f). This allows us to pass in either a texcoord vector4f, or a 17322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * temporary vector3f. 174cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 17522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic void build_f3( GLfloat *f, 176cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint fstride, 177bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal, 178cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvector4f *eye ) 179cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 180cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint stride = eye->stride; 181cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *coord = eye->start; 182cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = eye->count; 183cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 184cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *norm = normal->start; 185cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 186cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 187cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++) { 188cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat u[3], two_nu; 18922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes COPY_3V( u, coord ); 190cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV( u ); 191cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell two_nu = 2.0F * DOT3(norm,u); 192cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[0] = u[0] - norm[0] * two_nu; 193cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[1] = u[1] - norm[1] * two_nu; 194cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[2] = u[2] - norm[2] * two_nu; 195cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell STRIDE_F(coord,stride); 19622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes STRIDE_F(f,fstride); 197cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell STRIDE_F(norm, normal->stride); 198cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 199cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 200cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 201cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 20222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic void build_f2( GLfloat *f, 203cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint fstride, 204bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal, 205cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvector4f *eye ) 206cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 207cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint stride = eye->stride; 208cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *coord = eye->start; 209cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = eye->count; 210cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *norm = normal->start; 211cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 212cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 213cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++) { 214cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 215cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat u[3], two_nu; 21622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes COPY_2V( u, coord ); 217cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell u[2] = 0; 218cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV( u ); 219cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell two_nu = 2.0F * DOT3(norm,u); 220cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[0] = u[0] - norm[0] * two_nu; 221cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[1] = u[1] - norm[1] * two_nu; 222cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell f[2] = u[2] - norm[2] * two_nu; 223cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 224cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell STRIDE_F(coord,stride); 225cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell STRIDE_F(f,fstride); 226cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell STRIDE_F(norm, normal->stride); 227cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 228cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 229cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 230cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwelltypedef void (*build_f_func)( GLfloat *f, 231cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint fstride, 232bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul const GLvector4f *normal_vec, 233cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvector4f *eye ); 234cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 235cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 236cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 23722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes/* Just treat 4-vectors as 3-vectors. 238cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 239cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic build_f_func build_f_tab[5] = { 240b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell NULL, 241b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell NULL, 242cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_f2, 243cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_f3, 24422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes build_f3 245cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 246cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 247cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 2485fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell 249cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* Special case texgen functions. 250cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 251f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void texgen_reflection_map_nv( struct gl_context *ctx, 252cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store, 253cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint unit ) 254cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 255cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 25662e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul GLvector4f *in = VB->AttribPtr[VERT_ATTRIB_TEX0 + unit]; 257cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *out = &store->texcoord[unit]; 258cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 259cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell build_f_tab[VB->EyePtr->size]( out->start, 260cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell out->stride, 26162e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul VB->AttribPtr[_TNL_ATTRIB_NORMAL], 26222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes VB->EyePtr ); 26322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 2645fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_3; 2655fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->count = VB->Count; 2665fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->size = MAX2(in->size, 3); 2675fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell if (in->size == 4) 2685fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell _mesa_copy_tab[0x8]( out, in ); 269cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 270cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 271cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 272cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 273f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void texgen_normal_map_nv( struct gl_context *ctx, 274cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store, 275cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint unit ) 276cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 277cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 27862e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul GLvector4f *in = VB->AttribPtr[VERT_ATTRIB_TEX0 + unit]; 279cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *out = &store->texcoord[unit]; 28062e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul GLvector4f *normal = VB->AttribPtr[_TNL_ATTRIB_NORMAL]; 281cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*texcoord)[4] = (GLfloat (*)[4])out->start; 282cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = VB->Count; 283cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 284cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *norm = normal->start; 285cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 286cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) { 287cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][0] = norm[0]; 288cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][1] = norm[1]; 289cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][2] = norm[2]; 290cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 291cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 292cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 2935fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_3; 2945fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->count = count; 2955fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->size = MAX2(in->size, 3); 2965fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell if (in->size == 4) 2975fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell _mesa_copy_tab[0x8]( out, in ); 298cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 299cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 300cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 301f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void texgen_sphere_map( struct gl_context *ctx, 302cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store, 303cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint unit ) 304cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 305cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 30662e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul GLvector4f *in = VB->AttribPtr[VERT_ATTRIB_TEX0 + unit]; 307cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *out = &store->texcoord[unit]; 308cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*texcoord)[4] = (GLfloat (*)[4]) out->start; 309cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint count = VB->Count; 310cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 311cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*f)[3] = store->tmp_f; 312cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *m = store->tmp_m; 313cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 31422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes (build_m_tab[VB->EyePtr->size])( store->tmp_f, 31522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes store->tmp_m, 31662e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul VB->AttribPtr[_TNL_ATTRIB_NORMAL], 31722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes VB->EyePtr ); 318cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3195fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->size = MAX2(in->size,2); 3205fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell 321cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++) { 322cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][0] = f[i][0] * m[i] + 0.5F; 323cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][1] = f[i][1] * m[i] + 0.5F; 324cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 325cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3265fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->count = count; 3275fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_2; 3285fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell if (in->size > 2) 3295fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell _mesa_copy_tab[all_bits[in->size] & ~0x3]( out, in ); 330cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 331cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 332cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 333cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 334f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void texgen( struct gl_context *ctx, 335cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store, 336cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint unit ) 337cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 338cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell TNLcontext *tnl = TNL_CONTEXT(ctx); 339cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB = &tnl->vb; 34062e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul GLvector4f *in = VB->AttribPtr[VERT_ATTRIB_TEX0 + unit]; 341cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *out = &store->texcoord[unit]; 3422655e68504786b62a8463d04eaa74a953e5d2871Brian Paul const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 343165b860da6f16ef4817a4959774a57f57ba3756dEric Anholt const GLvector4f *obj = VB->AttribPtr[_TNL_ATTRIB_POS]; 344cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvector4f *eye = VB->EyePtr; 34562e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLvector4f *normal = VB->AttribPtr[_TNL_ATTRIB_NORMAL]; 3462655e68504786b62a8463d04eaa74a953e5d2871Brian Paul const GLfloat *m = store->tmp_m; 3472655e68504786b62a8463d04eaa74a953e5d2871Brian Paul const GLuint count = VB->Count; 348cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*texcoord)[4] = (GLfloat (*)[4])out->data; 349cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*f)[3] = store->tmp_f; 3505fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell GLuint copy; 351cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 352cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->_GenFlags & TEXGEN_NEED_M) { 3532655e68504786b62a8463d04eaa74a953e5d2871Brian Paul build_m_tab[eye->size]( store->tmp_f, store->tmp_m, normal, eye ); 354cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } else if (texUnit->_GenFlags & TEXGEN_NEED_F) { 3552655e68504786b62a8463d04eaa74a953e5d2871Brian Paul build_f_tab[eye->size]( (GLfloat *)store->tmp_f, 3, normal, eye ); 356cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 357cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 35822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 3595fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->size = MAX2(in->size, store->TexgenSize[unit]); 3605fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->flags |= (in->flags & VEC_SIZE_FLAGS) | texUnit->TexGenEnabled; 3615fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell out->count = count; 362cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3635fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell copy = (all_bits[in->size] & ~texUnit->TexGenEnabled); 3645fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell if (copy) 3655fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell _mesa_copy_tab[copy]( out, in ); 366cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 367cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled & S_BIT) { 368cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 3699705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul switch (texUnit->GenS.Mode) { 370cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_OBJECT_LINEAR: 3715e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[obj->size]( (GLfloat *)out->data, 3725e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), obj, 3739705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul texUnit->GenS.ObjectPlane ); 374cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 375cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_EYE_LINEAR: 3765e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[eye->size]( (GLfloat *)out->data, 3775e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), eye, 3789705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul texUnit->GenS.EyePlane ); 379cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 38022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes case GL_SPHERE_MAP: 3812655e68504786b62a8463d04eaa74a953e5d2871Brian Paul for (i = 0; i < count; i++) 3822655e68504786b62a8463d04eaa74a953e5d2871Brian Paul texcoord[i][0] = f[i][0] * m[i] + 0.5F; 383cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 38422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes case GL_REFLECTION_MAP_NV: 38522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes for (i=0;i<count;i++) 386cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][0] = f[i][0]; 387cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 388cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_NORMAL_MAP_NV: { 389cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *norm = normal->start; 390cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) { 391cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][0] = norm[0]; 392cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 393cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 394cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 395cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell default: 39608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad S texgen"); 397cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 39822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 399cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 400cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled & T_BIT) { 401cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 4029705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul switch (texUnit->GenT.Mode) { 403cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_OBJECT_LINEAR: 4045e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[obj->size]( &(out->data[0][1]), 4055e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), obj, 4069705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul texUnit->GenT.ObjectPlane ); 407cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 408cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_EYE_LINEAR: 4095e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[eye->size]( &(out->data[0][1]), 4105e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), eye, 4119705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul texUnit->GenT.EyePlane ); 41222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes break; 41322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes case GL_SPHERE_MAP: 4142655e68504786b62a8463d04eaa74a953e5d2871Brian Paul for (i = 0; i < count; i++) 4152655e68504786b62a8463d04eaa74a953e5d2871Brian Paul texcoord[i][1] = f[i][1] * m[i] + 0.5F; 41622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes break; 41722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes case GL_REFLECTION_MAP_NV: 41822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes for (i=0;i<count;i++) 4198fee8dfcaaf2dae5a8a022077f2d888b9943b5a2Daniel Borca texcoord[i][1] = f[i][1]; 420cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 421cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_NORMAL_MAP_NV: { 422cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *norm = normal->start; 423cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) { 424cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][1] = norm[1]; 425cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 426cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 427cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 428cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell default: 42908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad T texgen"); 430cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 431cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 432cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 433cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled & R_BIT) { 434cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 4359705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul switch (texUnit->GenR.Mode) { 436cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_OBJECT_LINEAR: 4375e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[obj->size]( &(out->data[0][2]), 4385e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), obj, 4399705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul texUnit->GenR.ObjectPlane ); 440cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 441cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_EYE_LINEAR: 4425e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[eye->size]( &(out->data[0][2]), 4435e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), eye, 4449705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul texUnit->GenR.EyePlane ); 445cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 44622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes case GL_REFLECTION_MAP_NV: 44722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes for (i=0;i<count;i++) 448cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][2] = f[i][2]; 449cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 450cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_NORMAL_MAP_NV: { 451cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *norm = normal->start; 452cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell for (i=0;i<count;i++,STRIDE_F(norm, normal->stride)) { 453cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texcoord[i][2] = norm[2]; 454cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 455cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 456cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 457cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell default: 45808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad R texgen"); 459cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 460cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 461cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 462cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled & Q_BIT) { 4639705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul switch (texUnit->GenQ.Mode) { 464cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_OBJECT_LINEAR: 4655e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[obj->size]( &(out->data[0][3]), 4665e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), obj, 4679705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul texUnit->GenQ.ObjectPlane ); 468cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 469cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell case GL_EYE_LINEAR: 4705e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes _mesa_dotprod_tab[eye->size]( &(out->data[0][3]), 4715e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes sizeof(out->data[0]), eye, 4729705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul texUnit->GenQ.EyePlane ); 473cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell break; 474cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell default: 47508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad Q texgen"); 476cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 477cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 478cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 479cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 480cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 481cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 4826f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell 483f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean run_texgen_stage( struct gl_context *ctx, 484ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_pipeline_stage *stage ) 485cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 48622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 4876f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage); 488cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 489cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 490a328e469d328f8b6fd5afdfc21d576fa1a2c43fcBrian if (!ctx->Texture._TexGenEnabled || ctx->VertexProgram._Current) 4916f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell return GL_TRUE; 4926f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell 4936f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) { 4946f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i]; 4956f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell 4966f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell if (texUnit->TexGenEnabled) { 4976f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell 4986f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell store->TexgenFunc[i]( ctx, store, i ); 499cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 50062e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul VB->AttribPtr[VERT_ATTRIB_TEX0 + i] = &store->texcoord[i]; 501cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 5026f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell } 503cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 504cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_TRUE; 505cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 506cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 507cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 508f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void validate_texgen_stage( struct gl_context *ctx, 5096f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell struct tnl_pipeline_stage *stage ) 510cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 511cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage); 512cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 513cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 514a328e469d328f8b6fd5afdfc21d576fa1a2c43fcBrian if (!ctx->Texture._TexGenEnabled || ctx->VertexProgram._Current) 5156f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell return; 5166f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell 51792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) { 518cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i]; 519cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 520cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled) { 521cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint sz; 522cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 523a4e65d69dc745a78fb3dbcbb0ee194e1b6877c5dBrian Paul if (texUnit->TexGenEnabled & Q_BIT) 524cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell sz = 4; 525a4e65d69dc745a78fb3dbcbb0ee194e1b6877c5dBrian Paul else if (texUnit->TexGenEnabled & R_BIT) 526cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell sz = 3; 527cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else if (texUnit->TexGenEnabled & T_BIT) 528cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell sz = 2; 529cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else 530cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell sz = 1; 53122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 532cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->TexgenSize[i] = sz; 5332655e68504786b62a8463d04eaa74a953e5d2871Brian Paul store->TexgenFunc[i] = texgen; /* general solution */ 53422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 5352655e68504786b62a8463d04eaa74a953e5d2871Brian Paul /* look for special texgen cases */ 536cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->TexGenEnabled == (S_BIT|T_BIT|R_BIT)) { 537cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (texUnit->_GenFlags == TEXGEN_REFLECTION_MAP_NV) { 538cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->TexgenFunc[i] = texgen_reflection_map_nv; 539cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 540cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else if (texUnit->_GenFlags == TEXGEN_NORMAL_MAP_NV) { 541cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->TexgenFunc[i] = texgen_normal_map_nv; 542cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 543cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 544cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else if (texUnit->TexGenEnabled == (S_BIT|T_BIT) && 545cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell texUnit->_GenFlags == TEXGEN_SPHERE_MAP) { 546cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->TexgenFunc[i] = texgen_sphere_map; 547cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 548cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 549cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 550cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 551cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 552cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 553cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 554cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 555cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 556cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* Called the first time stage->run() is invoked. 557cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 558f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean alloc_texgen_data( struct gl_context *ctx, 559ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_pipeline_stage *stage ) 560cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 56122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 562cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store; 563cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 564cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 565b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul stage->privatePtr = CALLOC(sizeof(*store)); 566cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store = TEXGEN_STAGE_DATA(stage); 567cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (!store) 568cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 569cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 57092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) 57108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_vector4f_alloc( &store->texcoord[i], 0, VB->Size, 32 ); 572cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 573cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->tmp_f = (GLfloat (*)[3]) MALLOC(VB->Size * sizeof(GLfloat) * 3); 574cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell store->tmp_m = (GLfloat *) MALLOC(VB->Size * sizeof(GLfloat)); 575cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 5766f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell return GL_TRUE; 577cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 578cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 579cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 580ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstatic void free_texgen_data( struct tnl_pipeline_stage *stage ) 581cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 582cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 583cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage); 584cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint i; 585cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 586cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (store) { 587610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul for (i = 0 ; i < MAX_TEXTURE_COORD_UNITS ; i++) 58822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes if (store->texcoord[i].data) 58908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_vector4f_free( &store->texcoord[i] ); 590cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 59122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 592cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (store->tmp_f) FREE( store->tmp_f ); 593cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (store->tmp_m) FREE( store->tmp_m ); 594cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell FREE( store ); 595b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul stage->privatePtr = NULL; 596cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 597cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 598cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 599cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 60022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 601ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellconst struct tnl_pipeline_stage _tnl_texgen_stage = 60222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes{ 60386b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul "texgen", /* name */ 60486b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul NULL, /* private data */ 6056f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell alloc_texgen_data, /* destructor */ 606cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell free_texgen_data, /* destructor */ 6076f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell validate_texgen_stage, /* check */ 6086f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell run_texgen_stage /* run -- initially set to alloc data */ 609cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}; 610