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  * nurbstess.h
33  *
34  */
35 
36 #ifndef __glunurbstess_h_
37 #define __glunurbstess_h_
38 
39 //#include "mysetjmp.h"
40 #include "subdivider.h"
41 #include "renderhints.h"
42 #include "backend.h"
43 #include "maplist.h"
44 #include "reader.h"
45 //#include "nurbsconsts.h"
46 
47 struct Knotvector;
48 class Quilt;
49 class DisplayList;
50 class BasicCurveEvaluator;
51 class BasicSurfaceEvaluator;
52 
53 class NurbsTessellator {
54 public:
55     			NurbsTessellator( BasicCurveEvaluator &c,
56                                           BasicSurfaceEvaluator &e );
57     			virtual ~NurbsTessellator( void );
58 
59     void     		getnurbsproperty( long, INREAL * );
60     void     		getnurbsproperty( long, long, INREAL * );
61     void     		setnurbsproperty( long, INREAL );
62     void     		setnurbsproperty( long, long, INREAL );
63     void		setnurbsproperty( long, long, INREAL * );
64     void		setnurbsproperty( long, long, INREAL *, long, long );
65 
66     // called before a tessellation begins/ends
67     virtual void	bgnrender( void );
68     virtual void	endrender( void );
69 
70     // called to make a display list of the output vertices
71     virtual void	makeobj( int n );
72     virtual void	closeobj( void );
73 
74     // called when a error occurs
75     virtual void	errorHandler( int );
76 
77     void     		bgnsurface( long );
78     void     		endsurface( void );
79     void     		bgntrim( void );
80     void     		endtrim( void );
81     void     		bgncurve( long );
82     void     		endcurve( void );
83     void     		pwlcurve( long, INREAL[], long, long );
84     void     		nurbscurve( long, INREAL[], long, INREAL[], long, long );
85     void     		nurbssurface( long, INREAL[], long, INREAL[], long, long,
86 			    INREAL[], long, long, long );
87 
88     void 		defineMap( long, long, long );
89     void		redefineMaps( void );
90 
91     // recording of input description
92     void 		discardRecording( void * );
93     void * 		beginRecording( void );
94     void 		endRecording( void );
95     void 		playRecording( void * );
96 
97     //for optimizing untrimmed nurbs in the case of domain distance sampling
98     void set_domain_distance_u_rate(REAL u_rate);
99     void set_domain_distance_v_rate(REAL v_rate);
100     void set_is_domain_distance_sampling(int flag);
101 
102 
103 protected:
104     Renderhints		renderhints;
105     Maplist		maplist;
106     Backend		backend;
107 
108 private:
109 
110     void		resetObjects( void );
111     int			do_check_knots( Knotvector *, const char * );
112     void		do_nurbserror( int );
113     void		do_bgncurve( O_curve * );
114     void		do_endcurve( void );
115     void		do_freeall( void );
116     void		do_freecurveall( O_curve * );
117     void		do_freebgntrim( O_trim * );
118     void		do_freebgncurve( O_curve * );
119     void		do_freepwlcurve( O_pwlcurve * );
120     void		do_freenurbscurve( O_nurbscurve * );
121     void		do_freenurbssurface( O_nurbssurface * );
122     void 		do_freebgnsurface( O_surface * );
123     void		do_bgnsurface( O_surface * );
124     void		do_endsurface( void );
125     void		do_bgntrim( O_trim * );
126     void		do_endtrim( void );
127     void		do_pwlcurve( O_pwlcurve * );
128     void		do_nurbscurve( O_nurbscurve * );
129     void		do_nurbssurface( O_nurbssurface * );
130     void		do_freenurbsproperty( Property * );
131     void		do_setnurbsproperty( Property * );
132     void		do_setnurbsproperty2( Property * );
133 
134     Subdivider		subdivider;
135     JumpBuffer* 	jumpbuffer;
136     Pool		o_pwlcurvePool;
137     Pool		o_nurbscurvePool;
138     Pool		o_curvePool;
139     Pool		o_trimPool;
140     Pool		o_surfacePool;
141     Pool		o_nurbssurfacePool;
142     Pool		propertyPool;
143 public:
144     Pool		quiltPool;
145 private:
146     TrimVertexPool	extTrimVertexPool;
147 
148     int			inSurface;		/* bgnsurface seen */
149     int			inCurve;		/* bgncurve seen */
150     int			inTrim;			/* bgntrim seen */
151     int			isCurveModified;	/* curve changed */
152     int			isTrimModified;		/* trim curves changed */
153     int			isSurfaceModified;	/* surface changed */
154     int			isDataValid;		/* all data is good */
155     int			numTrims;		/* valid trim regions */
156     int			playBack;
157 
158     O_trim**		nextTrim;		/* place to link o_trim */
159     O_curve**		nextCurve;		/* place to link o_curve */
160     O_nurbscurve**	nextNurbscurve;		/* place to link o_nurbscurve */
161     O_pwlcurve**	nextPwlcurve;		/* place to link o_pwlcurve */
162     O_nurbssurface**	nextNurbssurface;	/* place to link o_nurbssurface */
163 
164     O_surface*		currentSurface;
165     O_trim*		currentTrim;
166     O_curve*		currentCurve;
167 
168     DisplayList		*dl;
169 
170 };
171 
172 #endif /* __glunurbstess_h_ */
173