Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / glu / sgi / libnurbs / internals / subdivider.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  * 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
61     void                beginTrims( void ) {}
62     void                beginLoop( void );
63     void                addArc( REAL *, Quilt *, long );
64     void                addArc( int, TrimVertex *, long );
65     void                endLoop( void ) {}
66     void                endTrims( void ) {}
67
68     void                beginQuilts( void );
69     void                addQuilt( Quilt * );
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
82     void set_domain_distance_u_rate(REAL u_rate)
83       {
84         domain_distance_u_rate = u_rate;
85       }
86     void set_domain_distance_v_rate(REAL v_rate)
87       {
88         domain_distance_v_rate = v_rate;
89       }
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
153     inline void         setDegenerate( void ) { showDegenerate = 1; }
154     inline void         setNonDegenerate( void ) { showDegenerate = 0; }
155     inline int          showingDegenerate( void ) { return showDegenerate; }
156     inline void         setArcTypeBezier( void ) { isArcTypeBezier = 1; }
157     inline void         setArcTypePwl( void ) { isArcTypeBezier = 0; }
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
194 Subdivider::beginLoop( void ) 
195 {
196     pjarc = 0;
197 }
198
199
200 #endif /* __glusubdivider_h_ */