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

uvedit_intern.h « uvedit « editors « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 098c6ad8655f03db8ce76c7f2e23dcdff8c0d4fa (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/* SPDX-License-Identifier: GPL-2.0-or-later
 * Copyright 2008 Blender Foundation. All rights reserved. */

/** \file
 * \ingroup eduv
 */

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

struct BMFace;
struct BMLoop;
struct Object;
struct Scene;
struct SpaceImage;
struct wmOperatorType;

/* find nearest */

typedef struct UvNearestHit {
  /** Only for `*_multi(..)` versions of functions. */
  struct Object *ob;
  /** Always set if we have a hit. */
  struct BMFace *efa;
  struct BMLoop *l;
  /**
   * Needs to be set before calling nearest functions.
   *
   * \note When #UV_NEAREST_HIT_INIT_DIST_PX or #UV_NEAREST_HIT_INIT_MAX are used,
   * this value is pixels squared.
   */
  float dist_sq;

  /** Scale the UV's to account for aspect ratio from the image view. */
  float scale[2];
} UvNearestHit;

#define UV_NEAREST_HIT_INIT_DIST_PX(v2d, dist_px) \
  { \
    .dist_sq = square_f(U.pixelsize * dist_px), \
    .scale = { \
        UI_view2d_scale_get_x(v2d), \
        UI_view2d_scale_get_y(v2d), \
    }, \
  }

#define UV_NEAREST_HIT_INIT_MAX(v2d) \
  { \
    .dist_sq = FLT_MAX, \
    .scale = { \
        UI_view2d_scale_get_x(v2d), \
        UI_view2d_scale_get_y(v2d), \
    }, \
  }

bool uv_find_nearest_vert(struct Scene *scene,
                          struct Object *obedit,
                          const float co[2],
                          float penalty_dist,
                          struct UvNearestHit *hit);
bool uv_find_nearest_vert_multi(struct Scene *scene,
                                struct Object **objects,
                                uint objects_len,
                                const float co[2],
                                float penalty_dist,
                                struct UvNearestHit *hit);

bool uv_find_nearest_edge(struct Scene *scene,
                          struct Object *obedit,
                          const float co[2],
                          float penalty,
                          struct UvNearestHit *hit);
bool uv_find_nearest_edge_multi(struct Scene *scene,
                                struct Object **objects,
                                uint objects_len,
                                const float co[2],
                                float penalty,
                                struct UvNearestHit *hit);

/**
 * \param only_in_face: when true, only hit faces which `co` is inside.
 * This gives users a result they might expect, especially when zoomed in.
 *
 * \note Concave faces can cause odd behavior, although in practice this isn't often an issue.
 * The center can be outside the face, in this case the distance to the center
 * could cause the face to be considered too far away.
 * If this becomes an issue we could track the distance to the faces closest edge.
 */
bool uv_find_nearest_face_ex(struct Scene *scene,
                             struct Object *obedit,
                             const float co[2],
                             struct UvNearestHit *hit,
                             bool only_in_face);
bool uv_find_nearest_face(struct Scene *scene,
                          struct Object *obedit,
                          const float co[2],
                          struct UvNearestHit *hit);
bool uv_find_nearest_face_multi_ex(struct Scene *scene,
                                   struct Object **objects,
                                   uint objects_len,
                                   const float co[2],
                                   struct UvNearestHit *hit,
                                   bool only_in_face);
bool uv_find_nearest_face_multi(struct Scene *scene,
                                struct Object **objects,
                                uint objects_len,
                                const float co[2],
                                struct UvNearestHit *hit);

BMLoop *uv_find_nearest_loop_from_vert(struct Scene *scene,
                                       struct Object *obedit,
                                       struct BMVert *v,
                                       const float co[2]);
BMLoop *uv_find_nearest_loop_from_edge(struct Scene *scene,
                                       struct Object *obedit,
                                       struct BMEdge *e,
                                       const float co[2]);

bool uvedit_vert_is_edge_select_any_other(const struct Scene *scene,
                                          struct BMLoop *l,
                                          const int cd_loop_uv_offset);
bool uvedit_vert_is_face_select_any_other(const struct Scene *scene,
                                          struct BMLoop *l,
                                          const int cd_loop_uv_offset);
bool uvedit_vert_is_all_other_faces_selected(const struct Scene *scene,
                                             struct BMLoop *l,
                                             const int cd_loop_uv_offset);

/* utility tool functions */

void uvedit_live_unwrap_update(struct SpaceImage *sima,
                               struct Scene *scene,
                               struct Object *obedit);

/* operators */

void UV_OT_average_islands_scale(struct wmOperatorType *ot);
void UV_OT_cube_project(struct wmOperatorType *ot);
void UV_OT_cylinder_project(struct wmOperatorType *ot);
void UV_OT_project_from_view(struct wmOperatorType *ot);
void UV_OT_minimize_stretch(struct wmOperatorType *ot);
void UV_OT_pack_islands(struct wmOperatorType *ot);
void UV_OT_reset(struct wmOperatorType *ot);
void UV_OT_sphere_project(struct wmOperatorType *ot);
void UV_OT_unwrap(struct wmOperatorType *ot);
void UV_OT_rip(struct wmOperatorType *ot);
void UV_OT_stitch(struct wmOperatorType *ot);
void UV_OT_smart_project(struct wmOperatorType *ot);

/* uvedit_copy_paste.cc */
void UV_OT_copy(wmOperatorType *ot);
void UV_OT_paste(wmOperatorType *ot);

/* uvedit_path.c */

void UV_OT_shortest_path_pick(struct wmOperatorType *ot);
void UV_OT_shortest_path_select(struct wmOperatorType *ot);

/* uvedit_select.c */

bool uvedit_select_is_any_selected(const struct Scene *scene, struct Object *obedit);
bool uvedit_select_is_any_selected_multi(const struct Scene *scene,
                                         struct Object **objects,
                                         uint objects_len);
/**
 * \warning This returns first selected UV,
 * not ideal in many cases since there could be multiple.
 */
const float *uvedit_first_selected_uv_from_vertex(struct Scene *scene,
                                                  struct BMVert *eve,
                                                  int cd_loop_uv_offset);

void UV_OT_select_all(struct wmOperatorType *ot);
void UV_OT_select(struct wmOperatorType *ot);
void UV_OT_select_loop(struct wmOperatorType *ot);
void UV_OT_select_edge_ring(struct wmOperatorType *ot);
void UV_OT_select_linked(struct wmOperatorType *ot);
void UV_OT_select_linked_pick(struct wmOperatorType *ot);
void UV_OT_select_split(struct wmOperatorType *ot);
void UV_OT_select_pinned(struct wmOperatorType *ot);
void UV_OT_select_box(struct wmOperatorType *ot);
void UV_OT_select_lasso(struct wmOperatorType *ot);
void UV_OT_select_circle(struct wmOperatorType *ot);
void UV_OT_select_more(struct wmOperatorType *ot);
void UV_OT_select_less(struct wmOperatorType *ot);
void UV_OT_select_overlap(struct wmOperatorType *ot);
void UV_OT_select_similar(struct wmOperatorType *ot);
/* Used only when UV sync select is disabled. */
void UV_OT_select_mode(struct wmOperatorType *ot);

#ifdef __cplusplus
}
#endif