Blender V4.3
snap3d_gizmo.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2020 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
15#include "MEM_guardedalloc.h"
16
17#include "BLI_math_color.h"
18#include "BLI_math_vector.h"
19
20#include "BKE_context.hh"
21
22#include "ED_gizmo_library.hh"
23#include "ED_screen.hh"
24#include "ED_view3d.hh"
25
26#include "RNA_access.hh"
27#include "RNA_define.hh"
28#include "RNA_prototypes.hh"
29
30#include "WM_api.hh"
31
32/* own includes */
34
40
41/* -------------------------------------------------------------------- */
49
51{
52 V3DSnapCursorState *snap_state = ((SnapGizmo3D *)gz)->snap_state;
53 snap_state->flag |= eV3DSnapCursor(flag);
54}
55
57{
59 return snap_data->is_enabled;
60}
61
63 wmGizmo *gz,
64 float r_loc[3],
65 float r_nor[3],
66 int r_elem_index[3],
67 eSnapMode *r_snap_elem)
68{
69 if (C) {
70 /* Snap values are updated too late at the cursor. Be sure to update ahead of time. */
71 const wmEvent *event = CTX_wm_window(C)->eventstate;
72 if (event) {
73 ARegion *region = CTX_wm_region(C);
74 int x = event->xy[0] - region->winrct.xmin;
75 int y = event->xy[1] - region->winrct.ymin;
76
77 SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
78 ED_view3d_cursor_snap_data_update(snap_gizmo->snap_state, C, region, x, y);
79 }
80 }
81
83
84 if (r_loc) {
85 copy_v3_v3(r_loc, snap_data->loc);
86 }
87 if (r_nor) {
88 copy_v3_v3(r_nor, snap_data->nor);
89 }
90 if (r_elem_index) {
91 copy_v3_v3_int(r_elem_index, snap_data->elem_index);
92 }
93 if (r_snap_elem) {
94 *r_snap_elem = snap_data->type_target;
95 }
96}
97
100/* -------------------------------------------------------------------- */
109
111{
113 if (snap_gizmo) {
114 return snap_gizmo->snap_state;
115 }
116
118}
119
120static void gizmo_snap_rna_prevpoint_get_fn(PointerRNA *ptr, PropertyRNA * /*prop*/, float *values)
121{
123 if (snap_state->prevpoint) {
124 copy_v3_v3(values, snap_state->prevpoint);
125 }
126}
127
129 PropertyRNA * /*prop*/,
130 const float *values)
131{
134}
135
137 PropertyRNA * /*prop*/,
138 float *values)
139{
141 copy_v3_v3(values, snap_data->loc);
142}
143
145 PropertyRNA * /*prop*/,
146 const float *values)
147{
149 copy_v3_v3(snap_data->loc, values);
150}
151
153 PropertyRNA * /*prop*/,
154 float *values)
155{
157 copy_v3_v3(values, snap_data->nor);
158}
159
161 PropertyRNA * /*prop*/,
162 int *values)
163{
165 copy_v3_v3_int(values, snap_data->elem_index);
166}
167
169{
171 return int(snap_data->type_source);
172}
173
175 PropertyRNA * /*prop*/,
176 const int value)
177{
179 snap_data->type_source = (eSnapMode)value;
180}
181
184/* -------------------------------------------------------------------- */
188static void snap_cursor_free(SnapGizmo3D *snap_gizmo)
189{
190 if (snap_gizmo->snap_state) {
191 snap_gizmo->snap_state_stored = *snap_gizmo->snap_state;
193 snap_gizmo->snap_state = nullptr;
194 }
195}
196
197/* XXX: Delayed snap cursor removal. */
198static bool snap_cursor_poll(ARegion *region, void *data)
199{
200 SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)data;
201 if (!(snap_gizmo->gizmo.state & WM_GIZMO_STATE_HIGHLIGHT) &&
202 !(snap_gizmo->gizmo.flag & WM_GIZMO_DRAW_VALUE))
203 {
204 return false;
205 }
206
207 if (snap_gizmo->gizmo.flag & WM_GIZMO_HIDDEN) {
208 snap_cursor_free(snap_gizmo);
209 return false;
210 }
211
212 if (!WM_gizmomap_group_find_ptr(region->gizmo_map, snap_gizmo->gizmo.parent_gzgroup->type)) {
213 /* Wrong viewport. */
214 snap_cursor_free(snap_gizmo);
215 return false;
216 }
217 return true;
218}
219
222/* -------------------------------------------------------------------- */
226static void snap_gizmo_setup(wmGizmo *gz)
227{
229
230 SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
232 snap_gizmo->snap_state->draw_point = true;
233 snap_gizmo->snap_state->draw_plane = false;
234 snap_gizmo->snap_state->poll = snap_cursor_poll;
235 snap_gizmo->snap_state->poll_data = snap_gizmo;
236
237 snap_gizmo->snap_state_stored = *snap_gizmo->snap_state;
238}
239
240static void snap_gizmo_draw(const bContext * /*C*/, wmGizmo *gz)
241{
242 SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
243 if (snap_gizmo->snap_state == nullptr) {
245 *snap_gizmo->snap_state = snap_gizmo->snap_state_stored;
246 }
247
248 /* All drawing is handled at the paint cursor.
249 * Therefore, make sure that the #V3DSnapCursorState is the one of the gizmo being drawn. */
251}
252
253static int snap_gizmo_test_select(bContext *C, wmGizmo *gz, const int mval[2])
254{
255 SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
256 const ARegion *region = CTX_wm_region(C);
257
258 /* Snap values are updated too late at the cursor. Be sure to update ahead of time. */
259 int x, y;
260 {
261 const wmEvent *event = CTX_wm_window(C)->eventstate;
262 if (event) {
263 x = event->xy[0] - region->winrct.xmin;
264 y = event->xy[1] - region->winrct.ymin;
265 }
266 else {
267 x = mval[0];
268 y = mval[1];
269 }
270 }
271 ED_view3d_cursor_snap_data_update(snap_gizmo->snap_state, C, region, x, y);
273
274 if (snap_data->type_target != SCE_SNAP_TO_NONE) {
275 return 0;
276 }
277 return -1;
278}
279
280static int snap_gizmo_modal(bContext * /*C*/,
281 wmGizmo * /*gz*/,
282 const wmEvent * /*event*/,
283 eWM_GizmoFlagTweak /*tweak_flag*/)
284{
286}
287
288static int snap_gizmo_invoke(bContext * /*C*/, wmGizmo * /*gz*/, const wmEvent * /*event*/)
289{
291}
292
293static void snap_gizmo_free(wmGizmo *gz)
294{
296}
297
299{
300 /* identifiers */
301 gzt->idname = "GIZMO_GT_snap_3d";
302
303 /* api callbacks */
304 gzt->setup = snap_gizmo_setup;
305 gzt->draw = snap_gizmo_draw;
307 gzt->modal = snap_gizmo_modal;
309 gzt->free = snap_gizmo_free;
310
311 gzt->struct_size = sizeof(SnapGizmo3D);
312
314 {
315 /* Get Snap Element Items enum. */
316 bool free;
317 PointerRNA toolsettings_ptr = RNA_pointer_create(nullptr, &RNA_ToolSettings, nullptr);
318 PropertyRNA *prop = RNA_struct_find_property(&toolsettings_ptr, "snap_elements");
320 nullptr, &toolsettings_ptr, prop, &rna_enum_snap_element_items, nullptr, &free);
321
322 BLI_assert(free == false);
323 }
324
325 /* Setup. */
326 PropertyRNA *prop;
327 prop = RNA_def_float_array(gzt->srna,
328 "prev_point",
329 3,
330 nullptr,
331 FLT_MIN,
332 FLT_MAX,
333 "Previous Point",
334 "Point that defines the location of the perpendicular snap",
335 FLT_MIN,
336 FLT_MAX);
339
340 /* Returns. */
342 "location",
343 3,
344 nullptr,
345 FLT_MIN,
346 FLT_MAX,
347 "Location",
348 "Snap Point Location",
349 FLT_MIN,
350 FLT_MAX);
353
354 prop = RNA_def_float_vector_xyz(gzt->srna,
355 "normal",
356 3,
357 nullptr,
358 FLT_MIN,
359 FLT_MAX,
360 "Normal",
361 "Snap Point Normal",
362 FLT_MIN,
363 FLT_MAX);
365
366 prop = RNA_def_int_vector(gzt->srna,
367 "snap_elem_index",
368 3,
369 nullptr,
370 INT_MIN,
371 INT_MAX,
372 "Snap Element",
373 "Array index of face, edge and vert snapped",
374 INT_MIN,
375 INT_MAX);
377 prop, gizmo_snap_rna_snap_elem_index_get_fn, nullptr, nullptr);
378
379 prop = RNA_def_enum(gzt->srna,
380 "snap_source_type",
383 "Snap Source Type",
384 "Snap Source type (influences drawing)");
388 nullptr);
389}
390
395
wmWindow * CTX_wm_window(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
#define BLI_assert(a)
Definition BLI_assert.h:50
void BLI_kdtree_nd_ free(KDTree *tree)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_v3_int(int r[3], const int a[3])
@ SCE_SNAP_TO_NONE
@ RGN_TYPE_WINDOW
@ SPACE_VIEW3D
@ OPERATOR_RUNNING_MODAL
void ED_view3d_cursor_snap_data_update(V3DSnapCursorState *state, const bContext *C, const ARegion *region, int x, int y)
V3DSnapCursorState * ED_view3d_cursor_snap_state_create()
V3DSnapCursorState * ED_view3d_cursor_snap_state_active_get()
void ED_view3d_cursor_snap_state_prevpoint_set(V3DSnapCursorState *state, const float prev_point[3])
eV3DSnapCursor
Definition ED_view3d.hh:316
void ED_view3d_cursor_snap_state_free(V3DSnapCursorState *state)
void ED_view3d_cursor_snap_state_active_set(V3DSnapCursorState *state)
SnapObjectContext * ED_view3d_cursor_snap_context_ensure(Scene *scene)
V3DSnapCursorData * ED_view3d_cursor_snap_data_get()
Read Guarded memory(de)allocation.
eWM_GizmoFlagTweak
Gizmo tweak flag. Bit-flag passed to gizmo while tweaking.
@ WM_GIZMO_HIDDEN
@ WM_GIZMO_DRAW_VALUE
@ WM_GIZMO_NO_TOOLTIP
@ WM_GIZMO_STATE_HIGHLIGHT
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
wmGizmo * gizmo_find_from_properties(const IDProperty *properties, const int spacetype, const int regionid)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const EnumPropertyItem **r_item, int *r_totitem, bool *r_free)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
PropertyRNA * RNA_def_float_translation(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
void RNA_def_property_enum_funcs_runtime(PropertyRNA *prop, EnumPropertyGetFunc getfunc, EnumPropertySetFunc setfunc, EnumPropertyItemFunc itemfunc)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_int_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const int *default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
PropertyRNA * RNA_def_float_vector_xyz(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_float_array(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
void RNA_def_property_int_array_funcs_runtime(PropertyRNA *prop, IntArrayPropertyGetFunc getfunc, IntArrayPropertySetFunc setfunc, IntPropertyRangeFunc rangefunc)
void RNA_def_property_float_array_funcs_runtime(PropertyRNA *prop, FloatArrayPropertyGetFunc getfunc, FloatArrayPropertySetFunc setfunc, FloatPropertyRangeFunc rangefunc)
const EnumPropertyItem rna_enum_snap_element_items[]
Definition rna_scene.cc:153
static void gizmo_snap_rna_snap_srouce_type_set_fn(PointerRNA *, PropertyRNA *, const int value)
static void snap_cursor_free(SnapGizmo3D *snap_gizmo)
static int snap_gizmo_modal(bContext *, wmGizmo *, const wmEvent *, eWM_GizmoFlagTweak)
static void gizmo_snap_rna_prevpoint_set_fn(PointerRNA *ptr, PropertyRNA *, const float *values)
static int gizmo_snap_rna_snap_srouce_type_get_fn(PointerRNA *, PropertyRNA *)
static int snap_gizmo_test_select(bContext *C, wmGizmo *gz, const int mval[2])
void ED_gizmotypes_snap_3d_data_get(const bContext *C, wmGizmo *gz, float r_loc[3], float r_nor[3], int r_elem_index[3], eSnapMode *r_snap_elem)
static void gizmo_snap_rna_normal_get_fn(PointerRNA *, PropertyRNA *, float *values)
bool ED_gizmotypes_snap_3d_is_enabled(const wmGizmo *)
static void snap_gizmo_free(wmGizmo *gz)
void ED_gizmotypes_snap_3d()
static void snap_gizmo_draw(const bContext *, wmGizmo *gz)
static V3DSnapCursorState * gizmo_snap_state_from_rna_get(PointerRNA *ptr)
SnapObjectContext * ED_gizmotypes_snap_3d_context_ensure(Scene *scene, wmGizmo *)
static void gizmo_snap_rna_location_get_fn(PointerRNA *, PropertyRNA *, float *values)
static void snap_gizmo_setup(wmGizmo *gz)
static int snap_gizmo_invoke(bContext *, wmGizmo *, const wmEvent *)
static bool snap_cursor_poll(ARegion *region, void *data)
static void gizmo_snap_rna_snap_elem_index_get_fn(PointerRNA *, PropertyRNA *, int *values)
static void gizmo_snap_rna_location_set_fn(PointerRNA *, PropertyRNA *, const float *values)
void ED_gizmotypes_snap_3d_flag_set(wmGizmo *gz, int flag)
static SnapGizmo3D * gizmo_snap_rna_find_operator(PointerRNA *ptr)
static void gizmo_snap_rna_prevpoint_get_fn(PointerRNA *ptr, PropertyRNA *, float *values)
static void GIZMO_GT_snap_3d(wmGizmoType *gzt)
#define FLT_MAX
Definition stdcycles.h:14
void * data
Definition RNA_types.hh:42
V3DSnapCursorState snap_state_stored
wmGizmo gizmo
V3DSnapCursorState * snap_state
eSnapMode type_target
Definition ED_view3d.hh:327
eSnapMode type_source
Definition ED_view3d.hh:326
eV3DSnapCursor flag
Definition ED_view3d.hh:341
bool(* poll)(ARegion *region, void *custom_poll_data)
Definition ED_view3d.hh:351
int xy[2]
Definition WM_types.hh:726
wmGizmoGroupType * type
StructRNA * srna
wmGizmoFnDraw draw
wmGizmoFnModal modal
wmGizmoFnSetup setup
const char * idname
wmGizmoFnTestSelect test_select
wmGizmoFnInvoke invoke
wmGizmoFnFree free
wmGizmoGroup * parent_gzgroup
eWM_GizmoFlagState state
eWM_GizmoFlag flag
struct wmEvent * eventstate
PointerRNA * ptr
Definition wm_files.cc:4126
wmGizmoGroup * WM_gizmomap_group_find_ptr(wmGizmoMap *gzmap, const wmGizmoGroupType *gzgt)
void WM_gizmotype_append(void(*gtfunc)(wmGizmoType *))
uint8_t flag
Definition wm_window.cc:138