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
47struct Knotvector;
48class Quilt;
49class DisplayList;
50class BasicCurveEvaluator;
51class BasicSurfaceEvaluator;
52
53class NurbsTessellator {
54public:
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
103protected:
104    Renderhints		renderhints;
105    Maplist		maplist;
106    Backend		backend;
107
108private:
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;
143public:
144    Pool		quiltPool;
145private:
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