Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / BKE_mesh_remap.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  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 #ifndef __BKE_MESH_REMAP_H__
22 #define __BKE_MESH_REMAP_H__
23
24 /** \file BKE_mesh_remap.h
25  *  \ingroup bke
26  */
27
28 struct CustomData;
29 struct DerivedMesh;
30 struct MVert;
31 struct MemArena;
32
33 /* Generic ways to map some geometry elements from a source mesh to a dest one. */
34
35 typedef struct MeshPairRemapItem {
36         int    sources_num;
37         int   *indices_src;     /* NULL if no source found. */
38         float *weights_src;     /* NULL if no source found, else, always normalized! */
39         /* UNUSED (at the moment)*/
40         // float  hit_dist;     /* FLT_MAX if irrelevant or no source found. */
41         int    island;          /* For loops only. */
42 } MeshPairRemapItem;
43
44 /* All mapping computing func return this. */
45 typedef struct MeshPairRemap {
46         int                items_num;
47         MeshPairRemapItem *items;  /* array, one item per dest element. */
48
49         struct MemArena *mem;  /* memory arena, internal use only. */
50 } MeshPairRemap;
51
52 /* Helpers! */
53 void BKE_mesh_remap_init(MeshPairRemap *map, const int items_num);
54 void BKE_mesh_remap_free(MeshPairRemap *map);
55
56 void BKE_mesh_remap_item_define_invalid(MeshPairRemap *map, const int index);
57
58 /* TODO:
59  * Add other 'from/to' mapping sources, like e.g. using an UVMap, etc.
60  *     http://blenderartists.org/forum/showthread.php?346458-Move-Vertices-to-the-location-of-the-Reference-Mesh-based-on-the-UV-Position
61  * We could also use similar topology mappings inside a same mesh
62  * (cf. Campbell's 'select face islands from similar topology' wip work).
63  * Also, users will have to check, whether we can get rid of some modes here, not sure all will be useful!
64  */
65 enum {
66         MREMAP_USE_VERT                      = 1 << 4,
67         MREMAP_USE_EDGE                      = 1 << 5,
68         MREMAP_USE_LOOP                      = 1 << 6,
69         MREMAP_USE_POLY                      = 1 << 7,
70
71         MREMAP_USE_NEAREST                   = 1 << 8,
72         MREMAP_USE_NORPROJ                   = 1 << 9,
73         MREMAP_USE_INTERP                    = 1 << 10,
74         MREMAP_USE_NORMAL                    = 1 << 11,
75
76         /* ***** Target's vertices ***** */
77         MREMAP_MODE_VERT                     = 1 << 24,
78         /* Nearest source vert. */
79         MREMAP_MODE_VERT_NEAREST             = MREMAP_MODE_VERT | MREMAP_USE_VERT | MREMAP_USE_NEAREST,
80
81         /* Nearest vertex of nearest edge. */
82         MREMAP_MODE_VERT_EDGE_NEAREST        = MREMAP_MODE_VERT | MREMAP_USE_EDGE | MREMAP_USE_NEAREST,
83         /* This one uses two verts of selected edge (weighted interpolation). */
84         /* Nearest point on nearest edge. */
85         MREMAP_MODE_VERT_EDGEINTERP_NEAREST  = MREMAP_MODE_VERT | MREMAP_USE_EDGE | MREMAP_USE_NEAREST | MREMAP_USE_INTERP,
86
87         /* Nearest vertex of nearest poly. */
88         MREMAP_MODE_VERT_POLY_NEAREST        = MREMAP_MODE_VERT | MREMAP_USE_POLY | MREMAP_USE_NEAREST,
89         /* Those two use all verts of selected poly (weighted interpolation). */
90         /* Nearest point on nearest poly. */
91         MREMAP_MODE_VERT_POLYINTERP_NEAREST  = MREMAP_MODE_VERT | MREMAP_USE_POLY | MREMAP_USE_NEAREST | MREMAP_USE_INTERP,
92         /* Point on nearest face hit by ray from target vertex's normal. */
93         MREMAP_MODE_VERT_POLYINTERP_VNORPROJ = MREMAP_MODE_VERT | MREMAP_USE_POLY | MREMAP_USE_NORPROJ | MREMAP_USE_INTERP,
94
95         /* ***** Target's edges ***** */
96         MREMAP_MODE_EDGE                     = 1 << 25,
97
98         /* Source edge which both vertices are nearest of dest ones. */
99         MREMAP_MODE_EDGE_VERT_NEAREST        = MREMAP_MODE_EDGE | MREMAP_USE_VERT | MREMAP_USE_NEAREST,
100
101         /* Nearest source edge (using mid-point). */
102         MREMAP_MODE_EDGE_NEAREST             = MREMAP_MODE_EDGE | MREMAP_USE_EDGE | MREMAP_USE_NEAREST,
103
104         /* Nearest edge of nearest poly (using mid-point). */
105         MREMAP_MODE_EDGE_POLY_NEAREST        = MREMAP_MODE_EDGE | MREMAP_USE_POLY | MREMAP_USE_NEAREST,
106
107         /* Cast a set of rays from along dest edge, interpolating its vertices' normals, and use hit source edges. */
108         MREMAP_MODE_EDGE_EDGEINTERP_VNORPROJ = MREMAP_MODE_EDGE | MREMAP_USE_VERT | MREMAP_USE_NORPROJ | MREMAP_USE_INTERP,
109
110         /* ***** Target's loops ***** */
111         /* Note: when islands are given to loop mapping func, all loops from the same destination face will always be mapped
112          *       to loops of source faces within a same island, regardless of mapping mode. */
113         MREMAP_MODE_LOOP                     = 1 << 26,
114
115         /* Best normal-matching loop from nearest vert. */
116         MREMAP_MODE_LOOP_NEAREST_LOOPNOR     = MREMAP_MODE_LOOP | MREMAP_USE_LOOP | MREMAP_USE_VERT | MREMAP_USE_NEAREST | MREMAP_USE_NORMAL,
117         /* Loop from best normal-matching poly from nearest vert. */
118         MREMAP_MODE_LOOP_NEAREST_POLYNOR     = MREMAP_MODE_LOOP | MREMAP_USE_POLY | MREMAP_USE_VERT | MREMAP_USE_NEAREST | MREMAP_USE_NORMAL,
119
120         /* Loop from nearest vertex of nearest poly. */
121         MREMAP_MODE_LOOP_POLY_NEAREST        = MREMAP_MODE_LOOP | MREMAP_USE_POLY | MREMAP_USE_NEAREST,
122         /* Those two use all verts of selected poly (weighted interpolation). */
123         /* Nearest point on nearest poly. */
124         MREMAP_MODE_LOOP_POLYINTERP_NEAREST  = MREMAP_MODE_LOOP | MREMAP_USE_POLY | MREMAP_USE_NEAREST | MREMAP_USE_INTERP,
125         /* Point on nearest face hit by ray from target loop's normal. */
126         MREMAP_MODE_LOOP_POLYINTERP_LNORPROJ = MREMAP_MODE_LOOP | MREMAP_USE_POLY | MREMAP_USE_NORPROJ | MREMAP_USE_INTERP,
127
128         /* ***** Target's polygons ***** */
129         MREMAP_MODE_POLY                     = 1 << 27,
130
131         /* Nearest source poly. */
132         MREMAP_MODE_POLY_NEAREST             = MREMAP_MODE_POLY | MREMAP_USE_POLY | MREMAP_USE_NEAREST,
133         /* Source poly from best normal-matching dest poly. */
134         MREMAP_MODE_POLY_NOR                 = MREMAP_MODE_POLY | MREMAP_USE_POLY | MREMAP_USE_NORMAL,
135
136         /* Project dest poly onto source mesh using its normal, and use interpolation of all intersecting source polys. */
137         MREMAP_MODE_POLY_POLYINTERP_PNORPROJ = MREMAP_MODE_POLY | MREMAP_USE_POLY | MREMAP_USE_NORPROJ | MREMAP_USE_INTERP,
138
139         /* ***** Same topology, applies to all four elements types. ***** */
140         MREMAP_MODE_TOPOLOGY                 = MREMAP_MODE_VERT | MREMAP_MODE_EDGE | MREMAP_MODE_LOOP | MREMAP_MODE_POLY,
141 };
142
143 float BKE_mesh_remap_calc_difference_from_dm(
144         const struct SpaceTransform *space_transform,
145         const struct MVert *verts_dst, const int numverts_dst, struct DerivedMesh *dm_src);
146
147 void BKE_mesh_remap_find_best_match_from_dm(
148         const struct MVert *verts_dst, const int numverts_dst, struct DerivedMesh *dm_src,
149         struct SpaceTransform *r_space_transform);
150
151 /* TODO add mesh2mesh versions (we'll need mesh versions of bvhtree funcs too, though!). */
152
153 void BKE_mesh_remap_calc_verts_from_dm(
154         const int mode, const struct SpaceTransform *space_transform, const float max_dist, const float ray_radius,
155         const struct MVert *verts_dst, const int numverts_dst, const bool dirty_nors_dst,
156         struct DerivedMesh *dm_src, MeshPairRemap *r_map);
157
158 void BKE_mesh_remap_calc_edges_from_dm(
159         const int mode, const struct SpaceTransform *space_transform, const float max_dist, const float ray_radius,
160         const struct MVert *verts_dst, const int numverts_dst, const struct MEdge *edges_dst, const int numedges_dst,
161         const bool dirty_nors_dst, struct DerivedMesh *dm_src, MeshPairRemap *r_map);
162
163 void BKE_mesh_remap_calc_loops_from_dm(
164         const int mode, const struct SpaceTransform *space_transform, const float max_dist, const float ray_radius,
165         struct MVert *verts_dst, const int numverts_dst, struct MEdge *edges_dst, const int numedges_dst,
166         struct MLoop *loops_dst, const int numloops_dst, struct MPoly *polys_dst, const int numpolys_dst,
167         struct CustomData *ldata_dst, struct CustomData *pdata_dst,
168         const bool use_split_nors_dst, const float split_angle_dst, const bool dirty_nors_dst,
169         struct DerivedMesh *dm_src, const bool use_split_nors_src, const float split_angle_src,
170         MeshRemapIslandsCalc gen_islands_src, const float islands_precision_src, struct MeshPairRemap *r_map);
171
172 void BKE_mesh_remap_calc_polys_from_dm(
173         const int mode, const struct SpaceTransform *space_transform, const float max_dist, const float ray_radius,
174         struct MVert *verts_dst, const int numverts_dst, struct MLoop *loops_dst, const int numloops_dst,
175         struct MPoly *polys_dst, const int numpolys_dst, struct CustomData *pdata_dst, const bool dirty_nors_dst,
176         struct DerivedMesh *dm_src, struct MeshPairRemap *r_map);
177
178 #endif  /* __BKE_MESH_REMAP_H__ */