1 /* 2 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 3 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice including the dates of first publication and 13 * either this permission notice or a reference to 14 * http://oss.sgi.com/projects/FreeB/ 15 * shall be included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 22 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. 24 * 25 * Except as contained in this notice, the name of Silicon Graphics, Inc. 26 * shall not be used in advertising or otherwise to promote the sale, use or 27 * other dealings in this Software without prior written authorization from 28 * Silicon Graphics, Inc. 29 */ 30 31 /* 32 * glsurfeval.h 33 * 34 */ 35 36 #ifndef __gluglsurfeval_h_ 37 #define __gluglsurfeval_h_ 38 39 #include "basicsurfeval.h" 40 #include "bezierPatchMesh.h" //in case output triangles 41 #include <GL/gl.h> 42 #include <GL/glu.h> 43 44 class SurfaceMap; 45 class OpenGLSurfaceEvaluator; 46 class StoredVertex; 47 48 #define TYPECOORD 1 49 #define TYPEPOINT 2 50 51 /* Cache up to 3 vertices from tmeshes */ 52 #define VERTEX_CACHE_SIZE 3 53 54 /*for internal evaluator callback stuff*/ 55 #ifndef IN_MAX_BEZIER_ORDER 56 #define IN_MAX_BEZIER_ORDER 40 /*XXX should be bigger than machine order*/ 57 #endif 58 59 #ifndef IN_MAX_DIMENSION 60 #define IN_MAX_DIMENSION 4 61 #endif 62 63 typedef struct surfEvalMachine{ 64 REAL uprime;//cached previusly evaluated uprime. 65 REAL vprime; 66 int k; /*the dimension*/ 67 REAL u1; 68 REAL u2; 69 int ustride; 70 int uorder; 71 REAL v1; 72 REAL v2; 73 int vstride; 74 int vorder; 75 REAL ctlPoints[IN_MAX_BEZIER_ORDER*IN_MAX_BEZIER_ORDER*IN_MAX_DIMENSION]; 76 REAL ucoeff[IN_MAX_BEZIER_ORDER]; /*cache the polynomial values*/ 77 REAL vcoeff[IN_MAX_BEZIER_ORDER]; 78 REAL ucoeffDeriv[IN_MAX_BEZIER_ORDER]; /*cache the polynomial derivatives*/ 79 REAL vcoeffDeriv[IN_MAX_BEZIER_ORDER]; 80 } surfEvalMachine; 81 82 83 84 class StoredVertex { 85 public: 86 StoredVertex() { type = 0; coord[0] = 0; coord[1] = 0; point[0] = 0; point[1] = 0; } 87 ~StoredVertex(void) {} 88 void saveEvalCoord(REAL x, REAL y) 89 {coord[0] = x; coord[1] = y; type = TYPECOORD; } 90 void saveEvalPoint(long x, long y) 91 {point[0] = x; point[1] = y; type = TYPEPOINT; } 92 void invoke(OpenGLSurfaceEvaluator *eval); 93 94 private: 95 int type; 96 REAL coord[2]; 97 long point[2]; 98 }; 99 100 class OpenGLSurfaceEvaluator : public BasicSurfaceEvaluator { 101 public: 102 OpenGLSurfaceEvaluator(); 103 virtual ~OpenGLSurfaceEvaluator( void ); 104 void polymode( long style ); 105 void range2f( long, REAL *, REAL * ); 106 void domain2f( REAL, REAL, REAL, REAL ); 107 void addMap( SurfaceMap * ) { } 108 109 void enable( long ); 110 void disable( long ); 111 void bgnmap2f( long ); 112 void map2f( long, REAL, REAL, long, long, 113 REAL, REAL, long, long, REAL * ); 114 void mapgrid2f( long, REAL, REAL, long, REAL, REAL ); 115 void mapmesh2f( long, long, long, long, long ); 116 void evalcoord2f( long, REAL, REAL ); 117 void evalpoint2i( long, long ); 118 void endmap2f( void ); 119 120 void bgnline( void ); 121 void endline( void ); 122 void bgnclosedline( void ); 123 void endclosedline( void ); 124 void bgntmesh( void ); 125 void swaptmesh( void ); 126 void endtmesh( void ); 127 void bgnqstrip( void ); 128 void endqstrip( void ); 129 130 void bgntfan( void ); 131 void endtfan( void ); 132 void evalUStrip(int n_upper, REAL v_upper, REAL* upper_val, 133 int n_lower, REAL v_lower, REAL* lower_val); 134 void evalVStrip(int n_left, REAL u_left, REAL* left_val, 135 int n_right, REAL u_right, REAL* right_val); 136 137 void coord2f( REAL, REAL ); 138 void point2i( long, long ); 139 140 void newtmeshvert( REAL, REAL ); 141 void newtmeshvert( long, long ); 142 143 #ifdef _WIN32 144 void putCallBack(GLenum which, void (GLAPIENTRY *fn)() ); 145 #else 146 void putCallBack(GLenum which, _GLUfuncptr fn ); 147 #endif 148 149 int get_vertices_call_back() 150 { 151 return output_triangles; 152 } 153 void put_vertices_call_back(int flag) 154 { 155 output_triangles = flag; 156 } 157 158 void put_callback_auto_normal(int flag) 159 { 160 callback_auto_normal = flag; 161 } 162 163 int get_callback_auto_normal() 164 { 165 return callback_auto_normal; 166 } 167 168 void set_callback_userData(void* data) 169 { 170 userData = data; 171 } 172 173 /**************begin for LOD_eval_list***********/ 174 void LOD_eval_list(int level); 175 176 177 178 179 private: 180 StoredVertex *vertexCache[VERTEX_CACHE_SIZE]; 181 int tmeshing; 182 int which; 183 int vcount; 184 185 GLint gl_polygon_mode[2];/*to save and restore so that 186 *no side effect 187 */ 188 bezierPatchMesh *global_bpm; //for output triangles 189 int output_triangles; //true 1 or false 0 190 191 192 193 void (GLAPIENTRY *beginCallBackN) (GLenum type); 194 void (GLAPIENTRY *endCallBackN) (void); 195 void (GLAPIENTRY *vertexCallBackN) (const GLfloat *vert); 196 void (GLAPIENTRY *normalCallBackN) (const GLfloat *normal); 197 void (GLAPIENTRY *colorCallBackN) (const GLfloat *color); 198 void (GLAPIENTRY *texcoordCallBackN) (const GLfloat *texcoord); 199 200 void (GLAPIENTRY *beginCallBackData) (GLenum type, void* data); 201 void (GLAPIENTRY *endCallBackData) (void* data); 202 void (GLAPIENTRY *vertexCallBackData) (const GLfloat *vert, void* data); 203 void (GLAPIENTRY *normalCallBackData) (const GLfloat *normal, void* data); 204 void (GLAPIENTRY *colorCallBackData) (const GLfloat *color, void* data); 205 void (GLAPIENTRY *texcoordCallBackData) (const GLfloat *texcoord, void* data); 206 207 void beginCallBack (GLenum type, void* data); 208 void endCallBack (void* data); 209 void vertexCallBack (const GLfloat *vert, void* data); 210 void normalCallBack (const GLfloat *normal, void* data); 211 void colorCallBack (const GLfloat *color, void* data); 212 void texcoordCallBack (const GLfloat *texcoord, void* data); 213 214 215 void* userData; //the opaque pointer for Data callback functions. 216 217 /*LOD evaluation*/ 218 void LOD_triangle(REAL A[2], REAL B[2], REAL C[2], 219 int level); 220 void LOD_eval(int num_vert, REAL* verts, int type, int level); 221 222 int LOD_eval_level; //set by LOD_eval_list() 223 224 /*************begin for internal evaluators*****************/ 225 226 /*the following global variables are only defined in this file. 227 *They are used to cache the precomputed Bezier polynomial values. 228 *These calues may be used consecutively in which case we don't have 229 *recompute these values again. 230 */ 231 int global_uorder; /*store the uorder in the previous evaluation*/ 232 int global_vorder; /*store the vorder in the previous evaluation*/ 233 REAL global_uprime; 234 REAL global_vprime; 235 REAL global_vprime_BV; 236 REAL global_uprime_BU; 237 int global_uorder_BV; /*store the uorder in the previous evaluation*/ 238 int global_vorder_BV; /*store the vorder in the previous evaluation*/ 239 int global_uorder_BU; /*store the uorder in the previous evaluation*/ 240 int global_vorder_BU; /*store the vorder in the previous evaluation*/ 241 242 REAL global_ucoeff[IN_MAX_BEZIER_ORDER]; /*cache the polynomial values*/ 243 REAL global_vcoeff[IN_MAX_BEZIER_ORDER]; 244 REAL global_ucoeffDeriv[IN_MAX_BEZIER_ORDER]; /*cache the polynomial derivatives*/ 245 REAL global_vcoeffDeriv[IN_MAX_BEZIER_ORDER]; 246 247 REAL global_BV[IN_MAX_BEZIER_ORDER][IN_MAX_DIMENSION]; 248 REAL global_PBV[IN_MAX_BEZIER_ORDER][IN_MAX_DIMENSION]; 249 REAL global_BU[IN_MAX_BEZIER_ORDER][IN_MAX_DIMENSION]; 250 REAL global_PBU[IN_MAX_BEZIER_ORDER][IN_MAX_DIMENSION]; 251 REAL* global_baseData; 252 253 int global_ev_k; /*the dimension*/ 254 REAL global_ev_u1; 255 REAL global_ev_u2; 256 int global_ev_ustride; 257 int global_ev_uorder; 258 REAL global_ev_v1; 259 REAL global_ev_v2; 260 int global_ev_vstride; 261 int global_ev_vorder; 262 REAL global_ev_ctlPoints[IN_MAX_BEZIER_ORDER*IN_MAX_BEZIER_ORDER*IN_MAX_DIMENSION]; 263 264 REAL global_grid_u0; 265 REAL global_grid_u1; 266 int global_grid_nu; 267 REAL global_grid_v0; 268 REAL global_grid_v1; 269 int global_grid_nv; 270 271 /*functions*/ 272 void inDoDomain2WithDerivs(int k, REAL u, REAL v, 273 REAL u1, REAL u2, int uorder, 274 REAL v1, REAL v2, int vorder, 275 REAL *baseData, 276 REAL *retPoint, REAL *retdu, REAL *retdv); 277 void inPreEvaluate(int order, REAL vprime, REAL *coeff); 278 void inPreEvaluateWithDeriv(int order, REAL vprime, REAL *coeff, REAL *coeffDeriv); 279 void inComputeFirstPartials(REAL *p, REAL *pu, REAL *pv); 280 void inComputeNormal2(REAL *pu, REAL *pv, REAL *n); 281 void inDoEvalCoord2(REAL u, REAL v, 282 REAL *retPoint, REAL *retNormal); 283 void inDoEvalCoord2NOGE(REAL u, REAL v, 284 REAL *retPoint, REAL *retNormal); 285 void inMap2f(int k, 286 REAL ulower, 287 REAL uupper, 288 int ustride, 289 int uorder, 290 REAL vlower, 291 REAL vupper, 292 int vstride, 293 int vorder, 294 REAL *ctlPoints); 295 296 void inMapGrid2f(int nu, REAL u0, REAL u1, 297 int nv, REAL v0, REAL v1); 298 299 void inEvalMesh2(int lowU, int lowV, int highU, int highV); 300 void inEvalPoint2(int i, int j); 301 void inEvalCoord2f(REAL u, REAL v); 302 303 void inEvalULine(int n_points, REAL v, REAL* u_vals, 304 int stride, REAL ret_points[][3], REAL ret_normals[][3]); 305 306 void inEvalVLine(int n_points, REAL u, REAL* v_vals, 307 int stride, REAL ret_points[][3], REAL ret_normals[][3]); 308 309 void inEvalUStrip(int n_upper, REAL v_upper, REAL* upper_val, 310 int n_lower, REAL v_lower, REAL* lower_val 311 ); 312 void inEvalVStrip(int n_left, REAL u_left, REAL* left_val, int n_right, REAL u_right, REAL* right_val); 313 314 void inPreEvaluateBV(int k, int uorder, int vorder, REAL vprime, REAL *baseData); 315 void inPreEvaluateBU(int k, int uorder, int vorder, REAL uprime, REAL *baseData); 316 void inPreEvaluateBV_intfac(REAL v ) 317 { 318 inPreEvaluateBV(global_ev_k, global_ev_uorder, global_ev_vorder, (v-global_ev_v1)/(global_ev_v2-global_ev_v1), global_ev_ctlPoints); 319 } 320 321 void inPreEvaluateBU_intfac(REAL u) 322 { 323 inPreEvaluateBU(global_ev_k, global_ev_uorder, global_ev_vorder, (u-global_ev_u1)/(global_ev_u2-global_ev_u1), global_ev_ctlPoints); 324 } 325 326 void inDoDomain2WithDerivsBV(int k, REAL u, REAL v, 327 REAL u1, REAL u2, int uorder, 328 REAL v1, REAL v2, int vorder, 329 REAL *baseData, 330 REAL *retPoint, REAL* retdu, REAL *retdv); 331 332 void inDoDomain2WithDerivsBU(int k, REAL u, REAL v, 333 REAL u1, REAL u2, int uorder, 334 REAL v1, REAL v2, int vorder, 335 REAL *baseData, 336 REAL *retPoint, REAL* retdu, REAL *retdv); 337 338 339 void inDoEvalCoord2NOGE_BV(REAL u, REAL v, 340 REAL *retPoint, REAL *retNormal); 341 342 void inDoEvalCoord2NOGE_BU(REAL u, REAL v, 343 REAL *retPoint, REAL *retNormal); 344 345 void inBPMEval(bezierPatchMesh* bpm); 346 void inBPMListEval(bezierPatchMesh* list); 347 348 /*-------------begin for surfEvalMachine -------------*/ 349 surfEvalMachine em_vertex; 350 surfEvalMachine em_normal; 351 surfEvalMachine em_color; 352 surfEvalMachine em_texcoord; 353 354 int auto_normal_flag; //whether to output normla or not in callback 355 //determined by GL_AUTO_NORMAL and callback_auto_normal 356 int callback_auto_normal; //GLU_CALLBACK_AUTO_NORMAL_EXT 357 int vertex_flag; 358 int normal_flag; 359 int color_flag; 360 int texcoord_flag; 361 362 void inMap2fEM(int which, //0:vert,1:norm,2:color,3:tex 363 int dimension, 364 REAL ulower, 365 REAL uupper, 366 int ustride, 367 int uorder, 368 REAL vlower, 369 REAL vupper, 370 int vstride, 371 int vorder, 372 REAL *ctlPoints); 373 374 void inDoDomain2WithDerivsEM(surfEvalMachine *em, REAL u, REAL v, 375 REAL *retPoint, REAL *retdu, REAL *retdv); 376 void inDoDomain2EM(surfEvalMachine *em, REAL u, REAL v, 377 REAL *retPoint); 378 void inDoEvalCoord2EM(REAL u, REAL v); 379 380 void inBPMEvalEM(bezierPatchMesh* bpm); 381 void inBPMListEvalEM(bezierPatchMesh* list); 382 383 /*-------------end for surfEvalMachine -------------*/ 384 385 386 /*************end for internal evaluators*****************/ 387 388 }; 389 390 inline void StoredVertex::invoke(OpenGLSurfaceEvaluator *eval) 391 { 392 switch(type) { 393 case TYPECOORD: 394 eval->coord2f(coord[0], coord[1]); 395 break; 396 case TYPEPOINT: 397 eval->point2i(point[0], point[1]); 398 break; 399 default: 400 break; 401 } 402 } 403 404 #endif /* __gluglsurfeval_h_ */ 405