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