1 /* $Id: texstate.c,v 1.10 1998/02/03 23:45:02 brianp Exp $ */
2
3 /*
4 * Mesa 3-D graphics library
5 * Version: 2.6
6 * Copyright (C) 1995-1997 Brian Paul
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
17 *
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23
24 /*
25 * $Log: texstate.c,v $
26 * Revision 1.10 1998/02/03 23:45:02 brianp
27 * added casts to prevent warnings with Amiga StormC compiler
28 *
29 * Revision 1.9 1997/12/31 06:10:03 brianp
30 * added Henk Kok's texture validation optimization (AnyDirty flag)
31 *
32 * Revision 1.8 1997/10/13 23:56:01 brianp
33 * replaced UpdateTexture() call with TexParameter()
34 *
35 * Revision 1.7 1997/09/29 23:28:14 brianp
36 * updated for new device driver texture functions
37 *
38 * Revision 1.6 1997/09/27 00:14:39 brianp
39 * added GL_EXT_paletted_texture extension
40 *
41 * Revision 1.5 1997/07/24 01:25:34 brianp
42 * changed precompiled header symbol from PCH to PC_HEADER
43 *
44 * Revision 1.4 1997/05/28 03:26:49 brianp
45 * added precompiled header (PCH) support
46 *
47 * Revision 1.3 1997/05/03 00:53:28 brianp
48 * misc changes related to new texture object sampling function pointer
49 *
50 * Revision 1.2 1997/04/28 23:34:39 brianp
51 * simplified gl_update_texture_state()
52 *
53 * Revision 1.1 1997/04/14 01:59:54 brianp
54 * Initial revision
55 *
56 */
57
58
59 #ifdef PC_HEADER
60 #include "all.h"
61 #else
62 #include "context.h"
63 #include "macros.h"
64 #include "matrix.h"
65 #include "texobj.h"
66 #include "texstate.h"
67 #include "texture.h"
68 #include "types.h"
69 #include "xform.h"
70 #endif
71
72
73 #ifdef SPECIALCAST
74 /* Needed for an Amiga compiler */
75 #define ENUM_TO_FLOAT(X) ((GLfloat)(GLint)(X))
76 #define ENUM_TO_DOUBLE(X) ((GLdouble)(GLint)(X))
77 #else
78 /* all other compilers */
79 #define ENUM_TO_FLOAT(X) ((GLfloat)(X))
80 #define ENUM_TO_DOUBLE(X) ((GLdouble)(X))
81 #endif
82
83
84
85 /**********************************************************************/
86 /* Texture Environment */
87 /**********************************************************************/
88
89
gl_TexEnvfv(GLcontext * ctx,GLenum target,GLenum pname,const GLfloat * param)90 void gl_TexEnvfv( GLcontext *ctx,
91 GLenum target, GLenum pname, const GLfloat *param )
92 {
93 if (INSIDE_BEGIN_END(ctx)) {
94 gl_error( ctx, GL_INVALID_OPERATION, "glTexEnv" );
95 return;
96 }
97
98 if (target!=GL_TEXTURE_ENV) {
99 gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(target)" );
100 return;
101 }
102
103 if (pname==GL_TEXTURE_ENV_MODE) {
104 GLenum mode = (GLenum) (GLint) *param;
105 switch (mode) {
106 case GL_MODULATE:
107 case GL_BLEND:
108 case GL_DECAL:
109 case GL_REPLACE:
110 ctx->Texture.EnvMode = mode;
111 break;
112 default:
113 gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" );
114 return;
115 }
116 }
117 else if (pname==GL_TEXTURE_ENV_COLOR) {
118 ctx->Texture.EnvColor[0] = CLAMP( param[0], 0.0, 1.0 );
119 ctx->Texture.EnvColor[1] = CLAMP( param[1], 0.0, 1.0 );
120 ctx->Texture.EnvColor[2] = CLAMP( param[2], 0.0, 1.0 );
121 ctx->Texture.EnvColor[3] = CLAMP( param[3], 0.0, 1.0 );
122 }
123 else {
124 gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" );
125 return;
126 }
127
128 /* Tell device driver about the new texture environment */
129 if (ctx->Driver.TexEnv) {
130 (*ctx->Driver.TexEnv)( ctx, pname, param );
131 }
132 }
133
134
135
136
137
gl_GetTexEnvfv(GLcontext * ctx,GLenum target,GLenum pname,GLfloat * params)138 void gl_GetTexEnvfv( GLcontext *ctx,
139 GLenum target, GLenum pname, GLfloat *params )
140 {
141 if (target!=GL_TEXTURE_ENV) {
142 gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
143 return;
144 }
145 switch (pname) {
146 case GL_TEXTURE_ENV_MODE:
147 *params = ENUM_TO_FLOAT(ctx->Texture.EnvMode);
148 break;
149 case GL_TEXTURE_ENV_COLOR:
150 COPY_4V( params, ctx->Texture.EnvColor );
151 break;
152 default:
153 gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
154 }
155 }
156
157
gl_GetTexEnviv(GLcontext * ctx,GLenum target,GLenum pname,GLint * params)158 void gl_GetTexEnviv( GLcontext *ctx,
159 GLenum target, GLenum pname, GLint *params )
160 {
161 if (target!=GL_TEXTURE_ENV) {
162 gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
163 return;
164 }
165 switch (pname) {
166 case GL_TEXTURE_ENV_MODE:
167 *params = (GLint) ctx->Texture.EnvMode;
168 break;
169 case GL_TEXTURE_ENV_COLOR:
170 params[0] = FLOAT_TO_INT( ctx->Texture.EnvColor[0] );
171 params[1] = FLOAT_TO_INT( ctx->Texture.EnvColor[1] );
172 params[2] = FLOAT_TO_INT( ctx->Texture.EnvColor[2] );
173 params[3] = FLOAT_TO_INT( ctx->Texture.EnvColor[3] );
174 break;
175 default:
176 gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
177 }
178 }
179
180
181
182
183 /**********************************************************************/
184 /* Texture Parameters */
185 /**********************************************************************/
186
187
gl_TexParameterfv(GLcontext * ctx,GLenum target,GLenum pname,const GLfloat * params)188 void gl_TexParameterfv( GLcontext *ctx,
189 GLenum target, GLenum pname, const GLfloat *params )
190 {
191 GLenum eparam = (GLenum) (GLint) params[0];
192 struct gl_texture_object *texObj;
193
194 switch (target) {
195 case GL_TEXTURE_1D:
196 texObj = ctx->Texture.Current1D;
197 break;
198 case GL_TEXTURE_2D:
199 texObj = ctx->Texture.Current2D;
200 break;
201 default:
202 gl_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );
203 return;
204 }
205
206 switch (pname) {
207 case GL_TEXTURE_MIN_FILTER:
208 if (eparam==GL_NEAREST || eparam==GL_LINEAR
209 || eparam==GL_NEAREST_MIPMAP_NEAREST
210 || eparam==GL_LINEAR_MIPMAP_NEAREST
211 || eparam==GL_NEAREST_MIPMAP_LINEAR
212 || eparam==GL_LINEAR_MIPMAP_LINEAR) {
213 texObj->MinFilter = eparam;
214 ctx->NewState |= NEW_TEXTURING;
215 }
216 else {
217 gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
218 return;
219 }
220 break;
221 case GL_TEXTURE_MAG_FILTER:
222 if (eparam==GL_NEAREST || eparam==GL_LINEAR) {
223 texObj->MagFilter = eparam;
224 ctx->NewState |= NEW_TEXTURING;
225 }
226 else {
227 gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
228 return;
229 }
230 break;
231 case GL_TEXTURE_WRAP_S:
232 if (eparam==GL_CLAMP || eparam==GL_REPEAT) {
233 texObj->WrapS = eparam;
234 }
235 else {
236 gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
237 return;
238 }
239 break;
240 case GL_TEXTURE_WRAP_T:
241 if (eparam==GL_CLAMP || eparam==GL_REPEAT) {
242 texObj->WrapT = eparam;
243 }
244 else {
245 gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
246 return;
247 }
248 break;
249 case GL_TEXTURE_WRAP_R_EXT:
250 if (eparam==GL_CLAMP || eparam==GL_REPEAT) {
251 texObj->WrapR = eparam;
252 }
253 else {
254 gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
255 }
256 break;
257 case GL_TEXTURE_BORDER_COLOR:
258 texObj->BorderColor[0] = CLAMP((GLint)(params[0]*255.0), 0, 255);
259 texObj->BorderColor[1] = CLAMP((GLint)(params[1]*255.0), 0, 255);
260 texObj->BorderColor[2] = CLAMP((GLint)(params[2]*255.0), 0, 255);
261 texObj->BorderColor[3] = CLAMP((GLint)(params[3]*255.0), 0, 255);
262 break;
263 default:
264 gl_error( ctx, GL_INVALID_ENUM, "glTexParameter(pname)" );
265 return;
266 }
267
268 texObj->Dirty = GL_TRUE;
269 ctx->Texture.AnyDirty = GL_TRUE;
270
271 if (ctx->Driver.TexParameter) {
272 (*ctx->Driver.TexParameter)( ctx, target, texObj, pname, params );
273 }
274 }
275
276
277
gl_GetTexLevelParameterfv(GLcontext * ctx,GLenum target,GLint level,GLenum pname,GLfloat * params)278 void gl_GetTexLevelParameterfv( GLcontext *ctx, GLenum target, GLint level,
279 GLenum pname, GLfloat *params )
280 {
281 GLint iparam;
282
283 gl_GetTexLevelParameteriv( ctx, target, level, pname, &iparam );
284 *params = (GLfloat) iparam;
285 }
286
287
288
gl_GetTexLevelParameteriv(GLcontext * ctx,GLenum target,GLint level,GLenum pname,GLint * params)289 void gl_GetTexLevelParameteriv( GLcontext *ctx, GLenum target, GLint level,
290 GLenum pname, GLint *params )
291 {
292 struct gl_texture_image *tex;
293
294 if (level<0 || level>=MAX_TEXTURE_LEVELS) {
295 gl_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" );
296 return;
297 }
298
299 switch (target) {
300 case GL_TEXTURE_1D:
301 tex = ctx->Texture.Current1D->Image[level];
302 switch (pname) {
303 case GL_TEXTURE_WIDTH:
304 *params = tex->Width;
305 break;
306 case GL_TEXTURE_COMPONENTS:
307 *params = tex->Format;
308 break;
309 case GL_TEXTURE_BORDER:
310 *params = tex->Border;
311 break;
312 case GL_TEXTURE_RED_SIZE:
313 case GL_TEXTURE_GREEN_SIZE:
314 case GL_TEXTURE_BLUE_SIZE:
315 case GL_TEXTURE_ALPHA_SIZE:
316 case GL_TEXTURE_INTENSITY_SIZE:
317 case GL_TEXTURE_LUMINANCE_SIZE:
318 *params = 8; /* 8-bits */
319 break;
320 case GL_TEXTURE_INDEX_SIZE_EXT:
321 *params = 8;
322 break;
323 default:
324 gl_error( ctx, GL_INVALID_ENUM,
325 "glGetTexLevelParameter[if]v(pname)" );
326 }
327 break;
328 case GL_TEXTURE_2D:
329 tex = ctx->Texture.Current2D->Image[level];
330 switch (pname) {
331 case GL_TEXTURE_WIDTH:
332 *params = tex->Width;
333 break;
334 case GL_TEXTURE_HEIGHT:
335 *params = tex->Height;
336 break;
337 case GL_TEXTURE_COMPONENTS:
338 *params = tex->Format;
339 break;
340 case GL_TEXTURE_BORDER:
341 *params = tex->Border;
342 break;
343 case GL_TEXTURE_RED_SIZE:
344 case GL_TEXTURE_GREEN_SIZE:
345 case GL_TEXTURE_BLUE_SIZE:
346 case GL_TEXTURE_ALPHA_SIZE:
347 case GL_TEXTURE_INTENSITY_SIZE:
348 case GL_TEXTURE_LUMINANCE_SIZE:
349 *params = 8; /* 8-bits */
350 break;
351 case GL_TEXTURE_INDEX_SIZE_EXT:
352 *params = 8;
353 break;
354 default:
355 gl_error( ctx, GL_INVALID_ENUM,
356 "glGetTexLevelParameter[if]v(pname)" );
357 }
358 break;
359 case GL_PROXY_TEXTURE_1D:
360 tex = ctx->Texture.Proxy1D->Image[level];
361 switch (pname) {
362 case GL_TEXTURE_WIDTH:
363 *params = tex->Width;
364 break;
365 case GL_TEXTURE_COMPONENTS:
366 *params = tex->Format;
367 break;
368 case GL_TEXTURE_BORDER:
369 *params = tex->Border;
370 break;
371 case GL_TEXTURE_RED_SIZE:
372 case GL_TEXTURE_GREEN_SIZE:
373 case GL_TEXTURE_BLUE_SIZE:
374 case GL_TEXTURE_ALPHA_SIZE:
375 case GL_TEXTURE_INTENSITY_SIZE:
376 case GL_TEXTURE_LUMINANCE_SIZE:
377 *params = 8; /* 8-bits */
378 break;
379 case GL_TEXTURE_INDEX_SIZE_EXT:
380 *params = 8;
381 break;
382 default:
383 gl_error( ctx, GL_INVALID_ENUM,
384 "glGetTexLevelParameter[if]v(pname)" );
385 }
386 break;
387 case GL_PROXY_TEXTURE_2D:
388 tex = ctx->Texture.Proxy2D->Image[level];
389 switch (pname) {
390 case GL_TEXTURE_WIDTH:
391 *params = tex->Width;
392 break;
393 case GL_TEXTURE_HEIGHT:
394 *params = tex->Height;
395 break;
396 case GL_TEXTURE_COMPONENTS:
397 *params = tex->Format;
398 break;
399 case GL_TEXTURE_BORDER:
400 *params = tex->Border;
401 break;
402 case GL_TEXTURE_RED_SIZE:
403 case GL_TEXTURE_GREEN_SIZE:
404 case GL_TEXTURE_BLUE_SIZE:
405 case GL_TEXTURE_ALPHA_SIZE:
406 case GL_TEXTURE_INTENSITY_SIZE:
407 case GL_TEXTURE_LUMINANCE_SIZE:
408 *params = 8; /* 8-bits */
409 break;
410 case GL_TEXTURE_INDEX_SIZE_EXT:
411 *params = 8;
412 break;
413 default:
414 gl_error( ctx, GL_INVALID_ENUM,
415 "glGetTexLevelParameter[if]v(pname)" );
416 }
417 break;
418 default:
419 gl_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)");
420 }
421 }
422
423
424
425
gl_GetTexParameterfv(GLcontext * ctx,GLenum target,GLenum pname,GLfloat * params)426 void gl_GetTexParameterfv( GLcontext *ctx,
427 GLenum target, GLenum pname, GLfloat *params )
428 {
429 switch (target) {
430 case GL_TEXTURE_1D:
431 switch (pname) {
432 case GL_TEXTURE_MAG_FILTER:
433 *params = ENUM_TO_FLOAT(ctx->Texture.Current1D->MagFilter);
434 break;
435 case GL_TEXTURE_MIN_FILTER:
436 *params = ENUM_TO_FLOAT(ctx->Texture.Current1D->MinFilter);
437 break;
438 case GL_TEXTURE_WRAP_S:
439 *params = ENUM_TO_FLOAT(ctx->Texture.Current1D->WrapS);
440 break;
441 case GL_TEXTURE_WRAP_T:
442 *params = ENUM_TO_FLOAT(ctx->Texture.Current1D->WrapT);
443 break;
444 case GL_TEXTURE_BORDER_COLOR:
445 params[0] = ctx->Texture.Current1D->BorderColor[0] / 255.0f;
446 params[1] = ctx->Texture.Current1D->BorderColor[1] / 255.0f;
447 params[2] = ctx->Texture.Current1D->BorderColor[2] / 255.0f;
448 params[3] = ctx->Texture.Current1D->BorderColor[3] / 255.0f;
449 break;
450 case GL_TEXTURE_RESIDENT:
451 *params = ENUM_TO_FLOAT(GL_TRUE);
452 break;
453 case GL_TEXTURE_PRIORITY:
454 *params = ctx->Texture.Current1D->Priority;
455 break;
456 default:
457 gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname)" );
458 }
459 break;
460 case GL_TEXTURE_2D:
461 switch (pname) {
462 case GL_TEXTURE_MAG_FILTER:
463 *params = ENUM_TO_FLOAT(ctx->Texture.Current2D->MagFilter);
464 break;
465 case GL_TEXTURE_MIN_FILTER:
466 *params = ENUM_TO_FLOAT(ctx->Texture.Current2D->MinFilter);
467 break;
468 case GL_TEXTURE_WRAP_S:
469 *params = ENUM_TO_FLOAT(ctx->Texture.Current2D->WrapS);
470 break;
471 case GL_TEXTURE_WRAP_T:
472 *params = ENUM_TO_FLOAT(ctx->Texture.Current2D->WrapT);
473 break;
474 case GL_TEXTURE_BORDER_COLOR:
475 params[0] = ctx->Texture.Current2D->BorderColor[0] / 255.0f;
476 params[1] = ctx->Texture.Current2D->BorderColor[1] / 255.0f;
477 params[2] = ctx->Texture.Current2D->BorderColor[2] / 255.0f;
478 params[3] = ctx->Texture.Current2D->BorderColor[3] / 255.0f;
479 break;
480 case GL_TEXTURE_RESIDENT:
481 *params = ENUM_TO_FLOAT(GL_TRUE);
482 break;
483 case GL_TEXTURE_PRIORITY:
484 *params = ctx->Texture.Current2D->Priority;
485 break;
486 default:
487 gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname)" );
488 }
489 break;
490 default:
491 gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameterfv(target)" );
492 }
493 }
494
495
gl_GetTexParameteriv(GLcontext * ctx,GLenum target,GLenum pname,GLint * params)496 void gl_GetTexParameteriv( GLcontext *ctx,
497 GLenum target, GLenum pname, GLint *params )
498 {
499 switch (target) {
500 case GL_TEXTURE_1D:
501 switch (pname) {
502 case GL_TEXTURE_MAG_FILTER:
503 *params = (GLint) ctx->Texture.Current1D->MagFilter;
504 break;
505 case GL_TEXTURE_MIN_FILTER:
506 *params = (GLint) ctx->Texture.Current1D->MinFilter;
507 break;
508 case GL_TEXTURE_WRAP_S:
509 *params = (GLint) ctx->Texture.Current1D->WrapS;
510 break;
511 case GL_TEXTURE_WRAP_T:
512 *params = (GLint) ctx->Texture.Current1D->WrapT;
513 break;
514 case GL_TEXTURE_BORDER_COLOR:
515 {
516 GLfloat color[4];
517 color[0] = ctx->Texture.Current1D->BorderColor[0]/255.0;
518 color[1] = ctx->Texture.Current1D->BorderColor[1]/255.0;
519 color[2] = ctx->Texture.Current1D->BorderColor[2]/255.0;
520 color[3] = ctx->Texture.Current1D->BorderColor[3]/255.0;
521 params[0] = FLOAT_TO_INT( color[0] );
522 params[1] = FLOAT_TO_INT( color[1] );
523 params[2] = FLOAT_TO_INT( color[2] );
524 params[3] = FLOAT_TO_INT( color[3] );
525 }
526 break;
527 case GL_TEXTURE_RESIDENT:
528 *params = (GLint) GL_TRUE;
529 break;
530 case GL_TEXTURE_PRIORITY:
531 *params = (GLint) ctx->Texture.Current1D->Priority;
532 break;
533 default:
534 gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname)" );
535 }
536 break;
537 case GL_TEXTURE_2D:
538 switch (pname) {
539 case GL_TEXTURE_MAG_FILTER:
540 *params = (GLint) ctx->Texture.Current2D->MagFilter;
541 break;
542 case GL_TEXTURE_MIN_FILTER:
543 *params = (GLint) ctx->Texture.Current2D->MinFilter;
544 break;
545 case GL_TEXTURE_WRAP_S:
546 *params = (GLint) ctx->Texture.Current2D->WrapS;
547 break;
548 case GL_TEXTURE_WRAP_T:
549 *params = (GLint) ctx->Texture.Current2D->WrapT;
550 break;
551 case GL_TEXTURE_BORDER_COLOR:
552 {
553 GLfloat color[4];
554 color[0] = ctx->Texture.Current2D->BorderColor[0]/255.0;
555 color[1] = ctx->Texture.Current2D->BorderColor[1]/255.0;
556 color[2] = ctx->Texture.Current2D->BorderColor[2]/255.0;
557 color[3] = ctx->Texture.Current2D->BorderColor[3]/255.0;
558 params[0] = FLOAT_TO_INT( color[0] );
559 params[1] = FLOAT_TO_INT( color[1] );
560 params[2] = FLOAT_TO_INT( color[2] );
561 params[3] = FLOAT_TO_INT( color[3] );
562 }
563 break;
564 case GL_TEXTURE_RESIDENT:
565 *params = (GLint) GL_TRUE;
566 break;
567 case GL_TEXTURE_PRIORITY:
568 *params = (GLint) ctx->Texture.Current2D->Priority;
569 break;
570 default:
571 gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname)" );
572 }
573 break;
574 default:
575 gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameteriv(target)" );
576 }
577 }
578
579
580
581
582 /**********************************************************************/
583 /* Texture Coord Generation */
584 /**********************************************************************/
585
586
gl_TexGenfv(GLcontext * ctx,GLenum coord,GLenum pname,const GLfloat * params)587 void gl_TexGenfv( GLcontext *ctx,
588 GLenum coord, GLenum pname, const GLfloat *params )
589 {
590 if (INSIDE_BEGIN_END(ctx)) {
591 gl_error( ctx, GL_INVALID_OPERATION, "glTexGenfv" );
592 return;
593 }
594
595 switch( coord ) {
596 case GL_S:
597 if (pname==GL_TEXTURE_GEN_MODE) {
598 GLenum mode = (GLenum) (GLint) *params;
599 if (mode==GL_OBJECT_LINEAR ||
600 mode==GL_EYE_LINEAR ||
601 mode==GL_SPHERE_MAP) {
602 ctx->Texture.GenModeS = mode;
603 }
604 else {
605 gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
606 return;
607 }
608 }
609 else if (pname==GL_OBJECT_PLANE) {
610 ctx->Texture.ObjectPlaneS[0] = params[0];
611 ctx->Texture.ObjectPlaneS[1] = params[1];
612 ctx->Texture.ObjectPlaneS[2] = params[2];
613 ctx->Texture.ObjectPlaneS[3] = params[3];
614 }
615 else if (pname==GL_EYE_PLANE) {
616 /* Transform plane equation by the inverse modelview matrix */
617 if (ctx->NewModelViewMatrix) {
618 gl_analyze_modelview_matrix(ctx);
619 }
620 gl_transform_vector( ctx->Texture.EyePlaneS, params,
621 ctx->ModelViewInv );
622 }
623 else {
624 gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
625 return;
626 }
627 break;
628 case GL_T:
629 if (pname==GL_TEXTURE_GEN_MODE) {
630 GLenum mode = (GLenum) (GLint) *params;
631 if (mode==GL_OBJECT_LINEAR ||
632 mode==GL_EYE_LINEAR ||
633 mode==GL_SPHERE_MAP) {
634 ctx->Texture.GenModeT = mode;
635 }
636 else {
637 gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
638 return;
639 }
640 }
641 else if (pname==GL_OBJECT_PLANE) {
642 ctx->Texture.ObjectPlaneT[0] = params[0];
643 ctx->Texture.ObjectPlaneT[1] = params[1];
644 ctx->Texture.ObjectPlaneT[2] = params[2];
645 ctx->Texture.ObjectPlaneT[3] = params[3];
646 }
647 else if (pname==GL_EYE_PLANE) {
648 /* Transform plane equation by the inverse modelview matrix */
649 if (ctx->NewModelViewMatrix) {
650 gl_analyze_modelview_matrix(ctx);
651 }
652 gl_transform_vector( ctx->Texture.EyePlaneT, params,
653 ctx->ModelViewInv );
654 }
655 else {
656 gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
657 return;
658 }
659 break;
660 case GL_R:
661 if (pname==GL_TEXTURE_GEN_MODE) {
662 GLenum mode = (GLenum) (GLint) *params;
663 if (mode==GL_OBJECT_LINEAR ||
664 mode==GL_EYE_LINEAR) {
665 ctx->Texture.GenModeR = mode;
666 }
667 else {
668 gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
669 return;
670 }
671 }
672 else if (pname==GL_OBJECT_PLANE) {
673 ctx->Texture.ObjectPlaneR[0] = params[0];
674 ctx->Texture.ObjectPlaneR[1] = params[1];
675 ctx->Texture.ObjectPlaneR[2] = params[2];
676 ctx->Texture.ObjectPlaneR[3] = params[3];
677 }
678 else if (pname==GL_EYE_PLANE) {
679 /* Transform plane equation by the inverse modelview matrix */
680 if (ctx->NewModelViewMatrix) {
681 gl_analyze_modelview_matrix(ctx);
682 }
683 gl_transform_vector( ctx->Texture.EyePlaneR, params,
684 ctx->ModelViewInv );
685 }
686 else {
687 gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
688 return;
689 }
690 break;
691 case GL_Q:
692 if (pname==GL_TEXTURE_GEN_MODE) {
693 GLenum mode = (GLenum) (GLint) *params;
694 if (mode==GL_OBJECT_LINEAR ||
695 mode==GL_EYE_LINEAR) {
696 ctx->Texture.GenModeQ = mode;
697 }
698 else {
699 gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
700 return;
701 }
702 }
703 else if (pname==GL_OBJECT_PLANE) {
704 ctx->Texture.ObjectPlaneQ[0] = params[0];
705 ctx->Texture.ObjectPlaneQ[1] = params[1];
706 ctx->Texture.ObjectPlaneQ[2] = params[2];
707 ctx->Texture.ObjectPlaneQ[3] = params[3];
708 }
709 else if (pname==GL_EYE_PLANE) {
710 /* Transform plane equation by the inverse modelview matrix */
711 if (ctx->NewModelViewMatrix) {
712 gl_analyze_modelview_matrix(ctx);
713 }
714 gl_transform_vector( ctx->Texture.EyePlaneQ, params,
715 ctx->ModelViewInv );
716 }
717 else {
718 gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
719 return;
720 }
721 break;
722 default:
723 gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(coord)" );
724 return;
725 }
726
727 ctx->NewState |= NEW_TEXTURING;
728 }
729
730
731
gl_GetTexGendv(GLcontext * ctx,GLenum coord,GLenum pname,GLdouble * params)732 void gl_GetTexGendv( GLcontext *ctx,
733 GLenum coord, GLenum pname, GLdouble *params )
734 {
735 if (INSIDE_BEGIN_END(ctx)) {
736 gl_error( ctx, GL_INVALID_OPERATION, "glGetTexGendv" );
737 return;
738 }
739
740 switch( coord ) {
741 case GL_S:
742 if (pname==GL_TEXTURE_GEN_MODE) {
743 params[0] = ENUM_TO_DOUBLE(ctx->Texture.GenModeS);
744 }
745 else if (pname==GL_OBJECT_PLANE) {
746 COPY_4V( params, ctx->Texture.ObjectPlaneS );
747 }
748 else if (pname==GL_EYE_PLANE) {
749 COPY_4V( params, ctx->Texture.EyePlaneS );
750 }
751 else {
752 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
753 return;
754 }
755 break;
756 case GL_T:
757 if (pname==GL_TEXTURE_GEN_MODE) {
758 params[0] = ENUM_TO_DOUBLE(ctx->Texture.GenModeT);
759 }
760 else if (pname==GL_OBJECT_PLANE) {
761 COPY_4V( params, ctx->Texture.ObjectPlaneT );
762 }
763 else if (pname==GL_EYE_PLANE) {
764 COPY_4V( params, ctx->Texture.EyePlaneT );
765 }
766 else {
767 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
768 return;
769 }
770 break;
771 case GL_R:
772 if (pname==GL_TEXTURE_GEN_MODE) {
773 params[0] = ENUM_TO_DOUBLE(ctx->Texture.GenModeR);
774 }
775 else if (pname==GL_OBJECT_PLANE) {
776 COPY_4V( params, ctx->Texture.ObjectPlaneR );
777 }
778 else if (pname==GL_EYE_PLANE) {
779 COPY_4V( params, ctx->Texture.EyePlaneR );
780 }
781 else {
782 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
783 return;
784 }
785 break;
786 case GL_Q:
787 if (pname==GL_TEXTURE_GEN_MODE) {
788 params[0] = ENUM_TO_DOUBLE(ctx->Texture.GenModeQ);
789 }
790 else if (pname==GL_OBJECT_PLANE) {
791 COPY_4V( params, ctx->Texture.ObjectPlaneQ );
792 }
793 else if (pname==GL_EYE_PLANE) {
794 COPY_4V( params, ctx->Texture.EyePlaneQ );
795 }
796 else {
797 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
798 return;
799 }
800 break;
801 default:
802 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(coord)" );
803 return;
804 }
805 }
806
807
808
gl_GetTexGenfv(GLcontext * ctx,GLenum coord,GLenum pname,GLfloat * params)809 void gl_GetTexGenfv( GLcontext *ctx,
810 GLenum coord, GLenum pname, GLfloat *params )
811 {
812 if (INSIDE_BEGIN_END(ctx)) {
813 gl_error( ctx, GL_INVALID_OPERATION, "glGetTexGenfv" );
814 return;
815 }
816
817 switch( coord ) {
818 case GL_S:
819 if (pname==GL_TEXTURE_GEN_MODE) {
820 params[0] = ENUM_TO_FLOAT(ctx->Texture.GenModeS);
821 }
822 else if (pname==GL_OBJECT_PLANE) {
823 COPY_4V( params, ctx->Texture.ObjectPlaneS );
824 }
825 else if (pname==GL_EYE_PLANE) {
826 COPY_4V( params, ctx->Texture.EyePlaneS );
827 }
828 else {
829 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
830 return;
831 }
832 break;
833 case GL_T:
834 if (pname==GL_TEXTURE_GEN_MODE) {
835 params[0] = ENUM_TO_FLOAT(ctx->Texture.GenModeT);
836 }
837 else if (pname==GL_OBJECT_PLANE) {
838 COPY_4V( params, ctx->Texture.ObjectPlaneT );
839 }
840 else if (pname==GL_EYE_PLANE) {
841 COPY_4V( params, ctx->Texture.EyePlaneT );
842 }
843 else {
844 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
845 return;
846 }
847 break;
848 case GL_R:
849 if (pname==GL_TEXTURE_GEN_MODE) {
850 params[0] = ENUM_TO_FLOAT(ctx->Texture.GenModeR);
851 }
852 else if (pname==GL_OBJECT_PLANE) {
853 COPY_4V( params, ctx->Texture.ObjectPlaneR );
854 }
855 else if (pname==GL_EYE_PLANE) {
856 COPY_4V( params, ctx->Texture.EyePlaneR );
857 }
858 else {
859 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
860 return;
861 }
862 break;
863 case GL_Q:
864 if (pname==GL_TEXTURE_GEN_MODE) {
865 params[0] = ENUM_TO_FLOAT(ctx->Texture.GenModeQ);
866 }
867 else if (pname==GL_OBJECT_PLANE) {
868 COPY_4V( params, ctx->Texture.ObjectPlaneQ );
869 }
870 else if (pname==GL_EYE_PLANE) {
871 COPY_4V( params, ctx->Texture.EyePlaneQ );
872 }
873 else {
874 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
875 return;
876 }
877 break;
878 default:
879 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(coord)" );
880 return;
881 }
882 }
883
884
885
gl_GetTexGeniv(GLcontext * ctx,GLenum coord,GLenum pname,GLint * params)886 void gl_GetTexGeniv( GLcontext *ctx,
887 GLenum coord, GLenum pname, GLint *params )
888 {
889 if (INSIDE_BEGIN_END(ctx)) {
890 gl_error( ctx, GL_INVALID_OPERATION, "glGetTexGeniv" );
891 return;
892 }
893
894 switch( coord ) {
895 case GL_S:
896 if (pname==GL_TEXTURE_GEN_MODE) {
897 params[0] = ctx->Texture.GenModeS;
898 }
899 else if (pname==GL_OBJECT_PLANE) {
900 COPY_4V( params, ctx->Texture.ObjectPlaneS );
901 }
902 else if (pname==GL_EYE_PLANE) {
903 COPY_4V( params, ctx->Texture.EyePlaneS );
904 }
905 else {
906 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
907 return;
908 }
909 break;
910 case GL_T:
911 if (pname==GL_TEXTURE_GEN_MODE) {
912 params[0] = ctx->Texture.GenModeT;
913 }
914 else if (pname==GL_OBJECT_PLANE) {
915 COPY_4V( params, ctx->Texture.ObjectPlaneT );
916 }
917 else if (pname==GL_EYE_PLANE) {
918 COPY_4V( params, ctx->Texture.EyePlaneT );
919 }
920 else {
921 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
922 return;
923 }
924 break;
925 case GL_R:
926 if (pname==GL_TEXTURE_GEN_MODE) {
927 params[0] = ctx->Texture.GenModeR;
928 }
929 else if (pname==GL_OBJECT_PLANE) {
930 COPY_4V( params, ctx->Texture.ObjectPlaneR );
931 }
932 else if (pname==GL_EYE_PLANE) {
933 COPY_4V( params, ctx->Texture.EyePlaneR );
934 }
935 else {
936 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
937 return;
938 }
939 break;
940 case GL_Q:
941 if (pname==GL_TEXTURE_GEN_MODE) {
942 params[0] = ctx->Texture.GenModeQ;
943 }
944 else if (pname==GL_OBJECT_PLANE) {
945 COPY_4V( params, ctx->Texture.ObjectPlaneQ );
946 }
947 else if (pname==GL_EYE_PLANE) {
948 COPY_4V( params, ctx->Texture.EyePlaneQ );
949 }
950 else {
951 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
952 return;
953 }
954 break;
955 default:
956 gl_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(coord)" );
957 return;
958 }
959 }
960
961
962
963 /*
964 * This is called by gl_update_state() if the NEW_TEXTURING bit in
965 * ctx->NewState is set.
966 */
gl_update_texture_state(GLcontext * ctx)967 void gl_update_texture_state( GLcontext *ctx )
968 {
969 struct gl_texture_object *t;
970
971 if (ctx->Texture.Enabled & TEXTURE_2D)
972 ctx->Texture.Current = ctx->Texture.Current2D;
973 else if (ctx->Texture.Enabled & TEXTURE_1D)
974 ctx->Texture.Current = ctx->Texture.Current1D;
975 else
976 ctx->Texture.Current = NULL;
977
978 if (ctx->Texture.AnyDirty) {
979 for (t = ctx->Shared->TexObjectList; t; t = t->Next) {
980 if (t->Dirty) {
981 gl_test_texture_object_completeness(t);
982 gl_set_texture_sampler(t);
983 t->Dirty = GL_FALSE;
984 }
985 }
986 ctx->Texture.AnyDirty = GL_FALSE;
987 }
988 }
989