Blender V5.0
editcurve_query.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "DNA_curve_types.h"
10#include "DNA_object_types.h"
11
12#include "BLI_listbase.h"
13#include "BLI_math_vector.h"
14
15#include "BKE_curve.hh"
16#include "BKE_layer.hh"
17
18#include "ED_curve.hh"
19#include "ED_view3d.hh"
20
21#include "curve_intern.hh"
22
23using blender::Vector;
24
25/* -------------------------------------------------------------------- */
28
33 float dist;
34 int hpoint;
35 uint8_t select;
36 float mval_fl[2];
38};
39
40static void curve_pick_vert__do_closest(void *user_data,
41 Nurb *nu,
42 BPoint *bp,
43 BezTriple *bezt,
44 int beztindex,
45 bool handles_visible,
46 const float screen_co[2])
47{
48 PickUserData *data = static_cast<PickUserData *>(user_data);
49
50 uint8_t flag;
51 float dist_test;
52
53 if (bp) {
54 flag = bp->f1;
55 }
56 else {
57 BLI_assert(handles_visible || beztindex == 1);
58
59 if (beztindex == 0) {
60 flag = bezt->f1;
61 }
62 else if (beztindex == 1) {
63 flag = bezt->f2;
64 }
65 else {
66 flag = bezt->f3;
67 }
68 }
69
70 dist_test = len_manhattan_v2v2(data->mval_fl, screen_co);
71 if ((flag & SELECT) == data->select) {
72 dist_test += 5.0f;
73 }
74 if (bezt && beztindex == 1) {
75 dist_test += 3.0f; /* middle points get a small disadvantage */
76 }
77
78 if (dist_test < data->dist) {
79 data->dist = dist_test;
80
81 data->bp = bp;
82 data->bezt = bezt;
83 data->nurb = nu;
84 data->hpoint = bezt ? beztindex : 0;
85 data->is_changed = true;
86 }
87
89}
90
92 const bool select,
93 const int dist_px,
94 Nurb **r_nurb,
95 BezTriple **r_bezt,
96 BPoint **r_bp,
97 short *r_handle,
98 Base **r_base)
99{
101
102 data.dist = dist_px;
103 data.hpoint = 0;
104 data.select = select ? SELECT : 0;
105 data.mval_fl[0] = vc->mval[0];
106 data.mval_fl[1] = vc->mval[1];
107
109 vc->scene, vc->view_layer, vc->v3d);
110 for (Base *base : bases) {
111 data.is_changed = false;
112
113 ED_view3d_viewcontext_init_object(vc, base->object);
116
117 if (r_base && data.is_changed) {
118 *r_base = base;
119 }
120 }
121
122 *r_nurb = data.nurb;
123 *r_bezt = data.bezt;
124 *r_bp = data.bp;
125
126 if (r_handle) {
127 *r_handle = data.hpoint;
128 }
129
130 return (data.bezt || data.bp);
131}
132
134 short sel,
135 Nurb **r_nurb,
136 BezTriple **r_bezt,
137 BPoint **r_bp,
138 short *r_handle,
139 Base **r_base)
140{
142 vc, sel, ED_view3d_select_dist_px(), r_nurb, r_bezt, r_bp, r_handle, r_base);
143}
144
146
147/* -------------------------------------------------------------------- */
150
152 Curve *cu, View3D *v3d, Nurb **r_nu, BezTriple **r_bezt, BPoint **r_bp)
153{
154 /* In nu and (bezt or bp) selected are written if there's 1 sel. */
155 /* If more points selected in 1 spline: return only nu, bezt and bp are 0. */
156 ListBase *editnurb = &cu->editnurb->nurbs;
157 BezTriple *bezt1;
158 BPoint *bp1;
159 int a;
160
161 *r_nu = nullptr;
162 *r_bezt = nullptr;
163 *r_bp = nullptr;
164
165 LISTBASE_FOREACH (Nurb *, nu1, editnurb) {
166 if (nu1->type == CU_BEZIER) {
167 bezt1 = nu1->bezt;
168 a = nu1->pntsu;
169 while (a--) {
170 if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt1)) {
171 if (!ELEM(*r_nu, nullptr, nu1)) {
172 *r_nu = nullptr;
173 *r_bp = nullptr;
174 *r_bezt = nullptr;
175 return;
176 }
177
178 if (*r_bezt || *r_bp) {
179 *r_bp = nullptr;
180 *r_bezt = nullptr;
181 }
182 else {
183 *r_bezt = bezt1;
184 *r_nu = nu1;
185 }
186 }
187 bezt1++;
188 }
189 }
190 else {
191 bp1 = nu1->bp;
192 a = nu1->pntsu * nu1->pntsv;
193 while (a--) {
194 if (bp1->f1 & SELECT) {
195 if (!ELEM(*r_nu, nullptr, nu1)) {
196 *r_bp = nullptr;
197 *r_bezt = nullptr;
198 *r_nu = nullptr;
199 return;
200 }
201
202 if (*r_bezt || *r_bp) {
203 *r_bp = nullptr;
204 *r_bezt = nullptr;
205 }
206 else {
207 *r_bp = bp1;
208 *r_nu = nu1;
209 }
210 }
211 bp1++;
212 }
213 }
214 }
215}
216
217bool ED_curve_active_center(Curve *cu, float center[3])
218{
219 Nurb *nu = nullptr;
220 void *vert = nullptr;
221
222 if (!BKE_curve_nurb_vert_active_get(cu, &nu, &vert)) {
223 return false;
224 }
225
226 if (nu->type == CU_BEZIER) {
227 BezTriple *bezt = (BezTriple *)vert;
228 copy_v3_v3(center, bezt->vec[1]);
229 }
230 else {
231 BPoint *bp = (BPoint *)vert;
232 copy_v3_v3(center, bp->vec);
233 }
234
235 return true;
236}
237
bool BKE_curve_nurb_vert_active_get(Curve *cu, Nurb **r_nu, void **r_vert)
Definition curve.cc:5031
blender::Vector< Base * > BKE_view_layer_array_from_bases_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
#define BLI_assert(a)
Definition BLI_assert.h:46
#define LISTBASE_FOREACH(type, var, list)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float len_manhattan_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
#define UNUSED_VARS_NDEBUG(...)
#define ELEM(...)
@ CU_BEZIER
#define BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)
Object is a sort of wrapper for general info.
float ED_view3d_select_dist_px()
void nurbs_foreachScreenVert(const ViewContext *vc, void(*func)(void *user_data, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, bool handle_visible, const float screen_co[2]), void *user_data, eV3DProjTest clip_flag)
void ED_view3d_init_mats_rv3d(const Object *ob, RegionView3D *rv3d)
#define V3D_PROJ_TEST_CLIP_DEFAULT
Definition ED_view3d.hh:309
void ED_view3d_viewcontext_init_object(ViewContext *vc, Object *obact)
BMesh const char void * data
#define SELECT
bool ED_curve_pick_vert_ex(ViewContext *vc, const bool select, const int dist_px, Nurb **r_nurb, BezTriple **r_bezt, BPoint **r_bp, short *r_handle, Base **r_base)
static void curve_pick_vert__do_closest(void *user_data, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, bool handles_visible, const float screen_co[2])
void ED_curve_nurb_vert_selected_find(Curve *cu, View3D *v3d, Nurb **r_nu, BezTriple **r_bezt, BPoint **r_bp)
bool ED_curve_pick_vert(ViewContext *vc, short sel, Nurb **r_nurb, BezTriple **r_bezt, BPoint **r_bp, short *r_handle, Base **r_base)
bool ED_curve_active_center(Curve *cu, float center[3])
#define select(A, B, C)
static bool handles_visible(KeyframeEditData *ked, BezTriple *bezt)
uint8_t f1
float vec[4]
float vec[3][3]
EditNurb * editnurb
ListBase nurbs
short type
BezTriple * bezt
RegionView3D * rv3d
Definition ED_view3d.hh:80
int mval[2]
Definition ED_view3d.hh:82
Scene * scene
Definition ED_view3d.hh:73
ViewLayer * view_layer
Definition ED_view3d.hh:74
View3D * v3d
Definition ED_view3d.hh:78
Object * obedit
Definition ED_view3d.hh:76
uint8_t flag
Definition wm_window.cc:145