1 /* $Id: eval.c,v 1.12 2000/10/28 20:41:14 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
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:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
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.
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).
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.
58 static GLfloat inv_tab
[MAX_EVAL_ORDER
];
61 * Do one-time initialization for evaluators.
63 void gl_init_eval( void )
65 static int init_flag
= 0;
68 /* Compute a table of nCr (combination) values used by the
69 * Bernstein polynomial generator.
72 /* KW: precompute 1/x for useful x.
76 for (i
= 1 ; i
< MAX_EVAL_ORDER
; i
++)
86 * Horner scheme for Bezier curves
88 * Bezier curves can be computed via a Horner scheme.
89 * Horner is numerically less stable than the de Casteljau
90 * algorithm, but it is faster. For curves of degree n
91 * the complexity of Horner is O(n) and de Casteljau is O(n^2).
92 * Since stability is not important for displaying curve
93 * points I decided to use the Horner scheme.
95 * A cubic Bezier curve with control points b0, b1, b2, b3 can be
98 * (([3] [3] ) [3] ) [3]
99 * c(t) = (([0]*s*b0 + [1]*t*b1)*s + [2]*t^2*b2)*s + [3]*t^2*b3
102 * where s=1-t and the binomial coefficients [i]. These can
103 * be computed iteratively using the identity:
106 * [i] = (n-i+1)/i * [i-1] and [0] = 1
111 horner_bezier_curve(const GLfloat
*cp
, GLfloat
*out
, GLfloat t
,
112 GLuint dim
, GLuint order
)
115 GLuint i
, k
, bincoeff
;
123 out
[k
] = s
*cp
[k
] + bincoeff
*t
*cp
[dim
+k
];
125 for(i
=2, cp
+=2*dim
, powert
=t
*t
; i
<order
; i
++, powert
*=t
, cp
+=dim
)
128 bincoeff
*= inv_tab
[i
];
131 out
[k
] = s
*out
[k
] + bincoeff
*powert
*cp
[k
];
134 else /* order=1 -> constant curve */
142 * Tensor product Bezier surfaces
144 * Again the Horner scheme is used to compute a point on a
145 * TP Bezier surface. First a control polygon for a curve
146 * on the surface in one parameter direction is computed,
147 * then the point on the curve for the other parameter
148 * direction is evaluated.
150 * To store the curve control polygon additional storage
151 * for max(uorder,vorder) points is needed in the
156 horner_bezier_surf(GLfloat
*cn
, GLfloat
*out
, GLfloat u
, GLfloat v
,
157 GLuint dim
, GLuint uorder
, GLuint vorder
)
159 GLfloat
*cp
= cn
+ uorder
*vorder
*dim
;
160 GLuint i
, uinc
= vorder
*dim
;
167 GLuint j
, k
, bincoeff
;
169 /* Compute the control polygon for the surface-curve in u-direction */
170 for(j
=0; j
<vorder
; j
++)
172 GLfloat
*ucp
= &cn
[j
*dim
];
174 /* Each control point is the point for parameter u on a */
175 /* curve defined by the control polygons in u-direction */
180 cp
[j
*dim
+k
] = s
*ucp
[k
] + bincoeff
*u
*ucp
[uinc
+k
];
182 for(i
=2, ucp
+=2*uinc
, poweru
=u
*u
; i
<uorder
;
183 i
++, poweru
*=u
, ucp
+=uinc
)
185 bincoeff
*= uorder
-i
;
186 bincoeff
*= inv_tab
[i
];
189 cp
[j
*dim
+k
] = s
*cp
[j
*dim
+k
] + bincoeff
*poweru
*ucp
[k
];
193 /* Evaluate curve point in v */
194 horner_bezier_curve(cp
, out
, v
, dim
, vorder
);
196 else /* uorder=1 -> cn defines a curve in v */
197 horner_bezier_curve(cn
, out
, v
, dim
, vorder
);
199 else /* vorder <= uorder */
205 /* Compute the control polygon for the surface-curve in u-direction */
206 for(i
=0; i
<uorder
; i
++, cn
+= uinc
)
208 /* For constant i all cn[i][j] (j=0..vorder) are located */
209 /* on consecutive memory locations, so we can use */
210 /* horner_bezier_curve to compute the control points */
212 horner_bezier_curve(cn
, &cp
[i
*dim
], v
, dim
, vorder
);
215 /* Evaluate curve point in u */
216 horner_bezier_curve(cp
, out
, u
, dim
, uorder
);
218 else /* vorder=1 -> cn defines a curve in u */
219 horner_bezier_curve(cn
, out
, u
, dim
, uorder
);
224 * The direct de Casteljau algorithm is used when a point on the
225 * surface and the tangent directions spanning the tangent plane
226 * should be computed (this is needed to compute normals to the
227 * surface). In this case the de Casteljau algorithm approach is
228 * nicer because a point and the partial derivatives can be computed
229 * at the same time. To get the correct tangent length du and dv
230 * must be multiplied with the (u2-u1)/uorder-1 and (v2-v1)/vorder-1.
231 * Since only the directions are needed, this scaling step is omitted.
233 * De Casteljau needs additional storage for uorder*vorder
234 * values in the control net cn.
238 de_casteljau_surf(GLfloat
*cn
, GLfloat
*out
, GLfloat
*du
, GLfloat
*dv
,
239 GLfloat u
, GLfloat v
, GLuint dim
,
240 GLuint uorder
, GLuint vorder
)
242 GLfloat
*dcn
= cn
+ uorder
*vorder
*dim
;
243 GLfloat us
= 1.0-u
, vs
= 1.0-v
;
245 GLuint minorder
= uorder
< vorder
? uorder
: vorder
;
246 GLuint uinc
= vorder
*dim
;
247 GLuint dcuinc
= vorder
;
249 /* Each component is evaluated separately to save buffer space */
250 /* This does not drasticaly decrease the performance of the */
251 /* algorithm. If additional storage for (uorder-1)*(vorder-1) */
252 /* points would be available, the components could be accessed */
253 /* in the innermost loop which could lead to less cache misses. */
255 #define CN(I,J,K) cn[(I)*uinc+(J)*dim+(K)]
256 #define DCN(I, J) dcn[(I)*dcuinc+(J)]
263 /* Derivative direction in u */
264 du
[k
] = vs
*(CN(1,0,k
) - CN(0,0,k
)) +
265 v
*(CN(1,1,k
) - CN(0,1,k
));
267 /* Derivative direction in v */
268 dv
[k
] = us
*(CN(0,1,k
) - CN(0,0,k
)) +
269 u
*(CN(1,1,k
) - CN(1,0,k
));
271 /* bilinear de Casteljau step */
272 out
[k
] = us
*(vs
*CN(0,0,k
) + v
*CN(0,1,k
)) +
273 u
*(vs
*CN(1,0,k
) + v
*CN(1,1,k
));
276 else if(minorder
== uorder
)
280 /* bilinear de Casteljau step */
281 DCN(1,0) = CN(1,0,k
) - CN(0,0,k
);
282 DCN(0,0) = us
*CN(0,0,k
) + u
*CN(1,0,k
);
284 for(j
=0; j
<vorder
-1; j
++)
286 /* for the derivative in u */
287 DCN(1,j
+1) = CN(1,j
+1,k
) - CN(0,j
+1,k
);
288 DCN(1,j
) = vs
*DCN(1,j
) + v
*DCN(1,j
+1);
290 /* for the `point' */
291 DCN(0,j
+1) = us
*CN(0,j
+1,k
) + u
*CN(1,j
+1,k
);
292 DCN(0,j
) = vs
*DCN(0,j
) + v
*DCN(0,j
+1);
295 /* remaining linear de Casteljau steps until the second last step */
296 for(h
=minorder
; h
<vorder
-1; h
++)
297 for(j
=0; j
<vorder
-h
; j
++)
299 /* for the derivative in u */
300 DCN(1,j
) = vs
*DCN(1,j
) + v
*DCN(1,j
+1);
302 /* for the `point' */
303 DCN(0,j
) = vs
*DCN(0,j
) + v
*DCN(0,j
+1);
306 /* derivative direction in v */
307 dv
[k
] = DCN(0,1) - DCN(0,0);
309 /* derivative direction in u */
310 du
[k
] = vs
*DCN(1,0) + v
*DCN(1,1);
312 /* last linear de Casteljau step */
313 out
[k
] = vs
*DCN(0,0) + v
*DCN(0,1);
316 else /* minorder == vorder */
320 /* bilinear de Casteljau step */
321 DCN(0,1) = CN(0,1,k
) - CN(0,0,k
);
322 DCN(0,0) = vs
*CN(0,0,k
) + v
*CN(0,1,k
);
323 for(i
=0; i
<uorder
-1; i
++)
325 /* for the derivative in v */
326 DCN(i
+1,1) = CN(i
+1,1,k
) - CN(i
+1,0,k
);
327 DCN(i
,1) = us
*DCN(i
,1) + u
*DCN(i
+1,1);
329 /* for the `point' */
330 DCN(i
+1,0) = vs
*CN(i
+1,0,k
) + v
*CN(i
+1,1,k
);
331 DCN(i
,0) = us
*DCN(i
,0) + u
*DCN(i
+1,0);
334 /* remaining linear de Casteljau steps until the second last step */
335 for(h
=minorder
; h
<uorder
-1; h
++)
336 for(i
=0; i
<uorder
-h
; i
++)
338 /* for the derivative in v */
339 DCN(i
,1) = us
*DCN(i
,1) + u
*DCN(i
+1,1);
341 /* for the `point' */
342 DCN(i
,0) = us
*DCN(i
,0) + u
*DCN(i
+1,0);
345 /* derivative direction in u */
346 du
[k
] = DCN(1,0) - DCN(0,0);
348 /* derivative direction in v */
349 dv
[k
] = us
*DCN(0,1) + u
*DCN(1,1);
351 /* last linear de Casteljau step */
352 out
[k
] = us
*DCN(0,0) + u
*DCN(1,0);
356 else if(uorder
== vorder
)
360 /* first bilinear de Casteljau step */
361 for(i
=0; i
<uorder
-1; i
++)
363 DCN(i
,0) = us
*CN(i
,0,k
) + u
*CN(i
+1,0,k
);
364 for(j
=0; j
<vorder
-1; j
++)
366 DCN(i
,j
+1) = us
*CN(i
,j
+1,k
) + u
*CN(i
+1,j
+1,k
);
367 DCN(i
,j
) = vs
*DCN(i
,j
) + v
*DCN(i
,j
+1);
371 /* remaining bilinear de Casteljau steps until the second last step */
372 for(h
=2; h
<minorder
-1; h
++)
373 for(i
=0; i
<uorder
-h
; i
++)
375 DCN(i
,0) = us
*DCN(i
,0) + u
*DCN(i
+1,0);
376 for(j
=0; j
<vorder
-h
; j
++)
378 DCN(i
,j
+1) = us
*DCN(i
,j
+1) + u
*DCN(i
+1,j
+1);
379 DCN(i
,j
) = vs
*DCN(i
,j
) + v
*DCN(i
,j
+1);
383 /* derivative direction in u */
384 du
[k
] = vs
*(DCN(1,0) - DCN(0,0)) +
385 v
*(DCN(1,1) - DCN(0,1));
387 /* derivative direction in v */
388 dv
[k
] = us
*(DCN(0,1) - DCN(0,0)) +
389 u
*(DCN(1,1) - DCN(1,0));
391 /* last bilinear de Casteljau step */
392 out
[k
] = us
*(vs
*DCN(0,0) + v
*DCN(0,1)) +
393 u
*(vs
*DCN(1,0) + v
*DCN(1,1));
396 else if(minorder
== uorder
)
400 /* first bilinear de Casteljau step */
401 for(i
=0; i
<uorder
-1; i
++)
403 DCN(i
,0) = us
*CN(i
,0,k
) + u
*CN(i
+1,0,k
);
404 for(j
=0; j
<vorder
-1; j
++)
406 DCN(i
,j
+1) = us
*CN(i
,j
+1,k
) + u
*CN(i
+1,j
+1,k
);
407 DCN(i
,j
) = vs
*DCN(i
,j
) + v
*DCN(i
,j
+1);
411 /* remaining bilinear de Casteljau steps until the second last step */
412 for(h
=2; h
<minorder
-1; h
++)
413 for(i
=0; i
<uorder
-h
; i
++)
415 DCN(i
,0) = us
*DCN(i
,0) + u
*DCN(i
+1,0);
416 for(j
=0; j
<vorder
-h
; j
++)
418 DCN(i
,j
+1) = us
*DCN(i
,j
+1) + u
*DCN(i
+1,j
+1);
419 DCN(i
,j
) = vs
*DCN(i
,j
) + v
*DCN(i
,j
+1);
423 /* last bilinear de Casteljau step */
424 DCN(2,0) = DCN(1,0) - DCN(0,0);
425 DCN(0,0) = us
*DCN(0,0) + u
*DCN(1,0);
426 for(j
=0; j
<vorder
-1; j
++)
428 /* for the derivative in u */
429 DCN(2,j
+1) = DCN(1,j
+1) - DCN(0,j
+1);
430 DCN(2,j
) = vs
*DCN(2,j
) + v
*DCN(2,j
+1);
432 /* for the `point' */
433 DCN(0,j
+1) = us
*DCN(0,j
+1 ) + u
*DCN(1,j
+1);
434 DCN(0,j
) = vs
*DCN(0,j
) + v
*DCN(0,j
+1);
437 /* remaining linear de Casteljau steps until the second last step */
438 for(h
=minorder
; h
<vorder
-1; h
++)
439 for(j
=0; j
<vorder
-h
; j
++)
441 /* for the derivative in u */
442 DCN(2,j
) = vs
*DCN(2,j
) + v
*DCN(2,j
+1);
444 /* for the `point' */
445 DCN(0,j
) = vs
*DCN(0,j
) + v
*DCN(0,j
+1);
448 /* derivative direction in v */
449 dv
[k
] = DCN(0,1) - DCN(0,0);
451 /* derivative direction in u */
452 du
[k
] = vs
*DCN(2,0) + v
*DCN(2,1);
454 /* last linear de Casteljau step */
455 out
[k
] = vs
*DCN(0,0) + v
*DCN(0,1);
458 else /* minorder == vorder */
462 /* first bilinear de Casteljau step */
463 for(i
=0; i
<uorder
-1; i
++)
465 DCN(i
,0) = us
*CN(i
,0,k
) + u
*CN(i
+1,0,k
);
466 for(j
=0; j
<vorder
-1; j
++)
468 DCN(i
,j
+1) = us
*CN(i
,j
+1,k
) + u
*CN(i
+1,j
+1,k
);
469 DCN(i
,j
) = vs
*DCN(i
,j
) + v
*DCN(i
,j
+1);
473 /* remaining bilinear de Casteljau steps until the second last step */
474 for(h
=2; h
<minorder
-1; h
++)
475 for(i
=0; i
<uorder
-h
; i
++)
477 DCN(i
,0) = us
*DCN(i
,0) + u
*DCN(i
+1,0);
478 for(j
=0; j
<vorder
-h
; j
++)
480 DCN(i
,j
+1) = us
*DCN(i
,j
+1) + u
*DCN(i
+1,j
+1);
481 DCN(i
,j
) = vs
*DCN(i
,j
) + v
*DCN(i
,j
+1);
485 /* last bilinear de Casteljau step */
486 DCN(0,2) = DCN(0,1) - DCN(0,0);
487 DCN(0,0) = vs
*DCN(0,0) + v
*DCN(0,1);
488 for(i
=0; i
<uorder
-1; i
++)
490 /* for the derivative in v */
491 DCN(i
+1,2) = DCN(i
+1,1) - DCN(i
+1,0);
492 DCN(i
,2) = us
*DCN(i
,2) + u
*DCN(i
+1,2);
494 /* for the `point' */
495 DCN(i
+1,0) = vs
*DCN(i
+1,0) + v
*DCN(i
+1,1);
496 DCN(i
,0) = us
*DCN(i
,0) + u
*DCN(i
+1,0);
499 /* remaining linear de Casteljau steps until the second last step */
500 for(h
=minorder
; h
<uorder
-1; h
++)
501 for(i
=0; i
<uorder
-h
; i
++)
503 /* for the derivative in v */
504 DCN(i
,2) = us
*DCN(i
,2) + u
*DCN(i
+1,2);
506 /* for the `point' */
507 DCN(i
,0) = us
*DCN(i
,0) + u
*DCN(i
+1,0);
510 /* derivative direction in u */
511 du
[k
] = DCN(1,0) - DCN(0,0);
513 /* derivative direction in v */
514 dv
[k
] = us
*DCN(0,2) + u
*DCN(1,2);
516 /* last linear de Casteljau step */
517 out
[k
] = us
*DCN(0,0) + u
*DCN(1,0);
525 * Return the number of components per control point for any type of
526 * evaluator. Return 0 if bad target.
527 * See table 5.1 in the OpenGL 1.2 spec.
529 GLuint
_mesa_evaluator_components( GLenum target
)
532 case GL_MAP1_VERTEX_3
: return 3;
533 case GL_MAP1_VERTEX_4
: return 4;
534 case GL_MAP1_INDEX
: return 1;
535 case GL_MAP1_COLOR_4
: return 4;
536 case GL_MAP1_NORMAL
: return 3;
537 case GL_MAP1_TEXTURE_COORD_1
: return 1;
538 case GL_MAP1_TEXTURE_COORD_2
: return 2;
539 case GL_MAP1_TEXTURE_COORD_3
: return 3;
540 case GL_MAP1_TEXTURE_COORD_4
: return 4;
541 case GL_MAP2_VERTEX_3
: return 3;
542 case GL_MAP2_VERTEX_4
: return 4;
543 case GL_MAP2_INDEX
: return 1;
544 case GL_MAP2_COLOR_4
: return 4;
545 case GL_MAP2_NORMAL
: return 3;
546 case GL_MAP2_TEXTURE_COORD_1
: return 1;
547 case GL_MAP2_TEXTURE_COORD_2
: return 2;
548 case GL_MAP2_TEXTURE_COORD_3
: return 3;
549 case GL_MAP2_TEXTURE_COORD_4
: return 4;
555 /**********************************************************************/
556 /*** Copy and deallocate control points ***/
557 /**********************************************************************/
561 * Copy 1-parametric evaluator control points from user-specified
562 * memory space to a buffer of contiguous control points.
563 * Input: see glMap1f for details
564 * Return: pointer to buffer of contiguous control points or NULL if out
567 GLfloat
*gl_copy_map_points1f( GLenum target
, GLint ustride
, GLint uorder
,
568 const GLfloat
*points
)
571 GLint i
, k
, size
= _mesa_evaluator_components(target
);
573 if (!points
|| size
==0) {
577 buffer
= (GLfloat
*) MALLOC(uorder
* size
* sizeof(GLfloat
));
580 for(i
=0, p
=buffer
; i
<uorder
; i
++, points
+=ustride
)
581 for(k
=0; k
<size
; k
++)
590 * Same as above but convert doubles to floats.
592 GLfloat
*gl_copy_map_points1d( GLenum target
, GLint ustride
, GLint uorder
,
593 const GLdouble
*points
)
596 GLint i
, k
, size
= _mesa_evaluator_components(target
);
598 if (!points
|| size
==0) {
602 buffer
= (GLfloat
*) MALLOC(uorder
* size
* sizeof(GLfloat
));
605 for(i
=0, p
=buffer
; i
<uorder
; i
++, points
+=ustride
)
606 for(k
=0; k
<size
; k
++)
607 *p
++ = (GLfloat
) points
[k
];
615 * Copy 2-parametric evaluator control points from user-specified
616 * memory space to a buffer of contiguous control points.
617 * Additional memory is allocated to be used by the horner and
618 * de Casteljau evaluation schemes.
620 * Input: see glMap2f for details
621 * Return: pointer to buffer of contiguous control points or NULL if out
624 GLfloat
*gl_copy_map_points2f( GLenum target
,
625 GLint ustride
, GLint uorder
,
626 GLint vstride
, GLint vorder
,
627 const GLfloat
*points
)
630 GLint i
, j
, k
, size
, dsize
, hsize
;
633 size
= _mesa_evaluator_components(target
);
635 if (!points
|| size
==0) {
639 /* max(uorder, vorder) additional points are used in */
640 /* horner evaluation and uorder*vorder additional */
641 /* values are needed for de Casteljau */
642 dsize
= (uorder
== 2 && vorder
== 2)? 0 : uorder
*vorder
;
643 hsize
= (uorder
> vorder
? uorder
: vorder
)*size
;
646 buffer
= (GLfloat
*) MALLOC((uorder
*vorder
*size
+hsize
)*sizeof(GLfloat
));
648 buffer
= (GLfloat
*) MALLOC((uorder
*vorder
*size
+dsize
)*sizeof(GLfloat
));
650 /* compute the increment value for the u-loop */
651 uinc
= ustride
- vorder
*vstride
;
654 for (i
=0, p
=buffer
; i
<uorder
; i
++, points
+= uinc
)
655 for (j
=0; j
<vorder
; j
++, points
+= vstride
)
656 for (k
=0; k
<size
; k
++)
665 * Same as above but convert doubles to floats.
667 GLfloat
*gl_copy_map_points2d(GLenum target
,
668 GLint ustride
, GLint uorder
,
669 GLint vstride
, GLint vorder
,
670 const GLdouble
*points
)
673 GLint i
, j
, k
, size
, hsize
, dsize
;
676 size
= _mesa_evaluator_components(target
);
678 if (!points
|| size
==0) {
682 /* max(uorder, vorder) additional points are used in */
683 /* horner evaluation and uorder*vorder additional */
684 /* values are needed for de Casteljau */
685 dsize
= (uorder
== 2 && vorder
== 2)? 0 : uorder
*vorder
;
686 hsize
= (uorder
> vorder
? uorder
: vorder
)*size
;
689 buffer
= (GLfloat
*) MALLOC((uorder
*vorder
*size
+hsize
)*sizeof(GLfloat
));
691 buffer
= (GLfloat
*) MALLOC((uorder
*vorder
*size
+dsize
)*sizeof(GLfloat
));
693 /* compute the increment value for the u-loop */
694 uinc
= ustride
- vorder
*vstride
;
697 for (i
=0, p
=buffer
; i
<uorder
; i
++, points
+= uinc
)
698 for (j
=0; j
<vorder
; j
++, points
+= vstride
)
699 for (k
=0; k
<size
; k
++)
700 *p
++ = (GLfloat
) points
[k
];
708 * This function is called by the display list deallocator function to
709 * specify that a given set of control points are no longer needed.
711 void gl_free_control_points( GLcontext
* ctx
, GLenum target
, GLfloat
*data
)
713 struct gl_1d_map
*map1
= NULL
;
714 struct gl_2d_map
*map2
= NULL
;
717 case GL_MAP1_VERTEX_3
:
718 map1
= &ctx
->EvalMap
.Map1Vertex3
;
720 case GL_MAP1_VERTEX_4
:
721 map1
= &ctx
->EvalMap
.Map1Vertex4
;
724 map1
= &ctx
->EvalMap
.Map1Index
;
726 case GL_MAP1_COLOR_4
:
727 map1
= &ctx
->EvalMap
.Map1Color4
;
730 map1
= &ctx
->EvalMap
.Map1Normal
;
732 case GL_MAP1_TEXTURE_COORD_1
:
733 map1
= &ctx
->EvalMap
.Map1Texture1
;
735 case GL_MAP1_TEXTURE_COORD_2
:
736 map1
= &ctx
->EvalMap
.Map1Texture2
;
738 case GL_MAP1_TEXTURE_COORD_3
:
739 map1
= &ctx
->EvalMap
.Map1Texture3
;
741 case GL_MAP1_TEXTURE_COORD_4
:
742 map1
= &ctx
->EvalMap
.Map1Texture4
;
744 case GL_MAP2_VERTEX_3
:
745 map2
= &ctx
->EvalMap
.Map2Vertex3
;
747 case GL_MAP2_VERTEX_4
:
748 map2
= &ctx
->EvalMap
.Map2Vertex4
;
751 map2
= &ctx
->EvalMap
.Map2Index
;
753 case GL_MAP2_COLOR_4
:
754 map2
= &ctx
->EvalMap
.Map2Color4
;
757 map2
= &ctx
->EvalMap
.Map2Normal
;
759 case GL_MAP2_TEXTURE_COORD_1
:
760 map2
= &ctx
->EvalMap
.Map2Texture1
;
762 case GL_MAP2_TEXTURE_COORD_2
:
763 map2
= &ctx
->EvalMap
.Map2Texture2
;
765 case GL_MAP2_TEXTURE_COORD_3
:
766 map2
= &ctx
->EvalMap
.Map2Texture3
;
768 case GL_MAP2_TEXTURE_COORD_4
:
769 map2
= &ctx
->EvalMap
.Map2Texture4
;
772 gl_error( ctx
, GL_INVALID_ENUM
, "gl_free_control_points" );
777 if (data
==map1
->Points
) {
778 /* The control points in the display list are currently */
779 /* being used so we can mark them as discard-able. */
780 map1
->Retain
= GL_FALSE
;
783 /* The control points in the display list are not currently */
789 if (data
==map2
->Points
) {
790 /* The control points in the display list are currently */
791 /* being used so we can mark them as discard-able. */
792 map2
->Retain
= GL_FALSE
;
795 /* The control points in the display list are not currently */
806 /**********************************************************************/
807 /*** API entry points ***/
808 /**********************************************************************/
812 * This does the work of glMap1[fd].
815 map1(GLenum target
, GLfloat u1
, GLfloat u2
, GLint ustride
,
816 GLint uorder
, const GLvoid
*points
, GLenum type
)
818 GET_CURRENT_CONTEXT(ctx
);
822 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glMap1");
824 assert(type
== GL_FLOAT
|| type
== GL_DOUBLE
);
827 gl_error( ctx
, GL_INVALID_VALUE
, "glMap1(u1,u2)" );
830 if (uorder
< 1 || uorder
> MAX_EVAL_ORDER
) {
831 gl_error( ctx
, GL_INVALID_VALUE
, "glMap1(order)" );
835 gl_error( ctx
, GL_INVALID_VALUE
, "glMap1(points)" );
839 k
= _mesa_evaluator_components( target
);
841 gl_error( ctx
, GL_INVALID_ENUM
, "glMap1(target)" );
845 gl_error( ctx
, GL_INVALID_VALUE
, "glMap1(stride)" );
849 /* make copy of the control points */
850 if (type
== GL_FLOAT
)
851 pnts
= gl_copy_map_points1f(target
, ustride
, uorder
, (GLfloat
*) points
);
853 pnts
= gl_copy_map_points1d(target
, ustride
, uorder
, (GLdouble
*) points
);
856 case GL_MAP1_VERTEX_3
:
857 ctx
->EvalMap
.Map1Vertex3
.Order
= uorder
;
858 ctx
->EvalMap
.Map1Vertex3
.u1
= u1
;
859 ctx
->EvalMap
.Map1Vertex3
.u2
= u2
;
860 ctx
->EvalMap
.Map1Vertex3
.du
= 1.0 / (u2
- u1
);
861 if (ctx
->EvalMap
.Map1Vertex3
.Points
)
862 FREE( ctx
->EvalMap
.Map1Vertex3
.Points
);
863 ctx
->EvalMap
.Map1Vertex3
.Points
= pnts
;
865 case GL_MAP1_VERTEX_4
:
866 ctx
->EvalMap
.Map1Vertex4
.Order
= uorder
;
867 ctx
->EvalMap
.Map1Vertex4
.u1
= u1
;
868 ctx
->EvalMap
.Map1Vertex4
.u2
= u2
;
869 ctx
->EvalMap
.Map1Vertex4
.du
= 1.0 / (u2
- u1
);
870 if (ctx
->EvalMap
.Map1Vertex4
.Points
)
871 FREE( ctx
->EvalMap
.Map1Vertex4
.Points
);
872 ctx
->EvalMap
.Map1Vertex4
.Points
= pnts
;
875 ctx
->EvalMap
.Map1Index
.Order
= uorder
;
876 ctx
->EvalMap
.Map1Index
.u1
= u1
;
877 ctx
->EvalMap
.Map1Index
.u2
= u2
;
878 ctx
->EvalMap
.Map1Index
.du
= 1.0 / (u2
- u1
);
879 if (ctx
->EvalMap
.Map1Index
.Points
)
880 FREE( ctx
->EvalMap
.Map1Index
.Points
);
881 ctx
->EvalMap
.Map1Index
.Points
= pnts
;
883 case GL_MAP1_COLOR_4
:
884 ctx
->EvalMap
.Map1Color4
.Order
= uorder
;
885 ctx
->EvalMap
.Map1Color4
.u1
= u1
;
886 ctx
->EvalMap
.Map1Color4
.u2
= u2
;
887 ctx
->EvalMap
.Map1Color4
.du
= 1.0 / (u2
- u1
);
888 if (ctx
->EvalMap
.Map1Color4
.Points
)
889 FREE( ctx
->EvalMap
.Map1Color4
.Points
);
890 ctx
->EvalMap
.Map1Color4
.Points
= pnts
;
893 ctx
->EvalMap
.Map1Normal
.Order
= uorder
;
894 ctx
->EvalMap
.Map1Normal
.u1
= u1
;
895 ctx
->EvalMap
.Map1Normal
.u2
= u2
;
896 ctx
->EvalMap
.Map1Normal
.du
= 1.0 / (u2
- u1
);
897 if (ctx
->EvalMap
.Map1Normal
.Points
)
898 FREE( ctx
->EvalMap
.Map1Normal
.Points
);
899 ctx
->EvalMap
.Map1Normal
.Points
= pnts
;
901 case GL_MAP1_TEXTURE_COORD_1
:
902 ctx
->EvalMap
.Map1Texture1
.Order
= uorder
;
903 ctx
->EvalMap
.Map1Texture1
.u1
= u1
;
904 ctx
->EvalMap
.Map1Texture1
.u2
= u2
;
905 ctx
->EvalMap
.Map1Texture1
.du
= 1.0 / (u2
- u1
);
906 if (ctx
->EvalMap
.Map1Texture1
.Points
)
907 FREE( ctx
->EvalMap
.Map1Texture1
.Points
);
908 ctx
->EvalMap
.Map1Texture1
.Points
= pnts
;
910 case GL_MAP1_TEXTURE_COORD_2
:
911 ctx
->EvalMap
.Map1Texture2
.Order
= uorder
;
912 ctx
->EvalMap
.Map1Texture2
.u1
= u1
;
913 ctx
->EvalMap
.Map1Texture2
.u2
= u2
;
914 ctx
->EvalMap
.Map1Texture2
.du
= 1.0 / (u2
- u1
);
915 if (ctx
->EvalMap
.Map1Texture2
.Points
)
916 FREE( ctx
->EvalMap
.Map1Texture2
.Points
);
917 ctx
->EvalMap
.Map1Texture2
.Points
= pnts
;
919 case GL_MAP1_TEXTURE_COORD_3
:
920 ctx
->EvalMap
.Map1Texture3
.Order
= uorder
;
921 ctx
->EvalMap
.Map1Texture3
.u1
= u1
;
922 ctx
->EvalMap
.Map1Texture3
.u2
= u2
;
923 ctx
->EvalMap
.Map1Texture3
.du
= 1.0 / (u2
- u1
);
924 if (ctx
->EvalMap
.Map1Texture3
.Points
)
925 FREE( ctx
->EvalMap
.Map1Texture3
.Points
);
926 ctx
->EvalMap
.Map1Texture3
.Points
= pnts
;
928 case GL_MAP1_TEXTURE_COORD_4
:
929 ctx
->EvalMap
.Map1Texture4
.Order
= uorder
;
930 ctx
->EvalMap
.Map1Texture4
.u1
= u1
;
931 ctx
->EvalMap
.Map1Texture4
.u2
= u2
;
932 ctx
->EvalMap
.Map1Texture4
.du
= 1.0 / (u2
- u1
);
933 if (ctx
->EvalMap
.Map1Texture4
.Points
)
934 FREE( ctx
->EvalMap
.Map1Texture4
.Points
);
935 ctx
->EvalMap
.Map1Texture4
.Points
= pnts
;
938 gl_error( ctx
, GL_INVALID_ENUM
, "glMap1(target)" );
945 _mesa_Map1f( GLenum target
, GLfloat u1
, GLfloat u2
, GLint stride
,
946 GLint order
, const GLfloat
*points
)
948 map1(target
, u1
, u2
, stride
, order
, points
, GL_FLOAT
);
953 _mesa_Map1d( GLenum target
, GLdouble u1
, GLdouble u2
, GLint stride
,
954 GLint order
, const GLdouble
*points
)
956 map1(target
, u1
, u2
, stride
, order
, points
, GL_DOUBLE
);
961 map2( GLenum target
, GLfloat u1
, GLfloat u2
, GLint ustride
, GLint uorder
,
962 GLfloat v1
, GLfloat v2
, GLint vstride
, GLint vorder
,
963 const GLvoid
*points
, GLenum type
)
965 GET_CURRENT_CONTEXT(ctx
);
969 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glMap2");
972 gl_error( ctx
, GL_INVALID_VALUE
, "glMap2(u1,u2)" );
977 gl_error( ctx
, GL_INVALID_VALUE
, "glMap2(v1,v2)" );
981 if (uorder
<1 || uorder
>MAX_EVAL_ORDER
) {
982 gl_error( ctx
, GL_INVALID_VALUE
, "glMap2(uorder)" );
986 if (vorder
<1 || vorder
>MAX_EVAL_ORDER
) {
987 gl_error( ctx
, GL_INVALID_VALUE
, "glMap2(vorder)" );
991 k
= _mesa_evaluator_components( target
);
993 gl_error( ctx
, GL_INVALID_ENUM
, "glMap2(target)" );
997 gl_error( ctx
, GL_INVALID_VALUE
, "glMap2(ustride)" );
1001 gl_error( ctx
, GL_INVALID_VALUE
, "glMap2(vstride)" );
1005 /* make copy of the control points */
1006 if (type
== GL_FLOAT
)
1007 pnts
= gl_copy_map_points2f(target
, ustride
, uorder
,
1008 vstride
, vorder
, (GLfloat
*) points
);
1010 pnts
= gl_copy_map_points2d(target
, ustride
, uorder
,
1011 vstride
, vorder
, (GLdouble
*) points
);
1014 case GL_MAP2_VERTEX_3
:
1015 ctx
->EvalMap
.Map2Vertex3
.Uorder
= uorder
;
1016 ctx
->EvalMap
.Map2Vertex3
.u1
= u1
;
1017 ctx
->EvalMap
.Map2Vertex3
.u2
= u2
;
1018 ctx
->EvalMap
.Map2Vertex3
.du
= 1.0 / (u2
- u1
);
1019 ctx
->EvalMap
.Map2Vertex3
.Vorder
= vorder
;
1020 ctx
->EvalMap
.Map2Vertex3
.v1
= v1
;
1021 ctx
->EvalMap
.Map2Vertex3
.v2
= v2
;
1022 ctx
->EvalMap
.Map2Vertex3
.dv
= 1.0 / (v2
- v1
);
1023 if (ctx
->EvalMap
.Map2Vertex3
.Points
)
1024 FREE( ctx
->EvalMap
.Map2Vertex3
.Points
);
1025 ctx
->EvalMap
.Map2Vertex3
.Points
= pnts
;
1027 case GL_MAP2_VERTEX_4
:
1028 ctx
->EvalMap
.Map2Vertex4
.Uorder
= uorder
;
1029 ctx
->EvalMap
.Map2Vertex4
.u1
= u1
;
1030 ctx
->EvalMap
.Map2Vertex4
.u2
= u2
;
1031 ctx
->EvalMap
.Map2Vertex4
.du
= 1.0 / (u2
- u1
);
1032 ctx
->EvalMap
.Map2Vertex4
.Vorder
= vorder
;
1033 ctx
->EvalMap
.Map2Vertex4
.v1
= v1
;
1034 ctx
->EvalMap
.Map2Vertex4
.v2
= v2
;
1035 ctx
->EvalMap
.Map2Vertex4
.dv
= 1.0 / (v2
- v1
);
1036 if (ctx
->EvalMap
.Map2Vertex4
.Points
)
1037 FREE( ctx
->EvalMap
.Map2Vertex4
.Points
);
1038 ctx
->EvalMap
.Map2Vertex4
.Points
= pnts
;
1041 ctx
->EvalMap
.Map2Index
.Uorder
= uorder
;
1042 ctx
->EvalMap
.Map2Index
.u1
= u1
;
1043 ctx
->EvalMap
.Map2Index
.u2
= u2
;
1044 ctx
->EvalMap
.Map2Index
.du
= 1.0 / (u2
- u1
);
1045 ctx
->EvalMap
.Map2Index
.Vorder
= vorder
;
1046 ctx
->EvalMap
.Map2Index
.v1
= v1
;
1047 ctx
->EvalMap
.Map2Index
.v2
= v2
;
1048 ctx
->EvalMap
.Map2Index
.dv
= 1.0 / (v2
- v1
);
1049 if (ctx
->EvalMap
.Map2Index
.Points
)
1050 FREE( ctx
->EvalMap
.Map2Index
.Points
);
1051 ctx
->EvalMap
.Map2Index
.Points
= pnts
;
1053 case GL_MAP2_COLOR_4
:
1054 ctx
->EvalMap
.Map2Color4
.Uorder
= uorder
;
1055 ctx
->EvalMap
.Map2Color4
.u1
= u1
;
1056 ctx
->EvalMap
.Map2Color4
.u2
= u2
;
1057 ctx
->EvalMap
.Map2Color4
.du
= 1.0 / (u2
- u1
);
1058 ctx
->EvalMap
.Map2Color4
.Vorder
= vorder
;
1059 ctx
->EvalMap
.Map2Color4
.v1
= v1
;
1060 ctx
->EvalMap
.Map2Color4
.v2
= v2
;
1061 ctx
->EvalMap
.Map2Color4
.dv
= 1.0 / (v2
- v1
);
1062 if (ctx
->EvalMap
.Map2Color4
.Points
)
1063 FREE( ctx
->EvalMap
.Map2Color4
.Points
);
1064 ctx
->EvalMap
.Map2Color4
.Points
= pnts
;
1066 case GL_MAP2_NORMAL
:
1067 ctx
->EvalMap
.Map2Normal
.Uorder
= uorder
;
1068 ctx
->EvalMap
.Map2Normal
.u1
= u1
;
1069 ctx
->EvalMap
.Map2Normal
.u2
= u2
;
1070 ctx
->EvalMap
.Map2Normal
.du
= 1.0 / (u2
- u1
);
1071 ctx
->EvalMap
.Map2Normal
.Vorder
= vorder
;
1072 ctx
->EvalMap
.Map2Normal
.v1
= v1
;
1073 ctx
->EvalMap
.Map2Normal
.v2
= v2
;
1074 ctx
->EvalMap
.Map2Normal
.dv
= 1.0 / (v2
- v1
);
1075 if (ctx
->EvalMap
.Map2Normal
.Points
)
1076 FREE( ctx
->EvalMap
.Map2Normal
.Points
);
1077 ctx
->EvalMap
.Map2Normal
.Points
= pnts
;
1079 case GL_MAP2_TEXTURE_COORD_1
:
1080 ctx
->EvalMap
.Map2Texture1
.Uorder
= uorder
;
1081 ctx
->EvalMap
.Map2Texture1
.u1
= u1
;
1082 ctx
->EvalMap
.Map2Texture1
.u2
= u2
;
1083 ctx
->EvalMap
.Map2Texture1
.du
= 1.0 / (u2
- u1
);
1084 ctx
->EvalMap
.Map2Texture1
.Vorder
= vorder
;
1085 ctx
->EvalMap
.Map2Texture1
.v1
= v1
;
1086 ctx
->EvalMap
.Map2Texture1
.v2
= v2
;
1087 ctx
->EvalMap
.Map2Texture1
.dv
= 1.0 / (v2
- v1
);
1088 if (ctx
->EvalMap
.Map2Texture1
.Points
)
1089 FREE( ctx
->EvalMap
.Map2Texture1
.Points
);
1090 ctx
->EvalMap
.Map2Texture1
.Points
= pnts
;
1092 case GL_MAP2_TEXTURE_COORD_2
:
1093 ctx
->EvalMap
.Map2Texture2
.Uorder
= uorder
;
1094 ctx
->EvalMap
.Map2Texture2
.u1
= u1
;
1095 ctx
->EvalMap
.Map2Texture2
.u2
= u2
;
1096 ctx
->EvalMap
.Map2Texture2
.du
= 1.0 / (u2
- u1
);
1097 ctx
->EvalMap
.Map2Texture2
.Vorder
= vorder
;
1098 ctx
->EvalMap
.Map2Texture2
.v1
= v1
;
1099 ctx
->EvalMap
.Map2Texture2
.v2
= v2
;
1100 ctx
->EvalMap
.Map2Texture2
.dv
= 1.0 / (v2
- v1
);
1101 if (ctx
->EvalMap
.Map2Texture2
.Points
)
1102 FREE( ctx
->EvalMap
.Map2Texture2
.Points
);
1103 ctx
->EvalMap
.Map2Texture2
.Points
= pnts
;
1105 case GL_MAP2_TEXTURE_COORD_3
:
1106 ctx
->EvalMap
.Map2Texture3
.Uorder
= uorder
;
1107 ctx
->EvalMap
.Map2Texture3
.u1
= u1
;
1108 ctx
->EvalMap
.Map2Texture3
.u2
= u2
;
1109 ctx
->EvalMap
.Map2Texture3
.du
= 1.0 / (u2
- u1
);
1110 ctx
->EvalMap
.Map2Texture3
.Vorder
= vorder
;
1111 ctx
->EvalMap
.Map2Texture3
.v1
= v1
;
1112 ctx
->EvalMap
.Map2Texture3
.v2
= v2
;
1113 ctx
->EvalMap
.Map2Texture3
.dv
= 1.0 / (v2
- v1
);
1114 if (ctx
->EvalMap
.Map2Texture3
.Points
)
1115 FREE( ctx
->EvalMap
.Map2Texture3
.Points
);
1116 ctx
->EvalMap
.Map2Texture3
.Points
= pnts
;
1118 case GL_MAP2_TEXTURE_COORD_4
:
1119 ctx
->EvalMap
.Map2Texture4
.Uorder
= uorder
;
1120 ctx
->EvalMap
.Map2Texture4
.u1
= u1
;
1121 ctx
->EvalMap
.Map2Texture4
.u2
= u2
;
1122 ctx
->EvalMap
.Map2Texture4
.du
= 1.0 / (u2
- u1
);
1123 ctx
->EvalMap
.Map2Texture4
.Vorder
= vorder
;
1124 ctx
->EvalMap
.Map2Texture4
.v1
= v1
;
1125 ctx
->EvalMap
.Map2Texture4
.v2
= v2
;
1126 ctx
->EvalMap
.Map2Texture4
.dv
= 1.0 / (v2
- v1
);
1127 if (ctx
->EvalMap
.Map2Texture4
.Points
)
1128 FREE( ctx
->EvalMap
.Map2Texture4
.Points
);
1129 ctx
->EvalMap
.Map2Texture4
.Points
= pnts
;
1132 gl_error( ctx
, GL_INVALID_ENUM
, "glMap2(target)" );
1138 _mesa_Map2f( GLenum target
,
1139 GLfloat u1
, GLfloat u2
, GLint ustride
, GLint uorder
,
1140 GLfloat v1
, GLfloat v2
, GLint vstride
, GLint vorder
,
1141 const GLfloat
*points
)
1143 map2(target
, u1
, u2
, ustride
, uorder
, v1
, v2
, vstride
, vorder
,
1149 _mesa_Map2d( GLenum target
,
1150 GLdouble u1
, GLdouble u2
, GLint ustride
, GLint uorder
,
1151 GLdouble v1
, GLdouble v2
, GLint vstride
, GLint vorder
,
1152 const GLdouble
*points
)
1154 map2(target
, u1
, u2
, ustride
, uorder
, v1
, v2
, vstride
, vorder
,
1161 _mesa_GetMapdv( GLenum target
, GLenum query
, GLdouble
*v
)
1163 GET_CURRENT_CONTEXT(ctx
);
1170 case GL_MAP1_COLOR_4
:
1171 data
= ctx
->EvalMap
.Map1Color4
.Points
;
1172 n
= ctx
->EvalMap
.Map1Color4
.Order
* 4;
1175 data
= ctx
->EvalMap
.Map1Index
.Points
;
1176 n
= ctx
->EvalMap
.Map1Index
.Order
;
1178 case GL_MAP1_NORMAL
:
1179 data
= ctx
->EvalMap
.Map1Normal
.Points
;
1180 n
= ctx
->EvalMap
.Map1Normal
.Order
* 3;
1182 case GL_MAP1_TEXTURE_COORD_1
:
1183 data
= ctx
->EvalMap
.Map1Texture1
.Points
;
1184 n
= ctx
->EvalMap
.Map1Texture1
.Order
* 1;
1186 case GL_MAP1_TEXTURE_COORD_2
:
1187 data
= ctx
->EvalMap
.Map1Texture2
.Points
;
1188 n
= ctx
->EvalMap
.Map1Texture2
.Order
* 2;
1190 case GL_MAP1_TEXTURE_COORD_3
:
1191 data
= ctx
->EvalMap
.Map1Texture3
.Points
;
1192 n
= ctx
->EvalMap
.Map1Texture3
.Order
* 3;
1194 case GL_MAP1_TEXTURE_COORD_4
:
1195 data
= ctx
->EvalMap
.Map1Texture4
.Points
;
1196 n
= ctx
->EvalMap
.Map1Texture4
.Order
* 4;
1198 case GL_MAP1_VERTEX_3
:
1199 data
= ctx
->EvalMap
.Map1Vertex3
.Points
;
1200 n
= ctx
->EvalMap
.Map1Vertex3
.Order
* 3;
1202 case GL_MAP1_VERTEX_4
:
1203 data
= ctx
->EvalMap
.Map1Vertex4
.Points
;
1204 n
= ctx
->EvalMap
.Map1Vertex4
.Order
* 4;
1206 case GL_MAP2_COLOR_4
:
1207 data
= ctx
->EvalMap
.Map2Color4
.Points
;
1208 n
= ctx
->EvalMap
.Map2Color4
.Uorder
1209 * ctx
->EvalMap
.Map2Color4
.Vorder
* 4;
1212 data
= ctx
->EvalMap
.Map2Index
.Points
;
1213 n
= ctx
->EvalMap
.Map2Index
.Uorder
1214 * ctx
->EvalMap
.Map2Index
.Vorder
;
1216 case GL_MAP2_NORMAL
:
1217 data
= ctx
->EvalMap
.Map2Normal
.Points
;
1218 n
= ctx
->EvalMap
.Map2Normal
.Uorder
1219 * ctx
->EvalMap
.Map2Normal
.Vorder
* 3;
1221 case GL_MAP2_TEXTURE_COORD_1
:
1222 data
= ctx
->EvalMap
.Map2Texture1
.Points
;
1223 n
= ctx
->EvalMap
.Map2Texture1
.Uorder
1224 * ctx
->EvalMap
.Map2Texture1
.Vorder
* 1;
1226 case GL_MAP2_TEXTURE_COORD_2
:
1227 data
= ctx
->EvalMap
.Map2Texture2
.Points
;
1228 n
= ctx
->EvalMap
.Map2Texture2
.Uorder
1229 * ctx
->EvalMap
.Map2Texture2
.Vorder
* 2;
1231 case GL_MAP2_TEXTURE_COORD_3
:
1232 data
= ctx
->EvalMap
.Map2Texture3
.Points
;
1233 n
= ctx
->EvalMap
.Map2Texture3
.Uorder
1234 * ctx
->EvalMap
.Map2Texture3
.Vorder
* 3;
1236 case GL_MAP2_TEXTURE_COORD_4
:
1237 data
= ctx
->EvalMap
.Map2Texture4
.Points
;
1238 n
= ctx
->EvalMap
.Map2Texture4
.Uorder
1239 * ctx
->EvalMap
.Map2Texture4
.Vorder
* 4;
1241 case GL_MAP2_VERTEX_3
:
1242 data
= ctx
->EvalMap
.Map2Vertex3
.Points
;
1243 n
= ctx
->EvalMap
.Map2Vertex3
.Uorder
1244 * ctx
->EvalMap
.Map2Vertex3
.Vorder
* 3;
1246 case GL_MAP2_VERTEX_4
:
1247 data
= ctx
->EvalMap
.Map2Vertex4
.Points
;
1248 n
= ctx
->EvalMap
.Map2Vertex4
.Uorder
1249 * ctx
->EvalMap
.Map2Vertex4
.Vorder
* 4;
1252 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapdv(target)" );
1263 case GL_MAP1_COLOR_4
:
1264 *v
= ctx
->EvalMap
.Map1Color4
.Order
;
1267 *v
= ctx
->EvalMap
.Map1Index
.Order
;
1269 case GL_MAP1_NORMAL
:
1270 *v
= ctx
->EvalMap
.Map1Normal
.Order
;
1272 case GL_MAP1_TEXTURE_COORD_1
:
1273 *v
= ctx
->EvalMap
.Map1Texture1
.Order
;
1275 case GL_MAP1_TEXTURE_COORD_2
:
1276 *v
= ctx
->EvalMap
.Map1Texture2
.Order
;
1278 case GL_MAP1_TEXTURE_COORD_3
:
1279 *v
= ctx
->EvalMap
.Map1Texture3
.Order
;
1281 case GL_MAP1_TEXTURE_COORD_4
:
1282 *v
= ctx
->EvalMap
.Map1Texture4
.Order
;
1284 case GL_MAP1_VERTEX_3
:
1285 *v
= ctx
->EvalMap
.Map1Vertex3
.Order
;
1287 case GL_MAP1_VERTEX_4
:
1288 *v
= ctx
->EvalMap
.Map1Vertex4
.Order
;
1290 case GL_MAP2_COLOR_4
:
1291 v
[0] = ctx
->EvalMap
.Map2Color4
.Uorder
;
1292 v
[1] = ctx
->EvalMap
.Map2Color4
.Vorder
;
1295 v
[0] = ctx
->EvalMap
.Map2Index
.Uorder
;
1296 v
[1] = ctx
->EvalMap
.Map2Index
.Vorder
;
1298 case GL_MAP2_NORMAL
:
1299 v
[0] = ctx
->EvalMap
.Map2Normal
.Uorder
;
1300 v
[1] = ctx
->EvalMap
.Map2Normal
.Vorder
;
1302 case GL_MAP2_TEXTURE_COORD_1
:
1303 v
[0] = ctx
->EvalMap
.Map2Texture1
.Uorder
;
1304 v
[1] = ctx
->EvalMap
.Map2Texture1
.Vorder
;
1306 case GL_MAP2_TEXTURE_COORD_2
:
1307 v
[0] = ctx
->EvalMap
.Map2Texture2
.Uorder
;
1308 v
[1] = ctx
->EvalMap
.Map2Texture2
.Vorder
;
1310 case GL_MAP2_TEXTURE_COORD_3
:
1311 v
[0] = ctx
->EvalMap
.Map2Texture3
.Uorder
;
1312 v
[1] = ctx
->EvalMap
.Map2Texture3
.Vorder
;
1314 case GL_MAP2_TEXTURE_COORD_4
:
1315 v
[0] = ctx
->EvalMap
.Map2Texture4
.Uorder
;
1316 v
[1] = ctx
->EvalMap
.Map2Texture4
.Vorder
;
1318 case GL_MAP2_VERTEX_3
:
1319 v
[0] = ctx
->EvalMap
.Map2Vertex3
.Uorder
;
1320 v
[1] = ctx
->EvalMap
.Map2Vertex3
.Vorder
;
1322 case GL_MAP2_VERTEX_4
:
1323 v
[0] = ctx
->EvalMap
.Map2Vertex4
.Uorder
;
1324 v
[1] = ctx
->EvalMap
.Map2Vertex4
.Vorder
;
1327 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapdv(target)" );
1333 case GL_MAP1_COLOR_4
:
1334 v
[0] = ctx
->EvalMap
.Map1Color4
.u1
;
1335 v
[1] = ctx
->EvalMap
.Map1Color4
.u2
;
1338 v
[0] = ctx
->EvalMap
.Map1Index
.u1
;
1339 v
[1] = ctx
->EvalMap
.Map1Index
.u2
;
1341 case GL_MAP1_NORMAL
:
1342 v
[0] = ctx
->EvalMap
.Map1Normal
.u1
;
1343 v
[1] = ctx
->EvalMap
.Map1Normal
.u2
;
1345 case GL_MAP1_TEXTURE_COORD_1
:
1346 v
[0] = ctx
->EvalMap
.Map1Texture1
.u1
;
1347 v
[1] = ctx
->EvalMap
.Map1Texture1
.u2
;
1349 case GL_MAP1_TEXTURE_COORD_2
:
1350 v
[0] = ctx
->EvalMap
.Map1Texture2
.u1
;
1351 v
[1] = ctx
->EvalMap
.Map1Texture2
.u2
;
1353 case GL_MAP1_TEXTURE_COORD_3
:
1354 v
[0] = ctx
->EvalMap
.Map1Texture3
.u1
;
1355 v
[1] = ctx
->EvalMap
.Map1Texture3
.u2
;
1357 case GL_MAP1_TEXTURE_COORD_4
:
1358 v
[0] = ctx
->EvalMap
.Map1Texture4
.u1
;
1359 v
[1] = ctx
->EvalMap
.Map1Texture4
.u2
;
1361 case GL_MAP1_VERTEX_3
:
1362 v
[0] = ctx
->EvalMap
.Map1Vertex3
.u1
;
1363 v
[1] = ctx
->EvalMap
.Map1Vertex3
.u2
;
1365 case GL_MAP1_VERTEX_4
:
1366 v
[0] = ctx
->EvalMap
.Map1Vertex4
.u1
;
1367 v
[1] = ctx
->EvalMap
.Map1Vertex4
.u2
;
1369 case GL_MAP2_COLOR_4
:
1370 v
[0] = ctx
->EvalMap
.Map2Color4
.u1
;
1371 v
[1] = ctx
->EvalMap
.Map2Color4
.u2
;
1372 v
[2] = ctx
->EvalMap
.Map2Color4
.v1
;
1373 v
[3] = ctx
->EvalMap
.Map2Color4
.v2
;
1376 v
[0] = ctx
->EvalMap
.Map2Index
.u1
;
1377 v
[1] = ctx
->EvalMap
.Map2Index
.u2
;
1378 v
[2] = ctx
->EvalMap
.Map2Index
.v1
;
1379 v
[3] = ctx
->EvalMap
.Map2Index
.v2
;
1381 case GL_MAP2_NORMAL
:
1382 v
[0] = ctx
->EvalMap
.Map2Normal
.u1
;
1383 v
[1] = ctx
->EvalMap
.Map2Normal
.u2
;
1384 v
[2] = ctx
->EvalMap
.Map2Normal
.v1
;
1385 v
[3] = ctx
->EvalMap
.Map2Normal
.v2
;
1387 case GL_MAP2_TEXTURE_COORD_1
:
1388 v
[0] = ctx
->EvalMap
.Map2Texture1
.u1
;
1389 v
[1] = ctx
->EvalMap
.Map2Texture1
.u2
;
1390 v
[2] = ctx
->EvalMap
.Map2Texture1
.v1
;
1391 v
[3] = ctx
->EvalMap
.Map2Texture1
.v2
;
1393 case GL_MAP2_TEXTURE_COORD_2
:
1394 v
[0] = ctx
->EvalMap
.Map2Texture2
.u1
;
1395 v
[1] = ctx
->EvalMap
.Map2Texture2
.u2
;
1396 v
[2] = ctx
->EvalMap
.Map2Texture2
.v1
;
1397 v
[3] = ctx
->EvalMap
.Map2Texture2
.v2
;
1399 case GL_MAP2_TEXTURE_COORD_3
:
1400 v
[0] = ctx
->EvalMap
.Map2Texture3
.u1
;
1401 v
[1] = ctx
->EvalMap
.Map2Texture3
.u2
;
1402 v
[2] = ctx
->EvalMap
.Map2Texture3
.v1
;
1403 v
[3] = ctx
->EvalMap
.Map2Texture3
.v2
;
1405 case GL_MAP2_TEXTURE_COORD_4
:
1406 v
[0] = ctx
->EvalMap
.Map2Texture4
.u1
;
1407 v
[1] = ctx
->EvalMap
.Map2Texture4
.u2
;
1408 v
[2] = ctx
->EvalMap
.Map2Texture4
.v1
;
1409 v
[3] = ctx
->EvalMap
.Map2Texture4
.v2
;
1411 case GL_MAP2_VERTEX_3
:
1412 v
[0] = ctx
->EvalMap
.Map2Vertex3
.u1
;
1413 v
[1] = ctx
->EvalMap
.Map2Vertex3
.u2
;
1414 v
[2] = ctx
->EvalMap
.Map2Vertex3
.v1
;
1415 v
[3] = ctx
->EvalMap
.Map2Vertex3
.v2
;
1417 case GL_MAP2_VERTEX_4
:
1418 v
[0] = ctx
->EvalMap
.Map2Vertex4
.u1
;
1419 v
[1] = ctx
->EvalMap
.Map2Vertex4
.u2
;
1420 v
[2] = ctx
->EvalMap
.Map2Vertex4
.v1
;
1421 v
[3] = ctx
->EvalMap
.Map2Vertex4
.v2
;
1424 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapdv(target)" );
1428 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapdv(query)" );
1434 _mesa_GetMapfv( GLenum target
, GLenum query
, GLfloat
*v
)
1436 GET_CURRENT_CONTEXT(ctx
);
1443 case GL_MAP1_COLOR_4
:
1444 data
= ctx
->EvalMap
.Map1Color4
.Points
;
1445 n
= ctx
->EvalMap
.Map1Color4
.Order
* 4;
1448 data
= ctx
->EvalMap
.Map1Index
.Points
;
1449 n
= ctx
->EvalMap
.Map1Index
.Order
;
1451 case GL_MAP1_NORMAL
:
1452 data
= ctx
->EvalMap
.Map1Normal
.Points
;
1453 n
= ctx
->EvalMap
.Map1Normal
.Order
* 3;
1455 case GL_MAP1_TEXTURE_COORD_1
:
1456 data
= ctx
->EvalMap
.Map1Texture1
.Points
;
1457 n
= ctx
->EvalMap
.Map1Texture1
.Order
* 1;
1459 case GL_MAP1_TEXTURE_COORD_2
:
1460 data
= ctx
->EvalMap
.Map1Texture2
.Points
;
1461 n
= ctx
->EvalMap
.Map1Texture2
.Order
* 2;
1463 case GL_MAP1_TEXTURE_COORD_3
:
1464 data
= ctx
->EvalMap
.Map1Texture3
.Points
;
1465 n
= ctx
->EvalMap
.Map1Texture3
.Order
* 3;
1467 case GL_MAP1_TEXTURE_COORD_4
:
1468 data
= ctx
->EvalMap
.Map1Texture4
.Points
;
1469 n
= ctx
->EvalMap
.Map1Texture4
.Order
* 4;
1471 case GL_MAP1_VERTEX_3
:
1472 data
= ctx
->EvalMap
.Map1Vertex3
.Points
;
1473 n
= ctx
->EvalMap
.Map1Vertex3
.Order
* 3;
1475 case GL_MAP1_VERTEX_4
:
1476 data
= ctx
->EvalMap
.Map1Vertex4
.Points
;
1477 n
= ctx
->EvalMap
.Map1Vertex4
.Order
* 4;
1479 case GL_MAP2_COLOR_4
:
1480 data
= ctx
->EvalMap
.Map2Color4
.Points
;
1481 n
= ctx
->EvalMap
.Map2Color4
.Uorder
1482 * ctx
->EvalMap
.Map2Color4
.Vorder
* 4;
1485 data
= ctx
->EvalMap
.Map2Index
.Points
;
1486 n
= ctx
->EvalMap
.Map2Index
.Uorder
1487 * ctx
->EvalMap
.Map2Index
.Vorder
;
1489 case GL_MAP2_NORMAL
:
1490 data
= ctx
->EvalMap
.Map2Normal
.Points
;
1491 n
= ctx
->EvalMap
.Map2Normal
.Uorder
1492 * ctx
->EvalMap
.Map2Normal
.Vorder
* 3;
1494 case GL_MAP2_TEXTURE_COORD_1
:
1495 data
= ctx
->EvalMap
.Map2Texture1
.Points
;
1496 n
= ctx
->EvalMap
.Map2Texture1
.Uorder
1497 * ctx
->EvalMap
.Map2Texture1
.Vorder
* 1;
1499 case GL_MAP2_TEXTURE_COORD_2
:
1500 data
= ctx
->EvalMap
.Map2Texture2
.Points
;
1501 n
= ctx
->EvalMap
.Map2Texture2
.Uorder
1502 * ctx
->EvalMap
.Map2Texture2
.Vorder
* 2;
1504 case GL_MAP2_TEXTURE_COORD_3
:
1505 data
= ctx
->EvalMap
.Map2Texture3
.Points
;
1506 n
= ctx
->EvalMap
.Map2Texture3
.Uorder
1507 * ctx
->EvalMap
.Map2Texture3
.Vorder
* 3;
1509 case GL_MAP2_TEXTURE_COORD_4
:
1510 data
= ctx
->EvalMap
.Map2Texture4
.Points
;
1511 n
= ctx
->EvalMap
.Map2Texture4
.Uorder
1512 * ctx
->EvalMap
.Map2Texture4
.Vorder
* 4;
1514 case GL_MAP2_VERTEX_3
:
1515 data
= ctx
->EvalMap
.Map2Vertex3
.Points
;
1516 n
= ctx
->EvalMap
.Map2Vertex3
.Uorder
1517 * ctx
->EvalMap
.Map2Vertex3
.Vorder
* 3;
1519 case GL_MAP2_VERTEX_4
:
1520 data
= ctx
->EvalMap
.Map2Vertex4
.Points
;
1521 n
= ctx
->EvalMap
.Map2Vertex4
.Uorder
1522 * ctx
->EvalMap
.Map2Vertex4
.Vorder
* 4;
1525 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapfv(target)" );
1536 case GL_MAP1_COLOR_4
:
1537 *v
= ctx
->EvalMap
.Map1Color4
.Order
;
1540 *v
= ctx
->EvalMap
.Map1Index
.Order
;
1542 case GL_MAP1_NORMAL
:
1543 *v
= ctx
->EvalMap
.Map1Normal
.Order
;
1545 case GL_MAP1_TEXTURE_COORD_1
:
1546 *v
= ctx
->EvalMap
.Map1Texture1
.Order
;
1548 case GL_MAP1_TEXTURE_COORD_2
:
1549 *v
= ctx
->EvalMap
.Map1Texture2
.Order
;
1551 case GL_MAP1_TEXTURE_COORD_3
:
1552 *v
= ctx
->EvalMap
.Map1Texture3
.Order
;
1554 case GL_MAP1_TEXTURE_COORD_4
:
1555 *v
= ctx
->EvalMap
.Map1Texture4
.Order
;
1557 case GL_MAP1_VERTEX_3
:
1558 *v
= ctx
->EvalMap
.Map1Vertex3
.Order
;
1560 case GL_MAP1_VERTEX_4
:
1561 *v
= ctx
->EvalMap
.Map1Vertex4
.Order
;
1563 case GL_MAP2_COLOR_4
:
1564 v
[0] = ctx
->EvalMap
.Map2Color4
.Uorder
;
1565 v
[1] = ctx
->EvalMap
.Map2Color4
.Vorder
;
1568 v
[0] = ctx
->EvalMap
.Map2Index
.Uorder
;
1569 v
[1] = ctx
->EvalMap
.Map2Index
.Vorder
;
1571 case GL_MAP2_NORMAL
:
1572 v
[0] = ctx
->EvalMap
.Map2Normal
.Uorder
;
1573 v
[1] = ctx
->EvalMap
.Map2Normal
.Vorder
;
1575 case GL_MAP2_TEXTURE_COORD_1
:
1576 v
[0] = ctx
->EvalMap
.Map2Texture1
.Uorder
;
1577 v
[1] = ctx
->EvalMap
.Map2Texture1
.Vorder
;
1579 case GL_MAP2_TEXTURE_COORD_2
:
1580 v
[0] = ctx
->EvalMap
.Map2Texture2
.Uorder
;
1581 v
[1] = ctx
->EvalMap
.Map2Texture2
.Vorder
;
1583 case GL_MAP2_TEXTURE_COORD_3
:
1584 v
[0] = ctx
->EvalMap
.Map2Texture3
.Uorder
;
1585 v
[1] = ctx
->EvalMap
.Map2Texture3
.Vorder
;
1587 case GL_MAP2_TEXTURE_COORD_4
:
1588 v
[0] = ctx
->EvalMap
.Map2Texture4
.Uorder
;
1589 v
[1] = ctx
->EvalMap
.Map2Texture4
.Vorder
;
1591 case GL_MAP2_VERTEX_3
:
1592 v
[0] = ctx
->EvalMap
.Map2Vertex3
.Uorder
;
1593 v
[1] = ctx
->EvalMap
.Map2Vertex3
.Vorder
;
1595 case GL_MAP2_VERTEX_4
:
1596 v
[0] = ctx
->EvalMap
.Map2Vertex4
.Uorder
;
1597 v
[1] = ctx
->EvalMap
.Map2Vertex4
.Vorder
;
1600 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapfv(target)" );
1606 case GL_MAP1_COLOR_4
:
1607 v
[0] = ctx
->EvalMap
.Map1Color4
.u1
;
1608 v
[1] = ctx
->EvalMap
.Map1Color4
.u2
;
1611 v
[0] = ctx
->EvalMap
.Map1Index
.u1
;
1612 v
[1] = ctx
->EvalMap
.Map1Index
.u2
;
1614 case GL_MAP1_NORMAL
:
1615 v
[0] = ctx
->EvalMap
.Map1Normal
.u1
;
1616 v
[1] = ctx
->EvalMap
.Map1Normal
.u2
;
1618 case GL_MAP1_TEXTURE_COORD_1
:
1619 v
[0] = ctx
->EvalMap
.Map1Texture1
.u1
;
1620 v
[1] = ctx
->EvalMap
.Map1Texture1
.u2
;
1622 case GL_MAP1_TEXTURE_COORD_2
:
1623 v
[0] = ctx
->EvalMap
.Map1Texture2
.u1
;
1624 v
[1] = ctx
->EvalMap
.Map1Texture2
.u2
;
1626 case GL_MAP1_TEXTURE_COORD_3
:
1627 v
[0] = ctx
->EvalMap
.Map1Texture3
.u1
;
1628 v
[1] = ctx
->EvalMap
.Map1Texture3
.u2
;
1630 case GL_MAP1_TEXTURE_COORD_4
:
1631 v
[0] = ctx
->EvalMap
.Map1Texture4
.u1
;
1632 v
[1] = ctx
->EvalMap
.Map1Texture4
.u2
;
1634 case GL_MAP1_VERTEX_3
:
1635 v
[0] = ctx
->EvalMap
.Map1Vertex3
.u1
;
1636 v
[1] = ctx
->EvalMap
.Map1Vertex3
.u2
;
1638 case GL_MAP1_VERTEX_4
:
1639 v
[0] = ctx
->EvalMap
.Map1Vertex4
.u1
;
1640 v
[1] = ctx
->EvalMap
.Map1Vertex4
.u2
;
1642 case GL_MAP2_COLOR_4
:
1643 v
[0] = ctx
->EvalMap
.Map2Color4
.u1
;
1644 v
[1] = ctx
->EvalMap
.Map2Color4
.u2
;
1645 v
[2] = ctx
->EvalMap
.Map2Color4
.v1
;
1646 v
[3] = ctx
->EvalMap
.Map2Color4
.v2
;
1649 v
[0] = ctx
->EvalMap
.Map2Index
.u1
;
1650 v
[1] = ctx
->EvalMap
.Map2Index
.u2
;
1651 v
[2] = ctx
->EvalMap
.Map2Index
.v1
;
1652 v
[3] = ctx
->EvalMap
.Map2Index
.v2
;
1654 case GL_MAP2_NORMAL
:
1655 v
[0] = ctx
->EvalMap
.Map2Normal
.u1
;
1656 v
[1] = ctx
->EvalMap
.Map2Normal
.u2
;
1657 v
[2] = ctx
->EvalMap
.Map2Normal
.v1
;
1658 v
[3] = ctx
->EvalMap
.Map2Normal
.v2
;
1660 case GL_MAP2_TEXTURE_COORD_1
:
1661 v
[0] = ctx
->EvalMap
.Map2Texture1
.u1
;
1662 v
[1] = ctx
->EvalMap
.Map2Texture1
.u2
;
1663 v
[2] = ctx
->EvalMap
.Map2Texture1
.v1
;
1664 v
[3] = ctx
->EvalMap
.Map2Texture1
.v2
;
1666 case GL_MAP2_TEXTURE_COORD_2
:
1667 v
[0] = ctx
->EvalMap
.Map2Texture2
.u1
;
1668 v
[1] = ctx
->EvalMap
.Map2Texture2
.u2
;
1669 v
[2] = ctx
->EvalMap
.Map2Texture2
.v1
;
1670 v
[3] = ctx
->EvalMap
.Map2Texture2
.v2
;
1672 case GL_MAP2_TEXTURE_COORD_3
:
1673 v
[0] = ctx
->EvalMap
.Map2Texture3
.u1
;
1674 v
[1] = ctx
->EvalMap
.Map2Texture3
.u2
;
1675 v
[2] = ctx
->EvalMap
.Map2Texture3
.v1
;
1676 v
[3] = ctx
->EvalMap
.Map2Texture3
.v2
;
1678 case GL_MAP2_TEXTURE_COORD_4
:
1679 v
[0] = ctx
->EvalMap
.Map2Texture4
.u1
;
1680 v
[1] = ctx
->EvalMap
.Map2Texture4
.u2
;
1681 v
[2] = ctx
->EvalMap
.Map2Texture4
.v1
;
1682 v
[3] = ctx
->EvalMap
.Map2Texture4
.v2
;
1684 case GL_MAP2_VERTEX_3
:
1685 v
[0] = ctx
->EvalMap
.Map2Vertex3
.u1
;
1686 v
[1] = ctx
->EvalMap
.Map2Vertex3
.u2
;
1687 v
[2] = ctx
->EvalMap
.Map2Vertex3
.v1
;
1688 v
[3] = ctx
->EvalMap
.Map2Vertex3
.v2
;
1690 case GL_MAP2_VERTEX_4
:
1691 v
[0] = ctx
->EvalMap
.Map2Vertex4
.u1
;
1692 v
[1] = ctx
->EvalMap
.Map2Vertex4
.u2
;
1693 v
[2] = ctx
->EvalMap
.Map2Vertex4
.v1
;
1694 v
[3] = ctx
->EvalMap
.Map2Vertex4
.v2
;
1697 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapfv(target)" );
1701 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapfv(query)" );
1707 _mesa_GetMapiv( GLenum target
, GLenum query
, GLint
*v
)
1709 GET_CURRENT_CONTEXT(ctx
);
1716 case GL_MAP1_COLOR_4
:
1717 data
= ctx
->EvalMap
.Map1Color4
.Points
;
1718 n
= ctx
->EvalMap
.Map1Color4
.Order
* 4;
1721 data
= ctx
->EvalMap
.Map1Index
.Points
;
1722 n
= ctx
->EvalMap
.Map1Index
.Order
;
1724 case GL_MAP1_NORMAL
:
1725 data
= ctx
->EvalMap
.Map1Normal
.Points
;
1726 n
= ctx
->EvalMap
.Map1Normal
.Order
* 3;
1728 case GL_MAP1_TEXTURE_COORD_1
:
1729 data
= ctx
->EvalMap
.Map1Texture1
.Points
;
1730 n
= ctx
->EvalMap
.Map1Texture1
.Order
* 1;
1732 case GL_MAP1_TEXTURE_COORD_2
:
1733 data
= ctx
->EvalMap
.Map1Texture2
.Points
;
1734 n
= ctx
->EvalMap
.Map1Texture2
.Order
* 2;
1736 case GL_MAP1_TEXTURE_COORD_3
:
1737 data
= ctx
->EvalMap
.Map1Texture3
.Points
;
1738 n
= ctx
->EvalMap
.Map1Texture3
.Order
* 3;
1740 case GL_MAP1_TEXTURE_COORD_4
:
1741 data
= ctx
->EvalMap
.Map1Texture4
.Points
;
1742 n
= ctx
->EvalMap
.Map1Texture4
.Order
* 4;
1744 case GL_MAP1_VERTEX_3
:
1745 data
= ctx
->EvalMap
.Map1Vertex3
.Points
;
1746 n
= ctx
->EvalMap
.Map1Vertex3
.Order
* 3;
1748 case GL_MAP1_VERTEX_4
:
1749 data
= ctx
->EvalMap
.Map1Vertex4
.Points
;
1750 n
= ctx
->EvalMap
.Map1Vertex4
.Order
* 4;
1752 case GL_MAP2_COLOR_4
:
1753 data
= ctx
->EvalMap
.Map2Color4
.Points
;
1754 n
= ctx
->EvalMap
.Map2Color4
.Uorder
1755 * ctx
->EvalMap
.Map2Color4
.Vorder
* 4;
1758 data
= ctx
->EvalMap
.Map2Index
.Points
;
1759 n
= ctx
->EvalMap
.Map2Index
.Uorder
1760 * ctx
->EvalMap
.Map2Index
.Vorder
;
1762 case GL_MAP2_NORMAL
:
1763 data
= ctx
->EvalMap
.Map2Normal
.Points
;
1764 n
= ctx
->EvalMap
.Map2Normal
.Uorder
1765 * ctx
->EvalMap
.Map2Normal
.Vorder
* 3;
1767 case GL_MAP2_TEXTURE_COORD_1
:
1768 data
= ctx
->EvalMap
.Map2Texture1
.Points
;
1769 n
= ctx
->EvalMap
.Map2Texture1
.Uorder
1770 * ctx
->EvalMap
.Map2Texture1
.Vorder
* 1;
1772 case GL_MAP2_TEXTURE_COORD_2
:
1773 data
= ctx
->EvalMap
.Map2Texture2
.Points
;
1774 n
= ctx
->EvalMap
.Map2Texture2
.Uorder
1775 * ctx
->EvalMap
.Map2Texture2
.Vorder
* 2;
1777 case GL_MAP2_TEXTURE_COORD_3
:
1778 data
= ctx
->EvalMap
.Map2Texture3
.Points
;
1779 n
= ctx
->EvalMap
.Map2Texture3
.Uorder
1780 * ctx
->EvalMap
.Map2Texture3
.Vorder
* 3;
1782 case GL_MAP2_TEXTURE_COORD_4
:
1783 data
= ctx
->EvalMap
.Map2Texture4
.Points
;
1784 n
= ctx
->EvalMap
.Map2Texture4
.Uorder
1785 * ctx
->EvalMap
.Map2Texture4
.Vorder
* 4;
1787 case GL_MAP2_VERTEX_3
:
1788 data
= ctx
->EvalMap
.Map2Vertex3
.Points
;
1789 n
= ctx
->EvalMap
.Map2Vertex3
.Uorder
1790 * ctx
->EvalMap
.Map2Vertex3
.Vorder
* 3;
1792 case GL_MAP2_VERTEX_4
:
1793 data
= ctx
->EvalMap
.Map2Vertex4
.Points
;
1794 n
= ctx
->EvalMap
.Map2Vertex4
.Uorder
1795 * ctx
->EvalMap
.Map2Vertex4
.Vorder
* 4;
1798 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapiv(target)" );
1803 v
[i
] = ROUNDF(data
[i
]);
1809 case GL_MAP1_COLOR_4
:
1810 *v
= ctx
->EvalMap
.Map1Color4
.Order
;
1813 *v
= ctx
->EvalMap
.Map1Index
.Order
;
1815 case GL_MAP1_NORMAL
:
1816 *v
= ctx
->EvalMap
.Map1Normal
.Order
;
1818 case GL_MAP1_TEXTURE_COORD_1
:
1819 *v
= ctx
->EvalMap
.Map1Texture1
.Order
;
1821 case GL_MAP1_TEXTURE_COORD_2
:
1822 *v
= ctx
->EvalMap
.Map1Texture2
.Order
;
1824 case GL_MAP1_TEXTURE_COORD_3
:
1825 *v
= ctx
->EvalMap
.Map1Texture3
.Order
;
1827 case GL_MAP1_TEXTURE_COORD_4
:
1828 *v
= ctx
->EvalMap
.Map1Texture4
.Order
;
1830 case GL_MAP1_VERTEX_3
:
1831 *v
= ctx
->EvalMap
.Map1Vertex3
.Order
;
1833 case GL_MAP1_VERTEX_4
:
1834 *v
= ctx
->EvalMap
.Map1Vertex4
.Order
;
1836 case GL_MAP2_COLOR_4
:
1837 v
[0] = ctx
->EvalMap
.Map2Color4
.Uorder
;
1838 v
[1] = ctx
->EvalMap
.Map2Color4
.Vorder
;
1841 v
[0] = ctx
->EvalMap
.Map2Index
.Uorder
;
1842 v
[1] = ctx
->EvalMap
.Map2Index
.Vorder
;
1844 case GL_MAP2_NORMAL
:
1845 v
[0] = ctx
->EvalMap
.Map2Normal
.Uorder
;
1846 v
[1] = ctx
->EvalMap
.Map2Normal
.Vorder
;
1848 case GL_MAP2_TEXTURE_COORD_1
:
1849 v
[0] = ctx
->EvalMap
.Map2Texture1
.Uorder
;
1850 v
[1] = ctx
->EvalMap
.Map2Texture1
.Vorder
;
1852 case GL_MAP2_TEXTURE_COORD_2
:
1853 v
[0] = ctx
->EvalMap
.Map2Texture2
.Uorder
;
1854 v
[1] = ctx
->EvalMap
.Map2Texture2
.Vorder
;
1856 case GL_MAP2_TEXTURE_COORD_3
:
1857 v
[0] = ctx
->EvalMap
.Map2Texture3
.Uorder
;
1858 v
[1] = ctx
->EvalMap
.Map2Texture3
.Vorder
;
1860 case GL_MAP2_TEXTURE_COORD_4
:
1861 v
[0] = ctx
->EvalMap
.Map2Texture4
.Uorder
;
1862 v
[1] = ctx
->EvalMap
.Map2Texture4
.Vorder
;
1864 case GL_MAP2_VERTEX_3
:
1865 v
[0] = ctx
->EvalMap
.Map2Vertex3
.Uorder
;
1866 v
[1] = ctx
->EvalMap
.Map2Vertex3
.Vorder
;
1868 case GL_MAP2_VERTEX_4
:
1869 v
[0] = ctx
->EvalMap
.Map2Vertex4
.Uorder
;
1870 v
[1] = ctx
->EvalMap
.Map2Vertex4
.Vorder
;
1873 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapiv(target)" );
1879 case GL_MAP1_COLOR_4
:
1880 v
[0] = ROUNDF(ctx
->EvalMap
.Map1Color4
.u1
);
1881 v
[1] = ROUNDF(ctx
->EvalMap
.Map1Color4
.u2
);
1884 v
[0] = ROUNDF(ctx
->EvalMap
.Map1Index
.u1
);
1885 v
[1] = ROUNDF(ctx
->EvalMap
.Map1Index
.u2
);
1887 case GL_MAP1_NORMAL
:
1888 v
[0] = ROUNDF(ctx
->EvalMap
.Map1Normal
.u1
);
1889 v
[1] = ROUNDF(ctx
->EvalMap
.Map1Normal
.u2
);
1891 case GL_MAP1_TEXTURE_COORD_1
:
1892 v
[0] = ROUNDF(ctx
->EvalMap
.Map1Texture1
.u1
);
1893 v
[1] = ROUNDF(ctx
->EvalMap
.Map1Texture1
.u2
);
1895 case GL_MAP1_TEXTURE_COORD_2
:
1896 v
[0] = ROUNDF(ctx
->EvalMap
.Map1Texture2
.u1
);
1897 v
[1] = ROUNDF(ctx
->EvalMap
.Map1Texture2
.u2
);
1899 case GL_MAP1_TEXTURE_COORD_3
:
1900 v
[0] = ROUNDF(ctx
->EvalMap
.Map1Texture3
.u1
);
1901 v
[1] = ROUNDF(ctx
->EvalMap
.Map1Texture3
.u2
);
1903 case GL_MAP1_TEXTURE_COORD_4
:
1904 v
[0] = ROUNDF(ctx
->EvalMap
.Map1Texture4
.u1
);
1905 v
[1] = ROUNDF(ctx
->EvalMap
.Map1Texture4
.u2
);
1907 case GL_MAP1_VERTEX_3
:
1908 v
[0] = ROUNDF(ctx
->EvalMap
.Map1Vertex3
.u1
);
1909 v
[1] = ROUNDF(ctx
->EvalMap
.Map1Vertex3
.u2
);
1911 case GL_MAP1_VERTEX_4
:
1912 v
[0] = ROUNDF(ctx
->EvalMap
.Map1Vertex4
.u1
);
1913 v
[1] = ROUNDF(ctx
->EvalMap
.Map1Vertex4
.u2
);
1915 case GL_MAP2_COLOR_4
:
1916 v
[0] = ROUNDF(ctx
->EvalMap
.Map2Color4
.u1
);
1917 v
[1] = ROUNDF(ctx
->EvalMap
.Map2Color4
.u2
);
1918 v
[2] = ROUNDF(ctx
->EvalMap
.Map2Color4
.v1
);
1919 v
[3] = ROUNDF(ctx
->EvalMap
.Map2Color4
.v2
);
1922 v
[0] = ROUNDF(ctx
->EvalMap
.Map2Index
.u1
);
1923 v
[1] = ROUNDF(ctx
->EvalMap
.Map2Index
.u2
);
1924 v
[2] = ROUNDF(ctx
->EvalMap
.Map2Index
.v1
);
1925 v
[3] = ROUNDF(ctx
->EvalMap
.Map2Index
.v2
);
1927 case GL_MAP2_NORMAL
:
1928 v
[0] = ROUNDF(ctx
->EvalMap
.Map2Normal
.u1
);
1929 v
[1] = ROUNDF(ctx
->EvalMap
.Map2Normal
.u2
);
1930 v
[2] = ROUNDF(ctx
->EvalMap
.Map2Normal
.v1
);
1931 v
[3] = ROUNDF(ctx
->EvalMap
.Map2Normal
.v2
);
1933 case GL_MAP2_TEXTURE_COORD_1
:
1934 v
[0] = ROUNDF(ctx
->EvalMap
.Map2Texture1
.u1
);
1935 v
[1] = ROUNDF(ctx
->EvalMap
.Map2Texture1
.u2
);
1936 v
[2] = ROUNDF(ctx
->EvalMap
.Map2Texture1
.v1
);
1937 v
[3] = ROUNDF(ctx
->EvalMap
.Map2Texture1
.v2
);
1939 case GL_MAP2_TEXTURE_COORD_2
:
1940 v
[0] = ROUNDF(ctx
->EvalMap
.Map2Texture2
.u1
);
1941 v
[1] = ROUNDF(ctx
->EvalMap
.Map2Texture2
.u2
);
1942 v
[2] = ROUNDF(ctx
->EvalMap
.Map2Texture2
.v1
);
1943 v
[3] = ROUNDF(ctx
->EvalMap
.Map2Texture2
.v2
);
1945 case GL_MAP2_TEXTURE_COORD_3
:
1946 v
[0] = ROUNDF(ctx
->EvalMap
.Map2Texture3
.u1
);
1947 v
[1] = ROUNDF(ctx
->EvalMap
.Map2Texture3
.u2
);
1948 v
[2] = ROUNDF(ctx
->EvalMap
.Map2Texture3
.v1
);
1949 v
[3] = ROUNDF(ctx
->EvalMap
.Map2Texture3
.v2
);
1951 case GL_MAP2_TEXTURE_COORD_4
:
1952 v
[0] = ROUNDF(ctx
->EvalMap
.Map2Texture4
.u1
);
1953 v
[1] = ROUNDF(ctx
->EvalMap
.Map2Texture4
.u2
);
1954 v
[2] = ROUNDF(ctx
->EvalMap
.Map2Texture4
.v1
);
1955 v
[3] = ROUNDF(ctx
->EvalMap
.Map2Texture4
.v2
);
1957 case GL_MAP2_VERTEX_3
:
1958 v
[0] = ROUNDF(ctx
->EvalMap
.Map2Vertex3
.u1
);
1959 v
[1] = ROUNDF(ctx
->EvalMap
.Map2Vertex3
.u2
);
1960 v
[2] = ROUNDF(ctx
->EvalMap
.Map2Vertex3
.v1
);
1961 v
[3] = ROUNDF(ctx
->EvalMap
.Map2Vertex3
.v2
);
1963 case GL_MAP2_VERTEX_4
:
1964 v
[0] = ROUNDF(ctx
->EvalMap
.Map2Vertex4
.u1
);
1965 v
[1] = ROUNDF(ctx
->EvalMap
.Map2Vertex4
.u2
);
1966 v
[2] = ROUNDF(ctx
->EvalMap
.Map2Vertex4
.v1
);
1967 v
[3] = ROUNDF(ctx
->EvalMap
.Map2Vertex4
.v2
);
1970 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapiv(target)" );
1974 gl_error( ctx
, GL_INVALID_ENUM
, "glGetMapiv(query)" );
1980 static void eval_points1( GLfloat outcoord
[][4],
1982 const GLuint
*flags
,
1984 GLfloat du
, GLfloat u1
)
1987 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
1988 if (flags
[i
] & VERT_EVAL_P1
)
1989 outcoord
[i
][0] = coord
[i
][0] * du
+ u1
;
1990 else if (flags
[i
] & VERT_EVAL_ANY
) {
1991 outcoord
[i
][0] = coord
[i
][0];
1992 outcoord
[i
][1] = coord
[i
][1];
1996 static void eval_points2( GLfloat outcoord
[][4],
1998 const GLuint
*flags
,
2000 GLfloat du
, GLfloat u1
,
2001 GLfloat dv
, GLfloat v1
)
2004 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2005 if (flags
[i
] & VERT_EVAL_P2
) {
2006 outcoord
[i
][0] = coord
[i
][0] * du
+ u1
;
2007 outcoord
[i
][1] = coord
[i
][1] * dv
+ v1
;
2008 } else if (flags
[i
] & VERT_EVAL_ANY
) {
2009 outcoord
[i
][0] = coord
[i
][0];
2010 outcoord
[i
][1] = coord
[i
][1];
2015 static const GLubyte dirty_flags
[5] = {
2016 0, /* not possible */
2024 static GLvector4f
*eval1_4f( GLvector4f
*dest
,
2026 const GLuint
*flags
,
2029 struct gl_1d_map
*map
)
2031 const GLfloat u1
= map
->u1
;
2032 const GLfloat du
= map
->du
;
2033 GLfloat (*to
)[4] = dest
->data
;
2036 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2037 if (flags
[i
] & (VERT_EVAL_C1
|VERT_EVAL_P1
)) {
2038 GLfloat u
= (coord
[i
][0] - u1
) * du
;
2039 ASSIGN_4V(to
[i
], 0,0,0,1);
2040 horner_bezier_curve(map
->Points
, to
[i
], u
, dimension
, map
->Order
);
2044 dest
->start
= VEC_ELT(dest
, GLfloat
, start
);
2045 dest
->size
= MAX2(dest
->size
, dimension
);
2046 dest
->flags
|= dirty_flags
[dimension
];
2051 static GLvector1ui
*eval1_1ui( GLvector1ui
*dest
,
2053 const GLuint
*flags
,
2055 struct gl_1d_map
*map
)
2057 const GLfloat u1
= map
->u1
;
2058 const GLfloat du
= map
->du
;
2059 GLuint
*to
= dest
->data
;
2062 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2063 if (flags
[i
] & (VERT_EVAL_C1
|VERT_EVAL_P1
)) {
2064 GLfloat u
= (coord
[i
][0] - u1
) * du
;
2066 horner_bezier_curve(map
->Points
, &tmp
, u
, 1, map
->Order
);
2067 to
[i
] = (GLuint
) (GLint
) tmp
;
2070 dest
->start
= VEC_ELT(dest
, GLuint
, start
);
2075 static GLvector3f
*eval1_norm( GLvector3f
*dest
,
2077 GLuint
*flags
, /* not const */
2079 struct gl_1d_map
*map
)
2081 const GLfloat u1
= map
->u1
;
2082 const GLfloat du
= map
->du
;
2083 GLfloat (*to
)[3] = dest
->data
;
2086 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2087 if (flags
[i
] & (VERT_EVAL_C1
|VERT_EVAL_P1
)) {
2088 GLfloat u
= (coord
[i
][0] - u1
) * du
;
2089 horner_bezier_curve(map
->Points
, to
[i
], u
, 3, map
->Order
);
2090 flags
[i
+1] |= VERT_NORM
; /* reset */
2093 dest
->start
= VEC_ELT(dest
, GLfloat
, start
);
2098 static GLvector4ub
*eval1_color( GLvector4ub
*dest
,
2100 GLuint
*flags
, /* not const */
2102 struct gl_1d_map
*map
)
2104 const GLfloat u1
= map
->u1
;
2105 const GLfloat du
= map
->du
;
2106 GLubyte (*to
)[4] = dest
->data
;
2109 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2110 if (flags
[i
] & (VERT_EVAL_C1
|VERT_EVAL_P1
)) {
2111 GLfloat u
= (coord
[i
][0] - u1
) * du
;
2113 horner_bezier_curve(map
->Points
, fcolor
, u
, 4, map
->Order
);
2114 FLOAT_RGBA_TO_CHAN_RGBA(to
[i
], fcolor
);
2115 flags
[i
+1] |= VERT_RGBA
; /* reset */
2118 dest
->start
= VEC_ELT(dest
, GLubyte
, start
);
2126 static GLvector4f
*eval2_obj_norm( GLvector4f
*obj_ptr
,
2127 GLvector3f
*norm_ptr
,
2132 struct gl_2d_map
*map
)
2134 const GLfloat u1
= map
->u1
;
2135 const GLfloat du
= map
->du
;
2136 const GLfloat v1
= map
->v1
;
2137 const GLfloat dv
= map
->dv
;
2138 GLfloat (*obj
)[4] = obj_ptr
->data
;
2139 GLfloat (*normal
)[3] = norm_ptr
->data
;
2142 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2143 if (flags
[i
] & (VERT_EVAL_C2
|VERT_EVAL_P2
)) {
2144 GLfloat u
= (coord
[i
][0] - u1
) * du
;
2145 GLfloat v
= (coord
[i
][1] - v1
) * dv
;
2146 GLfloat du
[4], dv
[4];
2148 ASSIGN_4V(obj
[i
], 0,0,0,1);
2149 de_casteljau_surf(map
->Points
, obj
[i
], du
, dv
, u
, v
, dimension
,
2150 map
->Uorder
, map
->Vorder
);
2152 CROSS3(normal
[i
], du
, dv
);
2153 NORMALIZE_3FV(normal
[i
]);
2154 flags
[i
+1] |= VERT_NORM
;
2157 obj_ptr
->start
= VEC_ELT(obj_ptr
, GLfloat
, start
);
2159 obj_ptr
->size
= MAX2(obj_ptr
->size
, dimension
);
2160 obj_ptr
->flags
|= dirty_flags
[dimension
];
2165 static GLvector4f
*eval2_4f( GLvector4f
*dest
,
2167 const GLuint
*flags
,
2170 struct gl_2d_map
*map
)
2172 const GLfloat u1
= map
->u1
;
2173 const GLfloat du
= map
->du
;
2174 const GLfloat v1
= map
->v1
;
2175 const GLfloat dv
= map
->dv
;
2176 GLfloat (*to
)[4] = dest
->data
;
2179 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2180 if (flags
[i
] & (VERT_EVAL_C2
|VERT_EVAL_P2
)) {
2181 GLfloat u
= (coord
[i
][0] - u1
) * du
;
2182 GLfloat v
= (coord
[i
][1] - v1
) * dv
;
2183 horner_bezier_surf(map
->Points
, to
[i
], u
, v
, dimension
,
2184 map
->Uorder
, map
->Vorder
);
2187 dest
->start
= VEC_ELT(dest
, GLfloat
, start
);
2189 dest
->size
= MAX2(dest
->size
, dimension
);
2190 dest
->flags
|= dirty_flags
[dimension
];
2195 static GLvector3f
*eval2_norm( GLvector3f
*dest
,
2199 struct gl_2d_map
*map
)
2201 const GLfloat u1
= map
->u1
;
2202 const GLfloat du
= map
->du
;
2203 const GLfloat v1
= map
->v1
;
2204 const GLfloat dv
= map
->dv
;
2205 GLfloat (*to
)[3] = dest
->data
;
2208 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2209 if (flags
[i
] & (VERT_EVAL_C2
|VERT_EVAL_P2
)) {
2210 GLfloat u
= (coord
[i
][0] - u1
) * du
;
2211 GLfloat v
= (coord
[i
][1] - v1
) * dv
;
2212 horner_bezier_surf(map
->Points
, to
[i
], u
, v
, 3,
2213 map
->Uorder
, map
->Vorder
);
2214 flags
[i
+1] |= VERT_NORM
; /* reset */
2217 dest
->start
= VEC_ELT(dest
, GLfloat
, start
);
2223 static GLvector1ui
*eval2_1ui( GLvector1ui
*dest
,
2225 const GLuint
*flags
,
2227 struct gl_2d_map
*map
)
2229 const GLfloat u1
= map
->u1
;
2230 const GLfloat du
= map
->du
;
2231 const GLfloat v1
= map
->v1
;
2232 const GLfloat dv
= map
->dv
;
2233 GLuint
*to
= dest
->data
;
2236 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2237 if (flags
[i
] & (VERT_EVAL_C2
|VERT_EVAL_P2
)) {
2238 GLfloat u
= (coord
[i
][0] - u1
) * du
;
2239 GLfloat v
= (coord
[i
][1] - v1
) * dv
;
2241 horner_bezier_surf(map
->Points
, &tmp
, u
, v
, 1,
2242 map
->Uorder
, map
->Vorder
);
2244 to
[i
] = (GLuint
) (GLint
) tmp
;
2247 dest
->start
= VEC_ELT(dest
, GLuint
, start
);
2254 static GLvector4ub
*eval2_color( GLvector4ub
*dest
,
2258 struct gl_2d_map
*map
)
2260 const GLfloat u1
= map
->u1
;
2261 const GLfloat du
= map
->du
;
2262 const GLfloat v1
= map
->v1
;
2263 const GLfloat dv
= map
->dv
;
2264 GLubyte (*to
)[4] = dest
->data
;
2267 for (i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2268 if (flags
[i
] & (VERT_EVAL_C2
|VERT_EVAL_P2
)) {
2269 GLfloat u
= (coord
[i
][0] - u1
) * du
;
2270 GLfloat v
= (coord
[i
][1] - v1
) * dv
;
2272 horner_bezier_surf(map
->Points
, fcolor
, u
, v
, 4,
2273 map
->Uorder
, map
->Vorder
);
2274 FLOAT_RGBA_TO_CHAN_RGBA(to
[i
], fcolor
);
2275 flags
[i
+1] |= VERT_RGBA
; /* reset */
2278 dest
->start
= VEC_ELT(dest
, GLubyte
, start
);
2284 static GLvector4f
*copy_4f( GLvector4f
*out
, CONST GLvector4f
*in
,
2285 const GLuint
*flags
,
2288 GLfloat (*to
)[4] = out
->data
;
2289 GLfloat (*from
)[4] = in
->data
;
2292 for ( i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2293 if (!(flags
[i
] & VERT_EVAL_ANY
))
2294 COPY_4FV( to
[i
], from
[i
] );
2296 out
->start
= VEC_ELT(out
, GLfloat
, start
);
2300 static GLvector3f
*copy_3f( GLvector3f
*out
, CONST GLvector3f
*in
,
2301 const GLuint
*flags
,
2304 GLfloat (*to
)[3] = out
->data
;
2305 GLfloat (*from
)[3] = in
->data
;
2308 for ( i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2309 if (!(flags
[i
] & VERT_EVAL_ANY
))
2310 COPY_3V( to
[i
], from
[i
] );
2312 out
->start
= VEC_ELT(out
, GLfloat
, start
);
2316 static GLvector4ub
*copy_4ub( GLvector4ub
*out
,
2317 CONST GLvector4ub
*in
,
2318 const GLuint
*flags
,
2321 GLubyte (*to
)[4] = out
->data
;
2322 GLubyte (*from
)[4] = in
->data
;
2325 for ( i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2326 if (!(flags
[i
] & VERT_EVAL_ANY
))
2327 COPY_4UBV( to
[i
], from
[i
] );
2329 out
->start
= VEC_ELT(out
, GLubyte
, start
);
2333 static GLvector1ui
*copy_1ui( GLvector1ui
*out
,
2334 CONST GLvector1ui
*in
,
2335 const GLuint
*flags
,
2338 GLuint
*to
= out
->data
;
2339 CONST GLuint
*from
= in
->data
;
2342 for ( i
= start
; !(flags
[i
] & VERT_END_VB
) ; i
++)
2343 if (!(flags
[i
] & VERT_EVAL_ANY
))
2346 out
->start
= VEC_ELT(out
, GLuint
, start
);
2351 /* KW: Rewrote this to perform eval on a whole buffer at once.
2352 * Only evaluates active data items, and avoids scribbling
2353 * the source buffer if we are running from a display list.
2355 * If the user (in this case looser) sends eval coordinates
2356 * or runs a display list containing eval coords with no
2357 * vertex maps enabled, we have to either copy all non-eval
2358 * data to a new buffer, or find a way of working around
2359 * the eval data. I choose the second option.
2361 * KW: This code not reached by cva - use IM to access storage.
2363 void gl_eval_vb( struct vertex_buffer
*VB
)
2365 struct immediate
*IM
= VB
->IM
;
2366 GLcontext
*ctx
= VB
->ctx
;
2367 GLuint req
= ctx
->CVA
.elt
.inputs
;
2368 GLfloat (*coord
)[4] = VB
->ObjPtr
->data
;
2369 GLuint
*flags
= VB
->Flag
;
2370 GLuint new_flags
= 0;
2373 GLuint any_eval1
= VB
->OrFlag
& (VERT_EVAL_C1
|VERT_EVAL_P1
);
2374 GLuint any_eval2
= VB
->OrFlag
& (VERT_EVAL_C2
|VERT_EVAL_P2
);
2375 GLuint all_eval
= IM
->AndFlag
& VERT_EVAL_ANY
;
2377 /* Handle the degenerate cases.
2379 if (any_eval1
&& !ctx
->Eval
.Map1Vertex4
&& !ctx
->Eval
.Map1Vertex3
) {
2380 VB
->PurgeFlags
|= (VERT_EVAL_C1
|VERT_EVAL_P1
);
2382 any_eval1
= GL_FALSE
;
2385 if (any_eval2
&& !ctx
->Eval
.Map2Vertex4
&& !ctx
->Eval
.Map2Vertex3
) {
2386 VB
->PurgeFlags
|= (VERT_EVAL_C2
|VERT_EVAL_P2
);
2388 any_eval2
= GL_FALSE
;
2391 /* KW: This really is a degenerate case - doing this disables
2392 * culling, and causes dummy values for the missing vertices to be
2393 * transformed and clip tested. It also forces the individual
2394 * cliptesting of each primitive in vb_render. I wish there was a
2395 * nice alternative, but I can't say I want to put effort into
2396 * optimizing such a bad usage of the library - I'd much rather
2397 * work on useful changes.
2399 if (VB
->PurgeFlags
) {
2400 if (!any_eval1
&& !any_eval2
&& all_eval
) VB
->Count
= VB
->Start
;
2401 gl_purge_vertices( VB
);
2402 if (!any_eval1
&& !any_eval2
) return;
2404 VB
->IndirectCount
= VB
->Count
;
2406 /* Translate points into coords.
2408 if (any_eval1
&& (VB
->OrFlag
& VERT_EVAL_P1
))
2410 eval_points1( IM
->Obj
, coord
, flags
, IM
->Start
,
2411 ctx
->Eval
.MapGrid1du
,
2412 ctx
->Eval
.MapGrid1u1
);
2417 if (any_eval2
&& (VB
->OrFlag
& VERT_EVAL_P2
))
2419 eval_points2( IM
->Obj
, coord
, flags
, IM
->Start
,
2420 ctx
->Eval
.MapGrid2du
,
2421 ctx
->Eval
.MapGrid2u1
,
2422 ctx
->Eval
.MapGrid2dv
,
2423 ctx
->Eval
.MapGrid2v1
);
2428 /* Perform the evaluations on active data elements.
2430 if (req
& VERT_INDEX
)
2432 GLvector1ui
*in_index
= VB
->IndexPtr
;
2433 GLvector1ui
*out_index
= &IM
->v
.Index
;
2435 if (ctx
->Eval
.Map1Index
&& any_eval1
)
2436 VB
->IndexPtr
= eval1_1ui( out_index
, coord
, flags
, IM
->Start
,
2437 &ctx
->EvalMap
.Map1Index
);
2439 if (ctx
->Eval
.Map2Index
&& any_eval2
)
2440 VB
->IndexPtr
= eval2_1ui( out_index
, coord
, flags
, IM
->Start
,
2441 &ctx
->EvalMap
.Map2Index
);
2443 if (VB
->IndexPtr
!= in_index
) {
2444 new_flags
|= VERT_INDEX
;
2446 VB
->IndexPtr
= copy_1ui( out_index
, in_index
, flags
, IM
->Start
);
2450 if (req
& VERT_RGBA
)
2452 GLvector4ub
*in_color
= VB
->ColorPtr
;
2453 GLvector4ub
*out_color
= &IM
->v
.Color
;
2455 if (ctx
->Eval
.Map1Color4
&& any_eval1
)
2456 VB
->ColorPtr
= eval1_color( out_color
, coord
, flags
, IM
->Start
,
2457 &ctx
->EvalMap
.Map1Color4
);
2459 if (ctx
->Eval
.Map2Color4
&& any_eval2
)
2460 VB
->ColorPtr
= eval2_color( out_color
, coord
, flags
, IM
->Start
,
2461 &ctx
->EvalMap
.Map2Color4
);
2463 if (VB
->ColorPtr
!= in_color
) {
2464 new_flags
|= VERT_RGBA
;
2466 VB
->ColorPtr
= copy_4ub( out_color
, in_color
, flags
, IM
->Start
);
2469 VB
->Color
[0] = VB
->Color
[1] = VB
->ColorPtr
;
2473 if (req
& VERT_NORM
)
2475 GLvector3f
*in_normal
= VB
->NormalPtr
;
2476 GLvector3f
*out_normal
= &IM
->v
.Normal
;
2478 if (ctx
->Eval
.Map1Normal
&& any_eval1
)
2479 VB
->NormalPtr
= eval1_norm( out_normal
, coord
, flags
, IM
->Start
,
2480 &ctx
->EvalMap
.Map1Normal
);
2482 if (ctx
->Eval
.Map2Normal
&& any_eval2
)
2483 VB
->NormalPtr
= eval2_norm( out_normal
, coord
, flags
, IM
->Start
,
2484 &ctx
->EvalMap
.Map2Normal
);
2486 new_flags
|= VERT_NORM
;
2488 if (VB
->NormalPtr
!= in_normal
) {
2490 VB
->NormalPtr
= copy_3f( out_normal
, in_normal
, flags
, IM
->Start
);
2495 if (req
& VERT_TEX_ANY(0))
2497 GLvector4f
*tc
= VB
->TexCoordPtr
[0];
2498 GLvector4f
*in
= tc
;
2499 GLvector4f
*out
= &IM
->v
.TexCoord
[0];
2502 if (ctx
->Eval
.Map1TextureCoord4
)
2503 tc
= eval1_4f( out
, coord
, flags
, IM
->Start
,
2504 4, &ctx
->EvalMap
.Map1Texture4
);
2505 else if (ctx
->Eval
.Map1TextureCoord3
)
2506 tc
= eval1_4f( out
, coord
, flags
, IM
->Start
, 3,
2507 &ctx
->EvalMap
.Map1Texture3
);
2508 else if (ctx
->Eval
.Map1TextureCoord2
)
2509 tc
= eval1_4f( out
, coord
, flags
, IM
->Start
, 2,
2510 &ctx
->EvalMap
.Map1Texture2
);
2511 else if (ctx
->Eval
.Map1TextureCoord1
)
2512 tc
= eval1_4f( out
, coord
, flags
, IM
->Start
, 1,
2513 &ctx
->EvalMap
.Map1Texture1
);
2517 if (ctx
->Eval
.Map2TextureCoord4
)
2518 tc
= eval2_4f( out
, coord
, flags
, IM
->Start
,
2519 4, &ctx
->EvalMap
.Map2Texture4
);
2520 else if (ctx
->Eval
.Map2TextureCoord3
)
2521 tc
= eval2_4f( out
, coord
, flags
, IM
->Start
,
2522 3, &ctx
->EvalMap
.Map2Texture3
);
2523 else if (ctx
->Eval
.Map2TextureCoord2
)
2524 tc
= eval2_4f( out
, coord
, flags
, IM
->Start
,
2525 2, &ctx
->EvalMap
.Map2Texture2
);
2526 else if (ctx
->Eval
.Map2TextureCoord1
)
2527 tc
= eval2_4f( out
, coord
, flags
, IM
->Start
,
2528 1, &ctx
->EvalMap
.Map2Texture1
);
2532 new_flags
|= VERT_TEX_ANY(0); /* fix for sizes.. */
2534 tc
= copy_4f( out
, in
, flags
, IM
->Start
);
2537 VB
->TexCoordPtr
[0] = tc
;
2542 GLvector4f
*in
= VB
->ObjPtr
;
2543 GLvector4f
*out
= &IM
->v
.Obj
;
2544 GLvector4f
*obj
= in
;
2547 if (ctx
->Eval
.Map1Vertex4
)
2548 obj
= eval1_4f( out
, coord
, flags
, IM
->Start
,
2549 4, &ctx
->EvalMap
.Map1Vertex4
);
2551 obj
= eval1_4f( out
, coord
, flags
, IM
->Start
,
2552 3, &ctx
->EvalMap
.Map1Vertex3
);
2556 GLvector3f
*in_normal
= VB
->NormalPtr
;
2557 GLvector3f
*out_normal
= &IM
->v
.Normal
;
2559 if (ctx
->Eval
.Map2Vertex4
)
2561 if (ctx
->Eval
.AutoNormal
&& (req
& VERT_NORM
)) {
2562 obj
= eval2_obj_norm( out
, out_normal
, coord
, flags
,
2563 IM
->Start
, 4, &ctx
->EvalMap
.Map2Vertex4
);
2564 VB
->NormalPtr
= out_normal
;
2565 new_flags
|= VERT_NORM
;
2568 obj
= eval2_4f( out
, coord
, flags
, IM
->Start
,
2569 4, &ctx
->EvalMap
.Map2Vertex4
);
2571 else if (ctx
->Eval
.Map2Vertex3
)
2573 if (ctx
->Eval
.AutoNormal
&& (req
& VERT_NORM
)) {
2574 obj
= eval2_obj_norm( out
, out_normal
, coord
, flags
,
2575 IM
->Start
, 3, &ctx
->EvalMap
.Map2Vertex3
);
2576 VB
->NormalPtr
= out_normal
;
2577 new_flags
|= VERT_NORM
;
2580 obj
= eval2_4f( out
, coord
, flags
, IM
->Start
,
2581 3, &ctx
->EvalMap
.Map2Vertex3
);
2585 if (VB
->NormalPtr
!= in_normal
) {
2587 VB
->NormalPtr
= copy_3f( out_normal
, in_normal
, flags
,
2592 if (obj
!= in
&& !all_eval
)
2593 obj
= copy_4f( out
, in
, flags
, IM
->Start
);
2599 GLuint
*oldflags
= VB
->Flag
;
2600 GLuint
*flags
= VB
->Flag
= VB
->EvaluatedFlags
;
2602 GLuint count
= VB
->Count
;
2603 GLuint andflag
= VB
->IM
->AndFlag
;
2606 VB
->EvaluatedFlags
= (GLuint
*) MALLOC(VB
->Size
* sizeof(GLuint
));
2607 flags
= VB
->Flag
= VB
->EvaluatedFlags
;
2611 for (i
= 0 ; i
<= count
; i
++)
2612 flags
[i
] = oldflags
[i
] | new_flags
;
2613 andflag
|= new_flags
;
2616 for (i
= 0 ; i
<= count
; i
++) {
2617 flags
[i
] = oldflags
[i
];
2618 if (flags
[i
] & VERT_EVAL_ANY
)
2619 flags
[i
] |= new_flags
;
2620 andflag
&= flags
[i
];
2624 VB
->OrFlag
|= new_flags
;
2625 VB
->CullMode
= (GLubyte
) ((andflag
& VERT_NORM
) ? 0 : COMPACTED_NORMALS
);
2631 _mesa_MapGrid1f( GLint un
, GLfloat u1
, GLfloat u2
)
2633 GET_CURRENT_CONTEXT(ctx
);
2634 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glMapGrid1f");
2637 gl_error( ctx
, GL_INVALID_VALUE
, "glMapGrid1f" );
2640 ctx
->Eval
.MapGrid1un
= un
;
2641 ctx
->Eval
.MapGrid1u1
= u1
;
2642 ctx
->Eval
.MapGrid1u2
= u2
;
2643 ctx
->Eval
.MapGrid1du
= (u2
- u1
) / (GLfloat
) un
;
2648 _mesa_MapGrid1d( GLint un
, GLdouble u1
, GLdouble u2
)
2650 _mesa_MapGrid1f( un
, u1
, u2
);
2655 _mesa_MapGrid2f( GLint un
, GLfloat u1
, GLfloat u2
,
2656 GLint vn
, GLfloat v1
, GLfloat v2
)
2658 GET_CURRENT_CONTEXT(ctx
);
2659 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glMapGrid2f");
2661 gl_error( ctx
, GL_INVALID_VALUE
, "glMapGrid2f(un)" );
2665 gl_error( ctx
, GL_INVALID_VALUE
, "glMapGrid2f(vn)" );
2668 ctx
->Eval
.MapGrid2un
= un
;
2669 ctx
->Eval
.MapGrid2u1
= u1
;
2670 ctx
->Eval
.MapGrid2u2
= u2
;
2671 ctx
->Eval
.MapGrid2du
= (u2
- u1
) / (GLfloat
) un
;
2672 ctx
->Eval
.MapGrid2vn
= vn
;
2673 ctx
->Eval
.MapGrid2v1
= v1
;
2674 ctx
->Eval
.MapGrid2v2
= v2
;
2675 ctx
->Eval
.MapGrid2dv
= (v2
- v1
) / (GLfloat
) vn
;
2680 _mesa_MapGrid2d( GLint un
, GLdouble u1
, GLdouble u2
,
2681 GLint vn
, GLdouble v1
, GLdouble v2
)
2683 _mesa_MapGrid2f( un
, u1
, u2
, vn
, v1
, v2
);
2689 /* KW: If are compiling, we don't know whether eval will produce a
2690 * vertex when it is run in the future. If this is pure immediate
2691 * mode, eval is a noop if neither vertex map is enabled.
2693 * Thus we need to have a check in the display list code or
2694 * elsewhere for eval(1,2) vertices in the case where
2695 * map(1,2)_vertex is disabled, and to purge those vertices from
2696 * the vb. This is currently done
2697 * via modifications to the cull_vb and render_vb operations, and
2698 * by using the existing cullmask mechanism for all other operations.
2702 /* KW: Because the eval values don't become 'current', fixup will flow
2703 * through these vertices, and then evaluation will write on top
2704 * of the fixup results.
2706 * This is a little inefficient, but at least it is correct. This
2707 * could be short-circuited in the case where all vertices are
2708 * eval-vertices, or more generally by a cullmask in fixup.
2710 * Note: using Obj to hold eval coord data. This data is actually
2711 * transformed if eval is disabled. But disabling eval & sending
2712 * eval coords is stupid, right?
2716 #define EVALCOORD1(IM, x) \
2718 GLuint count = IM->Count++; \
2719 IM->Flag[count] |= VERT_EVAL_C1; \
2720 ASSIGN_4V(IM->Obj[count], x, 0, 0, 1); \
2721 if (count == VB_MAX-1) \
2722 _mesa_maybe_transform_vb( IM ); \
2725 #define EVALCOORD2(IM, x, y) \
2727 GLuint count = IM->Count++; \
2728 IM->Flag[count] |= VERT_EVAL_C2; \
2729 ASSIGN_4V(IM->Obj[count], x, y, 0, 1); \
2730 if (count == VB_MAX-1) \
2731 _mesa_maybe_transform_vb( IM ); \
2734 #define EVALPOINT1(IM, x) \
2736 GLuint count = IM->Count++; \
2737 IM->Flag[count] |= VERT_EVAL_P1; \
2738 ASSIGN_4V(IM->Obj[count], x, 0, 0, 1); \
2739 if (count == VB_MAX-1) \
2740 _mesa_maybe_transform_vb( IM ); \
2743 #define EVALPOINT2(IM, x, y) \
2745 GLuint count = IM->Count++; \
2746 IM->Flag[count] |= VERT_EVAL_P2; \
2747 ASSIGN_4V(IM->Obj[count], x, y, 0, 1); \
2748 if (count == VB_MAX-1) \
2749 _mesa_maybe_transform_vb( IM ); \
2753 /* Lame internal function:
2756 eval_coord1f( GLcontext
*CC
, GLfloat u
)
2758 struct immediate
*i
= CC
->input
;
2764 _mesa_EvalCoord1d( GLdouble u
)
2767 EVALCOORD1( IM
, (GLfloat
) u
);
2772 _mesa_EvalCoord1f( GLfloat u
)
2775 EVALCOORD1( IM
, u
);
2780 _mesa_EvalCoord1dv( const GLdouble
*u
)
2783 EVALCOORD1( IM
, (GLfloat
) *u
);
2788 _mesa_EvalCoord1fv( const GLfloat
*u
)
2791 EVALCOORD1( IM
, (GLfloat
) *u
);
2796 _mesa_EvalCoord2d( GLdouble u
, GLdouble v
)
2799 EVALCOORD2( IM
, (GLfloat
) u
, (GLfloat
) v
);
2804 _mesa_EvalCoord2f( GLfloat u
, GLfloat v
)
2807 EVALCOORD2( IM
, u
, v
);
2811 /* Lame internal function:
2814 eval_coord2f( GLcontext
*CC
, GLfloat u
, GLfloat v
)
2816 struct immediate
*i
= CC
->input
;
2817 EVALCOORD2( i
, u
, v
);
2822 _mesa_EvalCoord2dv( const GLdouble
*u
)
2825 EVALCOORD2( IM
, (GLfloat
) u
[0], (GLfloat
) u
[1] );
2830 _mesa_EvalCoord2fv( const GLfloat
*u
)
2833 EVALCOORD2( IM
, u
[0], u
[1] );
2838 _mesa_EvalPoint1( GLint i
)
2841 EVALPOINT1( IM
, i
);
2846 _mesa_EvalPoint2( GLint i
, GLint j
)
2849 EVALPOINT2( IM
, i
, j
);
2857 _mesa_EvalMesh1( GLenum mode
, GLint i1
, GLint i2
)
2859 GET_CURRENT_CONTEXT(ctx
);
2864 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glEvalMesh1");
2871 prim
= GL_LINE_STRIP
;
2874 gl_error( ctx
, GL_INVALID_ENUM
, "glEvalMesh1(mode)" );
2878 /* No effect if vertex maps disabled.
2880 if (!ctx
->Eval
.Map1Vertex4
&& !ctx
->Eval
.Map1Vertex3
)
2883 du
= ctx
->Eval
.MapGrid1du
;
2884 u
= ctx
->Eval
.MapGrid1u1
+ i1
* du
;
2886 /* KW: Could short-circuit this to avoid the immediate mechanism.
2888 RESET_IMMEDIATE(ctx
);
2890 gl_Begin( ctx
, prim
);
2891 for (i
=i1
;i
<=i2
;i
++,u
+=du
) {
2892 eval_coord1f( ctx
, u
);
2900 _mesa_EvalMesh2( GLenum mode
, GLint i1
, GLint i2
, GLint j1
, GLint j2
)
2902 GET_CURRENT_CONTEXT(ctx
);
2904 GLfloat u
, du
, v
, dv
, v1
, u1
;
2906 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glEvalMesh2");
2908 /* No effect if vertex maps disabled.
2910 if (!ctx
->Eval
.Map2Vertex4
&& !ctx
->Eval
.Map2Vertex3
)
2913 du
= ctx
->Eval
.MapGrid2du
;
2914 dv
= ctx
->Eval
.MapGrid2dv
;
2915 v1
= ctx
->Eval
.MapGrid2v1
+ j1
* dv
;
2916 u1
= ctx
->Eval
.MapGrid2u1
+ i1
* du
;
2918 RESET_IMMEDIATE(ctx
);
2922 gl_Begin( ctx
, GL_POINTS
);
2923 for (v
=v1
,j
=j1
;j
<=j2
;j
++,v
+=dv
) {
2924 for (u
=u1
,i
=i1
;i
<=i2
;i
++,u
+=du
) {
2925 eval_coord2f( ctx
, u
, v
);
2931 for (v
=v1
,j
=j1
;j
<=j2
;j
++,v
+=dv
) {
2932 gl_Begin( ctx
, GL_LINE_STRIP
);
2933 for (u
=u1
,i
=i1
;i
<=i2
;i
++,u
+=du
) {
2934 eval_coord2f( ctx
, u
, v
);
2938 for (u
=u1
,i
=i1
;i
<=i2
;i
++,u
+=du
) {
2939 gl_Begin( ctx
, GL_LINE_STRIP
);
2940 for (v
=v1
,j
=j1
;j
<=j2
;j
++,v
+=dv
) {
2941 eval_coord2f( ctx
, u
, v
);
2947 for (v
=v1
,j
=j1
;j
<j2
;j
++,v
+=dv
) {
2948 /* NOTE: a quad strip can't be used because the four */
2949 /* can't be guaranteed to be coplanar! */
2950 gl_Begin( ctx
, GL_TRIANGLE_STRIP
);
2951 for (u
=u1
,i
=i1
;i
<=i2
;i
++,u
+=du
) {
2952 eval_coord2f( ctx
, u
, v
);
2953 eval_coord2f( ctx
, u
, v
+dv
);
2959 gl_error( ctx
, GL_INVALID_ENUM
, "glEvalMesh2(mode)" );