Welcome to mirror list, hosted at ThFree Co, Russian Federation.

GEO_uv_parametrizer.h « geometry « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 427b40db9521f2b756af762ae5dd800b2ebc4b1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* SPDX-License-Identifier: GPL-2.0-or-later */

#pragma once

#include "BLI_sys_types.h" /* for intptr_t support */

/** \file
 * \ingroup geo
 */

#ifdef __cplusplus
extern "C" {
#endif

typedef struct PHandle ParamHandle; /* Deprecated, use PHandle instead. */
typedef struct PHandle PHandle;     /* Handle to an array of charts. */
typedef intptr_t ParamKey;          /* Key (hash) for identifying verts and faces. */
typedef enum ParamBool {
  PARAM_TRUE = 1,
  PARAM_FALSE = 0,
} ParamBool;

/* -------------------------------------------------------------------- */
/** \name Chart Construction:
 *
 * Faces and seams may only be added between #GEO_uv_parametrizer_construct_begin and
 * #GEO_uv_parametrizer_construct_end.
 *
 * The pointers to `co` and `uv` are stored, rather than being copied. Vertices are implicitly
 * created.
 *
 * In #GEO_uv_parametrizer_construct_end the mesh will be split up according to the seams. The
 * resulting charts must be manifold, connected and open (at least one boundary loop). The output
 * will be written to the `uv` pointers.
 *
 * \{ */

PHandle *GEO_uv_parametrizer_construct_begin(void);

void GEO_uv_parametrizer_aspect_ratio(PHandle *handle, float aspx, float aspy);

void GEO_uv_parametrizer_face_add(PHandle *handle,
                                  ParamKey key,
                                  int nverts,
                                  ParamKey *vkeys,
                                  float *co[4],
                                  float *uv[4],
                                  ParamBool *pin,
                                  ParamBool *select);

void GEO_uv_parametrizer_edge_set_seam(PHandle *handle, ParamKey *vkeys);

void GEO_uv_parametrizer_construct_end(PHandle *handle,
                                       ParamBool fill,
                                       ParamBool topology_from_uvs,
                                       int *count_fail);
void GEO_uv_parametrizer_delete(PHandle *handle);

/** \} */

/* -------------------------------------------------------------------- */
/** \name Least Squares Conformal Maps:
 *
 * Charts with less than two pinned vertices are assigned two pins. LSCM is divided to three steps:
 *
 * 1. Begin: compute matrix and its factorization (expensive).
 * 2. Solve using pinned coordinates (cheap).
 * 3. End: clean up.
 *
 * UV coordinates are allowed to change within begin/end, for quick re-solving.
 *
 * \{ */

void GEO_uv_parametrizer_lscm_begin(PHandle *handle, ParamBool live, ParamBool abf);
void GEO_uv_parametrizer_lscm_solve(PHandle *handle, int *count_changed, int *count_failed);
void GEO_uv_parametrizer_lscm_end(PHandle *handle);

/** \} */

/* -------------------------------------------------------------------- */
/** \name Stretch
 * \{ */

void GEO_uv_parametrizer_stretch_begin(PHandle *handle);
void GEO_uv_parametrizer_stretch_blend(PHandle *handle, float blend);
void GEO_uv_parametrizer_stretch_iter(PHandle *handle);
void GEO_uv_parametrizer_stretch_end(PHandle *handle);

/** \} */

/* -------------------------------------------------------------------- */
/** \name Area Smooth
 * \{ */

void GEO_uv_parametrizer_smooth_area(PHandle *handle);

/** \} */

/* -------------------------------------------------------------------- */
/** \name Packing
 * \{ */

void GEO_uv_parametrizer_pack(PHandle *handle, float margin, bool do_rotate, bool ignore_pinned);

/** \} */

/* -------------------------------------------------------------------- */
/** \name Average area for all charts
 * \{ */

void GEO_uv_parametrizer_average(PHandle *handle, bool ignore_pinned);

/** \} */

/* -------------------------------------------------------------------- */
/** \name Simple x,y scale
 * \{ */

void GEO_uv_parametrizer_scale(PHandle *handle, float x, float y);

/** \} */

/* -------------------------------------------------------------------- */
/** \name Flushing
 * \{ */

void GEO_uv_parametrizer_flush(PHandle *handle);
void GEO_uv_parametrizer_flush_restore(PHandle *handle);

/** \} */

#ifdef __cplusplus
}
#endif