eval.c revision 7117f1b4
17117f1b4Smrg 27117f1b4Smrg/* 37117f1b4Smrg * Mesa 3-D graphics library 47117f1b4Smrg * Version: 5.1 57117f1b4Smrg * 67117f1b4Smrg * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. 77117f1b4Smrg * 87117f1b4Smrg * Permission is hereby granted, free of charge, to any person obtaining a 97117f1b4Smrg * copy of this software and associated documentation files (the "Software"), 107117f1b4Smrg * to deal in the Software without restriction, including without limitation 117117f1b4Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 127117f1b4Smrg * and/or sell copies of the Software, and to permit persons to whom the 137117f1b4Smrg * Software is furnished to do so, subject to the following conditions: 147117f1b4Smrg * 157117f1b4Smrg * The above copyright notice and this permission notice shall be included 167117f1b4Smrg * in all copies or substantial portions of the Software. 177117f1b4Smrg * 187117f1b4Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 197117f1b4Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 207117f1b4Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 217117f1b4Smrg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 227117f1b4Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 237117f1b4Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 247117f1b4Smrg */ 257117f1b4Smrg 267117f1b4Smrg 277117f1b4Smrg/* 287117f1b4Smrg * eval.c was written by 297117f1b4Smrg * Bernd Barsuhn (bdbarsuh@cip.informatik.uni-erlangen.de) and 307117f1b4Smrg * Volker Weiss (vrweiss@cip.informatik.uni-erlangen.de). 317117f1b4Smrg * 327117f1b4Smrg * My original implementation of evaluators was simplistic and didn't 337117f1b4Smrg * compute surface normal vectors properly. Bernd and Volker applied 347117f1b4Smrg * used more sophisticated methods to get better results. 357117f1b4Smrg * 367117f1b4Smrg * Thanks guys! 377117f1b4Smrg */ 387117f1b4Smrg 397117f1b4Smrg 407117f1b4Smrg#include "glheader.h" 417117f1b4Smrg#include "imports.h" 427117f1b4Smrg#include "colormac.h" 437117f1b4Smrg#include "context.h" 447117f1b4Smrg#include "eval.h" 457117f1b4Smrg#include "macros.h" 467117f1b4Smrg#include "mtypes.h" 477117f1b4Smrg 487117f1b4Smrg 497117f1b4Smrg/* 507117f1b4Smrg * Return the number of components per control point for any type of 517117f1b4Smrg * evaluator. Return 0 if bad target. 527117f1b4Smrg * See table 5.1 in the OpenGL 1.2 spec. 537117f1b4Smrg */ 547117f1b4SmrgGLuint _mesa_evaluator_components( GLenum target ) 557117f1b4Smrg{ 567117f1b4Smrg switch (target) { 577117f1b4Smrg case GL_MAP1_VERTEX_3: return 3; 587117f1b4Smrg case GL_MAP1_VERTEX_4: return 4; 597117f1b4Smrg case GL_MAP1_INDEX: return 1; 607117f1b4Smrg case GL_MAP1_COLOR_4: return 4; 617117f1b4Smrg case GL_MAP1_NORMAL: return 3; 627117f1b4Smrg case GL_MAP1_TEXTURE_COORD_1: return 1; 637117f1b4Smrg case GL_MAP1_TEXTURE_COORD_2: return 2; 647117f1b4Smrg case GL_MAP1_TEXTURE_COORD_3: return 3; 657117f1b4Smrg case GL_MAP1_TEXTURE_COORD_4: return 4; 667117f1b4Smrg case GL_MAP2_VERTEX_3: return 3; 677117f1b4Smrg case GL_MAP2_VERTEX_4: return 4; 687117f1b4Smrg case GL_MAP2_INDEX: return 1; 697117f1b4Smrg case GL_MAP2_COLOR_4: return 4; 707117f1b4Smrg case GL_MAP2_NORMAL: return 3; 717117f1b4Smrg case GL_MAP2_TEXTURE_COORD_1: return 1; 727117f1b4Smrg case GL_MAP2_TEXTURE_COORD_2: return 2; 737117f1b4Smrg case GL_MAP2_TEXTURE_COORD_3: return 3; 747117f1b4Smrg case GL_MAP2_TEXTURE_COORD_4: return 4; 757117f1b4Smrg default: break; 767117f1b4Smrg } 777117f1b4Smrg 787117f1b4Smrg /* XXX need to check for the vertex program extension 797117f1b4Smrg if (!ctx->Extensions.NV_vertex_program) 807117f1b4Smrg return 0; 817117f1b4Smrg */ 827117f1b4Smrg 837117f1b4Smrg if (target >= GL_MAP1_VERTEX_ATTRIB0_4_NV && 847117f1b4Smrg target <= GL_MAP1_VERTEX_ATTRIB15_4_NV) 857117f1b4Smrg return 4; 867117f1b4Smrg 877117f1b4Smrg if (target >= GL_MAP2_VERTEX_ATTRIB0_4_NV && 887117f1b4Smrg target <= GL_MAP2_VERTEX_ATTRIB15_4_NV) 897117f1b4Smrg return 4; 907117f1b4Smrg 917117f1b4Smrg return 0; 927117f1b4Smrg} 937117f1b4Smrg 947117f1b4Smrg 957117f1b4Smrg/* 967117f1b4Smrg * Return pointer to the gl_1d_map struct for the named target. 977117f1b4Smrg */ 987117f1b4Smrgstatic struct gl_1d_map * 997117f1b4Smrgget_1d_map( GLcontext *ctx, GLenum target ) 1007117f1b4Smrg{ 1017117f1b4Smrg switch (target) { 1027117f1b4Smrg case GL_MAP1_VERTEX_3: 1037117f1b4Smrg return &ctx->EvalMap.Map1Vertex3; 1047117f1b4Smrg case GL_MAP1_VERTEX_4: 1057117f1b4Smrg return &ctx->EvalMap.Map1Vertex4; 1067117f1b4Smrg case GL_MAP1_INDEX: 1077117f1b4Smrg return &ctx->EvalMap.Map1Index; 1087117f1b4Smrg case GL_MAP1_COLOR_4: 1097117f1b4Smrg return &ctx->EvalMap.Map1Color4; 1107117f1b4Smrg case GL_MAP1_NORMAL: 1117117f1b4Smrg return &ctx->EvalMap.Map1Normal; 1127117f1b4Smrg case GL_MAP1_TEXTURE_COORD_1: 1137117f1b4Smrg return &ctx->EvalMap.Map1Texture1; 1147117f1b4Smrg case GL_MAP1_TEXTURE_COORD_2: 1157117f1b4Smrg return &ctx->EvalMap.Map1Texture2; 1167117f1b4Smrg case GL_MAP1_TEXTURE_COORD_3: 1177117f1b4Smrg return &ctx->EvalMap.Map1Texture3; 1187117f1b4Smrg case GL_MAP1_TEXTURE_COORD_4: 1197117f1b4Smrg return &ctx->EvalMap.Map1Texture4; 1207117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB0_4_NV: 1217117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB1_4_NV: 1227117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB2_4_NV: 1237117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB3_4_NV: 1247117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB4_4_NV: 1257117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB5_4_NV: 1267117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB6_4_NV: 1277117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB7_4_NV: 1287117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB8_4_NV: 1297117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB9_4_NV: 1307117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB10_4_NV: 1317117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB11_4_NV: 1327117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB12_4_NV: 1337117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB13_4_NV: 1347117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB14_4_NV: 1357117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB15_4_NV: 1367117f1b4Smrg if (!ctx->Extensions.NV_vertex_program) 1377117f1b4Smrg return NULL; 1387117f1b4Smrg return &ctx->EvalMap.Map1Attrib[target - GL_MAP1_VERTEX_ATTRIB0_4_NV]; 1397117f1b4Smrg default: 1407117f1b4Smrg return NULL; 1417117f1b4Smrg } 1427117f1b4Smrg} 1437117f1b4Smrg 1447117f1b4Smrg 1457117f1b4Smrg/* 1467117f1b4Smrg * Return pointer to the gl_2d_map struct for the named target. 1477117f1b4Smrg */ 1487117f1b4Smrgstatic struct gl_2d_map * 1497117f1b4Smrgget_2d_map( GLcontext *ctx, GLenum target ) 1507117f1b4Smrg{ 1517117f1b4Smrg switch (target) { 1527117f1b4Smrg case GL_MAP2_VERTEX_3: 1537117f1b4Smrg return &ctx->EvalMap.Map2Vertex3; 1547117f1b4Smrg case GL_MAP2_VERTEX_4: 1557117f1b4Smrg return &ctx->EvalMap.Map2Vertex4; 1567117f1b4Smrg case GL_MAP2_INDEX: 1577117f1b4Smrg return &ctx->EvalMap.Map2Index; 1587117f1b4Smrg case GL_MAP2_COLOR_4: 1597117f1b4Smrg return &ctx->EvalMap.Map2Color4; 1607117f1b4Smrg case GL_MAP2_NORMAL: 1617117f1b4Smrg return &ctx->EvalMap.Map2Normal; 1627117f1b4Smrg case GL_MAP2_TEXTURE_COORD_1: 1637117f1b4Smrg return &ctx->EvalMap.Map2Texture1; 1647117f1b4Smrg case GL_MAP2_TEXTURE_COORD_2: 1657117f1b4Smrg return &ctx->EvalMap.Map2Texture2; 1667117f1b4Smrg case GL_MAP2_TEXTURE_COORD_3: 1677117f1b4Smrg return &ctx->EvalMap.Map2Texture3; 1687117f1b4Smrg case GL_MAP2_TEXTURE_COORD_4: 1697117f1b4Smrg return &ctx->EvalMap.Map2Texture4; 1707117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB0_4_NV: 1717117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB1_4_NV: 1727117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB2_4_NV: 1737117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB3_4_NV: 1747117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB4_4_NV: 1757117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB5_4_NV: 1767117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB6_4_NV: 1777117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB7_4_NV: 1787117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB8_4_NV: 1797117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB9_4_NV: 1807117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB10_4_NV: 1817117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB11_4_NV: 1827117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB12_4_NV: 1837117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB13_4_NV: 1847117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB14_4_NV: 1857117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB15_4_NV: 1867117f1b4Smrg if (!ctx->Extensions.NV_vertex_program) 1877117f1b4Smrg return NULL; 1887117f1b4Smrg return &ctx->EvalMap.Map2Attrib[target - GL_MAP2_VERTEX_ATTRIB0_4_NV]; 1897117f1b4Smrg default: 1907117f1b4Smrg return NULL; 1917117f1b4Smrg } 1927117f1b4Smrg} 1937117f1b4Smrg 1947117f1b4Smrg 1957117f1b4Smrg/**********************************************************************/ 1967117f1b4Smrg/*** Copy and deallocate control points ***/ 1977117f1b4Smrg/**********************************************************************/ 1987117f1b4Smrg 1997117f1b4Smrg 2007117f1b4Smrg/* 2017117f1b4Smrg * Copy 1-parametric evaluator control points from user-specified 2027117f1b4Smrg * memory space to a buffer of contiguous control points. 2037117f1b4Smrg * \param see glMap1f for details 2047117f1b4Smrg * \return pointer to buffer of contiguous control points or NULL if out 2057117f1b4Smrg * of memory. 2067117f1b4Smrg */ 2077117f1b4SmrgGLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder, 2087117f1b4Smrg const GLfloat *points ) 2097117f1b4Smrg{ 2107117f1b4Smrg GLfloat *buffer, *p; 2117117f1b4Smrg GLint i, k, size = _mesa_evaluator_components(target); 2127117f1b4Smrg 2137117f1b4Smrg if (!points || !size) 2147117f1b4Smrg return NULL; 2157117f1b4Smrg 2167117f1b4Smrg buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat)); 2177117f1b4Smrg 2187117f1b4Smrg if (buffer) 2197117f1b4Smrg for (i = 0, p = buffer; i < uorder; i++, points += ustride) 2207117f1b4Smrg for (k = 0; k < size; k++) 2217117f1b4Smrg *p++ = points[k]; 2227117f1b4Smrg 2237117f1b4Smrg return buffer; 2247117f1b4Smrg} 2257117f1b4Smrg 2267117f1b4Smrg 2277117f1b4Smrg 2287117f1b4Smrg/* 2297117f1b4Smrg * Same as above but convert doubles to floats. 2307117f1b4Smrg */ 2317117f1b4SmrgGLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder, 2327117f1b4Smrg const GLdouble *points ) 2337117f1b4Smrg{ 2347117f1b4Smrg GLfloat *buffer, *p; 2357117f1b4Smrg GLint i, k, size = _mesa_evaluator_components(target); 2367117f1b4Smrg 2377117f1b4Smrg if (!points || !size) 2387117f1b4Smrg return NULL; 2397117f1b4Smrg 2407117f1b4Smrg buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat)); 2417117f1b4Smrg 2427117f1b4Smrg if (buffer) 2437117f1b4Smrg for (i = 0, p = buffer; i < uorder; i++, points += ustride) 2447117f1b4Smrg for (k = 0; k < size; k++) 2457117f1b4Smrg *p++ = (GLfloat) points[k]; 2467117f1b4Smrg 2477117f1b4Smrg return buffer; 2487117f1b4Smrg} 2497117f1b4Smrg 2507117f1b4Smrg 2517117f1b4Smrg 2527117f1b4Smrg/* 2537117f1b4Smrg * Copy 2-parametric evaluator control points from user-specified 2547117f1b4Smrg * memory space to a buffer of contiguous control points. 2557117f1b4Smrg * Additional memory is allocated to be used by the horner and 2567117f1b4Smrg * de Casteljau evaluation schemes. 2577117f1b4Smrg * 2587117f1b4Smrg * \param see glMap2f for details 2597117f1b4Smrg * \return pointer to buffer of contiguous control points or NULL if out 2607117f1b4Smrg * of memory. 2617117f1b4Smrg */ 2627117f1b4SmrgGLfloat *_mesa_copy_map_points2f( GLenum target, 2637117f1b4Smrg GLint ustride, GLint uorder, 2647117f1b4Smrg GLint vstride, GLint vorder, 2657117f1b4Smrg const GLfloat *points ) 2667117f1b4Smrg{ 2677117f1b4Smrg GLfloat *buffer, *p; 2687117f1b4Smrg GLint i, j, k, size, dsize, hsize; 2697117f1b4Smrg GLint uinc; 2707117f1b4Smrg 2717117f1b4Smrg size = _mesa_evaluator_components(target); 2727117f1b4Smrg 2737117f1b4Smrg if (!points || size==0) { 2747117f1b4Smrg return NULL; 2757117f1b4Smrg } 2767117f1b4Smrg 2777117f1b4Smrg /* max(uorder, vorder) additional points are used in */ 2787117f1b4Smrg /* horner evaluation and uorder*vorder additional */ 2797117f1b4Smrg /* values are needed for de Casteljau */ 2807117f1b4Smrg dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder; 2817117f1b4Smrg hsize = (uorder > vorder ? uorder : vorder)*size; 2827117f1b4Smrg 2837117f1b4Smrg if(hsize>dsize) 2847117f1b4Smrg buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat)); 2857117f1b4Smrg else 2867117f1b4Smrg buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat)); 2877117f1b4Smrg 2887117f1b4Smrg /* compute the increment value for the u-loop */ 2897117f1b4Smrg uinc = ustride - vorder*vstride; 2907117f1b4Smrg 2917117f1b4Smrg if (buffer) 2927117f1b4Smrg for (i=0, p=buffer; i<uorder; i++, points += uinc) 2937117f1b4Smrg for (j=0; j<vorder; j++, points += vstride) 2947117f1b4Smrg for (k=0; k<size; k++) 2957117f1b4Smrg *p++ = points[k]; 2967117f1b4Smrg 2977117f1b4Smrg return buffer; 2987117f1b4Smrg} 2997117f1b4Smrg 3007117f1b4Smrg 3017117f1b4Smrg 3027117f1b4Smrg/* 3037117f1b4Smrg * Same as above but convert doubles to floats. 3047117f1b4Smrg */ 3057117f1b4SmrgGLfloat *_mesa_copy_map_points2d(GLenum target, 3067117f1b4Smrg GLint ustride, GLint uorder, 3077117f1b4Smrg GLint vstride, GLint vorder, 3087117f1b4Smrg const GLdouble *points ) 3097117f1b4Smrg{ 3107117f1b4Smrg GLfloat *buffer, *p; 3117117f1b4Smrg GLint i, j, k, size, hsize, dsize; 3127117f1b4Smrg GLint uinc; 3137117f1b4Smrg 3147117f1b4Smrg size = _mesa_evaluator_components(target); 3157117f1b4Smrg 3167117f1b4Smrg if (!points || size==0) { 3177117f1b4Smrg return NULL; 3187117f1b4Smrg } 3197117f1b4Smrg 3207117f1b4Smrg /* max(uorder, vorder) additional points are used in */ 3217117f1b4Smrg /* horner evaluation and uorder*vorder additional */ 3227117f1b4Smrg /* values are needed for de Casteljau */ 3237117f1b4Smrg dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder; 3247117f1b4Smrg hsize = (uorder > vorder ? uorder : vorder)*size; 3257117f1b4Smrg 3267117f1b4Smrg if(hsize>dsize) 3277117f1b4Smrg buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat)); 3287117f1b4Smrg else 3297117f1b4Smrg buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat)); 3307117f1b4Smrg 3317117f1b4Smrg /* compute the increment value for the u-loop */ 3327117f1b4Smrg uinc = ustride - vorder*vstride; 3337117f1b4Smrg 3347117f1b4Smrg if (buffer) 3357117f1b4Smrg for (i=0, p=buffer; i<uorder; i++, points += uinc) 3367117f1b4Smrg for (j=0; j<vorder; j++, points += vstride) 3377117f1b4Smrg for (k=0; k<size; k++) 3387117f1b4Smrg *p++ = (GLfloat) points[k]; 3397117f1b4Smrg 3407117f1b4Smrg return buffer; 3417117f1b4Smrg} 3427117f1b4Smrg 3437117f1b4Smrg 3447117f1b4Smrg 3457117f1b4Smrg 3467117f1b4Smrg/**********************************************************************/ 3477117f1b4Smrg/*** API entry points ***/ 3487117f1b4Smrg/**********************************************************************/ 3497117f1b4Smrg 3507117f1b4Smrg 3517117f1b4Smrg/* 3527117f1b4Smrg * This does the work of glMap1[fd]. 3537117f1b4Smrg */ 3547117f1b4Smrgstatic void 3557117f1b4Smrgmap1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, 3567117f1b4Smrg GLint uorder, const GLvoid *points, GLenum type ) 3577117f1b4Smrg{ 3587117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 3597117f1b4Smrg GLint k; 3607117f1b4Smrg GLfloat *pnts; 3617117f1b4Smrg struct gl_1d_map *map = NULL; 3627117f1b4Smrg 3637117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 3647117f1b4Smrg ASSERT(type == GL_FLOAT || type == GL_DOUBLE); 3657117f1b4Smrg 3667117f1b4Smrg if (u1 == u2) { 3677117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" ); 3687117f1b4Smrg return; 3697117f1b4Smrg } 3707117f1b4Smrg if (uorder < 1 || uorder > MAX_EVAL_ORDER) { 3717117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" ); 3727117f1b4Smrg return; 3737117f1b4Smrg } 3747117f1b4Smrg if (!points) { 3757117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" ); 3767117f1b4Smrg return; 3777117f1b4Smrg } 3787117f1b4Smrg 3797117f1b4Smrg k = _mesa_evaluator_components( target ); 3807117f1b4Smrg if (k == 0) { 3817117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" ); 3827117f1b4Smrg } 3837117f1b4Smrg 3847117f1b4Smrg if (ustride < k) { 3857117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" ); 3867117f1b4Smrg return; 3877117f1b4Smrg } 3887117f1b4Smrg 3897117f1b4Smrg if (ctx->Texture.CurrentUnit != 0) { 3907117f1b4Smrg /* See OpenGL 1.2.1 spec, section F.2.13 */ 3917117f1b4Smrg _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" ); 3927117f1b4Smrg return; 3937117f1b4Smrg } 3947117f1b4Smrg 3957117f1b4Smrg map = get_1d_map(ctx, target); 3967117f1b4Smrg if (!map) { 3977117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" ); 3987117f1b4Smrg return; 3997117f1b4Smrg } 4007117f1b4Smrg 4017117f1b4Smrg /* make copy of the control points */ 4027117f1b4Smrg if (type == GL_FLOAT) 4037117f1b4Smrg pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points); 4047117f1b4Smrg else 4057117f1b4Smrg pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points); 4067117f1b4Smrg 4077117f1b4Smrg 4087117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4097117f1b4Smrg map->Order = uorder; 4107117f1b4Smrg map->u1 = u1; 4117117f1b4Smrg map->u2 = u2; 4127117f1b4Smrg map->du = 1.0F / (u2 - u1); 4137117f1b4Smrg if (map->Points) 4147117f1b4Smrg FREE( map->Points ); 4157117f1b4Smrg map->Points = pnts; 4167117f1b4Smrg} 4177117f1b4Smrg 4187117f1b4Smrg 4197117f1b4Smrg 4207117f1b4Smrgvoid GLAPIENTRY 4217117f1b4Smrg_mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, 4227117f1b4Smrg GLint order, const GLfloat *points ) 4237117f1b4Smrg{ 4247117f1b4Smrg map1(target, u1, u2, stride, order, points, GL_FLOAT); 4257117f1b4Smrg} 4267117f1b4Smrg 4277117f1b4Smrg 4287117f1b4Smrgvoid GLAPIENTRY 4297117f1b4Smrg_mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, 4307117f1b4Smrg GLint order, const GLdouble *points ) 4317117f1b4Smrg{ 4327117f1b4Smrg map1(target, (GLfloat) u1, (GLfloat) u2, stride, order, points, GL_DOUBLE); 4337117f1b4Smrg} 4347117f1b4Smrg 4357117f1b4Smrg 4367117f1b4Smrgstatic void 4377117f1b4Smrgmap2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, 4387117f1b4Smrg GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, 4397117f1b4Smrg const GLvoid *points, GLenum type ) 4407117f1b4Smrg{ 4417117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 4427117f1b4Smrg GLint k; 4437117f1b4Smrg GLfloat *pnts; 4447117f1b4Smrg struct gl_2d_map *map = NULL; 4457117f1b4Smrg 4467117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 4477117f1b4Smrg ASSERT(type == GL_FLOAT || type == GL_DOUBLE); 4487117f1b4Smrg 4497117f1b4Smrg if (u1==u2) { 4507117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" ); 4517117f1b4Smrg return; 4527117f1b4Smrg } 4537117f1b4Smrg 4547117f1b4Smrg if (v1==v2) { 4557117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" ); 4567117f1b4Smrg return; 4577117f1b4Smrg } 4587117f1b4Smrg 4597117f1b4Smrg if (uorder<1 || uorder>MAX_EVAL_ORDER) { 4607117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" ); 4617117f1b4Smrg return; 4627117f1b4Smrg } 4637117f1b4Smrg 4647117f1b4Smrg if (vorder<1 || vorder>MAX_EVAL_ORDER) { 4657117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" ); 4667117f1b4Smrg return; 4677117f1b4Smrg } 4687117f1b4Smrg 4697117f1b4Smrg k = _mesa_evaluator_components( target ); 4707117f1b4Smrg if (k==0) { 4717117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" ); 4727117f1b4Smrg } 4737117f1b4Smrg 4747117f1b4Smrg if (ustride < k) { 4757117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" ); 4767117f1b4Smrg return; 4777117f1b4Smrg } 4787117f1b4Smrg if (vstride < k) { 4797117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" ); 4807117f1b4Smrg return; 4817117f1b4Smrg } 4827117f1b4Smrg 4837117f1b4Smrg if (ctx->Texture.CurrentUnit != 0) { 4847117f1b4Smrg /* See OpenGL 1.2.1 spec, section F.2.13 */ 4857117f1b4Smrg _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" ); 4867117f1b4Smrg return; 4877117f1b4Smrg } 4887117f1b4Smrg 4897117f1b4Smrg map = get_2d_map(ctx, target); 4907117f1b4Smrg if (!map) { 4917117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" ); 4927117f1b4Smrg return; 4937117f1b4Smrg } 4947117f1b4Smrg 4957117f1b4Smrg /* make copy of the control points */ 4967117f1b4Smrg if (type == GL_FLOAT) 4977117f1b4Smrg pnts = _mesa_copy_map_points2f(target, ustride, uorder, 4987117f1b4Smrg vstride, vorder, (GLfloat*) points); 4997117f1b4Smrg else 5007117f1b4Smrg pnts = _mesa_copy_map_points2d(target, ustride, uorder, 5017117f1b4Smrg vstride, vorder, (GLdouble*) points); 5027117f1b4Smrg 5037117f1b4Smrg 5047117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 5057117f1b4Smrg map->Uorder = uorder; 5067117f1b4Smrg map->u1 = u1; 5077117f1b4Smrg map->u2 = u2; 5087117f1b4Smrg map->du = 1.0F / (u2 - u1); 5097117f1b4Smrg map->Vorder = vorder; 5107117f1b4Smrg map->v1 = v1; 5117117f1b4Smrg map->v2 = v2; 5127117f1b4Smrg map->dv = 1.0F / (v2 - v1); 5137117f1b4Smrg if (map->Points) 5147117f1b4Smrg FREE( map->Points ); 5157117f1b4Smrg map->Points = pnts; 5167117f1b4Smrg} 5177117f1b4Smrg 5187117f1b4Smrg 5197117f1b4Smrgvoid GLAPIENTRY 5207117f1b4Smrg_mesa_Map2f( GLenum target, 5217117f1b4Smrg GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, 5227117f1b4Smrg GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, 5237117f1b4Smrg const GLfloat *points) 5247117f1b4Smrg{ 5257117f1b4Smrg map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, 5267117f1b4Smrg points, GL_FLOAT); 5277117f1b4Smrg} 5287117f1b4Smrg 5297117f1b4Smrg 5307117f1b4Smrgvoid GLAPIENTRY 5317117f1b4Smrg_mesa_Map2d( GLenum target, 5327117f1b4Smrg GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, 5337117f1b4Smrg GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, 5347117f1b4Smrg const GLdouble *points ) 5357117f1b4Smrg{ 5367117f1b4Smrg map2(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder, 5377117f1b4Smrg (GLfloat) v1, (GLfloat) v2, vstride, vorder, points, GL_DOUBLE); 5387117f1b4Smrg} 5397117f1b4Smrg 5407117f1b4Smrg 5417117f1b4Smrg 5427117f1b4Smrgvoid GLAPIENTRY 5437117f1b4Smrg_mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v ) 5447117f1b4Smrg{ 5457117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 5467117f1b4Smrg struct gl_1d_map *map1d; 5477117f1b4Smrg struct gl_2d_map *map2d; 5487117f1b4Smrg GLint i, n; 5497117f1b4Smrg GLfloat *data; 5507117f1b4Smrg GLuint comps; 5517117f1b4Smrg 5527117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 5537117f1b4Smrg 5547117f1b4Smrg comps = _mesa_evaluator_components(target); 5557117f1b4Smrg if (!comps) { 5567117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" ); 5577117f1b4Smrg return; 5587117f1b4Smrg } 5597117f1b4Smrg 5607117f1b4Smrg map1d = get_1d_map(ctx, target); 5617117f1b4Smrg map2d = get_2d_map(ctx, target); 5627117f1b4Smrg ASSERT(map1d || map2d); 5637117f1b4Smrg 5647117f1b4Smrg switch (query) { 5657117f1b4Smrg case GL_COEFF: 5667117f1b4Smrg if (map1d) { 5677117f1b4Smrg data = map1d->Points; 5687117f1b4Smrg n = map1d->Order * comps; 5697117f1b4Smrg } 5707117f1b4Smrg else { 5717117f1b4Smrg data = map2d->Points; 5727117f1b4Smrg n = map2d->Uorder * map2d->Vorder * comps; 5737117f1b4Smrg } 5747117f1b4Smrg if (data) { 5757117f1b4Smrg for (i=0;i<n;i++) { 5767117f1b4Smrg v[i] = data[i]; 5777117f1b4Smrg } 5787117f1b4Smrg } 5797117f1b4Smrg break; 5807117f1b4Smrg case GL_ORDER: 5817117f1b4Smrg if (map1d) { 5827117f1b4Smrg v[0] = (GLdouble) map1d->Order; 5837117f1b4Smrg } 5847117f1b4Smrg else { 5857117f1b4Smrg v[0] = (GLdouble) map2d->Uorder; 5867117f1b4Smrg v[1] = (GLdouble) map2d->Vorder; 5877117f1b4Smrg } 5887117f1b4Smrg break; 5897117f1b4Smrg case GL_DOMAIN: 5907117f1b4Smrg if (map1d) { 5917117f1b4Smrg v[0] = (GLdouble) map1d->u1; 5927117f1b4Smrg v[1] = (GLdouble) map1d->u2; 5937117f1b4Smrg } 5947117f1b4Smrg else { 5957117f1b4Smrg v[0] = (GLdouble) map2d->u1; 5967117f1b4Smrg v[1] = (GLdouble) map2d->u2; 5977117f1b4Smrg v[2] = (GLdouble) map2d->v1; 5987117f1b4Smrg v[3] = (GLdouble) map2d->v2; 5997117f1b4Smrg } 6007117f1b4Smrg break; 6017117f1b4Smrg default: 6027117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" ); 6037117f1b4Smrg } 6047117f1b4Smrg} 6057117f1b4Smrg 6067117f1b4Smrg 6077117f1b4Smrgvoid GLAPIENTRY 6087117f1b4Smrg_mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v ) 6097117f1b4Smrg{ 6107117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 6117117f1b4Smrg struct gl_1d_map *map1d; 6127117f1b4Smrg struct gl_2d_map *map2d; 6137117f1b4Smrg GLint i, n; 6147117f1b4Smrg GLfloat *data; 6157117f1b4Smrg GLuint comps; 6167117f1b4Smrg 6177117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 6187117f1b4Smrg 6197117f1b4Smrg comps = _mesa_evaluator_components(target); 6207117f1b4Smrg if (!comps) { 6217117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" ); 6227117f1b4Smrg return; 6237117f1b4Smrg } 6247117f1b4Smrg 6257117f1b4Smrg map1d = get_1d_map(ctx, target); 6267117f1b4Smrg map2d = get_2d_map(ctx, target); 6277117f1b4Smrg ASSERT(map1d || map2d); 6287117f1b4Smrg 6297117f1b4Smrg switch (query) { 6307117f1b4Smrg case GL_COEFF: 6317117f1b4Smrg if (map1d) { 6327117f1b4Smrg data = map1d->Points; 6337117f1b4Smrg n = map1d->Order * comps; 6347117f1b4Smrg } 6357117f1b4Smrg else { 6367117f1b4Smrg data = map2d->Points; 6377117f1b4Smrg n = map2d->Uorder * map2d->Vorder * comps; 6387117f1b4Smrg } 6397117f1b4Smrg if (data) { 6407117f1b4Smrg for (i=0;i<n;i++) { 6417117f1b4Smrg v[i] = data[i]; 6427117f1b4Smrg } 6437117f1b4Smrg } 6447117f1b4Smrg break; 6457117f1b4Smrg case GL_ORDER: 6467117f1b4Smrg if (map1d) { 6477117f1b4Smrg v[0] = (GLfloat) map1d->Order; 6487117f1b4Smrg } 6497117f1b4Smrg else { 6507117f1b4Smrg v[0] = (GLfloat) map2d->Uorder; 6517117f1b4Smrg v[1] = (GLfloat) map2d->Vorder; 6527117f1b4Smrg } 6537117f1b4Smrg break; 6547117f1b4Smrg case GL_DOMAIN: 6557117f1b4Smrg if (map1d) { 6567117f1b4Smrg v[0] = map1d->u1; 6577117f1b4Smrg v[1] = map1d->u2; 6587117f1b4Smrg } 6597117f1b4Smrg else { 6607117f1b4Smrg v[0] = map2d->u1; 6617117f1b4Smrg v[1] = map2d->u2; 6627117f1b4Smrg v[2] = map2d->v1; 6637117f1b4Smrg v[3] = map2d->v2; 6647117f1b4Smrg } 6657117f1b4Smrg break; 6667117f1b4Smrg default: 6677117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" ); 6687117f1b4Smrg } 6697117f1b4Smrg} 6707117f1b4Smrg 6717117f1b4Smrg 6727117f1b4Smrgvoid GLAPIENTRY 6737117f1b4Smrg_mesa_GetMapiv( GLenum target, GLenum query, GLint *v ) 6747117f1b4Smrg{ 6757117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 6767117f1b4Smrg struct gl_1d_map *map1d; 6777117f1b4Smrg struct gl_2d_map *map2d; 6787117f1b4Smrg GLuint i, n; 6797117f1b4Smrg GLfloat *data; 6807117f1b4Smrg GLuint comps; 6817117f1b4Smrg 6827117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 6837117f1b4Smrg 6847117f1b4Smrg comps = _mesa_evaluator_components(target); 6857117f1b4Smrg if (!comps) { 6867117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" ); 6877117f1b4Smrg return; 6887117f1b4Smrg } 6897117f1b4Smrg 6907117f1b4Smrg map1d = get_1d_map(ctx, target); 6917117f1b4Smrg map2d = get_2d_map(ctx, target); 6927117f1b4Smrg ASSERT(map1d || map2d); 6937117f1b4Smrg 6947117f1b4Smrg switch (query) { 6957117f1b4Smrg case GL_COEFF: 6967117f1b4Smrg if (map1d) { 6977117f1b4Smrg data = map1d->Points; 6987117f1b4Smrg n = map1d->Order * comps; 6997117f1b4Smrg } 7007117f1b4Smrg else { 7017117f1b4Smrg data = map2d->Points; 7027117f1b4Smrg n = map2d->Uorder * map2d->Vorder * comps; 7037117f1b4Smrg } 7047117f1b4Smrg if (data) { 7057117f1b4Smrg for (i=0;i<n;i++) { 7067117f1b4Smrg v[i] = IROUND(data[i]); 7077117f1b4Smrg } 7087117f1b4Smrg } 7097117f1b4Smrg break; 7107117f1b4Smrg case GL_ORDER: 7117117f1b4Smrg if (map1d) { 7127117f1b4Smrg v[0] = map1d->Order; 7137117f1b4Smrg } 7147117f1b4Smrg else { 7157117f1b4Smrg v[0] = map2d->Uorder; 7167117f1b4Smrg v[1] = map2d->Vorder; 7177117f1b4Smrg } 7187117f1b4Smrg break; 7197117f1b4Smrg case GL_DOMAIN: 7207117f1b4Smrg if (map1d) { 7217117f1b4Smrg v[0] = IROUND(map1d->u1); 7227117f1b4Smrg v[1] = IROUND(map1d->u2); 7237117f1b4Smrg } 7247117f1b4Smrg else { 7257117f1b4Smrg v[0] = IROUND(map2d->u1); 7267117f1b4Smrg v[1] = IROUND(map2d->u2); 7277117f1b4Smrg v[2] = IROUND(map2d->v1); 7287117f1b4Smrg v[3] = IROUND(map2d->v2); 7297117f1b4Smrg } 7307117f1b4Smrg break; 7317117f1b4Smrg default: 7327117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" ); 7337117f1b4Smrg } 7347117f1b4Smrg} 7357117f1b4Smrg 7367117f1b4Smrg 7377117f1b4Smrg 7387117f1b4Smrgvoid GLAPIENTRY 7397117f1b4Smrg_mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 ) 7407117f1b4Smrg{ 7417117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 7427117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 7437117f1b4Smrg 7447117f1b4Smrg if (un<1) { 7457117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" ); 7467117f1b4Smrg return; 7477117f1b4Smrg } 7487117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 7497117f1b4Smrg ctx->Eval.MapGrid1un = un; 7507117f1b4Smrg ctx->Eval.MapGrid1u1 = u1; 7517117f1b4Smrg ctx->Eval.MapGrid1u2 = u2; 7527117f1b4Smrg ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un; 7537117f1b4Smrg} 7547117f1b4Smrg 7557117f1b4Smrg 7567117f1b4Smrgvoid GLAPIENTRY 7577117f1b4Smrg_mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 ) 7587117f1b4Smrg{ 7597117f1b4Smrg _mesa_MapGrid1f( un, (GLfloat) u1, (GLfloat) u2 ); 7607117f1b4Smrg} 7617117f1b4Smrg 7627117f1b4Smrg 7637117f1b4Smrgvoid GLAPIENTRY 7647117f1b4Smrg_mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2, 7657117f1b4Smrg GLint vn, GLfloat v1, GLfloat v2 ) 7667117f1b4Smrg{ 7677117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 7687117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 7697117f1b4Smrg 7707117f1b4Smrg if (un<1) { 7717117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" ); 7727117f1b4Smrg return; 7737117f1b4Smrg } 7747117f1b4Smrg if (vn<1) { 7757117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" ); 7767117f1b4Smrg return; 7777117f1b4Smrg } 7787117f1b4Smrg 7797117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 7807117f1b4Smrg ctx->Eval.MapGrid2un = un; 7817117f1b4Smrg ctx->Eval.MapGrid2u1 = u1; 7827117f1b4Smrg ctx->Eval.MapGrid2u2 = u2; 7837117f1b4Smrg ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un; 7847117f1b4Smrg ctx->Eval.MapGrid2vn = vn; 7857117f1b4Smrg ctx->Eval.MapGrid2v1 = v1; 7867117f1b4Smrg ctx->Eval.MapGrid2v2 = v2; 7877117f1b4Smrg ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn; 7887117f1b4Smrg} 7897117f1b4Smrg 7907117f1b4Smrg 7917117f1b4Smrgvoid GLAPIENTRY 7927117f1b4Smrg_mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2, 7937117f1b4Smrg GLint vn, GLdouble v1, GLdouble v2 ) 7947117f1b4Smrg{ 7957117f1b4Smrg _mesa_MapGrid2f( un, (GLfloat) u1, (GLfloat) u2, 7967117f1b4Smrg vn, (GLfloat) v1, (GLfloat) v2 ); 7977117f1b4Smrg} 7987117f1b4Smrg 7997117f1b4Smrg 8007117f1b4Smrg 8017117f1b4Smrg/**********************************************************************/ 8027117f1b4Smrg/***** Initialization *****/ 8037117f1b4Smrg/**********************************************************************/ 8047117f1b4Smrg 8057117f1b4Smrg/** 8067117f1b4Smrg * Initialize a 1-D evaluator map. 8077117f1b4Smrg */ 8087117f1b4Smrgstatic void 8097117f1b4Smrginit_1d_map( struct gl_1d_map *map, int n, const float *initial ) 8107117f1b4Smrg{ 8117117f1b4Smrg map->Order = 1; 8127117f1b4Smrg map->u1 = 0.0; 8137117f1b4Smrg map->u2 = 1.0; 8147117f1b4Smrg map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat)); 8157117f1b4Smrg if (map->Points) { 8167117f1b4Smrg GLint i; 8177117f1b4Smrg for (i=0;i<n;i++) 8187117f1b4Smrg map->Points[i] = initial[i]; 8197117f1b4Smrg } 8207117f1b4Smrg} 8217117f1b4Smrg 8227117f1b4Smrg 8237117f1b4Smrg/** 8247117f1b4Smrg * Initialize a 2-D evaluator map 8257117f1b4Smrg */ 8267117f1b4Smrgstatic void 8277117f1b4Smrginit_2d_map( struct gl_2d_map *map, int n, const float *initial ) 8287117f1b4Smrg{ 8297117f1b4Smrg map->Uorder = 1; 8307117f1b4Smrg map->Vorder = 1; 8317117f1b4Smrg map->u1 = 0.0; 8327117f1b4Smrg map->u2 = 1.0; 8337117f1b4Smrg map->v1 = 0.0; 8347117f1b4Smrg map->v2 = 1.0; 8357117f1b4Smrg map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat)); 8367117f1b4Smrg if (map->Points) { 8377117f1b4Smrg GLint i; 8387117f1b4Smrg for (i=0;i<n;i++) 8397117f1b4Smrg map->Points[i] = initial[i]; 8407117f1b4Smrg } 8417117f1b4Smrg} 8427117f1b4Smrg 8437117f1b4Smrg 8447117f1b4Smrgvoid _mesa_init_eval( GLcontext *ctx ) 8457117f1b4Smrg{ 8467117f1b4Smrg int i; 8477117f1b4Smrg 8487117f1b4Smrg /* Evaluators group */ 8497117f1b4Smrg ctx->Eval.Map1Color4 = GL_FALSE; 8507117f1b4Smrg ctx->Eval.Map1Index = GL_FALSE; 8517117f1b4Smrg ctx->Eval.Map1Normal = GL_FALSE; 8527117f1b4Smrg ctx->Eval.Map1TextureCoord1 = GL_FALSE; 8537117f1b4Smrg ctx->Eval.Map1TextureCoord2 = GL_FALSE; 8547117f1b4Smrg ctx->Eval.Map1TextureCoord3 = GL_FALSE; 8557117f1b4Smrg ctx->Eval.Map1TextureCoord4 = GL_FALSE; 8567117f1b4Smrg ctx->Eval.Map1Vertex3 = GL_FALSE; 8577117f1b4Smrg ctx->Eval.Map1Vertex4 = GL_FALSE; 8587117f1b4Smrg MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib)); 8597117f1b4Smrg ctx->Eval.Map2Color4 = GL_FALSE; 8607117f1b4Smrg ctx->Eval.Map2Index = GL_FALSE; 8617117f1b4Smrg ctx->Eval.Map2Normal = GL_FALSE; 8627117f1b4Smrg ctx->Eval.Map2TextureCoord1 = GL_FALSE; 8637117f1b4Smrg ctx->Eval.Map2TextureCoord2 = GL_FALSE; 8647117f1b4Smrg ctx->Eval.Map2TextureCoord3 = GL_FALSE; 8657117f1b4Smrg ctx->Eval.Map2TextureCoord4 = GL_FALSE; 8667117f1b4Smrg ctx->Eval.Map2Vertex3 = GL_FALSE; 8677117f1b4Smrg ctx->Eval.Map2Vertex4 = GL_FALSE; 8687117f1b4Smrg MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib)); 8697117f1b4Smrg ctx->Eval.AutoNormal = GL_FALSE; 8707117f1b4Smrg ctx->Eval.MapGrid1un = 1; 8717117f1b4Smrg ctx->Eval.MapGrid1u1 = 0.0; 8727117f1b4Smrg ctx->Eval.MapGrid1u2 = 1.0; 8737117f1b4Smrg ctx->Eval.MapGrid2un = 1; 8747117f1b4Smrg ctx->Eval.MapGrid2vn = 1; 8757117f1b4Smrg ctx->Eval.MapGrid2u1 = 0.0; 8767117f1b4Smrg ctx->Eval.MapGrid2u2 = 1.0; 8777117f1b4Smrg ctx->Eval.MapGrid2v1 = 0.0; 8787117f1b4Smrg ctx->Eval.MapGrid2v2 = 1.0; 8797117f1b4Smrg 8807117f1b4Smrg /* Evaluator data */ 8817117f1b4Smrg { 8827117f1b4Smrg static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 }; 8837117f1b4Smrg static GLfloat normal[3] = { 0.0, 0.0, 1.0 }; 8847117f1b4Smrg static GLfloat index[1] = { 1.0 }; 8857117f1b4Smrg static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 }; 8867117f1b4Smrg static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 }; 8877117f1b4Smrg static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 }; 8887117f1b4Smrg 8897117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex ); 8907117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex ); 8917117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Index, 1, index ); 8927117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Color4, 4, color ); 8937117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal ); 8947117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord ); 8957117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord ); 8967117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord ); 8977117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord ); 8987117f1b4Smrg for (i = 0; i < 16; i++) 8997117f1b4Smrg init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib ); 9007117f1b4Smrg 9017117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex ); 9027117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex ); 9037117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Index, 1, index ); 9047117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Color4, 4, color ); 9057117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal ); 9067117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord ); 9077117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord ); 9087117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord ); 9097117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord ); 9107117f1b4Smrg for (i = 0; i < 16; i++) 9117117f1b4Smrg init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib ); 9127117f1b4Smrg } 9137117f1b4Smrg} 9147117f1b4Smrg 9157117f1b4Smrg 9167117f1b4Smrgvoid _mesa_free_eval_data( GLcontext *ctx ) 9177117f1b4Smrg{ 9187117f1b4Smrg int i; 9197117f1b4Smrg 9207117f1b4Smrg /* Free evaluator data */ 9217117f1b4Smrg if (ctx->EvalMap.Map1Vertex3.Points) 9227117f1b4Smrg FREE( ctx->EvalMap.Map1Vertex3.Points ); 9237117f1b4Smrg if (ctx->EvalMap.Map1Vertex4.Points) 9247117f1b4Smrg FREE( ctx->EvalMap.Map1Vertex4.Points ); 9257117f1b4Smrg if (ctx->EvalMap.Map1Index.Points) 9267117f1b4Smrg FREE( ctx->EvalMap.Map1Index.Points ); 9277117f1b4Smrg if (ctx->EvalMap.Map1Color4.Points) 9287117f1b4Smrg FREE( ctx->EvalMap.Map1Color4.Points ); 9297117f1b4Smrg if (ctx->EvalMap.Map1Normal.Points) 9307117f1b4Smrg FREE( ctx->EvalMap.Map1Normal.Points ); 9317117f1b4Smrg if (ctx->EvalMap.Map1Texture1.Points) 9327117f1b4Smrg FREE( ctx->EvalMap.Map1Texture1.Points ); 9337117f1b4Smrg if (ctx->EvalMap.Map1Texture2.Points) 9347117f1b4Smrg FREE( ctx->EvalMap.Map1Texture2.Points ); 9357117f1b4Smrg if (ctx->EvalMap.Map1Texture3.Points) 9367117f1b4Smrg FREE( ctx->EvalMap.Map1Texture3.Points ); 9377117f1b4Smrg if (ctx->EvalMap.Map1Texture4.Points) 9387117f1b4Smrg FREE( ctx->EvalMap.Map1Texture4.Points ); 9397117f1b4Smrg for (i = 0; i < 16; i++) 9407117f1b4Smrg FREE((ctx->EvalMap.Map1Attrib[i].Points)); 9417117f1b4Smrg 9427117f1b4Smrg if (ctx->EvalMap.Map2Vertex3.Points) 9437117f1b4Smrg FREE( ctx->EvalMap.Map2Vertex3.Points ); 9447117f1b4Smrg if (ctx->EvalMap.Map2Vertex4.Points) 9457117f1b4Smrg FREE( ctx->EvalMap.Map2Vertex4.Points ); 9467117f1b4Smrg if (ctx->EvalMap.Map2Index.Points) 9477117f1b4Smrg FREE( ctx->EvalMap.Map2Index.Points ); 9487117f1b4Smrg if (ctx->EvalMap.Map2Color4.Points) 9497117f1b4Smrg FREE( ctx->EvalMap.Map2Color4.Points ); 9507117f1b4Smrg if (ctx->EvalMap.Map2Normal.Points) 9517117f1b4Smrg FREE( ctx->EvalMap.Map2Normal.Points ); 9527117f1b4Smrg if (ctx->EvalMap.Map2Texture1.Points) 9537117f1b4Smrg FREE( ctx->EvalMap.Map2Texture1.Points ); 9547117f1b4Smrg if (ctx->EvalMap.Map2Texture2.Points) 9557117f1b4Smrg FREE( ctx->EvalMap.Map2Texture2.Points ); 9567117f1b4Smrg if (ctx->EvalMap.Map2Texture3.Points) 9577117f1b4Smrg FREE( ctx->EvalMap.Map2Texture3.Points ); 9587117f1b4Smrg if (ctx->EvalMap.Map2Texture4.Points) 9597117f1b4Smrg FREE( ctx->EvalMap.Map2Texture4.Points ); 9607117f1b4Smrg for (i = 0; i < 16; i++) 9617117f1b4Smrg FREE((ctx->EvalMap.Map2Attrib[i].Points)); 9627117f1b4Smrg} 963