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 * subdivider.h
33 *
34 */
35
36 #ifndef __glusubdivider_h_
37 #define __glusubdivider_h_
38
39 #include "mysetjmp.h"
40 #include "bin.h"
41 #include "flist.h"
42 #include "slicer.h"
43 #include "arctess.h"
44 //#include "trimvertex.h"
45 #include "trimvertpool.h"
46
47 class Arc;
48 class Pool;
49 class Renderhints;
50 class Quilt;
51 class Patchlist;
52 class Curvelist;
53 struct JumpBuffer;
54
55 class Subdivider {
56 public:
57 Subdivider( Renderhints&, Backend& );
58 ~Subdivider( void );
59 void clear( void );
60
beginTrims(void)61 void beginTrims( void ) {}
62 void beginLoop( void );
63 void addArc( REAL *, Quilt *, long );
64 void addArc( int, TrimVertex *, long );
endLoop(void)65 void endLoop( void ) {}
endTrims(void)66 void endTrims( void ) {}
67
68 void beginQuilts( void );
69 void addQuilt( Quilt * );
endQuilts(void)70 void endQuilts( void ) {}
71
72 void drawCurves( void );
73 void drawSurfaces( long );
74
75 int ccwTurn_sl( Arc_ptr, Arc_ptr );
76 int ccwTurn_sr( Arc_ptr , Arc_ptr );
77 int ccwTurn_tl( Arc_ptr , Arc_ptr );
78 int ccwTurn_tr( Arc_ptr , Arc_ptr );
79
80 void setJumpbuffer( JumpBuffer * );
81
set_domain_distance_u_rate(REAL u_rate)82 void set_domain_distance_u_rate(REAL u_rate)
83 {
84 domain_distance_u_rate = u_rate;
85 }
set_domain_distance_v_rate(REAL v_rate)86 void set_domain_distance_v_rate(REAL v_rate)
87 {
88 domain_distance_v_rate = v_rate;
89 }
set_is_domain_distance_sampling(int flag)90 void set_is_domain_distance_sampling(int flag)
91 {
92 is_domain_distance_sampling = flag;
93 }
94
95 private:
96 void classify_headonleft_s( Bin &, Bin &, Bin &, REAL );
97 void classify_tailonleft_s( Bin &, Bin &, Bin &, REAL );
98 void classify_headonright_s( Bin &, Bin &, Bin &, REAL );
99 void classify_tailonright_s( Bin &, Bin &, Bin &, REAL );
100 void classify_headonleft_t( Bin &, Bin &, Bin &, REAL );
101 void classify_tailonleft_t( Bin &, Bin &, Bin &, REAL );
102 void classify_headonright_t( Bin &, Bin &, Bin &, REAL );
103 void classify_tailonright_t( Bin &, Bin &, Bin &, REAL );
104
105 enum dir { down, same, up, none };
106 void tessellate( Arc_ptr, REAL );
107 void monotonize( Arc_ptr , Bin & );
108 int isMonotone( Arc_ptr );
109 int decompose( Bin &, REAL );
110
111
112 Slicer slicer;
113 ArcTessellator arctessellator;
114 Pool arcpool;
115 Pool bezierarcpool;
116 Pool pwlarcpool;
117 TrimVertexPool trimvertexpool;
118
119 JumpBuffer* jumpbuffer;
120 Renderhints& renderhints;
121 Backend& backend;
122
123 Bin initialbin;
124 Arc_ptr pjarc;
125 int s_index;
126 int t_index;
127 Quilt * qlist;
128 Flist spbrkpts;
129 Flist tpbrkpts;
130 Flist smbrkpts;
131 Flist tmbrkpts;
132 REAL stepsizes[4];
133 int showDegenerate;
134 int isArcTypeBezier;
135
136 void samplingSplit( Curvelist&, int );
137
138 void subdivideInS( Bin& );
139 void splitInS( Bin&, int, int );
140 void splitInT( Bin&, int, int );
141 void samplingSplit( Bin&, Patchlist&, int, int );
142 void nonSamplingSplit( Bin&, Patchlist&, int, int );
143 void tessellation( Bin&, Patchlist& );
144 void monosplitInS( Bin&, int, int );
145 void monosplitInT( Bin&, int, int );
146
147 void outline( Bin & );
148 void freejarcs( Bin & );
149 void render( Bin & );
150 void split( Bin &, Bin &, Bin &, int, REAL );
151 void tessellate( Bin &, REAL, REAL, REAL, REAL );
152
setDegenerate(void)153 inline void setDegenerate( void ) { showDegenerate = 1; }
setNonDegenerate(void)154 inline void setNonDegenerate( void ) { showDegenerate = 0; }
showingDegenerate(void)155 inline int showingDegenerate( void ) { return showDegenerate; }
setArcTypeBezier(void)156 inline void setArcTypeBezier( void ) { isArcTypeBezier = 1; }
setArcTypePwl(void)157 inline void setArcTypePwl( void ) { isArcTypeBezier = 0; }
isBezierArcType(void)158 inline int isBezierArcType( void ) { return isArcTypeBezier; }
159
160 void makeBorderTrim( const REAL *, const REAL * );
161 void split( Bin &, int, const REAL *, int, int );
162 void partition( Bin &, Bin &, Bin &, Bin &, Bin &, int, REAL );
163 void findIrregularS( Bin & );
164 void findIrregularT( Bin & );
165
166
167 inline int bbox( TrimVertex *, TrimVertex *, TrimVertex *, int );
168 static int bbox( REAL, REAL, REAL, REAL, REAL, REAL );
169 static int ccw( TrimVertex *, TrimVertex *, TrimVertex * );
170 void join_s( Bin &, Bin &, Arc_ptr, Arc_ptr );
171 void join_t( Bin &, Bin &, Arc_ptr , Arc_ptr );
172 int arc_split( Arc_ptr , int, REAL, int );
173 void check_s( Arc_ptr , Arc_ptr );
174 void check_t( Arc_ptr , Arc_ptr );
175 inline void link( Arc_ptr , Arc_ptr , Arc_ptr , Arc_ptr );
176 inline void simple_link( Arc_ptr , Arc_ptr );
177
178 Bin* makePatchBoundary( const REAL *from, const REAL *to );
179
180 /*in domain distance method, the tessellation is controled by two numbers:
181 *GLU_U_STEP: number of u-segments per unit u length of domain
182 *GLU_V_STEP: number of v-segments per unit v length of domain
183 *These two numbers are normally stored in mapdesc->maxs(t)rate.
184 *I (ZL) put these two numbers here so that I can optimize the untrimmed
185 *case in the case of domain distance sampling.
186 *These two numbers are set by set_domain_distance_u_rate() and ..._v_..().
187 */
188 REAL domain_distance_u_rate;
189 REAL domain_distance_v_rate;
190 int is_domain_distance_sampling;
191 };
192
193 inline void
beginLoop(void)194 Subdivider::beginLoop( void )
195 {
196 pjarc = 0;
197 }
198
199
200 #endif /* __glusubdivider_h_ */
201