eval.c revision 4a49301e
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" 474a49301eSmrg#include "glapi/dispatch.h" 484a49301eSmrg 494a49301eSmrg 504a49301eSmrg#if FEATURE_evaluators 517117f1b4Smrg 527117f1b4Smrg 537117f1b4Smrg/* 547117f1b4Smrg * Return the number of components per control point for any type of 557117f1b4Smrg * evaluator. Return 0 if bad target. 567117f1b4Smrg * See table 5.1 in the OpenGL 1.2 spec. 577117f1b4Smrg */ 587117f1b4SmrgGLuint _mesa_evaluator_components( GLenum target ) 597117f1b4Smrg{ 607117f1b4Smrg switch (target) { 617117f1b4Smrg case GL_MAP1_VERTEX_3: return 3; 627117f1b4Smrg case GL_MAP1_VERTEX_4: return 4; 637117f1b4Smrg case GL_MAP1_INDEX: return 1; 647117f1b4Smrg case GL_MAP1_COLOR_4: return 4; 657117f1b4Smrg case GL_MAP1_NORMAL: return 3; 667117f1b4Smrg case GL_MAP1_TEXTURE_COORD_1: return 1; 677117f1b4Smrg case GL_MAP1_TEXTURE_COORD_2: return 2; 687117f1b4Smrg case GL_MAP1_TEXTURE_COORD_3: return 3; 697117f1b4Smrg case GL_MAP1_TEXTURE_COORD_4: return 4; 707117f1b4Smrg case GL_MAP2_VERTEX_3: return 3; 717117f1b4Smrg case GL_MAP2_VERTEX_4: return 4; 727117f1b4Smrg case GL_MAP2_INDEX: return 1; 737117f1b4Smrg case GL_MAP2_COLOR_4: return 4; 747117f1b4Smrg case GL_MAP2_NORMAL: return 3; 757117f1b4Smrg case GL_MAP2_TEXTURE_COORD_1: return 1; 767117f1b4Smrg case GL_MAP2_TEXTURE_COORD_2: return 2; 777117f1b4Smrg case GL_MAP2_TEXTURE_COORD_3: return 3; 787117f1b4Smrg case GL_MAP2_TEXTURE_COORD_4: return 4; 797117f1b4Smrg default: break; 807117f1b4Smrg } 817117f1b4Smrg 827117f1b4Smrg /* XXX need to check for the vertex program extension 837117f1b4Smrg if (!ctx->Extensions.NV_vertex_program) 847117f1b4Smrg return 0; 857117f1b4Smrg */ 867117f1b4Smrg 877117f1b4Smrg if (target >= GL_MAP1_VERTEX_ATTRIB0_4_NV && 887117f1b4Smrg target <= GL_MAP1_VERTEX_ATTRIB15_4_NV) 897117f1b4Smrg return 4; 907117f1b4Smrg 917117f1b4Smrg if (target >= GL_MAP2_VERTEX_ATTRIB0_4_NV && 927117f1b4Smrg target <= GL_MAP2_VERTEX_ATTRIB15_4_NV) 937117f1b4Smrg return 4; 947117f1b4Smrg 957117f1b4Smrg return 0; 967117f1b4Smrg} 977117f1b4Smrg 987117f1b4Smrg 997117f1b4Smrg/* 1007117f1b4Smrg * Return pointer to the gl_1d_map struct for the named target. 1017117f1b4Smrg */ 1027117f1b4Smrgstatic struct gl_1d_map * 1037117f1b4Smrgget_1d_map( GLcontext *ctx, GLenum target ) 1047117f1b4Smrg{ 1057117f1b4Smrg switch (target) { 1067117f1b4Smrg case GL_MAP1_VERTEX_3: 1077117f1b4Smrg return &ctx->EvalMap.Map1Vertex3; 1087117f1b4Smrg case GL_MAP1_VERTEX_4: 1097117f1b4Smrg return &ctx->EvalMap.Map1Vertex4; 1107117f1b4Smrg case GL_MAP1_INDEX: 1117117f1b4Smrg return &ctx->EvalMap.Map1Index; 1127117f1b4Smrg case GL_MAP1_COLOR_4: 1137117f1b4Smrg return &ctx->EvalMap.Map1Color4; 1147117f1b4Smrg case GL_MAP1_NORMAL: 1157117f1b4Smrg return &ctx->EvalMap.Map1Normal; 1167117f1b4Smrg case GL_MAP1_TEXTURE_COORD_1: 1177117f1b4Smrg return &ctx->EvalMap.Map1Texture1; 1187117f1b4Smrg case GL_MAP1_TEXTURE_COORD_2: 1197117f1b4Smrg return &ctx->EvalMap.Map1Texture2; 1207117f1b4Smrg case GL_MAP1_TEXTURE_COORD_3: 1217117f1b4Smrg return &ctx->EvalMap.Map1Texture3; 1227117f1b4Smrg case GL_MAP1_TEXTURE_COORD_4: 1237117f1b4Smrg return &ctx->EvalMap.Map1Texture4; 1247117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB0_4_NV: 1257117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB1_4_NV: 1267117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB2_4_NV: 1277117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB3_4_NV: 1287117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB4_4_NV: 1297117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB5_4_NV: 1307117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB6_4_NV: 1317117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB7_4_NV: 1327117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB8_4_NV: 1337117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB9_4_NV: 1347117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB10_4_NV: 1357117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB11_4_NV: 1367117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB12_4_NV: 1377117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB13_4_NV: 1387117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB14_4_NV: 1397117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB15_4_NV: 1407117f1b4Smrg if (!ctx->Extensions.NV_vertex_program) 1417117f1b4Smrg return NULL; 1427117f1b4Smrg return &ctx->EvalMap.Map1Attrib[target - GL_MAP1_VERTEX_ATTRIB0_4_NV]; 1437117f1b4Smrg default: 1447117f1b4Smrg return NULL; 1457117f1b4Smrg } 1467117f1b4Smrg} 1477117f1b4Smrg 1487117f1b4Smrg 1497117f1b4Smrg/* 1507117f1b4Smrg * Return pointer to the gl_2d_map struct for the named target. 1517117f1b4Smrg */ 1527117f1b4Smrgstatic struct gl_2d_map * 1537117f1b4Smrgget_2d_map( GLcontext *ctx, GLenum target ) 1547117f1b4Smrg{ 1557117f1b4Smrg switch (target) { 1567117f1b4Smrg case GL_MAP2_VERTEX_3: 1577117f1b4Smrg return &ctx->EvalMap.Map2Vertex3; 1587117f1b4Smrg case GL_MAP2_VERTEX_4: 1597117f1b4Smrg return &ctx->EvalMap.Map2Vertex4; 1607117f1b4Smrg case GL_MAP2_INDEX: 1617117f1b4Smrg return &ctx->EvalMap.Map2Index; 1627117f1b4Smrg case GL_MAP2_COLOR_4: 1637117f1b4Smrg return &ctx->EvalMap.Map2Color4; 1647117f1b4Smrg case GL_MAP2_NORMAL: 1657117f1b4Smrg return &ctx->EvalMap.Map2Normal; 1667117f1b4Smrg case GL_MAP2_TEXTURE_COORD_1: 1677117f1b4Smrg return &ctx->EvalMap.Map2Texture1; 1687117f1b4Smrg case GL_MAP2_TEXTURE_COORD_2: 1697117f1b4Smrg return &ctx->EvalMap.Map2Texture2; 1707117f1b4Smrg case GL_MAP2_TEXTURE_COORD_3: 1717117f1b4Smrg return &ctx->EvalMap.Map2Texture3; 1727117f1b4Smrg case GL_MAP2_TEXTURE_COORD_4: 1737117f1b4Smrg return &ctx->EvalMap.Map2Texture4; 1747117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB0_4_NV: 1757117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB1_4_NV: 1767117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB2_4_NV: 1777117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB3_4_NV: 1787117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB4_4_NV: 1797117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB5_4_NV: 1807117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB6_4_NV: 1817117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB7_4_NV: 1827117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB8_4_NV: 1837117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB9_4_NV: 1847117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB10_4_NV: 1857117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB11_4_NV: 1867117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB12_4_NV: 1877117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB13_4_NV: 1887117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB14_4_NV: 1897117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB15_4_NV: 1907117f1b4Smrg if (!ctx->Extensions.NV_vertex_program) 1917117f1b4Smrg return NULL; 1927117f1b4Smrg return &ctx->EvalMap.Map2Attrib[target - GL_MAP2_VERTEX_ATTRIB0_4_NV]; 1937117f1b4Smrg default: 1947117f1b4Smrg return NULL; 1957117f1b4Smrg } 1967117f1b4Smrg} 1977117f1b4Smrg 1987117f1b4Smrg 1997117f1b4Smrg/**********************************************************************/ 2007117f1b4Smrg/*** Copy and deallocate control points ***/ 2017117f1b4Smrg/**********************************************************************/ 2027117f1b4Smrg 2037117f1b4Smrg 2047117f1b4Smrg/* 2057117f1b4Smrg * Copy 1-parametric evaluator control points from user-specified 2067117f1b4Smrg * memory space to a buffer of contiguous control points. 2077117f1b4Smrg * \param see glMap1f for details 2087117f1b4Smrg * \return pointer to buffer of contiguous control points or NULL if out 2097117f1b4Smrg * of memory. 2107117f1b4Smrg */ 2117117f1b4SmrgGLfloat *_mesa_copy_map_points1f( GLenum target, GLint ustride, GLint uorder, 2127117f1b4Smrg const GLfloat *points ) 2137117f1b4Smrg{ 2147117f1b4Smrg GLfloat *buffer, *p; 2157117f1b4Smrg GLint i, k, size = _mesa_evaluator_components(target); 2167117f1b4Smrg 2177117f1b4Smrg if (!points || !size) 2187117f1b4Smrg return NULL; 2197117f1b4Smrg 2207117f1b4Smrg buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat)); 2217117f1b4Smrg 2227117f1b4Smrg if (buffer) 2237117f1b4Smrg for (i = 0, p = buffer; i < uorder; i++, points += ustride) 2247117f1b4Smrg for (k = 0; k < size; k++) 2257117f1b4Smrg *p++ = points[k]; 2267117f1b4Smrg 2277117f1b4Smrg return buffer; 2287117f1b4Smrg} 2297117f1b4Smrg 2307117f1b4Smrg 2317117f1b4Smrg 2327117f1b4Smrg/* 2337117f1b4Smrg * Same as above but convert doubles to floats. 2347117f1b4Smrg */ 2357117f1b4SmrgGLfloat *_mesa_copy_map_points1d( GLenum target, GLint ustride, GLint uorder, 2367117f1b4Smrg const GLdouble *points ) 2377117f1b4Smrg{ 2387117f1b4Smrg GLfloat *buffer, *p; 2397117f1b4Smrg GLint i, k, size = _mesa_evaluator_components(target); 2407117f1b4Smrg 2417117f1b4Smrg if (!points || !size) 2427117f1b4Smrg return NULL; 2437117f1b4Smrg 2447117f1b4Smrg buffer = (GLfloat *) MALLOC(uorder * size * sizeof(GLfloat)); 2457117f1b4Smrg 2467117f1b4Smrg if (buffer) 2477117f1b4Smrg for (i = 0, p = buffer; i < uorder; i++, points += ustride) 2487117f1b4Smrg for (k = 0; k < size; k++) 2497117f1b4Smrg *p++ = (GLfloat) points[k]; 2507117f1b4Smrg 2517117f1b4Smrg return buffer; 2527117f1b4Smrg} 2537117f1b4Smrg 2547117f1b4Smrg 2557117f1b4Smrg 2567117f1b4Smrg/* 2577117f1b4Smrg * Copy 2-parametric evaluator control points from user-specified 2587117f1b4Smrg * memory space to a buffer of contiguous control points. 2597117f1b4Smrg * Additional memory is allocated to be used by the horner and 2607117f1b4Smrg * de Casteljau evaluation schemes. 2617117f1b4Smrg * 2627117f1b4Smrg * \param see glMap2f for details 2637117f1b4Smrg * \return pointer to buffer of contiguous control points or NULL if out 2647117f1b4Smrg * of memory. 2657117f1b4Smrg */ 2667117f1b4SmrgGLfloat *_mesa_copy_map_points2f( GLenum target, 2677117f1b4Smrg GLint ustride, GLint uorder, 2687117f1b4Smrg GLint vstride, GLint vorder, 2697117f1b4Smrg const GLfloat *points ) 2707117f1b4Smrg{ 2717117f1b4Smrg GLfloat *buffer, *p; 2727117f1b4Smrg GLint i, j, k, size, dsize, hsize; 2737117f1b4Smrg GLint uinc; 2747117f1b4Smrg 2757117f1b4Smrg size = _mesa_evaluator_components(target); 2767117f1b4Smrg 2777117f1b4Smrg if (!points || size==0) { 2787117f1b4Smrg return NULL; 2797117f1b4Smrg } 2807117f1b4Smrg 2817117f1b4Smrg /* max(uorder, vorder) additional points are used in */ 2827117f1b4Smrg /* horner evaluation and uorder*vorder additional */ 2837117f1b4Smrg /* values are needed for de Casteljau */ 2847117f1b4Smrg dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder; 2857117f1b4Smrg hsize = (uorder > vorder ? uorder : vorder)*size; 2867117f1b4Smrg 2877117f1b4Smrg if(hsize>dsize) 2887117f1b4Smrg buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat)); 2897117f1b4Smrg else 2907117f1b4Smrg buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat)); 2917117f1b4Smrg 2927117f1b4Smrg /* compute the increment value for the u-loop */ 2937117f1b4Smrg uinc = ustride - vorder*vstride; 2947117f1b4Smrg 2957117f1b4Smrg if (buffer) 2967117f1b4Smrg for (i=0, p=buffer; i<uorder; i++, points += uinc) 2977117f1b4Smrg for (j=0; j<vorder; j++, points += vstride) 2987117f1b4Smrg for (k=0; k<size; k++) 2997117f1b4Smrg *p++ = points[k]; 3007117f1b4Smrg 3017117f1b4Smrg return buffer; 3027117f1b4Smrg} 3037117f1b4Smrg 3047117f1b4Smrg 3057117f1b4Smrg 3067117f1b4Smrg/* 3077117f1b4Smrg * Same as above but convert doubles to floats. 3087117f1b4Smrg */ 3097117f1b4SmrgGLfloat *_mesa_copy_map_points2d(GLenum target, 3107117f1b4Smrg GLint ustride, GLint uorder, 3117117f1b4Smrg GLint vstride, GLint vorder, 3127117f1b4Smrg const GLdouble *points ) 3137117f1b4Smrg{ 3147117f1b4Smrg GLfloat *buffer, *p; 3157117f1b4Smrg GLint i, j, k, size, hsize, dsize; 3167117f1b4Smrg GLint uinc; 3177117f1b4Smrg 3187117f1b4Smrg size = _mesa_evaluator_components(target); 3197117f1b4Smrg 3207117f1b4Smrg if (!points || size==0) { 3217117f1b4Smrg return NULL; 3227117f1b4Smrg } 3237117f1b4Smrg 3247117f1b4Smrg /* max(uorder, vorder) additional points are used in */ 3257117f1b4Smrg /* horner evaluation and uorder*vorder additional */ 3267117f1b4Smrg /* values are needed for de Casteljau */ 3277117f1b4Smrg dsize = (uorder == 2 && vorder == 2)? 0 : uorder*vorder; 3287117f1b4Smrg hsize = (uorder > vorder ? uorder : vorder)*size; 3297117f1b4Smrg 3307117f1b4Smrg if(hsize>dsize) 3317117f1b4Smrg buffer = (GLfloat *) MALLOC((uorder*vorder*size+hsize)*sizeof(GLfloat)); 3327117f1b4Smrg else 3337117f1b4Smrg buffer = (GLfloat *) MALLOC((uorder*vorder*size+dsize)*sizeof(GLfloat)); 3347117f1b4Smrg 3357117f1b4Smrg /* compute the increment value for the u-loop */ 3367117f1b4Smrg uinc = ustride - vorder*vstride; 3377117f1b4Smrg 3387117f1b4Smrg if (buffer) 3397117f1b4Smrg for (i=0, p=buffer; i<uorder; i++, points += uinc) 3407117f1b4Smrg for (j=0; j<vorder; j++, points += vstride) 3417117f1b4Smrg for (k=0; k<size; k++) 3427117f1b4Smrg *p++ = (GLfloat) points[k]; 3437117f1b4Smrg 3447117f1b4Smrg return buffer; 3457117f1b4Smrg} 3467117f1b4Smrg 3477117f1b4Smrg 3487117f1b4Smrg 3497117f1b4Smrg 3507117f1b4Smrg/**********************************************************************/ 3517117f1b4Smrg/*** API entry points ***/ 3527117f1b4Smrg/**********************************************************************/ 3537117f1b4Smrg 3547117f1b4Smrg 3557117f1b4Smrg/* 3567117f1b4Smrg * This does the work of glMap1[fd]. 3577117f1b4Smrg */ 3587117f1b4Smrgstatic void 3597117f1b4Smrgmap1(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, 3607117f1b4Smrg GLint uorder, const GLvoid *points, GLenum type ) 3617117f1b4Smrg{ 3627117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 3637117f1b4Smrg GLint k; 3647117f1b4Smrg GLfloat *pnts; 3657117f1b4Smrg struct gl_1d_map *map = NULL; 3667117f1b4Smrg 3677117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 3687117f1b4Smrg ASSERT(type == GL_FLOAT || type == GL_DOUBLE); 3697117f1b4Smrg 3707117f1b4Smrg if (u1 == u2) { 3717117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(u1,u2)" ); 3727117f1b4Smrg return; 3737117f1b4Smrg } 3747117f1b4Smrg if (uorder < 1 || uorder > MAX_EVAL_ORDER) { 3757117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(order)" ); 3767117f1b4Smrg return; 3777117f1b4Smrg } 3787117f1b4Smrg if (!points) { 3797117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(points)" ); 3807117f1b4Smrg return; 3817117f1b4Smrg } 3827117f1b4Smrg 3837117f1b4Smrg k = _mesa_evaluator_components( target ); 3847117f1b4Smrg if (k == 0) { 3857117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" ); 3867117f1b4Smrg } 3877117f1b4Smrg 3887117f1b4Smrg if (ustride < k) { 3897117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap1(stride)" ); 3907117f1b4Smrg return; 3917117f1b4Smrg } 3927117f1b4Smrg 3937117f1b4Smrg if (ctx->Texture.CurrentUnit != 0) { 3947117f1b4Smrg /* See OpenGL 1.2.1 spec, section F.2.13 */ 3957117f1b4Smrg _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" ); 3967117f1b4Smrg return; 3977117f1b4Smrg } 3987117f1b4Smrg 3997117f1b4Smrg map = get_1d_map(ctx, target); 4007117f1b4Smrg if (!map) { 4017117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap1(target)" ); 4027117f1b4Smrg return; 4037117f1b4Smrg } 4047117f1b4Smrg 4057117f1b4Smrg /* make copy of the control points */ 4067117f1b4Smrg if (type == GL_FLOAT) 4077117f1b4Smrg pnts = _mesa_copy_map_points1f(target, ustride, uorder, (GLfloat*) points); 4087117f1b4Smrg else 4097117f1b4Smrg pnts = _mesa_copy_map_points1d(target, ustride, uorder, (GLdouble*) points); 4107117f1b4Smrg 4117117f1b4Smrg 4127117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4137117f1b4Smrg map->Order = uorder; 4147117f1b4Smrg map->u1 = u1; 4157117f1b4Smrg map->u2 = u2; 4167117f1b4Smrg map->du = 1.0F / (u2 - u1); 4177117f1b4Smrg if (map->Points) 4187117f1b4Smrg FREE( map->Points ); 4197117f1b4Smrg map->Points = pnts; 4207117f1b4Smrg} 4217117f1b4Smrg 4227117f1b4Smrg 4237117f1b4Smrg 4244a49301eSmrgstatic void GLAPIENTRY 4257117f1b4Smrg_mesa_Map1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, 4267117f1b4Smrg GLint order, const GLfloat *points ) 4277117f1b4Smrg{ 4287117f1b4Smrg map1(target, u1, u2, stride, order, points, GL_FLOAT); 4297117f1b4Smrg} 4307117f1b4Smrg 4317117f1b4Smrg 4324a49301eSmrgstatic void GLAPIENTRY 4337117f1b4Smrg_mesa_Map1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride, 4347117f1b4Smrg GLint order, const GLdouble *points ) 4357117f1b4Smrg{ 4367117f1b4Smrg map1(target, (GLfloat) u1, (GLfloat) u2, stride, order, points, GL_DOUBLE); 4377117f1b4Smrg} 4387117f1b4Smrg 4397117f1b4Smrg 4407117f1b4Smrgstatic void 4417117f1b4Smrgmap2( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, 4427117f1b4Smrg GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, 4437117f1b4Smrg const GLvoid *points, GLenum type ) 4447117f1b4Smrg{ 4457117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 4467117f1b4Smrg GLint k; 4477117f1b4Smrg GLfloat *pnts; 4487117f1b4Smrg struct gl_2d_map *map = NULL; 4497117f1b4Smrg 4507117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 4517117f1b4Smrg ASSERT(type == GL_FLOAT || type == GL_DOUBLE); 4527117f1b4Smrg 4537117f1b4Smrg if (u1==u2) { 4547117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(u1,u2)" ); 4557117f1b4Smrg return; 4567117f1b4Smrg } 4577117f1b4Smrg 4587117f1b4Smrg if (v1==v2) { 4597117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(v1,v2)" ); 4607117f1b4Smrg return; 4617117f1b4Smrg } 4627117f1b4Smrg 4637117f1b4Smrg if (uorder<1 || uorder>MAX_EVAL_ORDER) { 4647117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(uorder)" ); 4657117f1b4Smrg return; 4667117f1b4Smrg } 4677117f1b4Smrg 4687117f1b4Smrg if (vorder<1 || vorder>MAX_EVAL_ORDER) { 4697117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vorder)" ); 4707117f1b4Smrg return; 4717117f1b4Smrg } 4727117f1b4Smrg 4737117f1b4Smrg k = _mesa_evaluator_components( target ); 4747117f1b4Smrg if (k==0) { 4757117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" ); 4767117f1b4Smrg } 4777117f1b4Smrg 4787117f1b4Smrg if (ustride < k) { 4797117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(ustride)" ); 4807117f1b4Smrg return; 4817117f1b4Smrg } 4827117f1b4Smrg if (vstride < k) { 4837117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMap2(vstride)" ); 4847117f1b4Smrg return; 4857117f1b4Smrg } 4867117f1b4Smrg 4877117f1b4Smrg if (ctx->Texture.CurrentUnit != 0) { 4887117f1b4Smrg /* See OpenGL 1.2.1 spec, section F.2.13 */ 4897117f1b4Smrg _mesa_error( ctx, GL_INVALID_OPERATION, "glMap2(ACTIVE_TEXTURE != 0)" ); 4907117f1b4Smrg return; 4917117f1b4Smrg } 4927117f1b4Smrg 4937117f1b4Smrg map = get_2d_map(ctx, target); 4947117f1b4Smrg if (!map) { 4957117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glMap2(target)" ); 4967117f1b4Smrg return; 4977117f1b4Smrg } 4987117f1b4Smrg 4997117f1b4Smrg /* make copy of the control points */ 5007117f1b4Smrg if (type == GL_FLOAT) 5017117f1b4Smrg pnts = _mesa_copy_map_points2f(target, ustride, uorder, 5027117f1b4Smrg vstride, vorder, (GLfloat*) points); 5037117f1b4Smrg else 5047117f1b4Smrg pnts = _mesa_copy_map_points2d(target, ustride, uorder, 5057117f1b4Smrg vstride, vorder, (GLdouble*) points); 5067117f1b4Smrg 5077117f1b4Smrg 5087117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 5097117f1b4Smrg map->Uorder = uorder; 5107117f1b4Smrg map->u1 = u1; 5117117f1b4Smrg map->u2 = u2; 5127117f1b4Smrg map->du = 1.0F / (u2 - u1); 5137117f1b4Smrg map->Vorder = vorder; 5147117f1b4Smrg map->v1 = v1; 5157117f1b4Smrg map->v2 = v2; 5167117f1b4Smrg map->dv = 1.0F / (v2 - v1); 5177117f1b4Smrg if (map->Points) 5187117f1b4Smrg FREE( map->Points ); 5197117f1b4Smrg map->Points = pnts; 5207117f1b4Smrg} 5217117f1b4Smrg 5227117f1b4Smrg 5234a49301eSmrgstatic void GLAPIENTRY 5247117f1b4Smrg_mesa_Map2f( GLenum target, 5257117f1b4Smrg GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, 5267117f1b4Smrg GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, 5277117f1b4Smrg const GLfloat *points) 5287117f1b4Smrg{ 5297117f1b4Smrg map2(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, 5307117f1b4Smrg points, GL_FLOAT); 5317117f1b4Smrg} 5327117f1b4Smrg 5337117f1b4Smrg 5344a49301eSmrgstatic void GLAPIENTRY 5357117f1b4Smrg_mesa_Map2d( GLenum target, 5367117f1b4Smrg GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, 5377117f1b4Smrg GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, 5387117f1b4Smrg const GLdouble *points ) 5397117f1b4Smrg{ 5407117f1b4Smrg map2(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder, 5417117f1b4Smrg (GLfloat) v1, (GLfloat) v2, vstride, vorder, points, GL_DOUBLE); 5427117f1b4Smrg} 5437117f1b4Smrg 5447117f1b4Smrg 5457117f1b4Smrg 5464a49301eSmrgstatic void GLAPIENTRY 5477117f1b4Smrg_mesa_GetMapdv( GLenum target, GLenum query, GLdouble *v ) 5487117f1b4Smrg{ 5497117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 5507117f1b4Smrg struct gl_1d_map *map1d; 5517117f1b4Smrg struct gl_2d_map *map2d; 5527117f1b4Smrg GLint i, n; 5537117f1b4Smrg GLfloat *data; 5547117f1b4Smrg GLuint comps; 5557117f1b4Smrg 5567117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 5577117f1b4Smrg 5587117f1b4Smrg comps = _mesa_evaluator_components(target); 5597117f1b4Smrg if (!comps) { 5607117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(target)" ); 5617117f1b4Smrg return; 5627117f1b4Smrg } 5637117f1b4Smrg 5647117f1b4Smrg map1d = get_1d_map(ctx, target); 5657117f1b4Smrg map2d = get_2d_map(ctx, target); 5667117f1b4Smrg ASSERT(map1d || map2d); 5677117f1b4Smrg 5687117f1b4Smrg switch (query) { 5697117f1b4Smrg case GL_COEFF: 5707117f1b4Smrg if (map1d) { 5717117f1b4Smrg data = map1d->Points; 5727117f1b4Smrg n = map1d->Order * comps; 5737117f1b4Smrg } 5747117f1b4Smrg else { 5757117f1b4Smrg data = map2d->Points; 5767117f1b4Smrg n = map2d->Uorder * map2d->Vorder * comps; 5777117f1b4Smrg } 5787117f1b4Smrg if (data) { 5797117f1b4Smrg for (i=0;i<n;i++) { 5807117f1b4Smrg v[i] = data[i]; 5817117f1b4Smrg } 5827117f1b4Smrg } 5837117f1b4Smrg break; 5847117f1b4Smrg case GL_ORDER: 5857117f1b4Smrg if (map1d) { 5867117f1b4Smrg v[0] = (GLdouble) map1d->Order; 5877117f1b4Smrg } 5887117f1b4Smrg else { 5897117f1b4Smrg v[0] = (GLdouble) map2d->Uorder; 5907117f1b4Smrg v[1] = (GLdouble) map2d->Vorder; 5917117f1b4Smrg } 5927117f1b4Smrg break; 5937117f1b4Smrg case GL_DOMAIN: 5947117f1b4Smrg if (map1d) { 5957117f1b4Smrg v[0] = (GLdouble) map1d->u1; 5967117f1b4Smrg v[1] = (GLdouble) map1d->u2; 5977117f1b4Smrg } 5987117f1b4Smrg else { 5997117f1b4Smrg v[0] = (GLdouble) map2d->u1; 6007117f1b4Smrg v[1] = (GLdouble) map2d->u2; 6017117f1b4Smrg v[2] = (GLdouble) map2d->v1; 6027117f1b4Smrg v[3] = (GLdouble) map2d->v2; 6037117f1b4Smrg } 6047117f1b4Smrg break; 6057117f1b4Smrg default: 6067117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapdv(query)" ); 6077117f1b4Smrg } 6087117f1b4Smrg} 6097117f1b4Smrg 6107117f1b4Smrg 6114a49301eSmrgstatic void GLAPIENTRY 6127117f1b4Smrg_mesa_GetMapfv( GLenum target, GLenum query, GLfloat *v ) 6137117f1b4Smrg{ 6147117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 6157117f1b4Smrg struct gl_1d_map *map1d; 6167117f1b4Smrg struct gl_2d_map *map2d; 6177117f1b4Smrg GLint i, n; 6187117f1b4Smrg GLfloat *data; 6197117f1b4Smrg GLuint comps; 6207117f1b4Smrg 6217117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 6227117f1b4Smrg 6237117f1b4Smrg comps = _mesa_evaluator_components(target); 6247117f1b4Smrg if (!comps) { 6257117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(target)" ); 6267117f1b4Smrg return; 6277117f1b4Smrg } 6287117f1b4Smrg 6297117f1b4Smrg map1d = get_1d_map(ctx, target); 6307117f1b4Smrg map2d = get_2d_map(ctx, target); 6317117f1b4Smrg ASSERT(map1d || map2d); 6327117f1b4Smrg 6337117f1b4Smrg switch (query) { 6347117f1b4Smrg case GL_COEFF: 6357117f1b4Smrg if (map1d) { 6367117f1b4Smrg data = map1d->Points; 6377117f1b4Smrg n = map1d->Order * comps; 6387117f1b4Smrg } 6397117f1b4Smrg else { 6407117f1b4Smrg data = map2d->Points; 6417117f1b4Smrg n = map2d->Uorder * map2d->Vorder * comps; 6427117f1b4Smrg } 6437117f1b4Smrg if (data) { 6447117f1b4Smrg for (i=0;i<n;i++) { 6457117f1b4Smrg v[i] = data[i]; 6467117f1b4Smrg } 6477117f1b4Smrg } 6487117f1b4Smrg break; 6497117f1b4Smrg case GL_ORDER: 6507117f1b4Smrg if (map1d) { 6517117f1b4Smrg v[0] = (GLfloat) map1d->Order; 6527117f1b4Smrg } 6537117f1b4Smrg else { 6547117f1b4Smrg v[0] = (GLfloat) map2d->Uorder; 6557117f1b4Smrg v[1] = (GLfloat) map2d->Vorder; 6567117f1b4Smrg } 6577117f1b4Smrg break; 6587117f1b4Smrg case GL_DOMAIN: 6597117f1b4Smrg if (map1d) { 6607117f1b4Smrg v[0] = map1d->u1; 6617117f1b4Smrg v[1] = map1d->u2; 6627117f1b4Smrg } 6637117f1b4Smrg else { 6647117f1b4Smrg v[0] = map2d->u1; 6657117f1b4Smrg v[1] = map2d->u2; 6667117f1b4Smrg v[2] = map2d->v1; 6677117f1b4Smrg v[3] = map2d->v2; 6687117f1b4Smrg } 6697117f1b4Smrg break; 6707117f1b4Smrg default: 6717117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapfv(query)" ); 6727117f1b4Smrg } 6737117f1b4Smrg} 6747117f1b4Smrg 6757117f1b4Smrg 6764a49301eSmrgstatic void GLAPIENTRY 6777117f1b4Smrg_mesa_GetMapiv( GLenum target, GLenum query, GLint *v ) 6787117f1b4Smrg{ 6797117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 6807117f1b4Smrg struct gl_1d_map *map1d; 6817117f1b4Smrg struct gl_2d_map *map2d; 6827117f1b4Smrg GLuint i, n; 6837117f1b4Smrg GLfloat *data; 6847117f1b4Smrg GLuint comps; 6857117f1b4Smrg 6867117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 6877117f1b4Smrg 6887117f1b4Smrg comps = _mesa_evaluator_components(target); 6897117f1b4Smrg if (!comps) { 6907117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(target)" ); 6917117f1b4Smrg return; 6927117f1b4Smrg } 6937117f1b4Smrg 6947117f1b4Smrg map1d = get_1d_map(ctx, target); 6957117f1b4Smrg map2d = get_2d_map(ctx, target); 6967117f1b4Smrg ASSERT(map1d || map2d); 6977117f1b4Smrg 6987117f1b4Smrg switch (query) { 6997117f1b4Smrg case GL_COEFF: 7007117f1b4Smrg if (map1d) { 7017117f1b4Smrg data = map1d->Points; 7027117f1b4Smrg n = map1d->Order * comps; 7037117f1b4Smrg } 7047117f1b4Smrg else { 7057117f1b4Smrg data = map2d->Points; 7067117f1b4Smrg n = map2d->Uorder * map2d->Vorder * comps; 7077117f1b4Smrg } 7087117f1b4Smrg if (data) { 7097117f1b4Smrg for (i=0;i<n;i++) { 7107117f1b4Smrg v[i] = IROUND(data[i]); 7117117f1b4Smrg } 7127117f1b4Smrg } 7137117f1b4Smrg break; 7147117f1b4Smrg case GL_ORDER: 7157117f1b4Smrg if (map1d) { 7167117f1b4Smrg v[0] = map1d->Order; 7177117f1b4Smrg } 7187117f1b4Smrg else { 7197117f1b4Smrg v[0] = map2d->Uorder; 7207117f1b4Smrg v[1] = map2d->Vorder; 7217117f1b4Smrg } 7227117f1b4Smrg break; 7237117f1b4Smrg case GL_DOMAIN: 7247117f1b4Smrg if (map1d) { 7257117f1b4Smrg v[0] = IROUND(map1d->u1); 7267117f1b4Smrg v[1] = IROUND(map1d->u2); 7277117f1b4Smrg } 7287117f1b4Smrg else { 7297117f1b4Smrg v[0] = IROUND(map2d->u1); 7307117f1b4Smrg v[1] = IROUND(map2d->u2); 7317117f1b4Smrg v[2] = IROUND(map2d->v1); 7327117f1b4Smrg v[3] = IROUND(map2d->v2); 7337117f1b4Smrg } 7347117f1b4Smrg break; 7357117f1b4Smrg default: 7367117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glGetMapiv(query)" ); 7377117f1b4Smrg } 7387117f1b4Smrg} 7397117f1b4Smrg 7407117f1b4Smrg 7417117f1b4Smrg 7424a49301eSmrgstatic void GLAPIENTRY 7437117f1b4Smrg_mesa_MapGrid1f( GLint un, GLfloat u1, GLfloat u2 ) 7447117f1b4Smrg{ 7457117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 7467117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 7477117f1b4Smrg 7487117f1b4Smrg if (un<1) { 7497117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid1f" ); 7507117f1b4Smrg return; 7517117f1b4Smrg } 7527117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 7537117f1b4Smrg ctx->Eval.MapGrid1un = un; 7547117f1b4Smrg ctx->Eval.MapGrid1u1 = u1; 7557117f1b4Smrg ctx->Eval.MapGrid1u2 = u2; 7567117f1b4Smrg ctx->Eval.MapGrid1du = (u2 - u1) / (GLfloat) un; 7577117f1b4Smrg} 7587117f1b4Smrg 7597117f1b4Smrg 7604a49301eSmrgstatic void GLAPIENTRY 7617117f1b4Smrg_mesa_MapGrid1d( GLint un, GLdouble u1, GLdouble u2 ) 7627117f1b4Smrg{ 7637117f1b4Smrg _mesa_MapGrid1f( un, (GLfloat) u1, (GLfloat) u2 ); 7647117f1b4Smrg} 7657117f1b4Smrg 7667117f1b4Smrg 7674a49301eSmrgstatic void GLAPIENTRY 7687117f1b4Smrg_mesa_MapGrid2f( GLint un, GLfloat u1, GLfloat u2, 7697117f1b4Smrg GLint vn, GLfloat v1, GLfloat v2 ) 7707117f1b4Smrg{ 7717117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 7727117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 7737117f1b4Smrg 7747117f1b4Smrg if (un<1) { 7757117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(un)" ); 7767117f1b4Smrg return; 7777117f1b4Smrg } 7787117f1b4Smrg if (vn<1) { 7797117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glMapGrid2f(vn)" ); 7807117f1b4Smrg return; 7817117f1b4Smrg } 7827117f1b4Smrg 7837117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 7847117f1b4Smrg ctx->Eval.MapGrid2un = un; 7857117f1b4Smrg ctx->Eval.MapGrid2u1 = u1; 7867117f1b4Smrg ctx->Eval.MapGrid2u2 = u2; 7877117f1b4Smrg ctx->Eval.MapGrid2du = (u2 - u1) / (GLfloat) un; 7887117f1b4Smrg ctx->Eval.MapGrid2vn = vn; 7897117f1b4Smrg ctx->Eval.MapGrid2v1 = v1; 7907117f1b4Smrg ctx->Eval.MapGrid2v2 = v2; 7917117f1b4Smrg ctx->Eval.MapGrid2dv = (v2 - v1) / (GLfloat) vn; 7927117f1b4Smrg} 7937117f1b4Smrg 7947117f1b4Smrg 7954a49301eSmrgstatic void GLAPIENTRY 7967117f1b4Smrg_mesa_MapGrid2d( GLint un, GLdouble u1, GLdouble u2, 7977117f1b4Smrg GLint vn, GLdouble v1, GLdouble v2 ) 7987117f1b4Smrg{ 7997117f1b4Smrg _mesa_MapGrid2f( un, (GLfloat) u1, (GLfloat) u2, 8007117f1b4Smrg vn, (GLfloat) v1, (GLfloat) v2 ); 8017117f1b4Smrg} 8027117f1b4Smrg 8037117f1b4Smrg 8044a49301eSmrgvoid 8054a49301eSmrg_mesa_install_eval_vtxfmt(struct _glapi_table *disp, 8064a49301eSmrg const GLvertexformat *vfmt) 8074a49301eSmrg{ 8084a49301eSmrg SET_EvalCoord1f(disp, vfmt->EvalCoord1f); 8094a49301eSmrg SET_EvalCoord1fv(disp, vfmt->EvalCoord1fv); 8104a49301eSmrg SET_EvalCoord2f(disp, vfmt->EvalCoord2f); 8114a49301eSmrg SET_EvalCoord2fv(disp, vfmt->EvalCoord2fv); 8124a49301eSmrg SET_EvalPoint1(disp, vfmt->EvalPoint1); 8134a49301eSmrg SET_EvalPoint2(disp, vfmt->EvalPoint2); 8144a49301eSmrg 8154a49301eSmrg SET_EvalMesh1(disp, vfmt->EvalMesh1); 8164a49301eSmrg SET_EvalMesh2(disp, vfmt->EvalMesh2); 8174a49301eSmrg} 8184a49301eSmrg 8194a49301eSmrg 8204a49301eSmrgvoid 8214a49301eSmrg_mesa_init_eval_dispatch(struct _glapi_table *disp) 8224a49301eSmrg{ 8234a49301eSmrg SET_GetMapdv(disp, _mesa_GetMapdv); 8244a49301eSmrg SET_GetMapfv(disp, _mesa_GetMapfv); 8254a49301eSmrg SET_GetMapiv(disp, _mesa_GetMapiv); 8264a49301eSmrg SET_Map1d(disp, _mesa_Map1d); 8274a49301eSmrg SET_Map1f(disp, _mesa_Map1f); 8284a49301eSmrg SET_Map2d(disp, _mesa_Map2d); 8294a49301eSmrg SET_Map2f(disp, _mesa_Map2f); 8304a49301eSmrg SET_MapGrid1d(disp, _mesa_MapGrid1d); 8314a49301eSmrg SET_MapGrid1f(disp, _mesa_MapGrid1f); 8324a49301eSmrg SET_MapGrid2d(disp, _mesa_MapGrid2d); 8334a49301eSmrg SET_MapGrid2f(disp, _mesa_MapGrid2f); 8344a49301eSmrg} 8354a49301eSmrg 8364a49301eSmrg 8374a49301eSmrg#endif /* FEATURE_evaluators */ 8384a49301eSmrg 8397117f1b4Smrg 8407117f1b4Smrg/**********************************************************************/ 8417117f1b4Smrg/***** Initialization *****/ 8427117f1b4Smrg/**********************************************************************/ 8437117f1b4Smrg 8447117f1b4Smrg/** 8457117f1b4Smrg * Initialize a 1-D evaluator map. 8467117f1b4Smrg */ 8477117f1b4Smrgstatic void 8487117f1b4Smrginit_1d_map( struct gl_1d_map *map, int n, const float *initial ) 8497117f1b4Smrg{ 8507117f1b4Smrg map->Order = 1; 8517117f1b4Smrg map->u1 = 0.0; 8527117f1b4Smrg map->u2 = 1.0; 8537117f1b4Smrg map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat)); 8547117f1b4Smrg if (map->Points) { 8557117f1b4Smrg GLint i; 8567117f1b4Smrg for (i=0;i<n;i++) 8577117f1b4Smrg map->Points[i] = initial[i]; 8587117f1b4Smrg } 8597117f1b4Smrg} 8607117f1b4Smrg 8617117f1b4Smrg 8627117f1b4Smrg/** 8637117f1b4Smrg * Initialize a 2-D evaluator map 8647117f1b4Smrg */ 8657117f1b4Smrgstatic void 8667117f1b4Smrginit_2d_map( struct gl_2d_map *map, int n, const float *initial ) 8677117f1b4Smrg{ 8687117f1b4Smrg map->Uorder = 1; 8697117f1b4Smrg map->Vorder = 1; 8707117f1b4Smrg map->u1 = 0.0; 8717117f1b4Smrg map->u2 = 1.0; 8727117f1b4Smrg map->v1 = 0.0; 8737117f1b4Smrg map->v2 = 1.0; 8747117f1b4Smrg map->Points = (GLfloat *) MALLOC(n * sizeof(GLfloat)); 8757117f1b4Smrg if (map->Points) { 8767117f1b4Smrg GLint i; 8777117f1b4Smrg for (i=0;i<n;i++) 8787117f1b4Smrg map->Points[i] = initial[i]; 8797117f1b4Smrg } 8807117f1b4Smrg} 8817117f1b4Smrg 8827117f1b4Smrg 8837117f1b4Smrgvoid _mesa_init_eval( GLcontext *ctx ) 8847117f1b4Smrg{ 8857117f1b4Smrg int i; 8867117f1b4Smrg 8877117f1b4Smrg /* Evaluators group */ 8887117f1b4Smrg ctx->Eval.Map1Color4 = GL_FALSE; 8897117f1b4Smrg ctx->Eval.Map1Index = GL_FALSE; 8907117f1b4Smrg ctx->Eval.Map1Normal = GL_FALSE; 8917117f1b4Smrg ctx->Eval.Map1TextureCoord1 = GL_FALSE; 8927117f1b4Smrg ctx->Eval.Map1TextureCoord2 = GL_FALSE; 8937117f1b4Smrg ctx->Eval.Map1TextureCoord3 = GL_FALSE; 8947117f1b4Smrg ctx->Eval.Map1TextureCoord4 = GL_FALSE; 8957117f1b4Smrg ctx->Eval.Map1Vertex3 = GL_FALSE; 8967117f1b4Smrg ctx->Eval.Map1Vertex4 = GL_FALSE; 8977117f1b4Smrg MEMSET(ctx->Eval.Map1Attrib, 0, sizeof(ctx->Eval.Map1Attrib)); 8987117f1b4Smrg ctx->Eval.Map2Color4 = GL_FALSE; 8997117f1b4Smrg ctx->Eval.Map2Index = GL_FALSE; 9007117f1b4Smrg ctx->Eval.Map2Normal = GL_FALSE; 9017117f1b4Smrg ctx->Eval.Map2TextureCoord1 = GL_FALSE; 9027117f1b4Smrg ctx->Eval.Map2TextureCoord2 = GL_FALSE; 9037117f1b4Smrg ctx->Eval.Map2TextureCoord3 = GL_FALSE; 9047117f1b4Smrg ctx->Eval.Map2TextureCoord4 = GL_FALSE; 9057117f1b4Smrg ctx->Eval.Map2Vertex3 = GL_FALSE; 9067117f1b4Smrg ctx->Eval.Map2Vertex4 = GL_FALSE; 9077117f1b4Smrg MEMSET(ctx->Eval.Map2Attrib, 0, sizeof(ctx->Eval.Map2Attrib)); 9087117f1b4Smrg ctx->Eval.AutoNormal = GL_FALSE; 9097117f1b4Smrg ctx->Eval.MapGrid1un = 1; 9107117f1b4Smrg ctx->Eval.MapGrid1u1 = 0.0; 9117117f1b4Smrg ctx->Eval.MapGrid1u2 = 1.0; 9127117f1b4Smrg ctx->Eval.MapGrid2un = 1; 9137117f1b4Smrg ctx->Eval.MapGrid2vn = 1; 9147117f1b4Smrg ctx->Eval.MapGrid2u1 = 0.0; 9157117f1b4Smrg ctx->Eval.MapGrid2u2 = 1.0; 9167117f1b4Smrg ctx->Eval.MapGrid2v1 = 0.0; 9177117f1b4Smrg ctx->Eval.MapGrid2v2 = 1.0; 9187117f1b4Smrg 9197117f1b4Smrg /* Evaluator data */ 9207117f1b4Smrg { 9217117f1b4Smrg static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 }; 9227117f1b4Smrg static GLfloat normal[3] = { 0.0, 0.0, 1.0 }; 9237117f1b4Smrg static GLfloat index[1] = { 1.0 }; 9247117f1b4Smrg static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 }; 9257117f1b4Smrg static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 }; 9267117f1b4Smrg static GLfloat attrib[4] = { 0.0, 0.0, 0.0, 1.0 }; 9277117f1b4Smrg 9287117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex ); 9297117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex ); 9307117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Index, 1, index ); 9317117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Color4, 4, color ); 9327117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal ); 9337117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord ); 9347117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord ); 9357117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord ); 9367117f1b4Smrg init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord ); 9377117f1b4Smrg for (i = 0; i < 16; i++) 9387117f1b4Smrg init_1d_map( ctx->EvalMap.Map1Attrib + i, 4, attrib ); 9397117f1b4Smrg 9407117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex ); 9417117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex ); 9427117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Index, 1, index ); 9437117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Color4, 4, color ); 9447117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal ); 9457117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord ); 9467117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord ); 9477117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord ); 9487117f1b4Smrg init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord ); 9497117f1b4Smrg for (i = 0; i < 16; i++) 9507117f1b4Smrg init_2d_map( ctx->EvalMap.Map2Attrib + i, 4, attrib ); 9517117f1b4Smrg } 9527117f1b4Smrg} 9537117f1b4Smrg 9547117f1b4Smrg 9557117f1b4Smrgvoid _mesa_free_eval_data( GLcontext *ctx ) 9567117f1b4Smrg{ 9577117f1b4Smrg int i; 9587117f1b4Smrg 9597117f1b4Smrg /* Free evaluator data */ 9607117f1b4Smrg if (ctx->EvalMap.Map1Vertex3.Points) 9617117f1b4Smrg FREE( ctx->EvalMap.Map1Vertex3.Points ); 9627117f1b4Smrg if (ctx->EvalMap.Map1Vertex4.Points) 9637117f1b4Smrg FREE( ctx->EvalMap.Map1Vertex4.Points ); 9647117f1b4Smrg if (ctx->EvalMap.Map1Index.Points) 9657117f1b4Smrg FREE( ctx->EvalMap.Map1Index.Points ); 9667117f1b4Smrg if (ctx->EvalMap.Map1Color4.Points) 9677117f1b4Smrg FREE( ctx->EvalMap.Map1Color4.Points ); 9687117f1b4Smrg if (ctx->EvalMap.Map1Normal.Points) 9697117f1b4Smrg FREE( ctx->EvalMap.Map1Normal.Points ); 9707117f1b4Smrg if (ctx->EvalMap.Map1Texture1.Points) 9717117f1b4Smrg FREE( ctx->EvalMap.Map1Texture1.Points ); 9727117f1b4Smrg if (ctx->EvalMap.Map1Texture2.Points) 9737117f1b4Smrg FREE( ctx->EvalMap.Map1Texture2.Points ); 9747117f1b4Smrg if (ctx->EvalMap.Map1Texture3.Points) 9757117f1b4Smrg FREE( ctx->EvalMap.Map1Texture3.Points ); 9767117f1b4Smrg if (ctx->EvalMap.Map1Texture4.Points) 9777117f1b4Smrg FREE( ctx->EvalMap.Map1Texture4.Points ); 9787117f1b4Smrg for (i = 0; i < 16; i++) 9797117f1b4Smrg FREE((ctx->EvalMap.Map1Attrib[i].Points)); 9807117f1b4Smrg 9817117f1b4Smrg if (ctx->EvalMap.Map2Vertex3.Points) 9827117f1b4Smrg FREE( ctx->EvalMap.Map2Vertex3.Points ); 9837117f1b4Smrg if (ctx->EvalMap.Map2Vertex4.Points) 9847117f1b4Smrg FREE( ctx->EvalMap.Map2Vertex4.Points ); 9857117f1b4Smrg if (ctx->EvalMap.Map2Index.Points) 9867117f1b4Smrg FREE( ctx->EvalMap.Map2Index.Points ); 9877117f1b4Smrg if (ctx->EvalMap.Map2Color4.Points) 9887117f1b4Smrg FREE( ctx->EvalMap.Map2Color4.Points ); 9897117f1b4Smrg if (ctx->EvalMap.Map2Normal.Points) 9907117f1b4Smrg FREE( ctx->EvalMap.Map2Normal.Points ); 9917117f1b4Smrg if (ctx->EvalMap.Map2Texture1.Points) 9927117f1b4Smrg FREE( ctx->EvalMap.Map2Texture1.Points ); 9937117f1b4Smrg if (ctx->EvalMap.Map2Texture2.Points) 9947117f1b4Smrg FREE( ctx->EvalMap.Map2Texture2.Points ); 9957117f1b4Smrg if (ctx->EvalMap.Map2Texture3.Points) 9967117f1b4Smrg FREE( ctx->EvalMap.Map2Texture3.Points ); 9977117f1b4Smrg if (ctx->EvalMap.Map2Texture4.Points) 9987117f1b4Smrg FREE( ctx->EvalMap.Map2Texture4.Points ); 9997117f1b4Smrg for (i = 0; i < 16; i++) 10007117f1b4Smrg FREE((ctx->EvalMap.Map2Attrib[i].Points)); 10017117f1b4Smrg} 1002