3 * Mesa 3-D graphics library
6 * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * eval.c was written by
29 * Bernd Barsuhn (bdbarsuh@cip.informatik.uni-erlangen.de) and
30 * Volker Weiss (vrweiss@cip.informatik.uni-erlangen.de).
32 * My original implementation of evaluators was simplistic and didn't
33 * compute surface normal vectors properly. Bernd and Volker applied
34 * used more sophisticated methods to get better results.
50 * Return the number of components per control point for any type of
51 * evaluator. Return 0 if bad target.
52 * See table 5.1 in the OpenGL 1.2 spec.
54 GLuint
_mesa_evaluator_components( GLenum target
)
57 case GL_MAP1_VERTEX_3
: return 3;
58 case GL_MAP1_VERTEX_4
: return 4;
59 case GL_MAP1_INDEX
: return 1;
60 case GL_MAP1_COLOR_4
: return 4;
61 case GL_MAP1_NORMAL
: return 3;
62 case GL_MAP1_TEXTURE_COORD_1
: return 1;
63 case GL_MAP1_TEXTURE_COORD_2
: return 2;
64 case GL_MAP1_TEXTURE_COORD_3
: return 3;
65 case GL_MAP1_TEXTURE_COORD_4
: return 4;
66 case GL_MAP2_VERTEX_3
: return 3;
67 case GL_MAP2_VERTEX_4
: return 4;
68 case GL_MAP2_INDEX
: return 1;
69 case GL_MAP2_COLOR_4
: return 4;
70 case GL_MAP2_NORMAL
: return 3;
71 case GL_MAP2_TEXTURE_COORD_1
: return 1;
72 case GL_MAP2_TEXTURE_COORD_2
: return 2;
73 case GL_MAP2_TEXTURE_COORD_3
: return 3;
74 case GL_MAP2_TEXTURE_COORD_4
: return 4;
78 /* XXX need to check for the vertex program extension
79 if (!ctx->Extensions.NV_vertex_program)
83 if (target
>= GL_MAP1_VERTEX_ATTRIB0_4_NV
&&
84 target
<= GL_MAP1_VERTEX_ATTRIB15_4_NV
)
87 if (target
>= GL_MAP2_VERTEX_ATTRIB0_4_NV
&&
88 target
<= GL_MAP2_VERTEX_ATTRIB15_4_NV
)
96 * Return pointer to the gl_1d_map struct for the named target.
98 static struct gl_1d_map
*
99 get_1d_map( GLcontext
*ctx
, GLenum target
)
102 case GL_MAP1_VERTEX_3
:
103 return &ctx
->EvalMap
.Map1Vertex3
;
104 case GL_MAP1_VERTEX_4
:
105 return &ctx
->EvalMap
.Map1Vertex4
;
107 return &ctx
->EvalMap
.Map1Index
;
108 case GL_MAP1_COLOR_4
:
109 return &ctx
->EvalMap
.Map1Color4
;
111 return &ctx
->EvalMap
.Map1Normal
;
112 case GL_MAP1_TEXTURE_COORD_1
:
113 return &ctx
->EvalMap
.Map1Texture1
;
114 case GL_MAP1_TEXTURE_COORD_2
:
115 return &ctx
->EvalMap
.Map1Texture2
;
116 case GL_MAP1_TEXTURE_COORD_3
:
117 return &ctx
->EvalMap
.Map1Texture3
;
118 case GL_MAP1_TEXTURE_COORD_4
:
119 return &ctx
->EvalMap
.Map1Texture4
;
120 case GL_MAP1_VERTEX_ATTRIB0_4_NV
:
121 case GL_MAP1_VERTEX_ATTRIB1_4_NV
:
122 case GL_MAP1_VERTEX_ATTRIB2_4_NV
:
123 case GL_MAP1_VERTEX_ATTRIB3_4_NV
:
124 case GL_MAP1_VERTEX_ATTRIB4_4_NV
:
125 case GL_MAP1_VERTEX_ATTRIB5_4_NV
:
126 case GL_MAP1_VERTEX_ATTRIB6_4_NV
:
127 case GL_MAP1_VERTEX_ATTRIB7_4_NV
:
128 case GL_MAP1_VERTEX_ATTRIB8_4_NV
:
129 case GL_MAP1_VERTEX_ATTRIB9_4_NV
:
130 case GL_MAP1_VERTEX_ATTRIB10_4_NV
:
131 case GL_MAP1_VERTEX_ATTRIB11_4_NV
:
132 case GL_MAP1_VERTEX_ATTRIB12_4_NV
:
133 case GL_MAP1_VERTEX_ATTRIB13_4_NV
:
134 case GL_MAP1_VERTEX_ATTRIB14_4_NV
:
135 case GL_MAP1_VERTEX_ATTRIB15_4_NV
:
136 if (!ctx
->Extensions
.NV_vertex_program
)
138 return &ctx
->EvalMap
.Map1Attrib
[target
- GL_MAP1_VERTEX_ATTRIB0_4_NV
];
146 * Return pointer to the gl_2d_map struct for the named target.
148 static struct gl_2d_map
*
149 get_2d_map( GLcontext
*ctx
, GLenum target
)
152 case GL_MAP2_VERTEX_3
:
153 return &ctx
->EvalMap
.Map2Vertex3
;
154 case GL_MAP2_VERTEX_4
:
155 return &ctx
->EvalMap
.Map2Vertex4
;
157 return &ctx
->EvalMap
.Map2Index
;
158 case GL_MAP2_COLOR_4
:
159 return &ctx
->EvalMap
.Map2Color4
;
161 return &ctx
->EvalMap
.Map2Normal
;
162 case GL_MAP2_TEXTURE_COORD_1
:
163 return &ctx
->EvalMap
.Map2Texture1
;
164 case GL_MAP2_TEXTURE_COORD_2
:
165 return &ctx
->EvalMap
.Map2Texture2
;
166 case GL_MAP2_TEXTURE_COORD_3
:
167 return &ctx
->EvalMap
.Map2Texture3
;
168 case GL_MAP2_TEXTURE_COORD_4
:
169 return &ctx
->EvalMap
.Map2Texture4
;
170 case GL_MAP2_VERTEX_ATTRIB0_4_NV
:
171 case GL_MAP2_VERTEX_ATTRIB1_4_NV
:
172 case GL_MAP2_VERTEX_ATTRIB2_4_NV
:
173 case GL_MAP2_VERTEX_ATTRIB3_4_NV
:
174 case GL_MAP2_VERTEX_ATTRIB4_4_NV
:
175 case GL_MAP2_VERTEX_ATTRIB5_4_NV
:
176 case GL_MAP2_VERTEX_ATTRIB6_4_NV
:
177 case GL_MAP2_VERTEX_ATTRIB7_4_NV
:
178 case GL_MAP2_VERTEX_ATTRIB8_4_NV
:
179 case GL_MAP2_VERTEX_ATTRIB9_4_NV
:
180 case GL_MAP2_VERTEX_ATTRIB10_4_NV
:
181 case GL_MAP2_VERTEX_ATTRIB11_4_NV
:
182 case GL_MAP2_VERTEX_ATTRIB12_4_NV
:
183 case GL_MAP2_VERTEX_ATTRIB13_4_NV
:
184 case GL_MAP2_VERTEX_ATTRIB14_4_NV
:
185 case GL_MAP2_VERTEX_ATTRIB15_4_NV
:
186 if (!ctx
->Extensions
.NV_vertex_program
)
188 return &ctx
->EvalMap
.Map2Attrib
[target
- GL_MAP2_VERTEX_ATTRIB0_4_NV
];
195 /**********************************************************************/
196 /*** Copy and deallocate control points ***/
197 /**********************************************************************/
201 * Copy 1-parametric evaluator control points from user-specified
202 * memory space to a buffer of contiguous control points.
203 * \param see glMap1f for details
204 * \return pointer to buffer of contiguous control points or NULL if out
207 GLfloat
*_mesa_copy_map_points1f( GLenum target
, GLint ustride
, GLint uorder
,
208 const GLfloat
*points
)
211 GLint i
, k
, size
= _mesa_evaluator_components(target
);
213 if (!points
|| !size
)
216 buffer
= (GLfloat
*) MALLOC(uorder
* size
* sizeof(GLfloat
));
219 for (i
= 0, p
= buffer
; i
< uorder
; i
++, points
+= ustride
)
220 for (k
= 0; k
< size
; k
++)
229 * Same as above but convert doubles to floats.
231 GLfloat
*_mesa_copy_map_points1d( GLenum target
, GLint ustride
, GLint uorder
,
232 const GLdouble
*points
)
235 GLint i
, k
, size
= _mesa_evaluator_components(target
);
237 if (!points
|| !size
)
240 buffer
= (GLfloat
*) MALLOC(uorder
* size
* sizeof(GLfloat
));
243 for (i
= 0, p
= buffer
; i
< uorder
; i
++, points
+= ustride
)
244 for (k
= 0; k
< size
; k
++)
245 *p
++ = (GLfloat
) points
[k
];
253 * Copy 2-parametric evaluator control points from user-specified
254 * memory space to a buffer of contiguous control points.
255 * Additional memory is allocated to be used by the horner and
256 * de Casteljau evaluation schemes.
258 * \param see glMap2f for details
259 * \return pointer to buffer of contiguous control points or NULL if out
262 GLfloat
*_mesa_copy_map_points2f( GLenum target
,
263 GLint ustride
, GLint uorder
,
264 GLint vstride
, GLint vorder
,
265 const GLfloat
*points
)
268 GLint i
, j
, k
, size
, dsize
, hsize
;
271 size
= _mesa_evaluator_components(target
);
273 if (!points
|| size
==0) {
277 /* max(uorder, vorder) additional points are used in */
278 /* horner evaluation and uorder*vorder additional */
279 /* values are needed for de Casteljau */
280 dsize
= (uorder
== 2 && vorder
== 2)? 0 : uorder
*vorder
;
281 hsize
= (uorder
> vorder
? uorder
: vorder
)*size
;
284 buffer
= (GLfloat
*) MALLOC((uorder
*vorder
*size
+hsize
)*sizeof(GLfloat
));
286 buffer
= (GLfloat
*) MALLOC((uorder
*vorder
*size
+dsize
)*sizeof(GLfloat
));
288 /* compute the increment value for the u-loop */
289 uinc
= ustride
- vorder
*vstride
;
292 for (i
=0, p
=buffer
; i
<uorder
; i
++, points
+= uinc
)
293 for (j
=0; j
<vorder
; j
++, points
+= vstride
)
294 for (k
=0; k
<size
; k
++)
303 * Same as above but convert doubles to floats.
305 GLfloat
*_mesa_copy_map_points2d(GLenum target
,
306 GLint ustride
, GLint uorder
,
307 GLint vstride
, GLint vorder
,
308 const GLdouble
*points
)
311 GLint i
, j
, k
, size
, hsize
, dsize
;
314 size
= _mesa_evaluator_components(target
);
316 if (!points
|| size
==0) {
320 /* max(uorder, vorder) additional points are used in */
321 /* horner evaluation and uorder*vorder additional */
322 /* values are needed for de Casteljau */
323 dsize
= (uorder
== 2 && vorder
== 2)? 0 : uorder
*vorder
;
324 hsize
= (uorder
> vorder
? uorder
: vorder
)*size
;
327 buffer
= (GLfloat
*) MALLOC((uorder
*vorder
*size
+hsize
)*sizeof(GLfloat
));
329 buffer
= (GLfloat
*) MALLOC((uorder
*vorder
*size
+dsize
)*sizeof(GLfloat
));
331 /* compute the increment value for the u-loop */
332 uinc
= ustride
- vorder
*vstride
;
335 for (i
=0, p
=buffer
; i
<uorder
; i
++, points
+= uinc
)
336 for (j
=0; j
<vorder
; j
++, points
+= vstride
)
337 for (k
=0; k
<size
; k
++)
338 *p
++ = (GLfloat
) points
[k
];
346 /**********************************************************************/
347 /*** API entry points ***/
348 /**********************************************************************/
352 * This does the work of glMap1[fd].
355 map1(GLenum target
, GLfloat u1
, GLfloat u2
, GLint ustride
,
356 GLint uorder
, const GLvoid
*points
, GLenum type
)
358 GET_CURRENT_CONTEXT(ctx
);
361 struct gl_1d_map
*map
= NULL
;
363 ASSERT_OUTSIDE_BEGIN_END(ctx
);
364 ASSERT(type
== GL_FLOAT
|| type
== GL_DOUBLE
);
367 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMap1(u1,u2)" );
370 if (uorder
< 1 || uorder
> MAX_EVAL_ORDER
) {
371 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMap1(order)" );
375 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMap1(points)" );
379 k
= _mesa_evaluator_components( target
);
381 _mesa_error( ctx
, GL_INVALID_ENUM
, "glMap1(target)" );
385 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMap1(stride)" );
389 if (ctx
->Texture
.CurrentUnit
!= 0) {
390 /* See OpenGL 1.2.1 spec, section F.2.13 */
391 _mesa_error( ctx
, GL_INVALID_OPERATION
, "glMap2(ACTIVE_TEXTURE != 0)" );
395 map
= get_1d_map(ctx
, target
);
397 _mesa_error( ctx
, GL_INVALID_ENUM
, "glMap1(target)" );
401 /* make copy of the control points */
402 if (type
== GL_FLOAT
)
403 pnts
= _mesa_copy_map_points1f(target
, ustride
, uorder
, (GLfloat
*) points
);
405 pnts
= _mesa_copy_map_points1d(target
, ustride
, uorder
, (GLdouble
*) points
);
408 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
412 map
->du
= 1.0F
/ (u2
- u1
);
421 _mesa_Map1f( GLenum target
, GLfloat u1
, GLfloat u2
, GLint stride
,
422 GLint order
, const GLfloat
*points
)
424 map1(target
, u1
, u2
, stride
, order
, points
, GL_FLOAT
);
429 _mesa_Map1d( GLenum target
, GLdouble u1
, GLdouble u2
, GLint stride
,
430 GLint order
, const GLdouble
*points
)
432 map1(target
, (GLfloat
) u1
, (GLfloat
) u2
, stride
, order
, points
, GL_DOUBLE
);
437 map2( GLenum target
, GLfloat u1
, GLfloat u2
, GLint ustride
, GLint uorder
,
438 GLfloat v1
, GLfloat v2
, GLint vstride
, GLint vorder
,
439 const GLvoid
*points
, GLenum type
)
441 GET_CURRENT_CONTEXT(ctx
);
444 struct gl_2d_map
*map
= NULL
;
446 ASSERT_OUTSIDE_BEGIN_END(ctx
);
447 ASSERT(type
== GL_FLOAT
|| type
== GL_DOUBLE
);
450 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMap2(u1,u2)" );
455 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMap2(v1,v2)" );
459 if (uorder
<1 || uorder
>MAX_EVAL_ORDER
) {
460 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMap2(uorder)" );
464 if (vorder
<1 || vorder
>MAX_EVAL_ORDER
) {
465 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMap2(vorder)" );
469 k
= _mesa_evaluator_components( target
);
471 _mesa_error( ctx
, GL_INVALID_ENUM
, "glMap2(target)" );
475 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMap2(ustride)" );
479 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMap2(vstride)" );
483 if (ctx
->Texture
.CurrentUnit
!= 0) {
484 /* See OpenGL 1.2.1 spec, section F.2.13 */
485 _mesa_error( ctx
, GL_INVALID_OPERATION
, "glMap2(ACTIVE_TEXTURE != 0)" );
489 map
= get_2d_map(ctx
, target
);
491 _mesa_error( ctx
, GL_INVALID_ENUM
, "glMap2(target)" );
495 /* make copy of the control points */
496 if (type
== GL_FLOAT
)
497 pnts
= _mesa_copy_map_points2f(target
, ustride
, uorder
,
498 vstride
, vorder
, (GLfloat
*) points
);
500 pnts
= _mesa_copy_map_points2d(target
, ustride
, uorder
,
501 vstride
, vorder
, (GLdouble
*) points
);
504 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
505 map
->Uorder
= uorder
;
508 map
->du
= 1.0F
/ (u2
- u1
);
509 map
->Vorder
= vorder
;
512 map
->dv
= 1.0F
/ (v2
- v1
);
520 _mesa_Map2f( GLenum target
,
521 GLfloat u1
, GLfloat u2
, GLint ustride
, GLint uorder
,
522 GLfloat v1
, GLfloat v2
, GLint vstride
, GLint vorder
,
523 const GLfloat
*points
)
525 map2(target
, u1
, u2
, ustride
, uorder
, v1
, v2
, vstride
, vorder
,
531 _mesa_Map2d( GLenum target
,
532 GLdouble u1
, GLdouble u2
, GLint ustride
, GLint uorder
,
533 GLdouble v1
, GLdouble v2
, GLint vstride
, GLint vorder
,
534 const GLdouble
*points
)
536 map2(target
, (GLfloat
) u1
, (GLfloat
) u2
, ustride
, uorder
,
537 (GLfloat
) v1
, (GLfloat
) v2
, vstride
, vorder
, points
, GL_DOUBLE
);
543 _mesa_GetMapdv( GLenum target
, GLenum query
, GLdouble
*v
)
545 GET_CURRENT_CONTEXT(ctx
);
546 struct gl_1d_map
*map1d
;
547 struct gl_2d_map
*map2d
;
552 ASSERT_OUTSIDE_BEGIN_END(ctx
);
554 comps
= _mesa_evaluator_components(target
);
556 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetMapdv(target)" );
560 map1d
= get_1d_map(ctx
, target
);
561 map2d
= get_2d_map(ctx
, target
);
562 ASSERT(map1d
|| map2d
);
567 data
= map1d
->Points
;
568 n
= map1d
->Order
* comps
;
571 data
= map2d
->Points
;
572 n
= map2d
->Uorder
* map2d
->Vorder
* comps
;
582 v
[0] = (GLdouble
) map1d
->Order
;
585 v
[0] = (GLdouble
) map2d
->Uorder
;
586 v
[1] = (GLdouble
) map2d
->Vorder
;
591 v
[0] = (GLdouble
) map1d
->u1
;
592 v
[1] = (GLdouble
) map1d
->u2
;
595 v
[0] = (GLdouble
) map2d
->u1
;
596 v
[1] = (GLdouble
) map2d
->u2
;
597 v
[2] = (GLdouble
) map2d
->v1
;
598 v
[3] = (GLdouble
) map2d
->v2
;
602 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetMapdv(query)" );
608 _mesa_GetMapfv( GLenum target
, GLenum query
, GLfloat
*v
)
610 GET_CURRENT_CONTEXT(ctx
);
611 struct gl_1d_map
*map1d
;
612 struct gl_2d_map
*map2d
;
617 ASSERT_OUTSIDE_BEGIN_END(ctx
);
619 comps
= _mesa_evaluator_components(target
);
621 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetMapfv(target)" );
625 map1d
= get_1d_map(ctx
, target
);
626 map2d
= get_2d_map(ctx
, target
);
627 ASSERT(map1d
|| map2d
);
632 data
= map1d
->Points
;
633 n
= map1d
->Order
* comps
;
636 data
= map2d
->Points
;
637 n
= map2d
->Uorder
* map2d
->Vorder
* comps
;
647 v
[0] = (GLfloat
) map1d
->Order
;
650 v
[0] = (GLfloat
) map2d
->Uorder
;
651 v
[1] = (GLfloat
) map2d
->Vorder
;
667 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetMapfv(query)" );
673 _mesa_GetMapiv( GLenum target
, GLenum query
, GLint
*v
)
675 GET_CURRENT_CONTEXT(ctx
);
676 struct gl_1d_map
*map1d
;
677 struct gl_2d_map
*map2d
;
682 ASSERT_OUTSIDE_BEGIN_END(ctx
);
684 comps
= _mesa_evaluator_components(target
);
686 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetMapiv(target)" );
690 map1d
= get_1d_map(ctx
, target
);
691 map2d
= get_2d_map(ctx
, target
);
692 ASSERT(map1d
|| map2d
);
697 data
= map1d
->Points
;
698 n
= map1d
->Order
* comps
;
701 data
= map2d
->Points
;
702 n
= map2d
->Uorder
* map2d
->Vorder
* comps
;
706 v
[i
] = IROUND(data
[i
]);
715 v
[0] = map2d
->Uorder
;
716 v
[1] = map2d
->Vorder
;
721 v
[0] = IROUND(map1d
->u1
);
722 v
[1] = IROUND(map1d
->u2
);
725 v
[0] = IROUND(map2d
->u1
);
726 v
[1] = IROUND(map2d
->u2
);
727 v
[2] = IROUND(map2d
->v1
);
728 v
[3] = IROUND(map2d
->v2
);
732 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetMapiv(query)" );
739 _mesa_MapGrid1f( GLint un
, GLfloat u1
, GLfloat u2
)
741 GET_CURRENT_CONTEXT(ctx
);
742 ASSERT_OUTSIDE_BEGIN_END(ctx
);
745 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMapGrid1f" );
748 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
749 ctx
->Eval
.MapGrid1un
= un
;
750 ctx
->Eval
.MapGrid1u1
= u1
;
751 ctx
->Eval
.MapGrid1u2
= u2
;
752 ctx
->Eval
.MapGrid1du
= (u2
- u1
) / (GLfloat
) un
;
757 _mesa_MapGrid1d( GLint un
, GLdouble u1
, GLdouble u2
)
759 _mesa_MapGrid1f( un
, (GLfloat
) u1
, (GLfloat
) u2
);
764 _mesa_MapGrid2f( GLint un
, GLfloat u1
, GLfloat u2
,
765 GLint vn
, GLfloat v1
, GLfloat v2
)
767 GET_CURRENT_CONTEXT(ctx
);
768 ASSERT_OUTSIDE_BEGIN_END(ctx
);
771 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMapGrid2f(un)" );
775 _mesa_error( ctx
, GL_INVALID_VALUE
, "glMapGrid2f(vn)" );
779 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
780 ctx
->Eval
.MapGrid2un
= un
;
781 ctx
->Eval
.MapGrid2u1
= u1
;
782 ctx
->Eval
.MapGrid2u2
= u2
;
783 ctx
->Eval
.MapGrid2du
= (u2
- u1
) / (GLfloat
) un
;
784 ctx
->Eval
.MapGrid2vn
= vn
;
785 ctx
->Eval
.MapGrid2v1
= v1
;
786 ctx
->Eval
.MapGrid2v2
= v2
;
787 ctx
->Eval
.MapGrid2dv
= (v2
- v1
) / (GLfloat
) vn
;
792 _mesa_MapGrid2d( GLint un
, GLdouble u1
, GLdouble u2
,
793 GLint vn
, GLdouble v1
, GLdouble v2
)
795 _mesa_MapGrid2f( un
, (GLfloat
) u1
, (GLfloat
) u2
,
796 vn
, (GLfloat
) v1
, (GLfloat
) v2
);
801 /**********************************************************************/
802 /***** Initialization *****/
803 /**********************************************************************/
806 * Initialize a 1-D evaluator map.
809 init_1d_map( struct gl_1d_map
*map
, int n
, const float *initial
)
814 map
->Points
= (GLfloat
*) MALLOC(n
* sizeof(GLfloat
));
818 map
->Points
[i
] = initial
[i
];
824 * Initialize a 2-D evaluator map
827 init_2d_map( struct gl_2d_map
*map
, int n
, const float *initial
)
835 map
->Points
= (GLfloat
*) MALLOC(n
* sizeof(GLfloat
));
839 map
->Points
[i
] = initial
[i
];
844 void _mesa_init_eval( GLcontext
*ctx
)
848 /* Evaluators group */
849 ctx
->Eval
.Map1Color4
= GL_FALSE
;
850 ctx
->Eval
.Map1Index
= GL_FALSE
;
851 ctx
->Eval
.Map1Normal
= GL_FALSE
;
852 ctx
->Eval
.Map1TextureCoord1
= GL_FALSE
;
853 ctx
->Eval
.Map1TextureCoord2
= GL_FALSE
;
854 ctx
->Eval
.Map1TextureCoord3
= GL_FALSE
;
855 ctx
->Eval
.Map1TextureCoord4
= GL_FALSE
;
856 ctx
->Eval
.Map1Vertex3
= GL_FALSE
;
857 ctx
->Eval
.Map1Vertex4
= GL_FALSE
;
858 MEMSET(ctx
->Eval
.Map1Attrib
, 0, sizeof(ctx
->Eval
.Map1Attrib
));
859 ctx
->Eval
.Map2Color4
= GL_FALSE
;
860 ctx
->Eval
.Map2Index
= GL_FALSE
;
861 ctx
->Eval
.Map2Normal
= GL_FALSE
;
862 ctx
->Eval
.Map2TextureCoord1
= GL_FALSE
;
863 ctx
->Eval
.Map2TextureCoord2
= GL_FALSE
;
864 ctx
->Eval
.Map2TextureCoord3
= GL_FALSE
;
865 ctx
->Eval
.Map2TextureCoord4
= GL_FALSE
;
866 ctx
->Eval
.Map2Vertex3
= GL_FALSE
;
867 ctx
->Eval
.Map2Vertex4
= GL_FALSE
;
868 MEMSET(ctx
->Eval
.Map2Attrib
, 0, sizeof(ctx
->Eval
.Map2Attrib
));
869 ctx
->Eval
.AutoNormal
= GL_FALSE
;
870 ctx
->Eval
.MapGrid1un
= 1;
871 ctx
->Eval
.MapGrid1u1
= 0.0;
872 ctx
->Eval
.MapGrid1u2
= 1.0;
873 ctx
->Eval
.MapGrid2un
= 1;
874 ctx
->Eval
.MapGrid2vn
= 1;
875 ctx
->Eval
.MapGrid2u1
= 0.0;
876 ctx
->Eval
.MapGrid2u2
= 1.0;
877 ctx
->Eval
.MapGrid2v1
= 0.0;
878 ctx
->Eval
.MapGrid2v2
= 1.0;
882 static GLfloat vertex
[4] = { 0.0, 0.0, 0.0, 1.0 };
883 static GLfloat normal
[3] = { 0.0, 0.0, 1.0 };
884 static GLfloat index
[1] = { 1.0 };
885 static GLfloat color
[4] = { 1.0, 1.0, 1.0, 1.0 };
886 static GLfloat texcoord
[4] = { 0.0, 0.0, 0.0, 1.0 };
887 static GLfloat attrib
[4] = { 0.0, 0.0, 0.0, 1.0 };
889 init_1d_map( &ctx
->EvalMap
.Map1Vertex3
, 3, vertex
);
890 init_1d_map( &ctx
->EvalMap
.Map1Vertex4
, 4, vertex
);
891 init_1d_map( &ctx
->EvalMap
.Map1Index
, 1, index
);
892 init_1d_map( &ctx
->EvalMap
.Map1Color4
, 4, color
);
893 init_1d_map( &ctx
->EvalMap
.Map1Normal
, 3, normal
);
894 init_1d_map( &ctx
->EvalMap
.Map1Texture1
, 1, texcoord
);
895 init_1d_map( &ctx
->EvalMap
.Map1Texture2
, 2, texcoord
);
896 init_1d_map( &ctx
->EvalMap
.Map1Texture3
, 3, texcoord
);
897 init_1d_map( &ctx
->EvalMap
.Map1Texture4
, 4, texcoord
);
898 for (i
= 0; i
< 16; i
++)
899 init_1d_map( ctx
->EvalMap
.Map1Attrib
+ i
, 4, attrib
);
901 init_2d_map( &ctx
->EvalMap
.Map2Vertex3
, 3, vertex
);
902 init_2d_map( &ctx
->EvalMap
.Map2Vertex4
, 4, vertex
);
903 init_2d_map( &ctx
->EvalMap
.Map2Index
, 1, index
);
904 init_2d_map( &ctx
->EvalMap
.Map2Color4
, 4, color
);
905 init_2d_map( &ctx
->EvalMap
.Map2Normal
, 3, normal
);
906 init_2d_map( &ctx
->EvalMap
.Map2Texture1
, 1, texcoord
);
907 init_2d_map( &ctx
->EvalMap
.Map2Texture2
, 2, texcoord
);
908 init_2d_map( &ctx
->EvalMap
.Map2Texture3
, 3, texcoord
);
909 init_2d_map( &ctx
->EvalMap
.Map2Texture4
, 4, texcoord
);
910 for (i
= 0; i
< 16; i
++)
911 init_2d_map( ctx
->EvalMap
.Map2Attrib
+ i
, 4, attrib
);
916 void _mesa_free_eval_data( GLcontext
*ctx
)
920 /* Free evaluator data */
921 if (ctx
->EvalMap
.Map1Vertex3
.Points
)
922 FREE( ctx
->EvalMap
.Map1Vertex3
.Points
);
923 if (ctx
->EvalMap
.Map1Vertex4
.Points
)
924 FREE( ctx
->EvalMap
.Map1Vertex4
.Points
);
925 if (ctx
->EvalMap
.Map1Index
.Points
)
926 FREE( ctx
->EvalMap
.Map1Index
.Points
);
927 if (ctx
->EvalMap
.Map1Color4
.Points
)
928 FREE( ctx
->EvalMap
.Map1Color4
.Points
);
929 if (ctx
->EvalMap
.Map1Normal
.Points
)
930 FREE( ctx
->EvalMap
.Map1Normal
.Points
);
931 if (ctx
->EvalMap
.Map1Texture1
.Points
)
932 FREE( ctx
->EvalMap
.Map1Texture1
.Points
);
933 if (ctx
->EvalMap
.Map1Texture2
.Points
)
934 FREE( ctx
->EvalMap
.Map1Texture2
.Points
);
935 if (ctx
->EvalMap
.Map1Texture3
.Points
)
936 FREE( ctx
->EvalMap
.Map1Texture3
.Points
);
937 if (ctx
->EvalMap
.Map1Texture4
.Points
)
938 FREE( ctx
->EvalMap
.Map1Texture4
.Points
);
939 for (i
= 0; i
< 16; i
++)
940 FREE((ctx
->EvalMap
.Map1Attrib
[i
].Points
));
942 if (ctx
->EvalMap
.Map2Vertex3
.Points
)
943 FREE( ctx
->EvalMap
.Map2Vertex3
.Points
);
944 if (ctx
->EvalMap
.Map2Vertex4
.Points
)
945 FREE( ctx
->EvalMap
.Map2Vertex4
.Points
);
946 if (ctx
->EvalMap
.Map2Index
.Points
)
947 FREE( ctx
->EvalMap
.Map2Index
.Points
);
948 if (ctx
->EvalMap
.Map2Color4
.Points
)
949 FREE( ctx
->EvalMap
.Map2Color4
.Points
);
950 if (ctx
->EvalMap
.Map2Normal
.Points
)
951 FREE( ctx
->EvalMap
.Map2Normal
.Points
);
952 if (ctx
->EvalMap
.Map2Texture1
.Points
)
953 FREE( ctx
->EvalMap
.Map2Texture1
.Points
);
954 if (ctx
->EvalMap
.Map2Texture2
.Points
)
955 FREE( ctx
->EvalMap
.Map2Texture2
.Points
);
956 if (ctx
->EvalMap
.Map2Texture3
.Points
)
957 FREE( ctx
->EvalMap
.Map2Texture3
.Points
);
958 if (ctx
->EvalMap
.Map2Texture4
.Points
)
959 FREE( ctx
->EvalMap
.Map2Texture4
.Points
);
960 for (i
= 0; i
< 16; i
++)
961 FREE((ctx
->EvalMap
.Map2Attrib
[i
].Points
));