Blender V4.3
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
9#include "DNA_object_types.h"
10#include "DNA_scene_types.h"
11
12#include "MEM_guardedalloc.h"
13
14#include "BLI_listbase.h"
15#include "BLI_math_vector.h"
16
17#include "BKE_curve.hh"
18#include "BKE_fcurve.hh"
19#include "BKE_layer.hh"
20
21#include "ED_curve.hh"
22#include "ED_view3d.hh"
23
24#include "curve_intern.hh"
25
26using blender::Vector;
27
28/* -------------------------------------------------------------------- */
42
43static void ED_curve_pick_vert__do_closest(void *user_data,
44 Nurb *nu,
45 BPoint *bp,
46 BezTriple *bezt,
47 int beztindex,
48 bool handles_visible,
49 const float screen_co[2])
50{
51 PickUserData *data = static_cast<PickUserData *>(user_data);
52
54 float dist_test;
55
56 if (bp) {
57 flag = bp->f1;
58 }
59 else {
60 BLI_assert(handles_visible || beztindex == 1);
61
62 if (beztindex == 0) {
63 flag = bezt->f1;
64 }
65 else if (beztindex == 1) {
66 flag = bezt->f2;
67 }
68 else {
69 flag = bezt->f3;
70 }
71 }
72
73 dist_test = len_manhattan_v2v2(data->mval_fl, screen_co);
74 if ((flag & SELECT) == data->select) {
75 dist_test += 5.0f;
76 }
77 if (bezt && beztindex == 1) {
78 dist_test += 3.0f; /* middle points get a small disadvantage */
79 }
80
81 if (dist_test < data->dist) {
82 data->dist = dist_test;
83
84 data->bp = bp;
85 data->bezt = bezt;
86 data->nurb = nu;
87 data->hpoint = bezt ? beztindex : 0;
88 data->is_changed = true;
89 }
90
91 UNUSED_VARS_NDEBUG(handles_visible);
92}
93
95 const bool select,
96 const int dist_px,
97 Nurb **r_nurb,
98 BezTriple **r_bezt,
99 BPoint **r_bp,
100 short *r_handle,
101 Base **r_base)
102{
103 PickUserData data{};
104
105 data.dist = dist_px;
106 data.hpoint = 0;
107 data.select = select ? SELECT : 0;
108 data.mval_fl[0] = vc->mval[0];
109 data.mval_fl[1] = vc->mval[1];
110
112 vc->scene, vc->view_layer, vc->v3d);
113 for (Base *base : bases) {
114 data.is_changed = false;
115
116 ED_view3d_viewcontext_init_object(vc, base->object);
119
120 if (r_base && data.is_changed) {
121 *r_base = base;
122 }
123 }
124
125 *r_nurb = data.nurb;
126 *r_bezt = data.bezt;
127 *r_bp = data.bp;
128
129 if (r_handle) {
130 *r_handle = data.hpoint;
131 }
132
133 return (data.bezt || data.bp);
134}
135
137 short sel,
138 Nurb **r_nurb,
139 BezTriple **r_bezt,
140 BPoint **r_bp,
141 short *r_handle,
142 Base **r_base)
143{
145 vc, sel, ED_view3d_select_dist_px(), r_nurb, r_bezt, r_bp, r_handle, r_base);
146}
147
150/* -------------------------------------------------------------------- */
155 Curve *cu, View3D *v3d, Nurb **r_nu, BezTriple **r_bezt, BPoint **r_bp)
156{
157 /* In nu and (bezt or bp) selected are written if there's 1 sel. */
158 /* If more points selected in 1 spline: return only nu, bezt and bp are 0. */
159 ListBase *editnurb = &cu->editnurb->nurbs;
160 BezTriple *bezt1;
161 BPoint *bp1;
162 int a;
163
164 *r_nu = nullptr;
165 *r_bezt = nullptr;
166 *r_bp = nullptr;
167
168 LISTBASE_FOREACH (Nurb *, nu1, editnurb) {
169 if (nu1->type == CU_BEZIER) {
170 bezt1 = nu1->bezt;
171 a = nu1->pntsu;
172 while (a--) {
173 if (BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt1)) {
174 if (!ELEM(*r_nu, nullptr, nu1)) {
175 *r_nu = nullptr;
176 *r_bp = nullptr;
177 *r_bezt = nullptr;
178 return;
179 }
180
181 if (*r_bezt || *r_bp) {
182 *r_bp = nullptr;
183 *r_bezt = nullptr;
184 }
185 else {
186 *r_bezt = bezt1;
187 *r_nu = nu1;
188 }
189 }
190 bezt1++;
191 }
192 }
193 else {
194 bp1 = nu1->bp;
195 a = nu1->pntsu * nu1->pntsv;
196 while (a--) {
197 if (bp1->f1 & SELECT) {
198 if (!ELEM(*r_nu, nullptr, nu1)) {
199 *r_bp = nullptr;
200 *r_bezt = nullptr;
201 *r_nu = nullptr;
202 return;
203 }
204
205 if (*r_bezt || *r_bp) {
206 *r_bp = nullptr;
207 *r_bezt = nullptr;
208 }
209 else {
210 *r_bp = bp1;
211 *r_nu = nu1;
212 }
213 }
214 bp1++;
215 }
216 }
217 }
218}
219
220bool ED_curve_active_center(Curve *cu, float center[3])
221{
222 Nurb *nu = nullptr;
223 void *vert = nullptr;
224
225 if (!BKE_curve_nurb_vert_active_get(cu, &nu, &vert)) {
226 return false;
227 }
228
229 if (nu->type == CU_BEZIER) {
230 BezTriple *bezt = (BezTriple *)vert;
231 copy_v3_v3(center, bezt->vec[1]);
232 }
233 else {
234 BPoint *bp = (BPoint *)vert;
235 copy_v3_v3(center, bp->vec);
236 }
237
238 return true;
239}
240
bool BKE_curve_nurb_vert_active_get(Curve *cu, Nurb **r_nu, void **r_vert)
Definition curve.cc:5038
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:50
#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(...)
#define BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)
@ CU_BEZIER
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:296
void ED_view3d_viewcontext_init_object(ViewContext *vc, Object *obact)
Read Guarded memory(de)allocation.
#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)
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])
static void ED_curve_pick_vert__do_closest(void *user_data, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, bool handles_visible, const float screen_co[2])
ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b)
unsigned char uint8_t
Definition stdint.h:78
uint8_t f1
float vec[4]
float vec[3][3]
EditNurb * editnurb
ListBase nurbs
short type
BezTriple * bezt
RegionView3D * rv3d
Definition ED_view3d.hh:76
int mval[2]
Definition ED_view3d.hh:78
Scene * scene
Definition ED_view3d.hh:69
ViewLayer * view_layer
Definition ED_view3d.hh:70
View3D * v3d
Definition ED_view3d.hh:74
Object * obedit
Definition ED_view3d.hh:72
uint8_t flag
Definition wm_window.cc:138