Fix issue reported in #32174: IK solver stretch was less stable after a code refactor
[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 __cplusplus
27 extern "C" {
28 #endif
29
30 typedef float (*DualConCo)[3];
31 typedef unsigned int (*DualConFaces)[4];
32 struct DerivedMesh;
33
34 typedef struct DualConInput {
35         DualConCo co;
36         int co_stride;
37         int totco;
38
39         DualConFaces faces;
40         int face_stride;
41         int totface;
42
43         float min[3], max[3];
44 } DualConInput;
45
46 /* callback for allocating memory for output */
47 typedef void *(*DualConAllocOutput)(int totvert, int totquad);
48 /* callback for adding a new vertex to the output */
49 typedef void (*DualConAddVert)(void *output, const float co[3]);
50 /* callback for adding a new quad to the output */
51 typedef void (*DualConAddQuad)(void *output, const int vert_indices[4]);
52
53 typedef enum {
54         DUALCON_FLOOD_FILL = 1,
55 } DualConFlags;
56
57 typedef enum {
58         /* blocky */
59         DUALCON_CENTROID,
60         /* smooth */
61         DUALCON_MASS_POINT,
62         /* keeps sharp edges */
63         DUALCON_SHARP_FEATURES,
64 } DualConMode;
65
66 /* Usage:
67  *
68  * The three callback arguments are used for creating the output
69  * mesh. The alloc_output callback takes the total number of vertices
70  * and faces (quads) that will be in the output. It should allocate
71  * and return a structure to hold the output mesh. The add_vert and
72  * add_quad callbacks will then be called for each new vertex and
73  * quad, and the callback should add the new mesh elements to the
74  * structure.
75  */
76 void *dualcon(const DualConInput *input_mesh,
77               /* callbacks for output */
78               DualConAllocOutput alloc_output,
79               DualConAddVert add_vert,
80               DualConAddQuad add_quad,
81
82               /* flags and settings to control the remeshing
83                * algorithm */
84               DualConFlags flags,
85               DualConMode mode,
86               float threshold,
87               float hermite_num,
88               float scale,
89               int depth);
90
91 #ifdef __cplusplus
92 }
93 #endif
94
95 #endif /* __DUALCON_H__ */