blob: a992a3922e1d4148f072e3bea1f9f4c1fe0aa452 [file] [log] [blame]
Gareth Hughes22144ab2001-03-12 00:48:37 +00001/* $Id: eval.c,v 1.19 2001/03/12 00:48:37 gareth Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paulc893a012000-10-28 20:41:13 +00005 * Version: 3.5
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00006 *
Gareth Hughes22144ab2001-03-12 00:48:37 +00007 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +00008 *
jtgafb833d1999-08-19 00:55:39 +00009 * 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:
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000015 *
jtgafb833d1999-08-19 00:55:39 +000016 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000018 *
jtgafb833d1999-08-19 00:55:39 +000019 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
jtgafb833d1999-08-19 00:55:39 +000028/*
29 * eval.c was written by
30 * Bernd Barsuhn (bdbarsuh@cip.informatik.uni-erlangen.de) and
31 * Volker Weiss (vrweiss@cip.informatik.uni-erlangen.de).
32 *
33 * My original implementation of evaluators was simplistic and didn't
34 * compute surface normal vectors properly. Bernd and Volker applied
35 * used more sophisticated methods to get better results.
36 *
37 * Thanks guys!
38 */
39
40
41#ifdef PC_HEADER
42#include "all.h"
43#else
Brian Paulfbd8f211999-11-11 01:22:25 +000044#include "glheader.h"
Brian Paulc893a012000-10-28 20:41:13 +000045#include "colormac.h"
jtgafb833d1999-08-19 00:55:39 +000046#include "context.h"
47#include "eval.h"
48#include "macros.h"
Brian Paulfbd8f211999-11-11 01:22:25 +000049#include "mem.h"
jtgafb833d1999-08-19 00:55:39 +000050#include "mmath.h"
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000051#include "mtypes.h"
jtgafb833d1999-08-19 00:55:39 +000052#endif
53
54
jtgafb833d1999-08-19 00:55:39 +000055/*
56 * Return the number of components per control point for any type of
57 * evaluator. Return 0 if bad target.
Brian Paulfbd8f211999-11-11 01:22:25 +000058 * See table 5.1 in the OpenGL 1.2 spec.
jtgafb833d1999-08-19 00:55:39 +000059 */
Brian Paulfbd8f211999-11-11 01:22:25 +000060GLuint _mesa_evaluator_components( GLenum target )
jtgafb833d1999-08-19 00:55:39 +000061{
62 switch (target) {
63 case GL_MAP1_VERTEX_3: return 3;
64 case GL_MAP1_VERTEX_4: return 4;
65 case GL_MAP1_INDEX: return 1;
66 case GL_MAP1_COLOR_4: return 4;
67 case GL_MAP1_NORMAL: return 3;
68 case GL_MAP1_TEXTURE_COORD_1: return 1;
69 case GL_MAP1_TEXTURE_COORD_2: return 2;
70 case GL_MAP1_TEXTURE_COORD_3: return 3;
71 case GL_MAP1_TEXTURE_COORD_4: return 4;
72 case GL_MAP2_VERTEX_3: return 3;
73 case GL_MAP2_VERTEX_4: return 4;
74 case GL_MAP2_INDEX: return 1;
75 case GL_MAP2_COLOR_4: return 4;
76 case GL_MAP2_NORMAL: return 3;
77 case GL_MAP2_TEXTURE_COORD_1: return 1;
78 case GL_MAP2_TEXTURE_COORD_2: return 2;
79 case GL_MAP2_TEXTURE_COORD_3: return 3;
80 case GL_MAP2_TEXTURE_COORD_4: return 4;
81 default: return 0;
82 }
83}
84
85
86/**********************************************************************/
87/*** Copy and deallocate control points ***/
88/**********************************************************************/
89
90
91/*
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +000092 * Copy 1-parametric evaluator control points from user-specified
jtgafb833d1999-08-19 00:55:39 +000093 * memory space to a buffer of contiguous control points.
94 * Input: see glMap1f for details
95 * Return: pointer to buffer of contiguous control points or NULL if out
96 * of memory.
97 */
Brian Paul08836342001-03-03 20:33:27 +000098GLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder,
jtgafb833d1999-08-19 00:55:39 +000099 const GLfloat *points )
100{
101 GLfloat *buffer, *p;
Brian Paulfbd8f211999-11-11 01:22:25 +0000102 GLint i, k, size = _mesa_evaluator_components(target);
jtgafb833d1999-08-19 00:55:39 +0000103
104 if (!points || size==0) {
105 return NULL;
106 }
107
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000108 buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000109
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000110 if(buffer)
jtgafb833d1999-08-19 00:55:39 +0000111 for(i=0, p=buffer; i<uorder; i++, points+=ustride)
112 for(k=0; k<size; k++)
113 *p++ = points[k];
114
115 return buffer;
116}
117
118
119
120/*
121 * Same as above but convert doubles to floats.
122 */
Brian Paul08836342001-03-03 20:33:27 +0000123GLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder,
Brian Paulfbd8f211999-11-11 01:22:25 +0000124 const GLdouble *points )
jtgafb833d1999-08-19 00:55:39 +0000125{
126 GLfloat *buffer, *p;
Brian Paulfbd8f211999-11-11 01:22:25 +0000127 GLint i, k, size = _mesa_evaluator_components(target);
jtgafb833d1999-08-19 00:55:39 +0000128
129 if (!points || size==0) {
130 return NULL;
131 }
132
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000133 buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000134
135 if(buffer)
136 for(i=0, p=buffer; i<uorder; i++, points+=ustride)
137 for(k=0; k<size; k++)
138 *p++ = (GLfloat) points[k];
139
140 return buffer;
141}
142
143
144
145/*
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000146 * Copy 2-parametric evaluator control points from user-specified
jtgafb833d1999-08-19 00:55:39 +0000147 * memory space to a buffer of contiguous control points.
148 * Additional memory is allocated to be used by the horner and
149 * de Casteljau evaluation schemes.
150 *
151 * Input: see glMap2f for details
152 * Return: pointer to buffer of contiguous control points or NULL if out
153 * of memory.
154 */
Brian Paul08836342001-03-03 20:33:27 +0000155GLfloat *_mesa_copy_map_points2f( GLenum target,
Brian Paulfbd8f211999-11-11 01:22:25 +0000156 GLint ustride, GLint uorder,
157 GLint vstride, GLint vorder,
158 const GLfloat *points )
jtgafb833d1999-08-19 00:55:39 +0000159{
160 GLfloat *buffer, *p;
161 GLint i, j, k, size, dsize, hsize;
162 GLint uinc;
163
Brian Paulfbd8f211999-11-11 01:22:25 +0000164 size = _mesa_evaluator_components(target);
jtgafb833d1999-08-19 00:55:39 +0000165
166 if (!points || size==0) {
167 return NULL;
168 }
169
170 /* max(uorder, vorder) additional points are used in */
171 /* horner evaluation and uorder*vorder additional */
172 /* values are needed for de Casteljau */
173 dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
174 hsize = (uorder > vorder ? uorder : vorder)*size;
175
176 if(hsize>dsize)
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000177 buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000178 else
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000179 buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000180
181 /* compute the increment value for the u-loop */
182 uinc = ustride - vorder*vstride;
183
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000184 if (buffer)
jtgafb833d1999-08-19 00:55:39 +0000185 for (i=0, p=buffer; i<uorder; i++, points += uinc)
186 for (j=0; j<vorder; j++, points += vstride)
187 for (k=0; k<size; k++)
188 *p++ = points[k];
189
190 return buffer;
191}
192
193
194
195/*
196 * Same as above but convert doubles to floats.
197 */
Brian Paul08836342001-03-03 20:33:27 +0000198GLfloat *_mesa_copy_map_points2d(GLenum target,
jtgafb833d1999-08-19 00:55:39 +0000199 GLint ustride, GLint uorder,
200 GLint vstride, GLint vorder,
201 const GLdouble *points )
202{
203 GLfloat *buffer, *p;
204 GLint i, j, k, size, hsize, dsize;
205 GLint uinc;
206
Brian Paulfbd8f211999-11-11 01:22:25 +0000207 size = _mesa_evaluator_components(target);
jtgafb833d1999-08-19 00:55:39 +0000208
209 if (!points || size==0) {
210 return NULL;
211 }
212
213 /* max(uorder, vorder) additional points are used in */
214 /* horner evaluation and uorder*vorder additional */
215 /* values are needed for de Casteljau */
216 dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder;
217 hsize = (uorder > vorder ? uorder : vorder)*size;
218
219 if(hsize>dsize)
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000220 buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000221 else
Brian Paulbd5cdaf1999-10-13 18:42:49 +0000222 buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat));
jtgafb833d1999-08-19 00:55:39 +0000223
224 /* compute the increment value for the u-loop */
225 uinc = ustride - vorder*vstride;
226
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000227 if (buffer)
jtgafb833d1999-08-19 00:55:39 +0000228 for (i=0, p=buffer; i<uorder; i++, points += uinc)
229 for (j=0; j<vorder; j++, points += vstride)
230 for (k=0; k<size; k++)
231 *p++ = (GLfloat) points[k];
232
233 return buffer;
234}
235
236
jtgafb833d1999-08-19 00:55:39 +0000237
238
239/**********************************************************************/
240/*** API entry points ***/
241/**********************************************************************/
242
243
244/*
Brian Paulfbd8f211999-11-11 01:22:25 +0000245 * This does the work of glMap1[fd].
jtgafb833d1999-08-19 00:55:39 +0000246 */
Brian Paulfbd8f211999-11-11 01:22:25 +0000247static void
248map1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
249 GLint uorder, const GLvoid *points, GLenum type )
jtgafb833d1999-08-19 00:55:39 +0000250{
Brian Paulfbd8f211999-11-11 01:22:25 +0000251 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000252 GLint k;
Brian Paulfbd8f211999-11-11 01:22:25 +0000253 GLfloat *pnts;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000254 struct gl_1d_map *map = 0;
Gareth Hughes22144ab2001-03-12 00:48:37 +0000255 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000256
Brian Paulfbd8f211999-11-11 01:22:25 +0000257 assert(type == GL_FLOAT || type == GL_DOUBLE);
258
259 if (u1 == u2) {
Brian Paul08836342001-03-03 20:33:27 +0000260 _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" );
jtgafb833d1999-08-19 00:55:39 +0000261 return;
262 }
Brian Paulfbd8f211999-11-11 01:22:25 +0000263 if (uorder < 1 || uorder > MAX_EVAL_ORDER) {
Brian Paul08836342001-03-03 20:33:27 +0000264 _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" );
jtgafb833d1999-08-19 00:55:39 +0000265 return;
266 }
Brian Paulfbd8f211999-11-11 01:22:25 +0000267 if (!points) {
Brian Paul08836342001-03-03 20:33:27 +0000268 _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" );
Brian Paulfbd8f211999-11-11 01:22:25 +0000269 return;
270 }
jtgafb833d1999-08-19 00:55:39 +0000271
Brian Paulfbd8f211999-11-11 01:22:25 +0000272 k = _mesa_evaluator_components( target );
273 if (k == 0) {
Brian Paul08836342001-03-03 20:33:27 +0000274 _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
jtgafb833d1999-08-19 00:55:39 +0000275 }
276
Brian Paulfbd8f211999-11-11 01:22:25 +0000277 if (ustride < k) {
Brian Paul08836342001-03-03 20:33:27 +0000278 _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" );
jtgafb833d1999-08-19 00:55:39 +0000279 return;
280 }
281
Keith Whitwellcab974c2000-12-26 05:09:27 +0000282 switch (target) {
283 case GL_MAP1_VERTEX_3:
284 map = &ctx->EvalMap.Map1Vertex3;
285 break;
286 case GL_MAP1_VERTEX_4:
287 map = &ctx->EvalMap.Map1Vertex4;
288 break;
289 case GL_MAP1_INDEX:
290 map = &ctx->EvalMap.Map1Index;
291 break;
292 case GL_MAP1_COLOR_4:
293 map = &ctx->EvalMap.Map1Color4;
294 break;
295 case GL_MAP1_NORMAL:
296 map = &ctx->EvalMap.Map1Normal;
297 break;
298 case GL_MAP1_TEXTURE_COORD_1:
299 map = &ctx->EvalMap.Map1Texture1;
300 break;
301 case GL_MAP1_TEXTURE_COORD_2:
302 map = &ctx->EvalMap.Map1Texture2;
303 break;
304 case GL_MAP1_TEXTURE_COORD_3:
305 map = &ctx->EvalMap.Map1Texture3;
306 break;
307 case GL_MAP1_TEXTURE_COORD_4:
308 map = &ctx->EvalMap.Map1Texture4;
309 break;
310 default:
Brian Paul08836342001-03-03 20:33:27 +0000311 _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000312 return;
313 }
314
Brian Paulfbd8f211999-11-11 01:22:25 +0000315 /* make copy of the control points */
316 if (type == GL_FLOAT)
Brian Paul08836342001-03-03 20:33:27 +0000317 pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points);
Brian Paulfbd8f211999-11-11 01:22:25 +0000318 else
Brian Paul08836342001-03-03 20:33:27 +0000319 pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points);
Brian Paulfbd8f211999-11-11 01:22:25 +0000320
Keith Whitwella96308c2000-10-30 13:31:59 +0000321
Keith Whitwellcab974c2000-12-26 05:09:27 +0000322 FLUSH_VERTICES(ctx, _NEW_EVAL);
323 map->Order = uorder;
324 map->u1 = u1;
325 map->u2 = u2;
326 map->du = 1.0 / (u2 - u1);
327 if (map->Points)
328 FREE( map->Points );
329 map->Points = pnts;
jtgafb833d1999-08-19 00:55:39 +0000330}
331
332
333
Brian Paulfbd8f211999-11-11 01:22:25 +0000334void
335_mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
336 GLint order, const GLfloat *points )
jtgafb833d1999-08-19 00:55:39 +0000337{
Brian Paulfbd8f211999-11-11 01:22:25 +0000338 map1(target, u1, u2, stride, order, points, GL_FLOAT);
339}
340
341
342void
343_mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
344 GLint order, const GLdouble *points )
345{
346 map1(target, u1, u2, stride, order, points, GL_DOUBLE);
347}
348
349
350static void
351map2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
352 GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
353 const GLvoid *points, GLenum type )
354{
355 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000356 GLint k;
Brian Paulfbd8f211999-11-11 01:22:25 +0000357 GLfloat *pnts;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000358 struct gl_2d_map *map = 0;
359 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000360
361 if (u1==u2) {
Brian Paul08836342001-03-03 20:33:27 +0000362 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" );
jtgafb833d1999-08-19 00:55:39 +0000363 return;
364 }
365
366 if (v1==v2) {
Brian Paul08836342001-03-03 20:33:27 +0000367 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" );
jtgafb833d1999-08-19 00:55:39 +0000368 return;
369 }
370
371 if (uorder<1 || uorder>MAX_EVAL_ORDER) {
Brian Paul08836342001-03-03 20:33:27 +0000372 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" );
jtgafb833d1999-08-19 00:55:39 +0000373 return;
374 }
375
376 if (vorder<1 || vorder>MAX_EVAL_ORDER) {
Brian Paul08836342001-03-03 20:33:27 +0000377 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" );
jtgafb833d1999-08-19 00:55:39 +0000378 return;
379 }
380
Brian Paulfbd8f211999-11-11 01:22:25 +0000381 k = _mesa_evaluator_components( target );
jtgafb833d1999-08-19 00:55:39 +0000382 if (k==0) {
Brian Paul08836342001-03-03 20:33:27 +0000383 _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
jtgafb833d1999-08-19 00:55:39 +0000384 }
385
386 if (ustride < k) {
Brian Paul08836342001-03-03 20:33:27 +0000387 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" );
jtgafb833d1999-08-19 00:55:39 +0000388 return;
389 }
390 if (vstride < k) {
Brian Paul08836342001-03-03 20:33:27 +0000391 _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" );
jtgafb833d1999-08-19 00:55:39 +0000392 return;
393 }
394
Keith Whitwellcab974c2000-12-26 05:09:27 +0000395 switch (target) {
396 case GL_MAP2_VERTEX_3:
397 map = &ctx->EvalMap.Map2Vertex3;
398 break;
399 case GL_MAP2_VERTEX_4:
400 map = &ctx->EvalMap.Map2Vertex4;
401 break;
402 case GL_MAP2_INDEX:
403 map = &ctx->EvalMap.Map2Index;
404 break;
405 case GL_MAP2_COLOR_4:
406 map = &ctx->EvalMap.Map2Color4;
407 break;
408 case GL_MAP2_NORMAL:
409 map = &ctx->EvalMap.Map2Normal;
410 break;
411 case GL_MAP2_TEXTURE_COORD_1:
412 map = &ctx->EvalMap.Map2Texture1;
413 break;
414 case GL_MAP2_TEXTURE_COORD_2:
415 map = &ctx->EvalMap.Map2Texture2;
416 break;
417 case GL_MAP2_TEXTURE_COORD_3:
418 map = &ctx->EvalMap.Map2Texture3;
419 break;
420 case GL_MAP2_TEXTURE_COORD_4:
421 map = &ctx->EvalMap.Map2Texture4;
422 break;
423 default:
Brian Paul08836342001-03-03 20:33:27 +0000424 _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000425 return;
426 }
427
Brian Paulfbd8f211999-11-11 01:22:25 +0000428 /* make copy of the control points */
429 if (type == GL_FLOAT)
Brian Paul08836342001-03-03 20:33:27 +0000430 pnts = _mesa_copy_map_points2f(target, ustride, uorder,
Brian Paulfbd8f211999-11-11 01:22:25 +0000431 vstride, vorder, (GLfloat*) points);
432 else
Brian Paul08836342001-03-03 20:33:27 +0000433 pnts = _mesa_copy_map_points2d(target, ustride, uorder,
Brian Paulfbd8f211999-11-11 01:22:25 +0000434 vstride, vorder, (GLdouble*) points);
Gareth Hughes22144ab2001-03-12 00:48:37 +0000435
436
Keith Whitwellcab974c2000-12-26 05:09:27 +0000437 FLUSH_VERTICES(ctx, _NEW_EVAL);
438 map->Uorder = uorder;
439 map->u1 = u1;
440 map->u2 = u2;
441 map->du = 1.0 / (u2 - u1);
442 map->Vorder = vorder;
443 map->v1 = v1;
444 map->v2 = v2;
445 map->dv = 1.0 / (v2 - v1);
446 if (map->Points)
447 FREE( map->Points );
448 map->Points = pnts;
jtgafb833d1999-08-19 00:55:39 +0000449}
450
451
Brian Paulfbd8f211999-11-11 01:22:25 +0000452void
453_mesa_Map2f( GLenum target,
454 GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
455 GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
456 const GLfloat *points)
jtgafb833d1999-08-19 00:55:39 +0000457{
Brian Paulfbd8f211999-11-11 01:22:25 +0000458 map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder,
459 points, GL_FLOAT);
460}
461
462
463void
464_mesa_Map2d( GLenum target,
465 GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
466 GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
467 const GLdouble *points )
468{
469 map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder,
470 points, GL_DOUBLE);
471}
472
473
Jouk Jansen5e3bc0c2000-11-22 07:32:16 +0000474
Brian Paulfbd8f211999-11-11 01:22:25 +0000475void
476_mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v )
477{
478 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000479 GLint i, n;
480 GLfloat *data;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000481 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000482
483 switch (query) {
484 case GL_COEFF:
485 switch (target) {
486 case GL_MAP1_COLOR_4:
487 data = ctx->EvalMap.Map1Color4.Points;
488 n = ctx->EvalMap.Map1Color4.Order * 4;
489 break;
490 case GL_MAP1_INDEX:
491 data = ctx->EvalMap.Map1Index.Points;
492 n = ctx->EvalMap.Map1Index.Order;
493 break;
494 case GL_MAP1_NORMAL:
495 data = ctx->EvalMap.Map1Normal.Points;
496 n = ctx->EvalMap.Map1Normal.Order * 3;
497 break;
498 case GL_MAP1_TEXTURE_COORD_1:
499 data = ctx->EvalMap.Map1Texture1.Points;
500 n = ctx->EvalMap.Map1Texture1.Order * 1;
501 break;
502 case GL_MAP1_TEXTURE_COORD_2:
503 data = ctx->EvalMap.Map1Texture2.Points;
504 n = ctx->EvalMap.Map1Texture2.Order * 2;
505 break;
506 case GL_MAP1_TEXTURE_COORD_3:
507 data = ctx->EvalMap.Map1Texture3.Points;
508 n = ctx->EvalMap.Map1Texture3.Order * 3;
509 break;
510 case GL_MAP1_TEXTURE_COORD_4:
511 data = ctx->EvalMap.Map1Texture4.Points;
512 n = ctx->EvalMap.Map1Texture4.Order * 4;
513 break;
514 case GL_MAP1_VERTEX_3:
515 data = ctx->EvalMap.Map1Vertex3.Points;
516 n = ctx->EvalMap.Map1Vertex3.Order * 3;
517 break;
518 case GL_MAP1_VERTEX_4:
519 data = ctx->EvalMap.Map1Vertex4.Points;
520 n = ctx->EvalMap.Map1Vertex4.Order * 4;
521 break;
522 case GL_MAP2_COLOR_4:
523 data = ctx->EvalMap.Map2Color4.Points;
524 n = ctx->EvalMap.Map2Color4.Uorder
525 * ctx->EvalMap.Map2Color4.Vorder * 4;
526 break;
527 case GL_MAP2_INDEX:
528 data = ctx->EvalMap.Map2Index.Points;
529 n = ctx->EvalMap.Map2Index.Uorder
530 * ctx->EvalMap.Map2Index.Vorder;
531 break;
532 case GL_MAP2_NORMAL:
533 data = ctx->EvalMap.Map2Normal.Points;
534 n = ctx->EvalMap.Map2Normal.Uorder
535 * ctx->EvalMap.Map2Normal.Vorder * 3;
536 break;
537 case GL_MAP2_TEXTURE_COORD_1:
538 data = ctx->EvalMap.Map2Texture1.Points;
539 n = ctx->EvalMap.Map2Texture1.Uorder
540 * ctx->EvalMap.Map2Texture1.Vorder * 1;
541 break;
542 case GL_MAP2_TEXTURE_COORD_2:
543 data = ctx->EvalMap.Map2Texture2.Points;
544 n = ctx->EvalMap.Map2Texture2.Uorder
545 * ctx->EvalMap.Map2Texture2.Vorder * 2;
546 break;
547 case GL_MAP2_TEXTURE_COORD_3:
548 data = ctx->EvalMap.Map2Texture3.Points;
549 n = ctx->EvalMap.Map2Texture3.Uorder
550 * ctx->EvalMap.Map2Texture3.Vorder * 3;
551 break;
552 case GL_MAP2_TEXTURE_COORD_4:
553 data = ctx->EvalMap.Map2Texture4.Points;
554 n = ctx->EvalMap.Map2Texture4.Uorder
555 * ctx->EvalMap.Map2Texture4.Vorder * 4;
556 break;
557 case GL_MAP2_VERTEX_3:
558 data = ctx->EvalMap.Map2Vertex3.Points;
559 n = ctx->EvalMap.Map2Vertex3.Uorder
560 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
561 break;
562 case GL_MAP2_VERTEX_4:
563 data = ctx->EvalMap.Map2Vertex4.Points;
564 n = ctx->EvalMap.Map2Vertex4.Uorder
565 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
566 break;
567 default:
Brian Paul08836342001-03-03 20:33:27 +0000568 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
jtgafb833d1999-08-19 00:55:39 +0000569 return;
570 }
571 if (data) {
572 for (i=0;i<n;i++) {
573 v[i] = data[i];
574 }
575 }
576 break;
577 case GL_ORDER:
578 switch (target) {
579 case GL_MAP1_COLOR_4:
580 *v = ctx->EvalMap.Map1Color4.Order;
581 break;
582 case GL_MAP1_INDEX:
583 *v = ctx->EvalMap.Map1Index.Order;
584 break;
585 case GL_MAP1_NORMAL:
586 *v = ctx->EvalMap.Map1Normal.Order;
587 break;
588 case GL_MAP1_TEXTURE_COORD_1:
589 *v = ctx->EvalMap.Map1Texture1.Order;
590 break;
591 case GL_MAP1_TEXTURE_COORD_2:
592 *v = ctx->EvalMap.Map1Texture2.Order;
593 break;
594 case GL_MAP1_TEXTURE_COORD_3:
595 *v = ctx->EvalMap.Map1Texture3.Order;
596 break;
597 case GL_MAP1_TEXTURE_COORD_4:
598 *v = ctx->EvalMap.Map1Texture4.Order;
599 break;
600 case GL_MAP1_VERTEX_3:
601 *v = ctx->EvalMap.Map1Vertex3.Order;
602 break;
603 case GL_MAP1_VERTEX_4:
604 *v = ctx->EvalMap.Map1Vertex4.Order;
605 break;
606 case GL_MAP2_COLOR_4:
607 v[0] = ctx->EvalMap.Map2Color4.Uorder;
608 v[1] = ctx->EvalMap.Map2Color4.Vorder;
609 break;
610 case GL_MAP2_INDEX:
611 v[0] = ctx->EvalMap.Map2Index.Uorder;
612 v[1] = ctx->EvalMap.Map2Index.Vorder;
613 break;
614 case GL_MAP2_NORMAL:
615 v[0] = ctx->EvalMap.Map2Normal.Uorder;
616 v[1] = ctx->EvalMap.Map2Normal.Vorder;
617 break;
618 case GL_MAP2_TEXTURE_COORD_1:
619 v[0] = ctx->EvalMap.Map2Texture1.Uorder;
620 v[1] = ctx->EvalMap.Map2Texture1.Vorder;
621 break;
622 case GL_MAP2_TEXTURE_COORD_2:
623 v[0] = ctx->EvalMap.Map2Texture2.Uorder;
624 v[1] = ctx->EvalMap.Map2Texture2.Vorder;
625 break;
626 case GL_MAP2_TEXTURE_COORD_3:
627 v[0] = ctx->EvalMap.Map2Texture3.Uorder;
628 v[1] = ctx->EvalMap.Map2Texture3.Vorder;
629 break;
630 case GL_MAP2_TEXTURE_COORD_4:
631 v[0] = ctx->EvalMap.Map2Texture4.Uorder;
632 v[1] = ctx->EvalMap.Map2Texture4.Vorder;
633 break;
634 case GL_MAP2_VERTEX_3:
635 v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
636 v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
637 break;
638 case GL_MAP2_VERTEX_4:
639 v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
640 v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
641 break;
642 default:
Brian Paul08836342001-03-03 20:33:27 +0000643 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
jtgafb833d1999-08-19 00:55:39 +0000644 return;
645 }
646 break;
647 case GL_DOMAIN:
648 switch (target) {
649 case GL_MAP1_COLOR_4:
650 v[0] = ctx->EvalMap.Map1Color4.u1;
651 v[1] = ctx->EvalMap.Map1Color4.u2;
652 break;
653 case GL_MAP1_INDEX:
654 v[0] = ctx->EvalMap.Map1Index.u1;
655 v[1] = ctx->EvalMap.Map1Index.u2;
656 break;
657 case GL_MAP1_NORMAL:
658 v[0] = ctx->EvalMap.Map1Normal.u1;
659 v[1] = ctx->EvalMap.Map1Normal.u2;
660 break;
661 case GL_MAP1_TEXTURE_COORD_1:
662 v[0] = ctx->EvalMap.Map1Texture1.u1;
663 v[1] = ctx->EvalMap.Map1Texture1.u2;
664 break;
665 case GL_MAP1_TEXTURE_COORD_2:
666 v[0] = ctx->EvalMap.Map1Texture2.u1;
667 v[1] = ctx->EvalMap.Map1Texture2.u2;
668 break;
669 case GL_MAP1_TEXTURE_COORD_3:
670 v[0] = ctx->EvalMap.Map1Texture3.u1;
671 v[1] = ctx->EvalMap.Map1Texture3.u2;
672 break;
673 case GL_MAP1_TEXTURE_COORD_4:
674 v[0] = ctx->EvalMap.Map1Texture4.u1;
675 v[1] = ctx->EvalMap.Map1Texture4.u2;
676 break;
677 case GL_MAP1_VERTEX_3:
678 v[0] = ctx->EvalMap.Map1Vertex3.u1;
679 v[1] = ctx->EvalMap.Map1Vertex3.u2;
680 break;
681 case GL_MAP1_VERTEX_4:
682 v[0] = ctx->EvalMap.Map1Vertex4.u1;
683 v[1] = ctx->EvalMap.Map1Vertex4.u2;
684 break;
685 case GL_MAP2_COLOR_4:
686 v[0] = ctx->EvalMap.Map2Color4.u1;
687 v[1] = ctx->EvalMap.Map2Color4.u2;
688 v[2] = ctx->EvalMap.Map2Color4.v1;
689 v[3] = ctx->EvalMap.Map2Color4.v2;
690 break;
691 case GL_MAP2_INDEX:
692 v[0] = ctx->EvalMap.Map2Index.u1;
693 v[1] = ctx->EvalMap.Map2Index.u2;
694 v[2] = ctx->EvalMap.Map2Index.v1;
695 v[3] = ctx->EvalMap.Map2Index.v2;
696 break;
697 case GL_MAP2_NORMAL:
698 v[0] = ctx->EvalMap.Map2Normal.u1;
699 v[1] = ctx->EvalMap.Map2Normal.u2;
700 v[2] = ctx->EvalMap.Map2Normal.v1;
701 v[3] = ctx->EvalMap.Map2Normal.v2;
702 break;
703 case GL_MAP2_TEXTURE_COORD_1:
704 v[0] = ctx->EvalMap.Map2Texture1.u1;
705 v[1] = ctx->EvalMap.Map2Texture1.u2;
706 v[2] = ctx->EvalMap.Map2Texture1.v1;
707 v[3] = ctx->EvalMap.Map2Texture1.v2;
708 break;
709 case GL_MAP2_TEXTURE_COORD_2:
710 v[0] = ctx->EvalMap.Map2Texture2.u1;
711 v[1] = ctx->EvalMap.Map2Texture2.u2;
712 v[2] = ctx->EvalMap.Map2Texture2.v1;
713 v[3] = ctx->EvalMap.Map2Texture2.v2;
714 break;
715 case GL_MAP2_TEXTURE_COORD_3:
716 v[0] = ctx->EvalMap.Map2Texture3.u1;
717 v[1] = ctx->EvalMap.Map2Texture3.u2;
718 v[2] = ctx->EvalMap.Map2Texture3.v1;
719 v[3] = ctx->EvalMap.Map2Texture3.v2;
720 break;
721 case GL_MAP2_TEXTURE_COORD_4:
722 v[0] = ctx->EvalMap.Map2Texture4.u1;
723 v[1] = ctx->EvalMap.Map2Texture4.u2;
724 v[2] = ctx->EvalMap.Map2Texture4.v1;
725 v[3] = ctx->EvalMap.Map2Texture4.v2;
726 break;
727 case GL_MAP2_VERTEX_3:
728 v[0] = ctx->EvalMap.Map2Vertex3.u1;
729 v[1] = ctx->EvalMap.Map2Vertex3.u2;
730 v[2] = ctx->EvalMap.Map2Vertex3.v1;
731 v[3] = ctx->EvalMap.Map2Vertex3.v2;
732 break;
733 case GL_MAP2_VERTEX_4:
734 v[0] = ctx->EvalMap.Map2Vertex4.u1;
735 v[1] = ctx->EvalMap.Map2Vertex4.u2;
736 v[2] = ctx->EvalMap.Map2Vertex4.v1;
737 v[3] = ctx->EvalMap.Map2Vertex4.v2;
738 break;
739 default:
Brian Paul08836342001-03-03 20:33:27 +0000740 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" );
jtgafb833d1999-08-19 00:55:39 +0000741 }
742 break;
743 default:
Brian Paul08836342001-03-03 20:33:27 +0000744 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" );
jtgafb833d1999-08-19 00:55:39 +0000745 }
746}
747
748
Brian Paulfbd8f211999-11-11 01:22:25 +0000749void
750_mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v )
jtgafb833d1999-08-19 00:55:39 +0000751{
Brian Paulfbd8f211999-11-11 01:22:25 +0000752 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000753 GLint i, n;
754 GLfloat *data;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000755 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +0000756
757 switch (query) {
758 case GL_COEFF:
759 switch (target) {
760 case GL_MAP1_COLOR_4:
761 data = ctx->EvalMap.Map1Color4.Points;
762 n = ctx->EvalMap.Map1Color4.Order * 4;
763 break;
764 case GL_MAP1_INDEX:
765 data = ctx->EvalMap.Map1Index.Points;
766 n = ctx->EvalMap.Map1Index.Order;
767 break;
768 case GL_MAP1_NORMAL:
769 data = ctx->EvalMap.Map1Normal.Points;
770 n = ctx->EvalMap.Map1Normal.Order * 3;
771 break;
772 case GL_MAP1_TEXTURE_COORD_1:
773 data = ctx->EvalMap.Map1Texture1.Points;
774 n = ctx->EvalMap.Map1Texture1.Order * 1;
775 break;
776 case GL_MAP1_TEXTURE_COORD_2:
777 data = ctx->EvalMap.Map1Texture2.Points;
778 n = ctx->EvalMap.Map1Texture2.Order * 2;
779 break;
780 case GL_MAP1_TEXTURE_COORD_3:
781 data = ctx->EvalMap.Map1Texture3.Points;
782 n = ctx->EvalMap.Map1Texture3.Order * 3;
783 break;
784 case GL_MAP1_TEXTURE_COORD_4:
785 data = ctx->EvalMap.Map1Texture4.Points;
786 n = ctx->EvalMap.Map1Texture4.Order * 4;
787 break;
788 case GL_MAP1_VERTEX_3:
789 data = ctx->EvalMap.Map1Vertex3.Points;
790 n = ctx->EvalMap.Map1Vertex3.Order * 3;
791 break;
792 case GL_MAP1_VERTEX_4:
793 data = ctx->EvalMap.Map1Vertex4.Points;
794 n = ctx->EvalMap.Map1Vertex4.Order * 4;
795 break;
796 case GL_MAP2_COLOR_4:
797 data = ctx->EvalMap.Map2Color4.Points;
798 n = ctx->EvalMap.Map2Color4.Uorder
799 * ctx->EvalMap.Map2Color4.Vorder * 4;
800 break;
801 case GL_MAP2_INDEX:
802 data = ctx->EvalMap.Map2Index.Points;
803 n = ctx->EvalMap.Map2Index.Uorder
804 * ctx->EvalMap.Map2Index.Vorder;
805 break;
806 case GL_MAP2_NORMAL:
807 data = ctx->EvalMap.Map2Normal.Points;
808 n = ctx->EvalMap.Map2Normal.Uorder
809 * ctx->EvalMap.Map2Normal.Vorder * 3;
810 break;
811 case GL_MAP2_TEXTURE_COORD_1:
812 data = ctx->EvalMap.Map2Texture1.Points;
813 n = ctx->EvalMap.Map2Texture1.Uorder
814 * ctx->EvalMap.Map2Texture1.Vorder * 1;
815 break;
816 case GL_MAP2_TEXTURE_COORD_2:
817 data = ctx->EvalMap.Map2Texture2.Points;
818 n = ctx->EvalMap.Map2Texture2.Uorder
819 * ctx->EvalMap.Map2Texture2.Vorder * 2;
820 break;
821 case GL_MAP2_TEXTURE_COORD_3:
822 data = ctx->EvalMap.Map2Texture3.Points;
823 n = ctx->EvalMap.Map2Texture3.Uorder
824 * ctx->EvalMap.Map2Texture3.Vorder * 3;
825 break;
826 case GL_MAP2_TEXTURE_COORD_4:
827 data = ctx->EvalMap.Map2Texture4.Points;
828 n = ctx->EvalMap.Map2Texture4.Uorder
829 * ctx->EvalMap.Map2Texture4.Vorder * 4;
830 break;
831 case GL_MAP2_VERTEX_3:
832 data = ctx->EvalMap.Map2Vertex3.Points;
833 n = ctx->EvalMap.Map2Vertex3.Uorder
834 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
835 break;
836 case GL_MAP2_VERTEX_4:
837 data = ctx->EvalMap.Map2Vertex4.Points;
838 n = ctx->EvalMap.Map2Vertex4.Uorder
839 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
840 break;
841 default:
Brian Paul08836342001-03-03 20:33:27 +0000842 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
jtgafb833d1999-08-19 00:55:39 +0000843 return;
844 }
845 if (data) {
846 for (i=0;i<n;i++) {
847 v[i] = data[i];
848 }
849 }
850 break;
851 case GL_ORDER:
852 switch (target) {
853 case GL_MAP1_COLOR_4:
854 *v = ctx->EvalMap.Map1Color4.Order;
855 break;
856 case GL_MAP1_INDEX:
857 *v = ctx->EvalMap.Map1Index.Order;
858 break;
859 case GL_MAP1_NORMAL:
860 *v = ctx->EvalMap.Map1Normal.Order;
861 break;
862 case GL_MAP1_TEXTURE_COORD_1:
863 *v = ctx->EvalMap.Map1Texture1.Order;
864 break;
865 case GL_MAP1_TEXTURE_COORD_2:
866 *v = ctx->EvalMap.Map1Texture2.Order;
867 break;
868 case GL_MAP1_TEXTURE_COORD_3:
869 *v = ctx->EvalMap.Map1Texture3.Order;
870 break;
871 case GL_MAP1_TEXTURE_COORD_4:
872 *v = ctx->EvalMap.Map1Texture4.Order;
873 break;
874 case GL_MAP1_VERTEX_3:
875 *v = ctx->EvalMap.Map1Vertex3.Order;
876 break;
877 case GL_MAP1_VERTEX_4:
878 *v = ctx->EvalMap.Map1Vertex4.Order;
879 break;
880 case GL_MAP2_COLOR_4:
881 v[0] = ctx->EvalMap.Map2Color4.Uorder;
882 v[1] = ctx->EvalMap.Map2Color4.Vorder;
883 break;
884 case GL_MAP2_INDEX:
885 v[0] = ctx->EvalMap.Map2Index.Uorder;
886 v[1] = ctx->EvalMap.Map2Index.Vorder;
887 break;
888 case GL_MAP2_NORMAL:
889 v[0] = ctx->EvalMap.Map2Normal.Uorder;
890 v[1] = ctx->EvalMap.Map2Normal.Vorder;
891 break;
892 case GL_MAP2_TEXTURE_COORD_1:
893 v[0] = ctx->EvalMap.Map2Texture1.Uorder;
894 v[1] = ctx->EvalMap.Map2Texture1.Vorder;
895 break;
896 case GL_MAP2_TEXTURE_COORD_2:
897 v[0] = ctx->EvalMap.Map2Texture2.Uorder;
898 v[1] = ctx->EvalMap.Map2Texture2.Vorder;
899 break;
900 case GL_MAP2_TEXTURE_COORD_3:
901 v[0] = ctx->EvalMap.Map2Texture3.Uorder;
902 v[1] = ctx->EvalMap.Map2Texture3.Vorder;
903 break;
904 case GL_MAP2_TEXTURE_COORD_4:
905 v[0] = ctx->EvalMap.Map2Texture4.Uorder;
906 v[1] = ctx->EvalMap.Map2Texture4.Vorder;
907 break;
908 case GL_MAP2_VERTEX_3:
909 v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
910 v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
911 break;
912 case GL_MAP2_VERTEX_4:
913 v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
914 v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
915 break;
916 default:
Brian Paul08836342001-03-03 20:33:27 +0000917 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
jtgafb833d1999-08-19 00:55:39 +0000918 return;
919 }
920 break;
921 case GL_DOMAIN:
922 switch (target) {
923 case GL_MAP1_COLOR_4:
924 v[0] = ctx->EvalMap.Map1Color4.u1;
925 v[1] = ctx->EvalMap.Map1Color4.u2;
926 break;
927 case GL_MAP1_INDEX:
928 v[0] = ctx->EvalMap.Map1Index.u1;
929 v[1] = ctx->EvalMap.Map1Index.u2;
930 break;
931 case GL_MAP1_NORMAL:
932 v[0] = ctx->EvalMap.Map1Normal.u1;
933 v[1] = ctx->EvalMap.Map1Normal.u2;
934 break;
935 case GL_MAP1_TEXTURE_COORD_1:
936 v[0] = ctx->EvalMap.Map1Texture1.u1;
937 v[1] = ctx->EvalMap.Map1Texture1.u2;
938 break;
939 case GL_MAP1_TEXTURE_COORD_2:
940 v[0] = ctx->EvalMap.Map1Texture2.u1;
941 v[1] = ctx->EvalMap.Map1Texture2.u2;
942 break;
943 case GL_MAP1_TEXTURE_COORD_3:
944 v[0] = ctx->EvalMap.Map1Texture3.u1;
945 v[1] = ctx->EvalMap.Map1Texture3.u2;
946 break;
947 case GL_MAP1_TEXTURE_COORD_4:
948 v[0] = ctx->EvalMap.Map1Texture4.u1;
949 v[1] = ctx->EvalMap.Map1Texture4.u2;
950 break;
951 case GL_MAP1_VERTEX_3:
952 v[0] = ctx->EvalMap.Map1Vertex3.u1;
953 v[1] = ctx->EvalMap.Map1Vertex3.u2;
954 break;
955 case GL_MAP1_VERTEX_4:
956 v[0] = ctx->EvalMap.Map1Vertex4.u1;
957 v[1] = ctx->EvalMap.Map1Vertex4.u2;
958 break;
959 case GL_MAP2_COLOR_4:
960 v[0] = ctx->EvalMap.Map2Color4.u1;
961 v[1] = ctx->EvalMap.Map2Color4.u2;
962 v[2] = ctx->EvalMap.Map2Color4.v1;
963 v[3] = ctx->EvalMap.Map2Color4.v2;
964 break;
965 case GL_MAP2_INDEX:
966 v[0] = ctx->EvalMap.Map2Index.u1;
967 v[1] = ctx->EvalMap.Map2Index.u2;
968 v[2] = ctx->EvalMap.Map2Index.v1;
969 v[3] = ctx->EvalMap.Map2Index.v2;
970 break;
971 case GL_MAP2_NORMAL:
972 v[0] = ctx->EvalMap.Map2Normal.u1;
973 v[1] = ctx->EvalMap.Map2Normal.u2;
974 v[2] = ctx->EvalMap.Map2Normal.v1;
975 v[3] = ctx->EvalMap.Map2Normal.v2;
976 break;
977 case GL_MAP2_TEXTURE_COORD_1:
978 v[0] = ctx->EvalMap.Map2Texture1.u1;
979 v[1] = ctx->EvalMap.Map2Texture1.u2;
980 v[2] = ctx->EvalMap.Map2Texture1.v1;
981 v[3] = ctx->EvalMap.Map2Texture1.v2;
982 break;
983 case GL_MAP2_TEXTURE_COORD_2:
984 v[0] = ctx->EvalMap.Map2Texture2.u1;
985 v[1] = ctx->EvalMap.Map2Texture2.u2;
986 v[2] = ctx->EvalMap.Map2Texture2.v1;
987 v[3] = ctx->EvalMap.Map2Texture2.v2;
988 break;
989 case GL_MAP2_TEXTURE_COORD_3:
990 v[0] = ctx->EvalMap.Map2Texture3.u1;
991 v[1] = ctx->EvalMap.Map2Texture3.u2;
992 v[2] = ctx->EvalMap.Map2Texture3.v1;
993 v[3] = ctx->EvalMap.Map2Texture3.v2;
994 break;
995 case GL_MAP2_TEXTURE_COORD_4:
996 v[0] = ctx->EvalMap.Map2Texture4.u1;
997 v[1] = ctx->EvalMap.Map2Texture4.u2;
998 v[2] = ctx->EvalMap.Map2Texture4.v1;
999 v[3] = ctx->EvalMap.Map2Texture4.v2;
1000 break;
1001 case GL_MAP2_VERTEX_3:
1002 v[0] = ctx->EvalMap.Map2Vertex3.u1;
1003 v[1] = ctx->EvalMap.Map2Vertex3.u2;
1004 v[2] = ctx->EvalMap.Map2Vertex3.v1;
1005 v[3] = ctx->EvalMap.Map2Vertex3.v2;
1006 break;
1007 case GL_MAP2_VERTEX_4:
1008 v[0] = ctx->EvalMap.Map2Vertex4.u1;
1009 v[1] = ctx->EvalMap.Map2Vertex4.u2;
1010 v[2] = ctx->EvalMap.Map2Vertex4.v1;
1011 v[3] = ctx->EvalMap.Map2Vertex4.v2;
1012 break;
1013 default:
Brian Paul08836342001-03-03 20:33:27 +00001014 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" );
jtgafb833d1999-08-19 00:55:39 +00001015 }
1016 break;
1017 default:
Brian Paul08836342001-03-03 20:33:27 +00001018 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" );
jtgafb833d1999-08-19 00:55:39 +00001019 }
1020}
1021
1022
Brian Paulfbd8f211999-11-11 01:22:25 +00001023void
1024_mesa_GetMapiv( GLenum target, GLenum query, GLint *v )
jtgafb833d1999-08-19 00:55:39 +00001025{
Brian Paulfbd8f211999-11-11 01:22:25 +00001026 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +00001027 GLuint i, n;
1028 GLfloat *data;
Keith Whitwellcab974c2000-12-26 05:09:27 +00001029 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +00001030
1031 switch (query) {
1032 case GL_COEFF:
1033 switch (target) {
1034 case GL_MAP1_COLOR_4:
1035 data = ctx->EvalMap.Map1Color4.Points;
1036 n = ctx->EvalMap.Map1Color4.Order * 4;
1037 break;
1038 case GL_MAP1_INDEX:
1039 data = ctx->EvalMap.Map1Index.Points;
1040 n = ctx->EvalMap.Map1Index.Order;
1041 break;
1042 case GL_MAP1_NORMAL:
1043 data = ctx->EvalMap.Map1Normal.Points;
1044 n = ctx->EvalMap.Map1Normal.Order * 3;
1045 break;
1046 case GL_MAP1_TEXTURE_COORD_1:
1047 data = ctx->EvalMap.Map1Texture1.Points;
1048 n = ctx->EvalMap.Map1Texture1.Order * 1;
1049 break;
1050 case GL_MAP1_TEXTURE_COORD_2:
1051 data = ctx->EvalMap.Map1Texture2.Points;
1052 n = ctx->EvalMap.Map1Texture2.Order * 2;
1053 break;
1054 case GL_MAP1_TEXTURE_COORD_3:
1055 data = ctx->EvalMap.Map1Texture3.Points;
1056 n = ctx->EvalMap.Map1Texture3.Order * 3;
1057 break;
1058 case GL_MAP1_TEXTURE_COORD_4:
1059 data = ctx->EvalMap.Map1Texture4.Points;
1060 n = ctx->EvalMap.Map1Texture4.Order * 4;
1061 break;
1062 case GL_MAP1_VERTEX_3:
1063 data = ctx->EvalMap.Map1Vertex3.Points;
1064 n = ctx->EvalMap.Map1Vertex3.Order * 3;
1065 break;
1066 case GL_MAP1_VERTEX_4:
1067 data = ctx->EvalMap.Map1Vertex4.Points;
1068 n = ctx->EvalMap.Map1Vertex4.Order * 4;
1069 break;
1070 case GL_MAP2_COLOR_4:
1071 data = ctx->EvalMap.Map2Color4.Points;
1072 n = ctx->EvalMap.Map2Color4.Uorder
1073 * ctx->EvalMap.Map2Color4.Vorder * 4;
1074 break;
1075 case GL_MAP2_INDEX:
1076 data = ctx->EvalMap.Map2Index.Points;
1077 n = ctx->EvalMap.Map2Index.Uorder
1078 * ctx->EvalMap.Map2Index.Vorder;
1079 break;
1080 case GL_MAP2_NORMAL:
1081 data = ctx->EvalMap.Map2Normal.Points;
1082 n = ctx->EvalMap.Map2Normal.Uorder
1083 * ctx->EvalMap.Map2Normal.Vorder * 3;
1084 break;
1085 case GL_MAP2_TEXTURE_COORD_1:
1086 data = ctx->EvalMap.Map2Texture1.Points;
1087 n = ctx->EvalMap.Map2Texture1.Uorder
1088 * ctx->EvalMap.Map2Texture1.Vorder * 1;
1089 break;
1090 case GL_MAP2_TEXTURE_COORD_2:
1091 data = ctx->EvalMap.Map2Texture2.Points;
1092 n = ctx->EvalMap.Map2Texture2.Uorder
1093 * ctx->EvalMap.Map2Texture2.Vorder * 2;
1094 break;
1095 case GL_MAP2_TEXTURE_COORD_3:
1096 data = ctx->EvalMap.Map2Texture3.Points;
1097 n = ctx->EvalMap.Map2Texture3.Uorder
1098 * ctx->EvalMap.Map2Texture3.Vorder * 3;
1099 break;
1100 case GL_MAP2_TEXTURE_COORD_4:
1101 data = ctx->EvalMap.Map2Texture4.Points;
1102 n = ctx->EvalMap.Map2Texture4.Uorder
1103 * ctx->EvalMap.Map2Texture4.Vorder * 4;
1104 break;
1105 case GL_MAP2_VERTEX_3:
1106 data = ctx->EvalMap.Map2Vertex3.Points;
1107 n = ctx->EvalMap.Map2Vertex3.Uorder
1108 * ctx->EvalMap.Map2Vertex3.Vorder * 3;
1109 break;
1110 case GL_MAP2_VERTEX_4:
1111 data = ctx->EvalMap.Map2Vertex4.Points;
1112 n = ctx->EvalMap.Map2Vertex4.Uorder
1113 * ctx->EvalMap.Map2Vertex4.Vorder * 4;
1114 break;
1115 default:
Brian Paul08836342001-03-03 20:33:27 +00001116 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
jtgafb833d1999-08-19 00:55:39 +00001117 return;
1118 }
1119 if (data) {
1120 for (i=0;i<n;i++) {
1121 v[i] = ROUNDF(data[i]);
1122 }
1123 }
1124 break;
1125 case GL_ORDER:
1126 switch (target) {
1127 case GL_MAP1_COLOR_4:
1128 *v = ctx->EvalMap.Map1Color4.Order;
1129 break;
1130 case GL_MAP1_INDEX:
1131 *v = ctx->EvalMap.Map1Index.Order;
1132 break;
1133 case GL_MAP1_NORMAL:
1134 *v = ctx->EvalMap.Map1Normal.Order;
1135 break;
1136 case GL_MAP1_TEXTURE_COORD_1:
1137 *v = ctx->EvalMap.Map1Texture1.Order;
1138 break;
1139 case GL_MAP1_TEXTURE_COORD_2:
1140 *v = ctx->EvalMap.Map1Texture2.Order;
1141 break;
1142 case GL_MAP1_TEXTURE_COORD_3:
1143 *v = ctx->EvalMap.Map1Texture3.Order;
1144 break;
1145 case GL_MAP1_TEXTURE_COORD_4:
1146 *v = ctx->EvalMap.Map1Texture4.Order;
1147 break;
1148 case GL_MAP1_VERTEX_3:
1149 *v = ctx->EvalMap.Map1Vertex3.Order;
1150 break;
1151 case GL_MAP1_VERTEX_4:
1152 *v = ctx->EvalMap.Map1Vertex4.Order;
1153 break;
1154 case GL_MAP2_COLOR_4:
1155 v[0] = ctx->EvalMap.Map2Color4.Uorder;
1156 v[1] = ctx->EvalMap.Map2Color4.Vorder;
1157 break;
1158 case GL_MAP2_INDEX:
1159 v[0] = ctx->EvalMap.Map2Index.Uorder;
1160 v[1] = ctx->EvalMap.Map2Index.Vorder;
1161 break;
1162 case GL_MAP2_NORMAL:
1163 v[0] = ctx->EvalMap.Map2Normal.Uorder;
1164 v[1] = ctx->EvalMap.Map2Normal.Vorder;
1165 break;
1166 case GL_MAP2_TEXTURE_COORD_1:
1167 v[0] = ctx->EvalMap.Map2Texture1.Uorder;
1168 v[1] = ctx->EvalMap.Map2Texture1.Vorder;
1169 break;
1170 case GL_MAP2_TEXTURE_COORD_2:
1171 v[0] = ctx->EvalMap.Map2Texture2.Uorder;
1172 v[1] = ctx->EvalMap.Map2Texture2.Vorder;
1173 break;
1174 case GL_MAP2_TEXTURE_COORD_3:
1175 v[0] = ctx->EvalMap.Map2Texture3.Uorder;
1176 v[1] = ctx->EvalMap.Map2Texture3.Vorder;
1177 break;
1178 case GL_MAP2_TEXTURE_COORD_4:
1179 v[0] = ctx->EvalMap.Map2Texture4.Uorder;
1180 v[1] = ctx->EvalMap.Map2Texture4.Vorder;
1181 break;
1182 case GL_MAP2_VERTEX_3:
1183 v[0] = ctx->EvalMap.Map2Vertex3.Uorder;
1184 v[1] = ctx->EvalMap.Map2Vertex3.Vorder;
1185 break;
1186 case GL_MAP2_VERTEX_4:
1187 v[0] = ctx->EvalMap.Map2Vertex4.Uorder;
1188 v[1] = ctx->EvalMap.Map2Vertex4.Vorder;
1189 break;
1190 default:
Brian Paul08836342001-03-03 20:33:27 +00001191 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
jtgafb833d1999-08-19 00:55:39 +00001192 return;
1193 }
1194 break;
1195 case GL_DOMAIN:
1196 switch (target) {
1197 case GL_MAP1_COLOR_4:
1198 v[0] = ROUNDF(ctx->EvalMap.Map1Color4.u1);
1199 v[1] = ROUNDF(ctx->EvalMap.Map1Color4.u2);
1200 break;
1201 case GL_MAP1_INDEX:
1202 v[0] = ROUNDF(ctx->EvalMap.Map1Index.u1);
1203 v[1] = ROUNDF(ctx->EvalMap.Map1Index.u2);
1204 break;
1205 case GL_MAP1_NORMAL:
1206 v[0] = ROUNDF(ctx->EvalMap.Map1Normal.u1);
1207 v[1] = ROUNDF(ctx->EvalMap.Map1Normal.u2);
1208 break;
1209 case GL_MAP1_TEXTURE_COORD_1:
1210 v[0] = ROUNDF(ctx->EvalMap.Map1Texture1.u1);
1211 v[1] = ROUNDF(ctx->EvalMap.Map1Texture1.u2);
1212 break;
1213 case GL_MAP1_TEXTURE_COORD_2:
1214 v[0] = ROUNDF(ctx->EvalMap.Map1Texture2.u1);
1215 v[1] = ROUNDF(ctx->EvalMap.Map1Texture2.u2);
1216 break;
1217 case GL_MAP1_TEXTURE_COORD_3:
1218 v[0] = ROUNDF(ctx->EvalMap.Map1Texture3.u1);
1219 v[1] = ROUNDF(ctx->EvalMap.Map1Texture3.u2);
1220 break;
1221 case GL_MAP1_TEXTURE_COORD_4:
1222 v[0] = ROUNDF(ctx->EvalMap.Map1Texture4.u1);
1223 v[1] = ROUNDF(ctx->EvalMap.Map1Texture4.u2);
1224 break;
1225 case GL_MAP1_VERTEX_3:
1226 v[0] = ROUNDF(ctx->EvalMap.Map1Vertex3.u1);
1227 v[1] = ROUNDF(ctx->EvalMap.Map1Vertex3.u2);
1228 break;
1229 case GL_MAP1_VERTEX_4:
1230 v[0] = ROUNDF(ctx->EvalMap.Map1Vertex4.u1);
1231 v[1] = ROUNDF(ctx->EvalMap.Map1Vertex4.u2);
1232 break;
1233 case GL_MAP2_COLOR_4:
1234 v[0] = ROUNDF(ctx->EvalMap.Map2Color4.u1);
1235 v[1] = ROUNDF(ctx->EvalMap.Map2Color4.u2);
1236 v[2] = ROUNDF(ctx->EvalMap.Map2Color4.v1);
1237 v[3] = ROUNDF(ctx->EvalMap.Map2Color4.v2);
1238 break;
1239 case GL_MAP2_INDEX:
1240 v[0] = ROUNDF(ctx->EvalMap.Map2Index.u1);
1241 v[1] = ROUNDF(ctx->EvalMap.Map2Index.u2);
1242 v[2] = ROUNDF(ctx->EvalMap.Map2Index.v1);
1243 v[3] = ROUNDF(ctx->EvalMap.Map2Index.v2);
1244 break;
1245 case GL_MAP2_NORMAL:
1246 v[0] = ROUNDF(ctx->EvalMap.Map2Normal.u1);
1247 v[1] = ROUNDF(ctx->EvalMap.Map2Normal.u2);
1248 v[2] = ROUNDF(ctx->EvalMap.Map2Normal.v1);
1249 v[3] = ROUNDF(ctx->EvalMap.Map2Normal.v2);
1250 break;
1251 case GL_MAP2_TEXTURE_COORD_1:
1252 v[0] = ROUNDF(ctx->EvalMap.Map2Texture1.u1);
1253 v[1] = ROUNDF(ctx->EvalMap.Map2Texture1.u2);
1254 v[2] = ROUNDF(ctx->EvalMap.Map2Texture1.v1);
1255 v[3] = ROUNDF(ctx->EvalMap.Map2Texture1.v2);
1256 break;
1257 case GL_MAP2_TEXTURE_COORD_2:
1258 v[0] = ROUNDF(ctx->EvalMap.Map2Texture2.u1);
1259 v[1] = ROUNDF(ctx->EvalMap.Map2Texture2.u2);
1260 v[2] = ROUNDF(ctx->EvalMap.Map2Texture2.v1);
1261 v[3] = ROUNDF(ctx->EvalMap.Map2Texture2.v2);
1262 break;
1263 case GL_MAP2_TEXTURE_COORD_3:
1264 v[0] = ROUNDF(ctx->EvalMap.Map2Texture3.u1);
1265 v[1] = ROUNDF(ctx->EvalMap.Map2Texture3.u2);
1266 v[2] = ROUNDF(ctx->EvalMap.Map2Texture3.v1);
1267 v[3] = ROUNDF(ctx->EvalMap.Map2Texture3.v2);
1268 break;
1269 case GL_MAP2_TEXTURE_COORD_4:
1270 v[0] = ROUNDF(ctx->EvalMap.Map2Texture4.u1);
1271 v[1] = ROUNDF(ctx->EvalMap.Map2Texture4.u2);
1272 v[2] = ROUNDF(ctx->EvalMap.Map2Texture4.v1);
1273 v[3] = ROUNDF(ctx->EvalMap.Map2Texture4.v2);
1274 break;
1275 case GL_MAP2_VERTEX_3:
1276 v[0] = ROUNDF(ctx->EvalMap.Map2Vertex3.u1);
1277 v[1] = ROUNDF(ctx->EvalMap.Map2Vertex3.u2);
1278 v[2] = ROUNDF(ctx->EvalMap.Map2Vertex3.v1);
1279 v[3] = ROUNDF(ctx->EvalMap.Map2Vertex3.v2);
1280 break;
1281 case GL_MAP2_VERTEX_4:
1282 v[0] = ROUNDF(ctx->EvalMap.Map2Vertex4.u1);
1283 v[1] = ROUNDF(ctx->EvalMap.Map2Vertex4.u2);
1284 v[2] = ROUNDF(ctx->EvalMap.Map2Vertex4.v1);
1285 v[3] = ROUNDF(ctx->EvalMap.Map2Vertex4.v2);
1286 break;
1287 default:
Brian Paul08836342001-03-03 20:33:27 +00001288 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" );
jtgafb833d1999-08-19 00:55:39 +00001289 }
1290 break;
1291 default:
Brian Paul08836342001-03-03 20:33:27 +00001292 _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" );
jtgafb833d1999-08-19 00:55:39 +00001293 }
1294}
1295
1296
1297
Brian Paulfbd8f211999-11-11 01:22:25 +00001298void
1299_mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 )
jtgafb833d1999-08-19 00:55:39 +00001300{
Brian Paulfbd8f211999-11-11 01:22:25 +00001301 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00001302 ASSERT_OUTSIDE_BEGIN_END(ctx);
jtgafb833d1999-08-19 00:55:39 +00001303
1304 if (un<1) {
Brian Paul08836342001-03-03 20:33:27 +00001305 _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" );
jtgafb833d1999-08-19 00:55:39 +00001306 return;
1307 }
Keith Whitwellcab974c2000-12-26 05:09:27 +00001308 FLUSH_VERTICES(ctx, _NEW_EVAL);
jtgafb833d1999-08-19 00:55:39 +00001309 ctx->Eval.MapGrid1un = un;
1310 ctx->Eval.MapGrid1u1 = u1;
1311 ctx->Eval.MapGrid1u2 = u2;
1312 ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un;
1313}
1314
1315
Brian Paulfbd8f211999-11-11 01:22:25 +00001316void
1317_mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 )
jtgafb833d1999-08-19 00:55:39 +00001318{
Brian Paulfbd8f211999-11-11 01:22:25 +00001319 _mesa_MapGrid1f( un, u1, u2 );
1320}
1321
1322
1323void
1324_mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2,
1325 GLint vn, GLfloat v1, GLfloat v2 )
1326{
1327 GET_CURRENT_CONTEXT(ctx);
Keith Whitwellcab974c2000-12-26 05:09:27 +00001328 ASSERT_OUTSIDE_BEGIN_END(ctx);
1329
jtgafb833d1999-08-19 00:55:39 +00001330 if (un<1) {
Brian Paul08836342001-03-03 20:33:27 +00001331 _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" );
jtgafb833d1999-08-19 00:55:39 +00001332 return;
1333 }
1334 if (vn<1) {
Brian Paul08836342001-03-03 20:33:27 +00001335 _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" );
jtgafb833d1999-08-19 00:55:39 +00001336 return;
1337 }
Keith Whitwellcab974c2000-12-26 05:09:27 +00001338
1339 FLUSH_VERTICES(ctx, _NEW_EVAL);
jtgafb833d1999-08-19 00:55:39 +00001340 ctx->Eval.MapGrid2un = un;
1341 ctx->Eval.MapGrid2u1 = u1;
1342 ctx->Eval.MapGrid2u2 = u2;
1343 ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un;
1344 ctx->Eval.MapGrid2vn = vn;
1345 ctx->Eval.MapGrid2v1 = v1;
1346 ctx->Eval.MapGrid2v2 = v2;
1347 ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn;
1348}
1349
1350
Brian Paulfbd8f211999-11-11 01:22:25 +00001351void
1352_mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2,
1353 GLint vn, GLdouble v1, GLdouble v2 )
jtgafb833d1999-08-19 00:55:39 +00001354{
Brian Paulfbd8f211999-11-11 01:22:25 +00001355 _mesa_MapGrid2f( un, u1, u2, vn, v1, v2 );
1356}