=bmesh= merge from trunk at r36529
[blender.git] / source / blender / editors / uvedit / uvedit_parametrizer.h
1 /** \file blender/editors/uvedit/uvedit_parametrizer.h
2  *  \ingroup eduv
3  */
4
5 #ifndef __PARAMETRIZER_H__
6 #define __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 int p_face_exists(ParamHandle *handle, ParamKey *vkeys, int i1, int i2, int i3);
37
38 void param_face_add(ParamHandle *handle,
39                                         ParamKey key,
40                                         int nverts,     
41                                         ParamKey *vkeys,
42                                         float **co,
43                                         float **uv,
44                                         ParamBool *pin,
45                                         ParamBool *select);
46
47 void param_edge_set_seam(ParamHandle *handle,
48                                                  ParamKey *vkeys);
49
50 void param_construct_end(ParamHandle *handle, ParamBool fill, ParamBool impl);
51 void param_delete(ParamHandle *chart);
52
53 /* Least Squares Conformal Maps:
54    -----------------------------
55    - charts with less than two pinned vertices are assigned 2 pins
56    - lscm is divided in three steps:
57           - begin: compute matrix and it's factorization (expensive)
58           - solve using pinned coordinates (cheap)
59           - end: clean up 
60         - uv coordinates are allowed to change within begin/end, for
61           quick re-solving
62 */
63
64 void param_lscm_begin(ParamHandle *handle, ParamBool live, ParamBool abf);
65 void param_lscm_solve(ParamHandle *handle);
66 void param_lscm_end(ParamHandle *handle);
67
68 /* Stretch */
69
70 void param_stretch_begin(ParamHandle *handle);
71 void param_stretch_blend(ParamHandle *handle, float blend);
72 void param_stretch_iter(ParamHandle *handle);
73 void param_stretch_end(ParamHandle *handle);
74
75 /* Area Smooth */
76
77 void param_smooth_area(ParamHandle *handle);
78
79 /* Packing */
80
81 void param_pack(ParamHandle *handle, float margin);
82
83 /* Average area for all charts */
84
85 void param_average(ParamHandle *handle);
86
87 /* Simple x,y scale */
88
89 void param_scale(ParamHandle *handle, float x, float y);
90
91 /* Flushing */
92
93 void param_flush(ParamHandle *handle);
94 void param_flush_restore(ParamHandle *handle);
95
96
97 #ifdef __cplusplus
98 }
99 #endif
100
101 #endif /*__PARAMETRIZER_H__*/
102