Cleanup: remove redundant doxygen \file argument
[blender.git] / source / blender / blenkernel / BKE_subdiv_foreach.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) 2018 by Blender Foundation.
17  * All rights reserved.
18  */
19
20 /** \file \ingroup bke
21  */
22
23 #ifndef __BKE_SUBDIV_FOREACH_H__
24 #define __BKE_SUBDIV_FOREACH_H__
25
26 #include "BLI_sys_types.h"
27
28 struct Mesh;
29 struct Subdiv;
30 struct SubdivForeachContext;
31 struct SubdivToMeshSettings;
32
33 typedef bool (*SubdivForeachTopologyInformationCb)(
34         const struct SubdivForeachContext *context,
35         const int num_vertices,
36         const int num_edges,
37         const int num_loops,
38         const int num_polygons);
39
40 typedef void (*SubdivForeachVertexFromCornerCb)(
41         const struct SubdivForeachContext *context,
42         void *tls,
43         const int ptex_face_index,
44         const float u, const float v,
45         const int coarse_vertex_index,
46         const int coarse_poly_index,
47         const int coarse_corner,
48         const int subdiv_vertex_index);
49
50 typedef void (*SubdivForeachVertexFromEdgeCb)(
51         const struct SubdivForeachContext *context,
52         void *tls,
53         const int ptex_face_index,
54         const float u, const float v,
55         const int coarse_edge_index,
56         const int coarse_poly_index,
57         const int coarse_corner,
58         const int subdiv_vertex_index);
59
60 typedef void (*SubdivForeachVertexInnerCb)(
61         const struct SubdivForeachContext *context,
62         void *tls,
63         const int ptex_face_index,
64         const float u, const float v,
65         const int coarse_poly_index,
66         const int coarse_corner,
67         const int subdiv_vertex_index);
68
69 typedef void (*SubdivForeachEdgeCb)(
70         const struct SubdivForeachContext *context,
71         void *tls,
72         const int coarse_edge_index,
73         const int subdiv_edge_index,
74         const int subdiv_v1, const int subdiv_v2);
75
76 typedef void (*SubdivForeachLoopCb)(
77         const struct SubdivForeachContext *context,
78         void *tls,
79         const int ptex_face_index,
80         const float u, const float v,
81         const int coarse_loop_index,
82         const int coarse_poly_index,
83         const int coarse_corner,
84         const int subdiv_loop_index,
85         const int subdiv_vertex_index, const int subdiv_edge_index);
86
87 typedef void (*SubdivForeachPolygonCb)(
88         const struct SubdivForeachContext *context,
89         void *tls,
90         const int coarse_poly_index,
91         const int subdiv_poly_index,
92         const int start_loop_index, const int num_loops);
93
94 typedef void (*SubdivForeachLooseCb)(
95         const struct SubdivForeachContext *context,
96         void *tls,
97         const int coarse_vertex_index,
98         const int subdiv_vertex_index);
99
100 typedef void (*SubdivForeachVertexOfLooseEdgeCb)(
101         const struct SubdivForeachContext *context,
102         void *tls,
103         const int coarse_edge_index,
104         const float u,
105         const int subdiv_vertex_index);
106
107 typedef struct SubdivForeachContext {
108         /* Is called when topology information becomes available.
109          * Is only called once.
110          *
111          * NOTE: If this callback returns false, the foreach loop is aborted.
112          */
113         SubdivForeachTopologyInformationCb topology_info;
114         /* These callbacks are called from every ptex which shares "emitting"
115          * vertex or edge.
116          */
117         SubdivForeachVertexFromCornerCb vertex_every_corner;
118         SubdivForeachVertexFromEdgeCb vertex_every_edge;
119         /* Those callbacks are run once per subdivision vertex, ptex is undefined
120          * as in it will be whatever first ptex face happened to be tarversed in
121          * the multi-threaded environment ahd which shares "emitting" vertex or
122          * edge.
123          */
124         SubdivForeachVertexFromCornerCb vertex_corner;
125         SubdivForeachVertexFromEdgeCb vertex_edge;
126         /* Called exactly once, always corresponds to a single ptex face. */
127         SubdivForeachVertexInnerCb vertex_inner;
128         /* Called once for each loose vertex. One loose coarse vertexcorresponds
129          * to a single subdivision vertex.
130          */
131         SubdivForeachLooseCb vertex_loose;
132         /* Called once per vertex created for loose edge. */
133         SubdivForeachVertexOfLooseEdgeCb vertex_of_loose_edge;
134         /* NOTE: If subdivided edge does not come from coarse edge, ORIGINDEX_NONE
135          * will be passed as coarse_edge_index.
136          */
137         SubdivForeachEdgeCb edge;
138         /* NOTE: If subdivided loop does not come from coarse loop, ORIGINDEX_NONE
139          * will be passed as coarse_loop_index.
140          */
141         SubdivForeachLoopCb loop;
142         SubdivForeachPolygonCb poly;
143
144         /* User-defined pointer, to allow callbacks know something about context the
145          * traversal is happening for,
146          */
147         void *user_data;
148
149         /* Initial value of TLS data. */
150         void *user_data_tls;
151         /* Size of TLS data. */
152         size_t user_data_tls_size;
153         /* Function to free TLS storage. */
154         void (*user_data_tls_free)(void *tls);
155 } SubdivForeachContext;
156
157 /* Invokes callbacks in the order and with values which corresponds to creation
158  * of final subdivided mesh.
159  *
160  * Returns truth if the whole topology was traversed, without any early exits.
161  *
162  * TODO(sergey): Need to either get rid of subdiv or of coarse_mesh.
163  * The main point here is th be abel to get base level topology, which can be
164  * done with either of those. Having both of them is kind of redundant.
165  */
166 bool BKE_subdiv_foreach_subdiv_geometry(
167         struct Subdiv *subdiv,
168         const struct SubdivForeachContext *context,
169         const struct SubdivToMeshSettings *mesh_settings,
170         const struct Mesh *coarse_mesh);
171
172 #endif  /* __BKE_SUBDIV_FOREACH_H__ */