ClangFormat: apply to source, most of intern
[blender.git] / source / blender / blenkernel / BKE_subdiv_ccg.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
21  * \ingroup bke
22  */
23
24 #ifndef __BKE_SUBDIV_CCG_H__
25 #define __BKE_SUBDIV_CCG_H__
26
27 #include "BKE_customdata.h"
28 #include "BKE_DerivedMesh.h"
29 #include "BLI_bitmap.h"
30 #include "BLI_sys_types.h"
31
32 struct CCGElem;
33 struct CCGFace;
34 struct CCGKey;
35 struct DMFlagMat;
36 struct Mesh;
37 struct Subdiv;
38
39 /* =============================================================================
40  * Masks.
41  */
42
43 /* Functor which evaluates mask value at a given (u, v) of given ptex face. */
44 typedef struct SubdivCCGMaskEvaluator {
45   float (*eval_mask)(struct SubdivCCGMaskEvaluator *mask_evaluator,
46                      const int ptex_face_index,
47                      const float u,
48                      const float v);
49
50   /* Free the data, not the evaluator itself. */
51   void (*free)(struct SubdivCCGMaskEvaluator *mask_evaluator);
52
53   void *user_data;
54 } SubdivCCGMaskEvaluator;
55
56 /* Return true if mesh has mask and evaluator can be used. */
57 bool BKE_subdiv_ccg_mask_init_from_paint(SubdivCCGMaskEvaluator *mask_evaluator,
58                                          const struct Mesh *mesh);
59
60 /* =============================================================================
61  * Materials.
62  */
63
64 /* Functor which evaluates material and flags of a given coarse face. */
65 typedef struct SubdivCCGMaterialFlagsEvaluator {
66   DMFlagMat (*eval_material_flags)(
67       struct SubdivCCGMaterialFlagsEvaluator *material_flags_evaluator,
68       const int coarse_face_index);
69
70   /* Free the data, not the evaluator itself. */
71   void (*free)(struct SubdivCCGMaterialFlagsEvaluator *material_flags_evaluator);
72
73   void *user_data;
74 } SubdivCCGMaterialFlagsEvaluator;
75
76 void BKE_subdiv_ccg_material_flags_init_from_mesh(
77     SubdivCCGMaterialFlagsEvaluator *material_flags_evaluator, const struct Mesh *mesh);
78
79 /* =============================================================================
80  * SubdivCCG.
81  */
82
83 typedef struct SubdivToCCGSettings {
84   /* Resolution at which regular ptex (created for quad polygon) are being
85    * evaluated. This defines how many vertices final mesh will have: every
86    * regular ptex has resolution^2 vertices. Special (irregular, or ptex
87    * created for a corner of non-quad polygon) will have resolution of
88    * `resolution - 1`. */
89   int resolution;
90   /* Denotes which extra layers to be added to CCG elements. */
91   bool need_normal;
92   bool need_mask;
93 } SubdivToCCGSettings;
94
95 /* This is actually a coarse face, which consists of multiple CCG grids. */
96 typedef struct SubdivCCGFace {
97   /* Total number of grids in this face.
98    *
99    * This 1:1 corresponds to a number of corners (or loops) from a coarse
100    * face. */
101   int num_grids;
102   /* Index of first grid from this face in SubdivCCG->grids array. */
103   int start_grid_index;
104 } SubdivCCGFace;
105
106 /* Definition of an edge which is adjacent to at least one of the faces. */
107 typedef struct SubdivCCGAdjacentEdge {
108   int num_adjacent_faces;
109   /* Indexed by adjacent face index. */
110   SubdivCCGFace **faces;
111   /* Indexed by adjacent face index, then by point index on the edge.
112    * points to a grid element. */
113   struct CCGElem ***boundary_elements;
114 } SubdivCCGAdjacentEdge;
115
116 /* Definition of a vertex which is adjacent to at least one of the faces. */
117 typedef struct SubdivCCGAdjacentVertex {
118   int num_adjacent_faces;
119   /* Indexed by adjacent face index. */
120   SubdivCCGFace **faces;
121   /* Indexed by adjacent face index, points to a grid element. */
122   struct CCGElem **corner_elements;
123 } SubdivCCGAdjacentVertex;
124
125 /* Representation of subdivision surface which uses CCG grids. */
126 typedef struct SubdivCCG {
127   /* This is a subdivision surface this CCG was created for.
128    *
129    * TODO(sergey): Make sure the whole descriptor is valid, including all the
130    * displacement attached to the surface. */
131   struct Subdiv *subdiv;
132   /* A level at which geometry was subdivided. This is what defines grid
133    * resolution. It is NOT the topology refinement level. */
134   int level;
135   /* Resolution of grid. All grids have matching resolution, and resolution
136    * is same as ptex created for non-quad polygons. */
137   int grid_size;
138   /* Grids represent limit surface, with displacement applied. Grids are
139    * corresponding to face-corners of coarse mesh, each grid has
140    * grid_size^2 elements.
141    */
142   /* Indexed by a grid index, points to a grid data which is stored in
143    * grids_storage. */
144   struct CCGElem **grids;
145   /* Flat array of all grids' data. */
146   unsigned char *grids_storage;
147   int num_grids;
148   /* Loose edges, each array element contains grid_size elements
149    * corresponding to vertices created by subdividing coarse edges. */
150   struct CCGElem **edges;
151   int num_edges;
152   /* Loose vertices. Every element corresponds to a loose vertex from a coarse
153    * mesh, every coarse loose vertex corresponds to a single sundivided
154    * element. */
155   struct CCGElem *vertices;
156   int num_vertices;
157   /* Denotes which layers present in the elements.
158    *
159    * Grids always has coordinates, followed by extra layers which are set to
160    * truth here.
161    */
162   bool has_normal;
163   bool has_mask;
164   /* Offsets of corresponding data layers in the elements. */
165   int normal_offset;
166   int mask_offset;
167
168   /* Faces from which grids are emitted. */
169   int num_faces;
170   SubdivCCGFace *faces;
171   /* Indexed by grid index, points to corresponding face from `faces`. */
172   SubdivCCGFace **grid_faces;
173
174   /* Edges which are adjacent to faces.
175    * Used for faster grid stitching, in the cost of extra memory.
176    */
177   int num_adjacent_edges;
178   SubdivCCGAdjacentEdge *adjacent_edges;
179
180   /* Vertices which are adjacent to faces
181    * Used for faster grid stitching, in the cost of extra memory.
182    */
183   int num_adjacent_vertices;
184   SubdivCCGAdjacentVertex *adjacent_vertices;
185
186   struct DMFlagMat *grid_flag_mats;
187   BLI_bitmap **grid_hidden;
188
189   /* TODO(sergey): Consider adding some accessors to a "decoded" geometry,
190    * to make integration with draw manager and such easy.
191    */
192
193   /* TODO(sergey): Consider adding CD layers here, so we can draw final mesh
194    * from grids, and have UVs and such work.
195    */
196
197   /* Integration with sculpting. */
198   /* TODO(sergey): Is this really best way to go? Kind of annoying to have
199    * such use-related flags in a more or less generic structure. */
200   struct {
201     /* Corresponds to MULTIRES_COORDS_MODIFIED. */
202     bool coords;
203     /* Corresponds to MULTIRES_HIDDEN_MODIFIED. */
204     bool hidden;
205   } dirty;
206 } SubdivCCG;
207
208 /* Create real hi-res CCG from subdivision.
209  *
210  * NOTE: Subdiv is expected to be refined and ready for evaluation.
211  * NOTE: CCG becomes an owner of subdiv.
212  *
213  * TODO(sergey): Allow some user-counter or more explicit control over who owns
214  * the Subdiv. The goal should be to allow viewport GL Mesh and CCG to share
215  * same Subsurf without conflicts. */
216 struct SubdivCCG *BKE_subdiv_to_ccg(struct Subdiv *subdiv,
217                                     const SubdivToCCGSettings *settings,
218                                     SubdivCCGMaskEvaluator *mask_evaluator,
219                                     SubdivCCGMaterialFlagsEvaluator *material_flags_evaluator);
220
221 /* Destroy CCG representation of subdivision surface. */
222 void BKE_subdiv_ccg_destroy(SubdivCCG *subdiv_ccg);
223
224 /* Helper function, creates Mesh structure which is properly setup to use
225  * grids.
226  */
227 struct Mesh *BKE_subdiv_to_ccg_mesh(struct Subdiv *subdiv,
228                                     const SubdivToCCGSettings *settings,
229                                     const struct Mesh *coarse_mesh);
230
231 /* Create a key for accessing grid elements at a given level. */
232 void BKE_subdiv_ccg_key(struct CCGKey *key, const SubdivCCG *subdiv_ccg, int level);
233 void BKE_subdiv_ccg_key_top_level(struct CCGKey *key, const SubdivCCG *subdiv_ccg);
234
235 /* Recalculate all normals based on grid element coordinates. */
236 void BKE_subdiv_ccg_recalc_normals(SubdivCCG *subdiv_ccg);
237
238 /* Update normals of affected faces. */
239 void BKE_subdiv_ccg_update_normals(SubdivCCG *subdiv_ccg,
240                                    struct CCGFace **effected_faces,
241                                    int num_effected_faces);
242
243 /* Average grid coordinates and normals along the grid boundatries. */
244 void BKE_subdiv_ccg_average_grids(SubdivCCG *subdiv_ccg);
245
246 /* Similar to above, but only updates given faces. */
247 void BKE_subdiv_ccg_average_stitch_faces(SubdivCCG *subdiv_ccg,
248                                          struct CCGFace **effected_faces,
249                                          int num_effected_faces);
250
251 /* Get geometry counters at the current subdivision level. */
252 void BKE_subdiv_ccg_topology_counters(const SubdivCCG *subdiv_ccg,
253                                       int *r_num_vertices,
254                                       int *r_num_edges,
255                                       int *r_num_faces,
256                                       int *r_num_loops);
257
258 #endif /* __BKE_SUBDIV_CCG_H__ */