Merge remote-tracking branch 'origin/master' into blender2.8
[blender.git] / intern / dualcon / dualcon.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Nicholas Bishop
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 #ifndef __DUALCON_H__
24 #define __DUALCON_H__
25
26 #ifdef WITH_CXX_GUARDEDALLOC
27 #  include "MEM_guardedalloc.h"
28 #endif
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 typedef float (*DualConCo)[3];
35
36 typedef unsigned int (*DualConTri)[3];
37
38 typedef unsigned int (*DualConLoop);
39
40 typedef struct DualConInput {
41         DualConLoop mloop;
42
43         DualConCo co;
44         int co_stride;
45         int totco;
46
47         DualConTri looptri;
48         int tri_stride;
49         int tottri;
50
51         int loop_stride;
52
53         float min[3], max[3];
54 } DualConInput;
55
56 /* callback for allocating memory for output */
57 typedef void *(*DualConAllocOutput)(int totvert, int totquad);
58 /* callback for adding a new vertex to the output */
59 typedef void (*DualConAddVert)(void *output, const float co[3]);
60 /* callback for adding a new quad to the output */
61 typedef void (*DualConAddQuad)(void *output, const int vert_indices[4]);
62
63 typedef enum {
64         DUALCON_FLOOD_FILL = 1,
65 } DualConFlags;
66
67 typedef enum {
68         /* blocky */
69         DUALCON_CENTROID,
70         /* smooth */
71         DUALCON_MASS_POINT,
72         /* keeps sharp edges */
73         DUALCON_SHARP_FEATURES,
74 } DualConMode;
75
76 /* Usage:
77  *
78  * The three callback arguments are used for creating the output
79  * mesh. The alloc_output callback takes the total number of vertices
80  * and faces (quads) that will be in the output. It should allocate
81  * and return a structure to hold the output mesh. The add_vert and
82  * add_quad callbacks will then be called for each new vertex and
83  * quad, and the callback should add the new mesh elements to the
84  * structure.
85  */
86 void *dualcon(const DualConInput *input_mesh,
87               /* callbacks for output */
88               DualConAllocOutput alloc_output,
89               DualConAddVert add_vert,
90               DualConAddQuad add_quad,
91
92               /* flags and settings to control the remeshing
93                * algorithm */
94               DualConFlags flags,
95               DualConMode mode,
96               float threshold,
97               float hermite_num,
98               float scale,
99               int depth);
100
101 #ifdef __cplusplus
102 }
103 #endif
104
105 #endif /* __DUALCON_H__ */