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