e42944f3da45565f866eddda51966349901e9011
[blender.git] / source / blender / editors / uvedit / uvedit_parametrizer.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):
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 #ifndef __UVEDIT_PARAMETRIZER_H__
24 #define __UVEDIT_PARAMETRIZER_H__
25
26 /** \file blender/editors/uvedit/uvedit_parametrizer.h
27  *  \ingroup eduv
28  */
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 #include "BLI_sys_types.h" // for intptr_t support
35
36 typedef void ParamHandle;       /* handle to a set of charts */
37 typedef intptr_t ParamKey;              /* (hash) key for identifying verts and faces */
38 typedef enum ParamBool {
39         PARAM_TRUE = 1,
40         PARAM_FALSE = 0
41 } ParamBool;
42
43 /* Chart construction:
44  * -------------------
45  * - faces and seams may only be added between construct_{begin|end}
46  * - the pointers to co and uv are stored, rather than being copied
47  * - vertices are implicitly created
48  * - in construct_end the mesh will be split up according to the seams
49  * - the resulting charts must be:
50  * - manifold, connected, open (at least one boundary loop)
51  * - output will be written to the uv pointers
52  */
53
54 ParamHandle *param_construct_begin(void);
55
56 void param_aspect_ratio(ParamHandle *handle, float aspx, float aspy);
57
58 void param_face_add(ParamHandle *handle,
59                     ParamKey key,
60                     int nverts,
61                     ParamKey *vkeys,
62                     float *co[4],
63                     float *uv[4],
64                     ParamBool *pin,
65                     ParamBool *select);
66
67 void param_edge_set_seam(ParamHandle *handle,
68                          ParamKey *vkeys);
69
70 void param_construct_end(ParamHandle *handle, ParamBool fill, ParamBool impl);
71 void param_delete(ParamHandle *chart);
72
73 /* Least Squares Conformal Maps:
74  * -----------------------------
75  * - charts with less than two pinned vertices are assigned 2 pins
76  * - lscm is divided in three steps:
77  * - begin: compute matrix and it's factorization (expensive)
78  * - solve using pinned coordinates (cheap)
79  * - end: clean up
80  * - uv coordinates are allowed to change within begin/end, for
81  *   quick re-solving
82  */
83
84 void param_lscm_begin(ParamHandle *handle, ParamBool live, ParamBool abf);
85 void param_lscm_solve(ParamHandle *handle);
86 void param_lscm_end(ParamHandle *handle);
87
88 /* Stretch */
89
90 void param_stretch_begin(ParamHandle *handle);
91 void param_stretch_blend(ParamHandle *handle, float blend);
92 void param_stretch_iter(ParamHandle *handle);
93 void param_stretch_end(ParamHandle *handle);
94
95 /* Area Smooth */
96
97 void param_smooth_area(ParamHandle *handle);
98
99 /* Packing */
100
101 void param_pack(ParamHandle *handle, float margin, bool do_rotate);
102
103 /* Average area for all charts */
104
105 void param_average(ParamHandle *handle);
106
107 /* Simple x,y scale */
108
109 void param_scale(ParamHandle *handle, float x, float y);
110
111 /* Flushing */
112
113 void param_flush(ParamHandle *handle);
114 void param_flush_restore(ParamHandle *handle);
115
116
117 #ifdef __cplusplus
118 }
119 #endif
120
121 #endif /*__UVEDIT_PARAMETRIZER_H__*/