Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / glu / sgi / libnurbs / interface / glsurfeval.h
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_ */