eval.c revision 22144ab7552f0799bcfca506bf4ffa7f70a06649
1/* $Id: eval.c,v 1.19 2001/03/12 00:48:37 gareth Exp $ */ 2 3/* 4 * Mesa 3-D graphics library 5 * Version: 3.5 6 * 7 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a 10 * copy of this software and associated documentation files (the "Software"), 11 * to deal in the Software without restriction, including without limitation 12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 * and/or sell copies of the Software, and to permit persons to whom the 14 * Software is furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice shall be included 17 * in all copies or substantial portions of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 */ 26 27 28/* 29 * eval.c was written by 30 * Bernd Barsuhn (bdbarsuh@cip.informatik.uni-erlangen.de) and 31 * Volker Weiss (vrweiss@cip.informatik.uni-erlangen.de). 32 * 33 * My original implementation of evaluators was simplistic and didn't 34 * compute surface normal vectors properly. Bernd and Volker applied 35 * used more sophisticated methods to get better results. 36 * 37 * Thanks guys! 38 */ 39 40 41#ifdef PC_HEADER 42#include "all.h" 43#else 44#include "glheader.h" 45#include "colormac.h" 46#include "context.h" 47#include "eval.h" 48#include "macros.h" 49#include "mem.h" 50#include "mmath.h" 51#include "mtypes.h" 52#endif 53 54 55/* 56 * Return the number of components per control point for any type of 57 * evaluator. Return 0 if bad target. 58 * See table 5.1 in the OpenGL 1.2 spec. 59 */ 60GLuint _mesa_evaluator_components( GLenum target ) 61{ 62 switch (target) { 63 case GL_MAP1_VERTEX_3: return 3; 64 case GL_MAP1_VERTEX_4: return 4; 65 case GL_MAP1_INDEX: return 1; 66 case GL_MAP1_COLOR_4: return 4; 67 case GL_MAP1_NORMAL: return 3; 68 case GL_MAP1_TEXTURE_COORD_1: return 1; 69 case GL_MAP1_TEXTURE_COORD_2: return 2; 70 case GL_MAP1_TEXTURE_COORD_3: return 3; 71 case GL_MAP1_TEXTURE_COORD_4: return 4; 72 case GL_MAP2_VERTEX_3: return 3; 73 case GL_MAP2_VERTEX_4: return 4; 74 case GL_MAP2_INDEX: return 1; 75 case GL_MAP2_COLOR_4: return 4; 76 case GL_MAP2_NORMAL: return 3; 77 case GL_MAP2_TEXTURE_COORD_1: return 1; 78 case GL_MAP2_TEXTURE_COORD_2: return 2; 79 case GL_MAP2_TEXTURE_COORD_3: return 3; 80 case GL_MAP2_TEXTURE_COORD_4: return 4; 81 default: return 0; 82 } 83} 84 85 86/**********************************************************************/ 87/*** Copy and deallocate control points ***/ 88/**********************************************************************/ 89 90 91/* 92 * Copy 1-parametric evaluator control points from user-specified 93 * memory space to a buffer of contiguous control points. 94 * Input: see glMap1f for details 95 * Return: pointer to buffer of contiguous control points or NULL if out 96 * of memory. 97 */ 98GLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder, 99 const GLfloat *points ) 100{ 101 GLfloat *buffer, *p; 102 GLint i, k, size = _mesa_evaluator_components(target); 103 104 if (!points || size==0) { 105 return NULL; 106 } 107 108 buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat)); 109 110 if(buffer) 111 for(i=0, p=buffer; i<uorder; i++, points+=ustride) 112 for(k=0; k<size; k++) 113 *p++ = points[k]; 114 115 return buffer; 116} 117 118 119 120/* 121 * Same as above but convert doubles to floats. 122 */ 123GLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder, 124 const GLdouble *points ) 125{ 126 GLfloat *buffer, *p; 127 GLint i, k, size = _mesa_evaluator_components(target); 128 129 if (!points || size==0) { 130 return NULL; 131 } 132 133 buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat)); 134 135 if(buffer) 136 for(i=0, p=buffer; i<uorder; i++, points+=ustride) 137 for(k=0; k<size; k++) 138 *p++ = (GLfloat) points[k]; 139 140 return buffer; 141} 142 143 144 145/* 146 * Copy 2-parametric evaluator control points from user-specified 147 * memory space to a buffer of contiguous control points. 148 * Additional memory is allocated to be used by the horner and 149 * de Casteljau evaluation schemes. 150 * 151 * Input: see glMap2f for details 152 * Return: pointer to buffer of contiguous control points or NULL if out 153 * of memory. 154 */ 155GLfloat *_mesa_copy_map_points2f( GLenum target, 156 GLint ustride, GLint uorder, 157 GLint vstride, GLint vorder, 158 const GLfloat *points ) 159{ 160 GLfloat *buffer, *p; 161 GLint i, j, k, size, dsize, hsize; 162 GLint uinc; 163 164 size = _mesa_evaluator_components(target); 165 166 if (!points || size==0) { 167 return NULL; 168 } 169 170 /* max(uorder, vorder) additional points are used in */ 171 /* horner evaluation and uorder*vorder additional */ 172 /* values are needed for de Casteljau */ 173 dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder; 174 hsize = (uorder > vorder ? uorder : vorder)*size; 175 176 if(hsize>dsize) 177 buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat)); 178 else 179 buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat)); 180 181 /* compute the increment value for the u-loop */ 182 uinc = ustride - vorder*vstride; 183 184 if (buffer) 185 for (i=0, p=buffer; i<uorder; i++, points += uinc) 186 for (j=0; j<vorder; j++, points += vstride) 187 for (k=0; k<size; k++) 188 *p++ = points[k]; 189 190 return buffer; 191} 192 193 194 195/* 196 * Same as above but convert doubles to floats. 197 */ 198GLfloat *_mesa_copy_map_points2d(GLenum target, 199 GLint ustride, GLint uorder, 200 GLint vstride, GLint vorder, 201 const GLdouble *points ) 202{ 203 GLfloat *buffer, *p; 204 GLint i, j, k, size, hsize, dsize; 205 GLint uinc; 206 207 size = _mesa_evaluator_components(target); 208 209 if (!points || size==0) { 210 return NULL; 211 } 212 213 /* max(uorder, vorder) additional points are used in */ 214 /* horner evaluation and uorder*vorder additional */ 215 /* values are needed for de Casteljau */ 216 dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder; 217 hsize = (uorder > vorder ? uorder : vorder)*size; 218 219 if(hsize>dsize) 220 buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat)); 221 else 222 buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat)); 223 224 /* compute the increment value for the u-loop */ 225 uinc = ustride - vorder*vstride; 226 227 if (buffer) 228 for (i=0, p=buffer; i<uorder; i++, points += uinc) 229 for (j=0; j<vorder; j++, points += vstride) 230 for (k=0; k<size; k++) 231 *p++ = (GLfloat) points[k]; 232 233 return buffer; 234} 235 236 237 238 239/**********************************************************************/ 240/*** API entry points ***/ 241/**********************************************************************/ 242 243 244/* 245 * This does the work of glMap1[fd]. 246 */ 247static void 248map1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, 249 GLint uorder, const GLvoid *points, GLenum type ) 250{ 251 GET_CURRENT_CONTEXT(ctx); 252 GLint k; 253 GLfloat *pnts; 254 struct gl_1d_map *map = 0; 255 ASSERT_OUTSIDE_BEGIN_END(ctx); 256 257 assert(type == GL_FLOAT || type == GL_DOUBLE); 258 259 if (u1 == u2) { 260 _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" ); 261 return; 262 } 263 if (uorder < 1 || uorder > MAX_EVAL_ORDER) { 264 _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" ); 265 return; 266 } 267 if (!points) { 268 _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" ); 269 return; 270 } 271 272 k = _mesa_evaluator_components( target ); 273 if (k == 0) { 274 _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" ); 275 } 276 277 if (ustride < k) { 278 _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" ); 279 return; 280 } 281 282 switch (target) { 283 case GL_MAP1_VERTEX_3: 284 map = &ctx->EvalMap.Map1Vertex3; 285 break; 286 case GL_MAP1_VERTEX_4: 287 map = &ctx->EvalMap.Map1Vertex4; 288 break; 289 case GL_MAP1_INDEX: 290 map = &ctx->EvalMap.Map1Index; 291 break; 292 case GL_MAP1_COLOR_4: 293 map = &ctx->EvalMap.Map1Color4; 294 break; 295 case GL_MAP1_NORMAL: 296 map = &ctx->EvalMap.Map1Normal; 297 break; 298 case GL_MAP1_TEXTURE_COORD_1: 299 map = &ctx->EvalMap.Map1Texture1; 300 break; 301 case GL_MAP1_TEXTURE_COORD_2: 302 map = &ctx->EvalMap.Map1Texture2; 303 break; 304 case GL_MAP1_TEXTURE_COORD_3: 305 map = &ctx->EvalMap.Map1Texture3; 306 break; 307 case GL_MAP1_TEXTURE_COORD_4: 308 map = &ctx->EvalMap.Map1Texture4; 309 break; 310 default: 311 _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" ); 312 return; 313 } 314 315 /* make copy of the control points */ 316 if (type == GL_FLOAT) 317 pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points); 318 else 319 pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points); 320 321 322 FLUSH_VERTICES(ctx, _NEW_EVAL); 323 map->Order = uorder; 324 map->u1 = u1; 325 map->u2 = u2; 326 map->du = 1.0 / (u2 - u1); 327 if (map->Points) 328 FREE( map->Points ); 329 map->Points = pnts; 330} 331 332 333 334void 335_mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, 336 GLint order, const GLfloat *points ) 337{ 338 map1(target, u1, u2, stride, order, points, GL_FLOAT); 339} 340 341 342void 343_mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, 344 GLint order, const GLdouble *points ) 345{ 346 map1(target, u1, u2, stride, order, points, GL_DOUBLE); 347} 348 349 350static void 351map2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, 352 GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, 353 const GLvoid *points, GLenum type ) 354{ 355 GET_CURRENT_CONTEXT(ctx); 356 GLint k; 357 GLfloat *pnts; 358 struct gl_2d_map *map = 0; 359 ASSERT_OUTSIDE_BEGIN_END(ctx); 360 361 if (u1==u2) { 362 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" ); 363 return; 364 } 365 366 if (v1==v2) { 367 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" ); 368 return; 369 } 370 371 if (uorder<1 || uorder>MAX_EVAL_ORDER) { 372 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" ); 373 return; 374 } 375 376 if (vorder<1 || vorder>MAX_EVAL_ORDER) { 377 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" ); 378 return; 379 } 380 381 k = _mesa_evaluator_components( target ); 382 if (k==0) { 383 _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" ); 384 } 385 386 if (ustride < k) { 387 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" ); 388 return; 389 } 390 if (vstride < k) { 391 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" ); 392 return; 393 } 394 395 switch (target) { 396 case GL_MAP2_VERTEX_3: 397 map = &ctx->EvalMap.Map2Vertex3; 398 break; 399 case GL_MAP2_VERTEX_4: 400 map = &ctx->EvalMap.Map2Vertex4; 401 break; 402 case GL_MAP2_INDEX: 403 map = &ctx->EvalMap.Map2Index; 404 break; 405 case GL_MAP2_COLOR_4: 406 map = &ctx->EvalMap.Map2Color4; 407 break; 408 case GL_MAP2_NORMAL: 409 map = &ctx->EvalMap.Map2Normal; 410 break; 411 case GL_MAP2_TEXTURE_COORD_1: 412 map = &ctx->EvalMap.Map2Texture1; 413 break; 414 case GL_MAP2_TEXTURE_COORD_2: 415 map = &ctx->EvalMap.Map2Texture2; 416 break; 417 case GL_MAP2_TEXTURE_COORD_3: 418 map = &ctx->EvalMap.Map2Texture3; 419 break; 420 case GL_MAP2_TEXTURE_COORD_4: 421 map = &ctx->EvalMap.Map2Texture4; 422 break; 423 default: 424 _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" ); 425 return; 426 } 427 428 /* make copy of the control points */ 429 if (type == GL_FLOAT) 430 pnts = _mesa_copy_map_points2f(target, ustride, uorder, 431 vstride, vorder, (GLfloat*) points); 432 else 433 pnts = _mesa_copy_map_points2d(target, ustride, uorder, 434 vstride, vorder, (GLdouble*) points); 435 436 437 FLUSH_VERTICES(ctx, _NEW_EVAL); 438 map->Uorder = uorder; 439 map->u1 = u1; 440 map->u2 = u2; 441 map->du = 1.0 / (u2 - u1); 442 map->Vorder = vorder; 443 map->v1 = v1; 444 map->v2 = v2; 445 map->dv = 1.0 / (v2 - v1); 446 if (map->Points) 447 FREE( map->Points ); 448 map->Points = pnts; 449} 450 451 452void 453_mesa_Map2f( GLenum target, 454 GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, 455 GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, 456 const GLfloat *points) 457{ 458 map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, 459 points, GL_FLOAT); 460} 461 462 463void 464_mesa_Map2d( GLenum target, 465 GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, 466 GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, 467 const GLdouble *points ) 468{ 469 map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, 470 points, GL_DOUBLE); 471} 472 473 474 475void 476_mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v ) 477{ 478 GET_CURRENT_CONTEXT(ctx); 479 GLint i, n; 480 GLfloat *data; 481 ASSERT_OUTSIDE_BEGIN_END(ctx); 482 483 switch (query) { 484 case GL_COEFF: 485 switch (target) { 486 case GL_MAP1_COLOR_4: 487 data = ctx->EvalMap.Map1Color4.Points; 488 n = ctx->EvalMap.Map1Color4.Order * 4; 489 break; 490 case GL_MAP1_INDEX: 491 data = ctx->EvalMap.Map1Index.Points; 492 n = ctx->EvalMap.Map1Index.Order; 493 break; 494 case GL_MAP1_NORMAL: 495 data = ctx->EvalMap.Map1Normal.Points; 496 n = ctx->EvalMap.Map1Normal.Order * 3; 497 break; 498 case GL_MAP1_TEXTURE_COORD_1: 499 data = ctx->EvalMap.Map1Texture1.Points; 500 n = ctx->EvalMap.Map1Texture1.Order * 1; 501 break; 502 case GL_MAP1_TEXTURE_COORD_2: 503 data = ctx->EvalMap.Map1Texture2.Points; 504 n = ctx->EvalMap.Map1Texture2.Order * 2; 505 break; 506 case GL_MAP1_TEXTURE_COORD_3: 507 data = ctx->EvalMap.Map1Texture3.Points; 508 n = ctx->EvalMap.Map1Texture3.Order * 3; 509 break; 510 case GL_MAP1_TEXTURE_COORD_4: 511 data = ctx->EvalMap.Map1Texture4.Points; 512 n = ctx->EvalMap.Map1Texture4.Order * 4; 513 break; 514 case GL_MAP1_VERTEX_3: 515 data = ctx->EvalMap.Map1Vertex3.Points; 516 n = ctx->EvalMap.Map1Vertex3.Order * 3; 517 break; 518 case GL_MAP1_VERTEX_4: 519 data = ctx->EvalMap.Map1Vertex4.Points; 520 n = ctx->EvalMap.Map1Vertex4.Order * 4; 521 break; 522 case GL_MAP2_COLOR_4: 523 data = ctx->EvalMap.Map2Color4.Points; 524 n = ctx->EvalMap.Map2Color4.Uorder 525 * ctx->EvalMap.Map2Color4.Vorder * 4; 526 break; 527 case GL_MAP2_INDEX: 528 data = ctx->EvalMap.Map2Index.Points; 529 n = ctx->EvalMap.Map2Index.Uorder 530 * ctx->EvalMap.Map2Index.Vorder; 531 break; 532 case GL_MAP2_NORMAL: 533 data = ctx->EvalMap.Map2Normal.Points; 534 n = ctx->EvalMap.Map2Normal.Uorder 535 * ctx->EvalMap.Map2Normal.Vorder * 3; 536 break; 537 case GL_MAP2_TEXTURE_COORD_1: 538 data = ctx->EvalMap.Map2Texture1.Points; 539 n = ctx->EvalMap.Map2Texture1.Uorder 540 * ctx->EvalMap.Map2Texture1.Vorder * 1; 541 break; 542 case GL_MAP2_TEXTURE_COORD_2: 543 data = ctx->EvalMap.Map2Texture2.Points; 544 n = ctx->EvalMap.Map2Texture2.Uorder 545 * ctx->EvalMap.Map2Texture2.Vorder * 2; 546 break; 547 case GL_MAP2_TEXTURE_COORD_3: 548 data = ctx->EvalMap.Map2Texture3.Points; 549 n = ctx->EvalMap.Map2Texture3.Uorder 550 * ctx->EvalMap.Map2Texture3.Vorder * 3; 551 break; 552 case GL_MAP2_TEXTURE_COORD_4: 553 data = ctx->EvalMap.Map2Texture4.Points; 554 n = ctx->EvalMap.Map2Texture4.Uorder 555 * ctx->EvalMap.Map2Texture4.Vorder * 4; 556 break; 557 case GL_MAP2_VERTEX_3: 558 data = ctx->EvalMap.Map2Vertex3.Points; 559 n = ctx->EvalMap.Map2Vertex3.Uorder 560 * ctx->EvalMap.Map2Vertex3.Vorder * 3; 561 break; 562 case GL_MAP2_VERTEX_4: 563 data = ctx->EvalMap.Map2Vertex4.Points; 564 n = ctx->EvalMap.Map2Vertex4.Uorder 565 * ctx->EvalMap.Map2Vertex4.Vorder * 4; 566 break; 567 default: 568 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" ); 569 return; 570 } 571 if (data) { 572 for (i=0;i<n;i++) { 573 v[i] = data[i]; 574 } 575 } 576 break; 577 case GL_ORDER: 578 switch (target) { 579 case GL_MAP1_COLOR_4: 580 *v = ctx->EvalMap.Map1Color4.Order; 581 break; 582 case GL_MAP1_INDEX: 583 *v = ctx->EvalMap.Map1Index.Order; 584 break; 585 case GL_MAP1_NORMAL: 586 *v = ctx->EvalMap.Map1Normal.Order; 587 break; 588 case GL_MAP1_TEXTURE_COORD_1: 589 *v = ctx->EvalMap.Map1Texture1.Order; 590 break; 591 case GL_MAP1_TEXTURE_COORD_2: 592 *v = ctx->EvalMap.Map1Texture2.Order; 593 break; 594 case GL_MAP1_TEXTURE_COORD_3: 595 *v = ctx->EvalMap.Map1Texture3.Order; 596 break; 597 case GL_MAP1_TEXTURE_COORD_4: 598 *v = ctx->EvalMap.Map1Texture4.Order; 599 break; 600 case GL_MAP1_VERTEX_3: 601 *v = ctx->EvalMap.Map1Vertex3.Order; 602 break; 603 case GL_MAP1_VERTEX_4: 604 *v = ctx->EvalMap.Map1Vertex4.Order; 605 break; 606 case GL_MAP2_COLOR_4: 607 v[0] = ctx->EvalMap.Map2Color4.Uorder; 608 v[1] = ctx->EvalMap.Map2Color4.Vorder; 609 break; 610 case GL_MAP2_INDEX: 611 v[0] = ctx->EvalMap.Map2Index.Uorder; 612 v[1] = ctx->EvalMap.Map2Index.Vorder; 613 break; 614 case GL_MAP2_NORMAL: 615 v[0] = ctx->EvalMap.Map2Normal.Uorder; 616 v[1] = ctx->EvalMap.Map2Normal.Vorder; 617 break; 618 case GL_MAP2_TEXTURE_COORD_1: 619 v[0] = ctx->EvalMap.Map2Texture1.Uorder; 620 v[1] = ctx->EvalMap.Map2Texture1.Vorder; 621 break; 622 case GL_MAP2_TEXTURE_COORD_2: 623 v[0] = ctx->EvalMap.Map2Texture2.Uorder; 624 v[1] = ctx->EvalMap.Map2Texture2.Vorder; 625 break; 626 case GL_MAP2_TEXTURE_COORD_3: 627 v[0] = ctx->EvalMap.Map2Texture3.Uorder; 628 v[1] = ctx->EvalMap.Map2Texture3.Vorder; 629 break; 630 case GL_MAP2_TEXTURE_COORD_4: 631 v[0] = ctx->EvalMap.Map2Texture4.Uorder; 632 v[1] = ctx->EvalMap.Map2Texture4.Vorder; 633 break; 634 case GL_MAP2_VERTEX_3: 635 v[0] = ctx->EvalMap.Map2Vertex3.Uorder; 636 v[1] = ctx->EvalMap.Map2Vertex3.Vorder; 637 break; 638 case GL_MAP2_VERTEX_4: 639 v[0] = ctx->EvalMap.Map2Vertex4.Uorder; 640 v[1] = ctx->EvalMap.Map2Vertex4.Vorder; 641 break; 642 default: 643 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" ); 644 return; 645 } 646 break; 647 case GL_DOMAIN: 648 switch (target) { 649 case GL_MAP1_COLOR_4: 650 v[0] = ctx->EvalMap.Map1Color4.u1; 651 v[1] = ctx->EvalMap.Map1Color4.u2; 652 break; 653 case GL_MAP1_INDEX: 654 v[0] = ctx->EvalMap.Map1Index.u1; 655 v[1] = ctx->EvalMap.Map1Index.u2; 656 break; 657 case GL_MAP1_NORMAL: 658 v[0] = ctx->EvalMap.Map1Normal.u1; 659 v[1] = ctx->EvalMap.Map1Normal.u2; 660 break; 661 case GL_MAP1_TEXTURE_COORD_1: 662 v[0] = ctx->EvalMap.Map1Texture1.u1; 663 v[1] = ctx->EvalMap.Map1Texture1.u2; 664 break; 665 case GL_MAP1_TEXTURE_COORD_2: 666 v[0] = ctx->EvalMap.Map1Texture2.u1; 667 v[1] = ctx->EvalMap.Map1Texture2.u2; 668 break; 669 case GL_MAP1_TEXTURE_COORD_3: 670 v[0] = ctx->EvalMap.Map1Texture3.u1; 671 v[1] = ctx->EvalMap.Map1Texture3.u2; 672 break; 673 case GL_MAP1_TEXTURE_COORD_4: 674 v[0] = ctx->EvalMap.Map1Texture4.u1; 675 v[1] = ctx->EvalMap.Map1Texture4.u2; 676 break; 677 case GL_MAP1_VERTEX_3: 678 v[0] = ctx->EvalMap.Map1Vertex3.u1; 679 v[1] = ctx->EvalMap.Map1Vertex3.u2; 680 break; 681 case GL_MAP1_VERTEX_4: 682 v[0] = ctx->EvalMap.Map1Vertex4.u1; 683 v[1] = ctx->EvalMap.Map1Vertex4.u2; 684 break; 685 case GL_MAP2_COLOR_4: 686 v[0] = ctx->EvalMap.Map2Color4.u1; 687 v[1] = ctx->EvalMap.Map2Color4.u2; 688 v[2] = ctx->EvalMap.Map2Color4.v1; 689 v[3] = ctx->EvalMap.Map2Color4.v2; 690 break; 691 case GL_MAP2_INDEX: 692 v[0] = ctx->EvalMap.Map2Index.u1; 693 v[1] = ctx->EvalMap.Map2Index.u2; 694 v[2] = ctx->EvalMap.Map2Index.v1; 695 v[3] = ctx->EvalMap.Map2Index.v2; 696 break; 697 case GL_MAP2_NORMAL: 698 v[0] = ctx->EvalMap.Map2Normal.u1; 699 v[1] = ctx->EvalMap.Map2Normal.u2; 700 v[2] = ctx->EvalMap.Map2Normal.v1; 701 v[3] = ctx->EvalMap.Map2Normal.v2; 702 break; 703 case GL_MAP2_TEXTURE_COORD_1: 704 v[0] = ctx->EvalMap.Map2Texture1.u1; 705 v[1] = ctx->EvalMap.Map2Texture1.u2; 706 v[2] = ctx->EvalMap.Map2Texture1.v1; 707 v[3] = ctx->EvalMap.Map2Texture1.v2; 708 break; 709 case GL_MAP2_TEXTURE_COORD_2: 710 v[0] = ctx->EvalMap.Map2Texture2.u1; 711 v[1] = ctx->EvalMap.Map2Texture2.u2; 712 v[2] = ctx->EvalMap.Map2Texture2.v1; 713 v[3] = ctx->EvalMap.Map2Texture2.v2; 714 break; 715 case GL_MAP2_TEXTURE_COORD_3: 716 v[0] = ctx->EvalMap.Map2Texture3.u1; 717 v[1] = ctx->EvalMap.Map2Texture3.u2; 718 v[2] = ctx->EvalMap.Map2Texture3.v1; 719 v[3] = ctx->EvalMap.Map2Texture3.v2; 720 break; 721 case GL_MAP2_TEXTURE_COORD_4: 722 v[0] = ctx->EvalMap.Map2Texture4.u1; 723 v[1] = ctx->EvalMap.Map2Texture4.u2; 724 v[2] = ctx->EvalMap.Map2Texture4.v1; 725 v[3] = ctx->EvalMap.Map2Texture4.v2; 726 break; 727 case GL_MAP2_VERTEX_3: 728 v[0] = ctx->EvalMap.Map2Vertex3.u1; 729 v[1] = ctx->EvalMap.Map2Vertex3.u2; 730 v[2] = ctx->EvalMap.Map2Vertex3.v1; 731 v[3] = ctx->EvalMap.Map2Vertex3.v2; 732 break; 733 case GL_MAP2_VERTEX_4: 734 v[0] = ctx->EvalMap.Map2Vertex4.u1; 735 v[1] = ctx->EvalMap.Map2Vertex4.u2; 736 v[2] = ctx->EvalMap.Map2Vertex4.v1; 737 v[3] = ctx->EvalMap.Map2Vertex4.v2; 738 break; 739 default: 740 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" ); 741 } 742 break; 743 default: 744 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" ); 745 } 746} 747 748 749void 750_mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v ) 751{ 752 GET_CURRENT_CONTEXT(ctx); 753 GLint i, n; 754 GLfloat *data; 755 ASSERT_OUTSIDE_BEGIN_END(ctx); 756 757 switch (query) { 758 case GL_COEFF: 759 switch (target) { 760 case GL_MAP1_COLOR_4: 761 data = ctx->EvalMap.Map1Color4.Points; 762 n = ctx->EvalMap.Map1Color4.Order * 4; 763 break; 764 case GL_MAP1_INDEX: 765 data = ctx->EvalMap.Map1Index.Points; 766 n = ctx->EvalMap.Map1Index.Order; 767 break; 768 case GL_MAP1_NORMAL: 769 data = ctx->EvalMap.Map1Normal.Points; 770 n = ctx->EvalMap.Map1Normal.Order * 3; 771 break; 772 case GL_MAP1_TEXTURE_COORD_1: 773 data = ctx->EvalMap.Map1Texture1.Points; 774 n = ctx->EvalMap.Map1Texture1.Order * 1; 775 break; 776 case GL_MAP1_TEXTURE_COORD_2: 777 data = ctx->EvalMap.Map1Texture2.Points; 778 n = ctx->EvalMap.Map1Texture2.Order * 2; 779 break; 780 case GL_MAP1_TEXTURE_COORD_3: 781 data = ctx->EvalMap.Map1Texture3.Points; 782 n = ctx->EvalMap.Map1Texture3.Order * 3; 783 break; 784 case GL_MAP1_TEXTURE_COORD_4: 785 data = ctx->EvalMap.Map1Texture4.Points; 786 n = ctx->EvalMap.Map1Texture4.Order * 4; 787 break; 788 case GL_MAP1_VERTEX_3: 789 data = ctx->EvalMap.Map1Vertex3.Points; 790 n = ctx->EvalMap.Map1Vertex3.Order * 3; 791 break; 792 case GL_MAP1_VERTEX_4: 793 data = ctx->EvalMap.Map1Vertex4.Points; 794 n = ctx->EvalMap.Map1Vertex4.Order * 4; 795 break; 796 case GL_MAP2_COLOR_4: 797 data = ctx->EvalMap.Map2Color4.Points; 798 n = ctx->EvalMap.Map2Color4.Uorder 799 * ctx->EvalMap.Map2Color4.Vorder * 4; 800 break; 801 case GL_MAP2_INDEX: 802 data = ctx->EvalMap.Map2Index.Points; 803 n = ctx->EvalMap.Map2Index.Uorder 804 * ctx->EvalMap.Map2Index.Vorder; 805 break; 806 case GL_MAP2_NORMAL: 807 data = ctx->EvalMap.Map2Normal.Points; 808 n = ctx->EvalMap.Map2Normal.Uorder 809 * ctx->EvalMap.Map2Normal.Vorder * 3; 810 break; 811 case GL_MAP2_TEXTURE_COORD_1: 812 data = ctx->EvalMap.Map2Texture1.Points; 813 n = ctx->EvalMap.Map2Texture1.Uorder 814 * ctx->EvalMap.Map2Texture1.Vorder * 1; 815 break; 816 case GL_MAP2_TEXTURE_COORD_2: 817 data = ctx->EvalMap.Map2Texture2.Points; 818 n = ctx->EvalMap.Map2Texture2.Uorder 819 * ctx->EvalMap.Map2Texture2.Vorder * 2; 820 break; 821 case GL_MAP2_TEXTURE_COORD_3: 822 data = ctx->EvalMap.Map2Texture3.Points; 823 n = ctx->EvalMap.Map2Texture3.Uorder 824 * ctx->EvalMap.Map2Texture3.Vorder * 3; 825 break; 826 case GL_MAP2_TEXTURE_COORD_4: 827 data = ctx->EvalMap.Map2Texture4.Points; 828 n = ctx->EvalMap.Map2Texture4.Uorder 829 * ctx->EvalMap.Map2Texture4.Vorder * 4; 830 break; 831 case GL_MAP2_VERTEX_3: 832 data = ctx->EvalMap.Map2Vertex3.Points; 833 n = ctx->EvalMap.Map2Vertex3.Uorder 834 * ctx->EvalMap.Map2Vertex3.Vorder * 3; 835 break; 836 case GL_MAP2_VERTEX_4: 837 data = ctx->EvalMap.Map2Vertex4.Points; 838 n = ctx->EvalMap.Map2Vertex4.Uorder 839 * ctx->EvalMap.Map2Vertex4.Vorder * 4; 840 break; 841 default: 842 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" ); 843 return; 844 } 845 if (data) { 846 for (i=0;i<n;i++) { 847 v[i] = data[i]; 848 } 849 } 850 break; 851 case GL_ORDER: 852 switch (target) { 853 case GL_MAP1_COLOR_4: 854 *v = ctx->EvalMap.Map1Color4.Order; 855 break; 856 case GL_MAP1_INDEX: 857 *v = ctx->EvalMap.Map1Index.Order; 858 break; 859 case GL_MAP1_NORMAL: 860 *v = ctx->EvalMap.Map1Normal.Order; 861 break; 862 case GL_MAP1_TEXTURE_COORD_1: 863 *v = ctx->EvalMap.Map1Texture1.Order; 864 break; 865 case GL_MAP1_TEXTURE_COORD_2: 866 *v = ctx->EvalMap.Map1Texture2.Order; 867 break; 868 case GL_MAP1_TEXTURE_COORD_3: 869 *v = ctx->EvalMap.Map1Texture3.Order; 870 break; 871 case GL_MAP1_TEXTURE_COORD_4: 872 *v = ctx->EvalMap.Map1Texture4.Order; 873 break; 874 case GL_MAP1_VERTEX_3: 875 *v = ctx->EvalMap.Map1Vertex3.Order; 876 break; 877 case GL_MAP1_VERTEX_4: 878 *v = ctx->EvalMap.Map1Vertex4.Order; 879 break; 880 case GL_MAP2_COLOR_4: 881 v[0] = ctx->EvalMap.Map2Color4.Uorder; 882 v[1] = ctx->EvalMap.Map2Color4.Vorder; 883 break; 884 case GL_MAP2_INDEX: 885 v[0] = ctx->EvalMap.Map2Index.Uorder; 886 v[1] = ctx->EvalMap.Map2Index.Vorder; 887 break; 888 case GL_MAP2_NORMAL: 889 v[0] = ctx->EvalMap.Map2Normal.Uorder; 890 v[1] = ctx->EvalMap.Map2Normal.Vorder; 891 break; 892 case GL_MAP2_TEXTURE_COORD_1: 893 v[0] = ctx->EvalMap.Map2Texture1.Uorder; 894 v[1] = ctx->EvalMap.Map2Texture1.Vorder; 895 break; 896 case GL_MAP2_TEXTURE_COORD_2: 897 v[0] = ctx->EvalMap.Map2Texture2.Uorder; 898 v[1] = ctx->EvalMap.Map2Texture2.Vorder; 899 break; 900 case GL_MAP2_TEXTURE_COORD_3: 901 v[0] = ctx->EvalMap.Map2Texture3.Uorder; 902 v[1] = ctx->EvalMap.Map2Texture3.Vorder; 903 break; 904 case GL_MAP2_TEXTURE_COORD_4: 905 v[0] = ctx->EvalMap.Map2Texture4.Uorder; 906 v[1] = ctx->EvalMap.Map2Texture4.Vorder; 907 break; 908 case GL_MAP2_VERTEX_3: 909 v[0] = ctx->EvalMap.Map2Vertex3.Uorder; 910 v[1] = ctx->EvalMap.Map2Vertex3.Vorder; 911 break; 912 case GL_MAP2_VERTEX_4: 913 v[0] = ctx->EvalMap.Map2Vertex4.Uorder; 914 v[1] = ctx->EvalMap.Map2Vertex4.Vorder; 915 break; 916 default: 917 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" ); 918 return; 919 } 920 break; 921 case GL_DOMAIN: 922 switch (target) { 923 case GL_MAP1_COLOR_4: 924 v[0] = ctx->EvalMap.Map1Color4.u1; 925 v[1] = ctx->EvalMap.Map1Color4.u2; 926 break; 927 case GL_MAP1_INDEX: 928 v[0] = ctx->EvalMap.Map1Index.u1; 929 v[1] = ctx->EvalMap.Map1Index.u2; 930 break; 931 case GL_MAP1_NORMAL: 932 v[0] = ctx->EvalMap.Map1Normal.u1; 933 v[1] = ctx->EvalMap.Map1Normal.u2; 934 break; 935 case GL_MAP1_TEXTURE_COORD_1: 936 v[0] = ctx->EvalMap.Map1Texture1.u1; 937 v[1] = ctx->EvalMap.Map1Texture1.u2; 938 break; 939 case GL_MAP1_TEXTURE_COORD_2: 940 v[0] = ctx->EvalMap.Map1Texture2.u1; 941 v[1] = ctx->EvalMap.Map1Texture2.u2; 942 break; 943 case GL_MAP1_TEXTURE_COORD_3: 944 v[0] = ctx->EvalMap.Map1Texture3.u1; 945 v[1] = ctx->EvalMap.Map1Texture3.u2; 946 break; 947 case GL_MAP1_TEXTURE_COORD_4: 948 v[0] = ctx->EvalMap.Map1Texture4.u1; 949 v[1] = ctx->EvalMap.Map1Texture4.u2; 950 break; 951 case GL_MAP1_VERTEX_3: 952 v[0] = ctx->EvalMap.Map1Vertex3.u1; 953 v[1] = ctx->EvalMap.Map1Vertex3.u2; 954 break; 955 case GL_MAP1_VERTEX_4: 956 v[0] = ctx->EvalMap.Map1Vertex4.u1; 957 v[1] = ctx->EvalMap.Map1Vertex4.u2; 958 break; 959 case GL_MAP2_COLOR_4: 960 v[0] = ctx->EvalMap.Map2Color4.u1; 961 v[1] = ctx->EvalMap.Map2Color4.u2; 962 v[2] = ctx->EvalMap.Map2Color4.v1; 963 v[3] = ctx->EvalMap.Map2Color4.v2; 964 break; 965 case GL_MAP2_INDEX: 966 v[0] = ctx->EvalMap.Map2Index.u1; 967 v[1] = ctx->EvalMap.Map2Index.u2; 968 v[2] = ctx->EvalMap.Map2Index.v1; 969 v[3] = ctx->EvalMap.Map2Index.v2; 970 break; 971 case GL_MAP2_NORMAL: 972 v[0] = ctx->EvalMap.Map2Normal.u1; 973 v[1] = ctx->EvalMap.Map2Normal.u2; 974 v[2] = ctx->EvalMap.Map2Normal.v1; 975 v[3] = ctx->EvalMap.Map2Normal.v2; 976 break; 977 case GL_MAP2_TEXTURE_COORD_1: 978 v[0] = ctx->EvalMap.Map2Texture1.u1; 979 v[1] = ctx->EvalMap.Map2Texture1.u2; 980 v[2] = ctx->EvalMap.Map2Texture1.v1; 981 v[3] = ctx->EvalMap.Map2Texture1.v2; 982 break; 983 case GL_MAP2_TEXTURE_COORD_2: 984 v[0] = ctx->EvalMap.Map2Texture2.u1; 985 v[1] = ctx->EvalMap.Map2Texture2.u2; 986 v[2] = ctx->EvalMap.Map2Texture2.v1; 987 v[3] = ctx->EvalMap.Map2Texture2.v2; 988 break; 989 case GL_MAP2_TEXTURE_COORD_3: 990 v[0] = ctx->EvalMap.Map2Texture3.u1; 991 v[1] = ctx->EvalMap.Map2Texture3.u2; 992 v[2] = ctx->EvalMap.Map2Texture3.v1; 993 v[3] = ctx->EvalMap.Map2Texture3.v2; 994 break; 995 case GL_MAP2_TEXTURE_COORD_4: 996 v[0] = ctx->EvalMap.Map2Texture4.u1; 997 v[1] = ctx->EvalMap.Map2Texture4.u2; 998 v[2] = ctx->EvalMap.Map2Texture4.v1; 999 v[3] = ctx->EvalMap.Map2Texture4.v2; 1000 break; 1001 case GL_MAP2_VERTEX_3: 1002 v[0] = ctx->EvalMap.Map2Vertex3.u1; 1003 v[1] = ctx->EvalMap.Map2Vertex3.u2; 1004 v[2] = ctx->EvalMap.Map2Vertex3.v1; 1005 v[3] = ctx->EvalMap.Map2Vertex3.v2; 1006 break; 1007 case GL_MAP2_VERTEX_4: 1008 v[0] = ctx->EvalMap.Map2Vertex4.u1; 1009 v[1] = ctx->EvalMap.Map2Vertex4.u2; 1010 v[2] = ctx->EvalMap.Map2Vertex4.v1; 1011 v[3] = ctx->EvalMap.Map2Vertex4.v2; 1012 break; 1013 default: 1014 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" ); 1015 } 1016 break; 1017 default: 1018 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" ); 1019 } 1020} 1021 1022 1023void 1024_mesa_GetMapiv( GLenum target, GLenum query, GLint *v ) 1025{ 1026 GET_CURRENT_CONTEXT(ctx); 1027 GLuint i, n; 1028 GLfloat *data; 1029 ASSERT_OUTSIDE_BEGIN_END(ctx); 1030 1031 switch (query) { 1032 case GL_COEFF: 1033 switch (target) { 1034 case GL_MAP1_COLOR_4: 1035 data = ctx->EvalMap.Map1Color4.Points; 1036 n = ctx->EvalMap.Map1Color4.Order * 4; 1037 break; 1038 case GL_MAP1_INDEX: 1039 data = ctx->EvalMap.Map1Index.Points; 1040 n = ctx->EvalMap.Map1Index.Order; 1041 break; 1042 case GL_MAP1_NORMAL: 1043 data = ctx->EvalMap.Map1Normal.Points; 1044 n = ctx->EvalMap.Map1Normal.Order * 3; 1045 break; 1046 case GL_MAP1_TEXTURE_COORD_1: 1047 data = ctx->EvalMap.Map1Texture1.Points; 1048 n = ctx->EvalMap.Map1Texture1.Order * 1; 1049 break; 1050 case GL_MAP1_TEXTURE_COORD_2: 1051 data = ctx->EvalMap.Map1Texture2.Points; 1052 n = ctx->EvalMap.Map1Texture2.Order * 2; 1053 break; 1054 case GL_MAP1_TEXTURE_COORD_3: 1055 data = ctx->EvalMap.Map1Texture3.Points; 1056 n = ctx->EvalMap.Map1Texture3.Order * 3; 1057 break; 1058 case GL_MAP1_TEXTURE_COORD_4: 1059 data = ctx->EvalMap.Map1Texture4.Points; 1060 n = ctx->EvalMap.Map1Texture4.Order * 4; 1061 break; 1062 case GL_MAP1_VERTEX_3: 1063 data = ctx->EvalMap.Map1Vertex3.Points; 1064 n = ctx->EvalMap.Map1Vertex3.Order * 3; 1065 break; 1066 case GL_MAP1_VERTEX_4: 1067 data = ctx->EvalMap.Map1Vertex4.Points; 1068 n = ctx->EvalMap.Map1Vertex4.Order * 4; 1069 break; 1070 case GL_MAP2_COLOR_4: 1071 data = ctx->EvalMap.Map2Color4.Points; 1072 n = ctx->EvalMap.Map2Color4.Uorder 1073 * ctx->EvalMap.Map2Color4.Vorder * 4; 1074 break; 1075 case GL_MAP2_INDEX: 1076 data = ctx->EvalMap.Map2Index.Points; 1077 n = ctx->EvalMap.Map2Index.Uorder 1078 * ctx->EvalMap.Map2Index.Vorder; 1079 break; 1080 case GL_MAP2_NORMAL: 1081 data = ctx->EvalMap.Map2Normal.Points; 1082 n = ctx->EvalMap.Map2Normal.Uorder 1083 * ctx->EvalMap.Map2Normal.Vorder * 3; 1084 break; 1085 case GL_MAP2_TEXTURE_COORD_1: 1086 data = ctx->EvalMap.Map2Texture1.Points; 1087 n = ctx->EvalMap.Map2Texture1.Uorder 1088 * ctx->EvalMap.Map2Texture1.Vorder * 1; 1089 break; 1090 case GL_MAP2_TEXTURE_COORD_2: 1091 data = ctx->EvalMap.Map2Texture2.Points; 1092 n = ctx->EvalMap.Map2Texture2.Uorder 1093 * ctx->EvalMap.Map2Texture2.Vorder * 2; 1094 break; 1095 case GL_MAP2_TEXTURE_COORD_3: 1096 data = ctx->EvalMap.Map2Texture3.Points; 1097 n = ctx->EvalMap.Map2Texture3.Uorder 1098 * ctx->EvalMap.Map2Texture3.Vorder * 3; 1099 break; 1100 case GL_MAP2_TEXTURE_COORD_4: 1101 data = ctx->EvalMap.Map2Texture4.Points; 1102 n = ctx->EvalMap.Map2Texture4.Uorder 1103 * ctx->EvalMap.Map2Texture4.Vorder * 4; 1104 break; 1105 case GL_MAP2_VERTEX_3: 1106 data = ctx->EvalMap.Map2Vertex3.Points; 1107 n = ctx->EvalMap.Map2Vertex3.Uorder 1108 * ctx->EvalMap.Map2Vertex3.Vorder * 3; 1109 break; 1110 case GL_MAP2_VERTEX_4: 1111 data = ctx->EvalMap.Map2Vertex4.Points; 1112 n = ctx->EvalMap.Map2Vertex4.Uorder 1113 * ctx->EvalMap.Map2Vertex4.Vorder * 4; 1114 break; 1115 default: 1116 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" ); 1117 return; 1118 } 1119 if (data) { 1120 for (i=0;i<n;i++) { 1121 v[i] = ROUNDF(data[i]); 1122 } 1123 } 1124 break; 1125 case GL_ORDER: 1126 switch (target) { 1127 case GL_MAP1_COLOR_4: 1128 *v = ctx->EvalMap.Map1Color4.Order; 1129 break; 1130 case GL_MAP1_INDEX: 1131 *v = ctx->EvalMap.Map1Index.Order; 1132 break; 1133 case GL_MAP1_NORMAL: 1134 *v = ctx->EvalMap.Map1Normal.Order; 1135 break; 1136 case GL_MAP1_TEXTURE_COORD_1: 1137 *v = ctx->EvalMap.Map1Texture1.Order; 1138 break; 1139 case GL_MAP1_TEXTURE_COORD_2: 1140 *v = ctx->EvalMap.Map1Texture2.Order; 1141 break; 1142 case GL_MAP1_TEXTURE_COORD_3: 1143 *v = ctx->EvalMap.Map1Texture3.Order; 1144 break; 1145 case GL_MAP1_TEXTURE_COORD_4: 1146 *v = ctx->EvalMap.Map1Texture4.Order; 1147 break; 1148 case GL_MAP1_VERTEX_3: 1149 *v = ctx->EvalMap.Map1Vertex3.Order; 1150 break; 1151 case GL_MAP1_VERTEX_4: 1152 *v = ctx->EvalMap.Map1Vertex4.Order; 1153 break; 1154 case GL_MAP2_COLOR_4: 1155 v[0] = ctx->EvalMap.Map2Color4.Uorder; 1156 v[1] = ctx->EvalMap.Map2Color4.Vorder; 1157 break; 1158 case GL_MAP2_INDEX: 1159 v[0] = ctx->EvalMap.Map2Index.Uorder; 1160 v[1] = ctx->EvalMap.Map2Index.Vorder; 1161 break; 1162 case GL_MAP2_NORMAL: 1163 v[0] = ctx->EvalMap.Map2Normal.Uorder; 1164 v[1] = ctx->EvalMap.Map2Normal.Vorder; 1165 break; 1166 case GL_MAP2_TEXTURE_COORD_1: 1167 v[0] = ctx->EvalMap.Map2Texture1.Uorder; 1168 v[1] = ctx->EvalMap.Map2Texture1.Vorder; 1169 break; 1170 case GL_MAP2_TEXTURE_COORD_2: 1171 v[0] = ctx->EvalMap.Map2Texture2.Uorder; 1172 v[1] = ctx->EvalMap.Map2Texture2.Vorder; 1173 break; 1174 case GL_MAP2_TEXTURE_COORD_3: 1175 v[0] = ctx->EvalMap.Map2Texture3.Uorder; 1176 v[1] = ctx->EvalMap.Map2Texture3.Vorder; 1177 break; 1178 case GL_MAP2_TEXTURE_COORD_4: 1179 v[0] = ctx->EvalMap.Map2Texture4.Uorder; 1180 v[1] = ctx->EvalMap.Map2Texture4.Vorder; 1181 break; 1182 case GL_MAP2_VERTEX_3: 1183 v[0] = ctx->EvalMap.Map2Vertex3.Uorder; 1184 v[1] = ctx->EvalMap.Map2Vertex3.Vorder; 1185 break; 1186 case GL_MAP2_VERTEX_4: 1187 v[0] = ctx->EvalMap.Map2Vertex4.Uorder; 1188 v[1] = ctx->EvalMap.Map2Vertex4.Vorder; 1189 break; 1190 default: 1191 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" ); 1192 return; 1193 } 1194 break; 1195 case GL_DOMAIN: 1196 switch (target) { 1197 case GL_MAP1_COLOR_4: 1198 v[0] = ROUNDF(ctx->EvalMap.Map1Color4.u1); 1199 v[1] = ROUNDF(ctx->EvalMap.Map1Color4.u2); 1200 break; 1201 case GL_MAP1_INDEX: 1202 v[0] = ROUNDF(ctx->EvalMap.Map1Index.u1); 1203 v[1] = ROUNDF(ctx->EvalMap.Map1Index.u2); 1204 break; 1205 case GL_MAP1_NORMAL: 1206 v[0] = ROUNDF(ctx->EvalMap.Map1Normal.u1); 1207 v[1] = ROUNDF(ctx->EvalMap.Map1Normal.u2); 1208 break; 1209 case GL_MAP1_TEXTURE_COORD_1: 1210 v[0] = ROUNDF(ctx->EvalMap.Map1Texture1.u1); 1211 v[1] = ROUNDF(ctx->EvalMap.Map1Texture1.u2); 1212 break; 1213 case GL_MAP1_TEXTURE_COORD_2: 1214 v[0] = ROUNDF(ctx->EvalMap.Map1Texture2.u1); 1215 v[1] = ROUNDF(ctx->EvalMap.Map1Texture2.u2); 1216 break; 1217 case GL_MAP1_TEXTURE_COORD_3: 1218 v[0] = ROUNDF(ctx->EvalMap.Map1Texture3.u1); 1219 v[1] = ROUNDF(ctx->EvalMap.Map1Texture3.u2); 1220 break; 1221 case GL_MAP1_TEXTURE_COORD_4: 1222 v[0] = ROUNDF(ctx->EvalMap.Map1Texture4.u1); 1223 v[1] = ROUNDF(ctx->EvalMap.Map1Texture4.u2); 1224 break; 1225 case GL_MAP1_VERTEX_3: 1226 v[0] = ROUNDF(ctx->EvalMap.Map1Vertex3.u1); 1227 v[1] = ROUNDF(ctx->EvalMap.Map1Vertex3.u2); 1228 break; 1229 case GL_MAP1_VERTEX_4: 1230 v[0] = ROUNDF(ctx->EvalMap.Map1Vertex4.u1); 1231 v[1] = ROUNDF(ctx->EvalMap.Map1Vertex4.u2); 1232 break; 1233 case GL_MAP2_COLOR_4: 1234 v[0] = ROUNDF(ctx->EvalMap.Map2Color4.u1); 1235 v[1] = ROUNDF(ctx->EvalMap.Map2Color4.u2); 1236 v[2] = ROUNDF(ctx->EvalMap.Map2Color4.v1); 1237 v[3] = ROUNDF(ctx->EvalMap.Map2Color4.v2); 1238 break; 1239 case GL_MAP2_INDEX: 1240 v[0] = ROUNDF(ctx->EvalMap.Map2Index.u1); 1241 v[1] = ROUNDF(ctx->EvalMap.Map2Index.u2); 1242 v[2] = ROUNDF(ctx->EvalMap.Map2Index.v1); 1243 v[3] = ROUNDF(ctx->EvalMap.Map2Index.v2); 1244 break; 1245 case GL_MAP2_NORMAL: 1246 v[0] = ROUNDF(ctx->EvalMap.Map2Normal.u1); 1247 v[1] = ROUNDF(ctx->EvalMap.Map2Normal.u2); 1248 v[2] = ROUNDF(ctx->EvalMap.Map2Normal.v1); 1249 v[3] = ROUNDF(ctx->EvalMap.Map2Normal.v2); 1250 break; 1251 case GL_MAP2_TEXTURE_COORD_1: 1252 v[0] = ROUNDF(ctx->EvalMap.Map2Texture1.u1); 1253 v[1] = ROUNDF(ctx->EvalMap.Map2Texture1.u2); 1254 v[2] = ROUNDF(ctx->EvalMap.Map2Texture1.v1); 1255 v[3] = ROUNDF(ctx->EvalMap.Map2Texture1.v2); 1256 break; 1257 case GL_MAP2_TEXTURE_COORD_2: 1258 v[0] = ROUNDF(ctx->EvalMap.Map2Texture2.u1); 1259 v[1] = ROUNDF(ctx->EvalMap.Map2Texture2.u2); 1260 v[2] = ROUNDF(ctx->EvalMap.Map2Texture2.v1); 1261 v[3] = ROUNDF(ctx->EvalMap.Map2Texture2.v2); 1262 break; 1263 case GL_MAP2_TEXTURE_COORD_3: 1264 v[0] = ROUNDF(ctx->EvalMap.Map2Texture3.u1); 1265 v[1] = ROUNDF(ctx->EvalMap.Map2Texture3.u2); 1266 v[2] = ROUNDF(ctx->EvalMap.Map2Texture3.v1); 1267 v[3] = ROUNDF(ctx->EvalMap.Map2Texture3.v2); 1268 break; 1269 case GL_MAP2_TEXTURE_COORD_4: 1270 v[0] = ROUNDF(ctx->EvalMap.Map2Texture4.u1); 1271 v[1] = ROUNDF(ctx->EvalMap.Map2Texture4.u2); 1272 v[2] = ROUNDF(ctx->EvalMap.Map2Texture4.v1); 1273 v[3] = ROUNDF(ctx->EvalMap.Map2Texture4.v2); 1274 break; 1275 case GL_MAP2_VERTEX_3: 1276 v[0] = ROUNDF(ctx->EvalMap.Map2Vertex3.u1); 1277 v[1] = ROUNDF(ctx->EvalMap.Map2Vertex3.u2); 1278 v[2] = ROUNDF(ctx->EvalMap.Map2Vertex3.v1); 1279 v[3] = ROUNDF(ctx->EvalMap.Map2Vertex3.v2); 1280 break; 1281 case GL_MAP2_VERTEX_4: 1282 v[0] = ROUNDF(ctx->EvalMap.Map2Vertex4.u1); 1283 v[1] = ROUNDF(ctx->EvalMap.Map2Vertex4.u2); 1284 v[2] = ROUNDF(ctx->EvalMap.Map2Vertex4.v1); 1285 v[3] = ROUNDF(ctx->EvalMap.Map2Vertex4.v2); 1286 break; 1287 default: 1288 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" ); 1289 } 1290 break; 1291 default: 1292 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" ); 1293 } 1294} 1295 1296 1297 1298void 1299_mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 ) 1300{ 1301 GET_CURRENT_CONTEXT(ctx); 1302 ASSERT_OUTSIDE_BEGIN_END(ctx); 1303 1304 if (un<1) { 1305 _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" ); 1306 return; 1307 } 1308 FLUSH_VERTICES(ctx, _NEW_EVAL); 1309 ctx->Eval.MapGrid1un = un; 1310 ctx->Eval.MapGrid1u1 = u1; 1311 ctx->Eval.MapGrid1u2 = u2; 1312 ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un; 1313} 1314 1315 1316void 1317_mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 ) 1318{ 1319 _mesa_MapGrid1f( un, u1, u2 ); 1320} 1321 1322 1323void 1324_mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2, 1325 GLint vn, GLfloat v1, GLfloat v2 ) 1326{ 1327 GET_CURRENT_CONTEXT(ctx); 1328 ASSERT_OUTSIDE_BEGIN_END(ctx); 1329 1330 if (un<1) { 1331 _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" ); 1332 return; 1333 } 1334 if (vn<1) { 1335 _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" ); 1336 return; 1337 } 1338 1339 FLUSH_VERTICES(ctx, _NEW_EVAL); 1340 ctx->Eval.MapGrid2un = un; 1341 ctx->Eval.MapGrid2u1 = u1; 1342 ctx->Eval.MapGrid2u2 = u2; 1343 ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un; 1344 ctx->Eval.MapGrid2vn = vn; 1345 ctx->Eval.MapGrid2v1 = v1; 1346 ctx->Eval.MapGrid2v2 = v2; 1347 ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn; 1348} 1349 1350 1351void 1352_mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2, 1353 GLint vn, GLdouble v1, GLdouble v2 ) 1354{ 1355 _mesa_MapGrid2f( un, u1, u2, vn, v1, v2 ); 1356} 1357