ClangFormat: apply to source, most of intern
[blender.git] / source / blender / blenlib / BLI_scanfill.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 #ifndef __BLI_SCANFILL_H__
21 #define __BLI_SCANFILL_H__
22
23 /** \file
24  * \ingroup bli
25  */
26
27 struct ScanFillVert;
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 typedef struct ScanFillContext {
34   ListBase fillvertbase;
35   ListBase filledgebase;
36   ListBase fillfacebase;
37
38   /* increment this value before adding each curve to skip having to calculate
39    * 'poly_nr' for edges and verts (which can take approx half scanfill time) */
40   unsigned short poly_nr;
41
42   /* private */
43   struct MemArena *arena;
44 } ScanFillContext;
45
46 #define BLI_SCANFILL_ARENA_SIZE MEM_SIZE_OPTIMAL(1 << 14)
47
48 /**
49  * \note this is USHRT_MAX so incrementing  will set to zero
50  * which happens if callers choose to increment #ScanFillContext.poly_nr before adding each curve.
51  * Nowhere else in scanfill do we make use of intentional overflow like this.
52  */
53 #define SF_POLY_UNSET ((unsigned short)-1)
54
55 typedef struct ScanFillVert {
56   struct ScanFillVert *next, *prev;
57   union {
58     struct ScanFillVert *v;
59     void *p;
60     int i;
61     unsigned int u;
62   } tmp;
63   /** vertex location */
64   float co[3];
65   /** 2D projection of vertex location */
66   float xy[2];
67   /** index, caller can use how it likes to match the scanfill result with own data */
68   unsigned int keyindex;
69   unsigned short poly_nr;
70   /** number of edges using this vertex */
71   unsigned char edge_tot;
72   /** vert status */
73   unsigned int f : 4;
74   /** flag callers can use as they like */
75   unsigned int user_flag : 4;
76 } ScanFillVert;
77
78 typedef struct ScanFillEdge {
79   struct ScanFillEdge *next, *prev;
80   struct ScanFillVert *v1, *v2;
81   unsigned short poly_nr;
82   unsigned int f : 4;         /* edge status */
83   unsigned int user_flag : 4; /* flag callers can use as they like */
84   union {
85     unsigned char c;
86   } tmp;
87 } ScanFillEdge;
88
89 typedef struct ScanFillFace {
90   struct ScanFillFace *next, *prev;
91   struct ScanFillVert *v1, *v2, *v3;
92 } ScanFillFace;
93
94 /* scanfill.c */
95 struct ScanFillVert *BLI_scanfill_vert_add(ScanFillContext *sf_ctx, const float vec[3]);
96 struct ScanFillEdge *BLI_scanfill_edge_add(ScanFillContext *sf_ctx,
97                                            struct ScanFillVert *v1,
98                                            struct ScanFillVert *v2);
99
100 enum {
101   BLI_SCANFILL_CALC_QUADTRI_FASTPATH = (1 << 0),
102
103   /* note: using BLI_SCANFILL_CALC_REMOVE_DOUBLES
104    * Assumes ordered edges, otherwise we risk an eternal loop
105    * removing double verts. - campbell */
106   BLI_SCANFILL_CALC_REMOVE_DOUBLES = (1 << 1),
107
108   /* calculate isolated polygons */
109   BLI_SCANFILL_CALC_POLYS = (1 << 2),
110
111   /* note: This flag removes checks for overlapping polygons.
112    * when this flag is set, we'll never get back more faces then (totvert - 2) */
113   BLI_SCANFILL_CALC_HOLES = (1 << 3),
114
115   /* checks valid edge users - can skip for simple loops */
116   BLI_SCANFILL_CALC_LOOSE = (1 << 4),
117 };
118 void BLI_scanfill_begin(ScanFillContext *sf_ctx);
119 unsigned int BLI_scanfill_calc(ScanFillContext *sf_ctx, const int flag);
120 unsigned int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx,
121                                   const int flag,
122                                   const float nor_proj[3]);
123 void BLI_scanfill_end(ScanFillContext *sf_ctx);
124
125 void BLI_scanfill_begin_arena(ScanFillContext *sf_ctx, struct MemArena *arena);
126 void BLI_scanfill_end_arena(ScanFillContext *sf_ctx, struct MemArena *arena);
127
128 /* scanfill_utils.c */
129 bool BLI_scanfill_calc_self_isect(ScanFillContext *sf_ctx,
130                                   ListBase *fillvertbase,
131                                   ListBase *filledgebase);
132
133 #ifdef __cplusplus
134 }
135 #endif
136
137 #endif