Blender  V3.3
snap3d_gizmo.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2020 Blender Foundation. All rights reserved. */
3 
14 #include "MEM_guardedalloc.h"
15 
16 #include "BLI_listbase.h"
17 #include "BLI_math.h"
18 
19 #include "BKE_context.h"
20 #include "BKE_global.h"
21 #include "BKE_main.h"
22 
23 #include "ED_gizmo_library.h"
24 #include "ED_screen.h"
26 #include "ED_view3d.h"
27 
28 #include "UI_resources.h"
29 
30 #include "RNA_access.h"
31 #include "RNA_define.h"
32 #include "RNA_prototypes.h"
33 
34 #include "WM_api.h"
35 
36 /* own includes */
37 #include "../gizmo_library_intern.h"
38 
39 typedef struct SnapGizmo3D {
43 
45 {
46  wmGizmoProperty *gz_prop_snap;
47  gz_prop_snap = WM_gizmo_target_property_find(&snap_gizmo->gizmo, "snap_elements");
48 
49  if (gz_prop_snap->prop) {
50  V3DSnapCursorState *snap_state = snap_gizmo->snap_state;
51  snap_state->snap_elem_force |= RNA_property_enum_get(&gz_prop_snap->ptr, gz_prop_snap->prop);
52  }
53 }
54 
55 /* -------------------------------------------------------------------- */
60 {
62 }
63 
64 void ED_gizmotypes_snap_3d_flag_set(struct wmGizmo *gz, int flag)
65 {
66  V3DSnapCursorState *snap_state = ((SnapGizmo3D *)gz)->snap_state;
67  snap_state->flag |= flag;
68 }
69 
70 void ED_gizmotypes_snap_3d_flag_clear(struct wmGizmo *gz, int flag)
71 {
72  V3DSnapCursorState *snap_state = ((SnapGizmo3D *)gz)->snap_state;
73  snap_state->flag &= ~flag;
74 }
75 
76 bool ED_gizmotypes_snap_3d_flag_test(struct wmGizmo *gz, int flag)
77 {
78  V3DSnapCursorState *snap_state = ((SnapGizmo3D *)gz)->snap_state;
79  return (snap_state->flag & flag) != 0;
80 }
81 
83 {
85  return snap_data->is_snap_invert;
86 }
87 
89 {
91  return snap_data->is_enabled;
92 }
93 
95  wmGizmo *gz,
96  float r_loc[3],
97  float r_nor[3],
98  int r_elem_index[3],
99  eSnapMode *r_snap_elem)
100 {
101  if (C) {
102  /* Snap values are updated too late at the cursor. Be sure to update ahead of time. */
104  const wmEvent *event = wm->winactive ? wm->winactive->eventstate : NULL;
105  if (event) {
106  ARegion *region = CTX_wm_region(C);
107  int x = event->xy[0] - region->winrct.xmin;
108  int y = event->xy[1] - region->winrct.ymin;
109 
110  SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
112  }
113  }
114 
116 
117  if (r_loc) {
118  copy_v3_v3(r_loc, snap_data->loc);
119  }
120  if (r_nor) {
121  copy_v3_v3(r_nor, snap_data->nor);
122  }
123  if (r_elem_index) {
124  copy_v3_v3_int(r_elem_index, snap_data->elem_index);
125  }
126  if (r_snap_elem) {
127  *r_snap_elem = snap_data->snap_elem;
128  }
129 }
130 
133 /* -------------------------------------------------------------------- */
137 /* Based on 'rna_GizmoProperties_find_operator'. */
139 {
140  IDProperty *properties = ptr->data;
141  for (bScreen *screen = G_MAIN->screens.first; screen; screen = screen->id.next) {
142  LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
143  if (area->spacetype != SPACE_VIEW3D) {
144  continue;
145  }
146  LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
147  if (region->regiontype == RGN_TYPE_WINDOW && region->gizmo_map) {
148  wmGizmoMap *gzmap = region->gizmo_map;
150  LISTBASE_FOREACH (wmGizmo *, gz, &gzgroup->gizmos) {
151  if (gz->properties == properties) {
152  return (SnapGizmo3D *)gz;
153  }
154  }
155  }
156  }
157  }
158  }
159  }
160  return NULL;
161 }
162 
164 {
166  if (snap_gizmo) {
167  return snap_gizmo->snap_state;
168  }
169 
171 }
172 
174  struct PropertyRNA *UNUSED(prop))
175 {
177  return snap_state->snap_elem_force;
178 }
179 
181  struct PropertyRNA *UNUSED(prop),
182  int value)
183 {
185  snap_state->snap_elem_force = (short)value;
186 }
187 
189  struct PropertyRNA *UNUSED(prop),
190  float *values)
191 {
193  if (snap_state->prevpoint) {
194  copy_v3_v3(values, snap_state->prevpoint);
195  }
196 }
197 
199  struct PropertyRNA *UNUSED(prop),
200  const float *values)
201 {
203  ED_view3d_cursor_snap_prevpoint_set(snap_state, values);
204 }
205 
207  struct PropertyRNA *UNUSED(prop),
208  float *values)
209 {
211  copy_v3_v3(values, snap_data->loc);
212 }
213 
215  struct PropertyRNA *UNUSED(prop),
216  const float *values)
217 {
219  copy_v3_v3(snap_data->loc, values);
220 }
221 
223  struct PropertyRNA *UNUSED(prop),
224  float *values)
225 {
227  copy_v3_v3(values, snap_data->nor);
228 }
229 
231  struct PropertyRNA *UNUSED(prop),
232  int *values)
233 {
235  copy_v3_v3_int(values, snap_data->elem_index);
236 }
237 
240 /* -------------------------------------------------------------------- */
244 static void snap_gizmo_setup(wmGizmo *gz)
245 {
246  gz->flag |= WM_GIZMO_NO_TOOLTIP;
247  SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
249  snap_gizmo->snap_state->gzgrp_type = gz->parent_gzgroup->type;
250  snap_gizmo->snap_state->draw_point = true;
251  snap_gizmo->snap_state->draw_plane = false;
252 
253  rgba_float_to_uchar(snap_gizmo->snap_state->color_point, gz->color);
254 }
255 
256 static void snap_gizmo_draw(const bContext *UNUSED(C), wmGizmo *UNUSED(gz))
257 {
258  /* All drawing is handled at the paint cursor. */
259 }
260 
261 static int snap_gizmo_test_select(bContext *C, wmGizmo *gz, const int mval[2])
262 {
263  SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
264 
265  /* Snap Elements can change while the gizmo is active. Need to be updated somewhere. */
267 
268  /* Snap values are updated too late at the cursor. Be sure to update ahead of time. */
269  int x, y;
270  {
272  const wmEvent *event = wm->winactive ? wm->winactive->eventstate : NULL;
273  if (event) {
274  ARegion *region = CTX_wm_region(C);
275  x = event->xy[0] - region->winrct.xmin;
276  y = event->xy[1] - region->winrct.ymin;
277  }
278  else {
279  x = mval[0];
280  y = mval[1];
281  }
282  }
285 
286  if (snap_data->snap_elem != SCE_SNAP_MODE_NONE) {
287  return 0;
288  }
289  return -1;
290 }
291 
293  wmGizmo *UNUSED(gz),
294  const wmEvent *UNUSED(event),
295  eWM_GizmoFlagTweak UNUSED(tweak_flag))
296 {
297  return OPERATOR_RUNNING_MODAL;
298 }
299 
301  wmGizmo *UNUSED(gz),
302  const wmEvent *UNUSED(event))
303 {
304  return OPERATOR_RUNNING_MODAL;
305 }
306 
307 static void snap_gizmo_free(wmGizmo *gz)
308 {
309  SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
310  if (snap_gizmo->snap_state) {
312  }
313 }
314 
315 static void GIZMO_GT_snap_3d(wmGizmoType *gzt)
316 {
317  /* identifiers */
318  gzt->idname = "GIZMO_GT_snap_3d";
319 
320  /* api callbacks */
321  gzt->setup = snap_gizmo_setup;
322  gzt->draw = snap_gizmo_draw;
324  gzt->modal = snap_gizmo_modal;
325  gzt->invoke = snap_gizmo_invoke;
326  gzt->free = snap_gizmo_free;
327 
328  gzt->struct_size = sizeof(SnapGizmo3D);
329 
331  {
332  /* Get Snap Element Items enum. */
333  bool free;
334  PointerRNA toolsettings_ptr;
335  RNA_pointer_create(NULL, &RNA_ToolSettings, NULL, &toolsettings_ptr);
336  PropertyRNA *prop = RNA_struct_find_property(&toolsettings_ptr, "snap_elements");
338  NULL, &toolsettings_ptr, prop, &rna_enum_snap_element_items, NULL, &free);
339 
340  BLI_assert(free == false);
341  }
342 
343  /* Setup. */
344  PropertyRNA *prop;
345  prop = RNA_def_enum_flag(gzt->srna,
346  "snap_elements_force",
349  "Snap Elements",
350  "");
354  NULL);
355 
356  prop = RNA_def_float_array(gzt->srna,
357  "prev_point",
358  3,
359  NULL,
360  FLT_MIN,
361  FLT_MAX,
362  "Previous Point",
363  "Point that defines the location of the perpendicular snap",
364  FLT_MIN,
365  FLT_MAX);
368 
369  /* Returns. */
370  prop = RNA_def_float_translation(gzt->srna,
371  "location",
372  3,
373  NULL,
374  FLT_MIN,
375  FLT_MAX,
376  "Location",
377  "Snap Point Location",
378  FLT_MIN,
379  FLT_MAX);
382 
383  prop = RNA_def_float_vector_xyz(gzt->srna,
384  "normal",
385  3,
386  NULL,
387  FLT_MIN,
388  FLT_MAX,
389  "Normal",
390  "Snap Point Normal",
391  FLT_MIN,
392  FLT_MAX);
394 
395  prop = RNA_def_int_vector(gzt->srna,
396  "snap_elem_index",
397  3,
398  NULL,
399  INT_MIN,
400  INT_MAX,
401  "Snap Element",
402  "Array index of face, edge and vert snapped",
403  INT_MIN,
404  INT_MAX);
407 
408  /* Read/Write. */
409  WM_gizmotype_target_property_def(gzt, "snap_elements", PROP_ENUM, 1);
410 }
411 
413 {
415 }
416 
struct wmWindowManager * CTX_wm_manager(const bContext *C)
Definition: context.c:713
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:749
#define G_MAIN
Definition: BKE_global.h:267
#define BLI_assert(a)
Definition: BLI_assert.h:46
void BLI_kdtree_nd_() free(KDTree *tree)
Definition: kdtree_impl.h:102
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
void rgba_float_to_uchar(unsigned char r_col[4], const float col_f[4])
Definition: math_color.c:396
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])
#define UNUSED(x)
eSnapMode
@ SCE_SNAP_MODE_VERTEX
@ SCE_SNAP_MODE_EDGE
@ SCE_SNAP_MODE_FACE_RAYCAST
@ SCE_SNAP_MODE_NONE
@ RGN_TYPE_WINDOW
@ SPACE_VIEW3D
@ OPERATOR_RUNNING_MODAL
void ED_view3d_cursor_snap_prevpoint_set(V3DSnapCursorState *state, const float prev_point[3])
V3DSnapCursorData * ED_view3d_cursor_snap_data_get(void)
void ED_view3d_cursor_snap_data_update(V3DSnapCursorState *state, const struct bContext *C, int x, int y)
struct SnapObjectContext * ED_view3d_cursor_snap_context_ensure(struct Scene *scene)
void ED_view3d_cursor_snap_deactive(V3DSnapCursorState *state)
V3DSnapCursorState * ED_view3d_cursor_snap_active(void)
V3DSnapCursorState * ED_view3d_cursor_snap_state_get(void)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
Read Guarded memory(de)allocation.
@ PROP_ENUM
Definition: RNA_types.h:63
#define C
Definition: RandGen.cpp:25
eWM_GizmoFlagTweak
Gizmo tweak flag. Bit-flag passed to gizmo while tweaking.
@ WM_GIZMO_NO_TOOLTIP
Scene scene
static void area(int d1, int d2, int e1, int e2, float weights[2])
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
Definition: rna_access.c:136
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:717
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
Definition: rna_access.c:3402
void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const EnumPropertyItem **r_item, int *r_totitem, bool *r_free)
Definition: rna_access.c:1495
PropertyRNA * RNA_def_enum_flag(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3806
PropertyRNA * RNA_def_float_array(StructOrFunctionRNA *cont_, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
Definition: rna_define.c:4076
void RNA_def_property_enum_funcs_runtime(PropertyRNA *prop, EnumPropertyGetFunc getfunc, EnumPropertySetFunc setfunc, EnumPropertyItemFunc itemfunc)
Definition: rna_define.c:3258
PropertyRNA * RNA_def_int_vector(StructOrFunctionRNA *cont_, const char *identifier, int len, const int *default_value, int hardmin, int hardmax, const char *ui_name, const char *ui_description, int softmin, int softmax)
Definition: rna_define.c:3623
PropertyRNA * RNA_def_float_translation(StructOrFunctionRNA *cont_, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
Definition: rna_define.c:3986
void RNA_def_property_int_array_funcs_runtime(PropertyRNA *prop, IntArrayPropertyGetFunc getfunc, IntArrayPropertySetFunc setfunc, IntPropertyRangeFunc rangefunc)
Definition: rna_define.c:3099
void RNA_def_property_float_array_funcs_runtime(PropertyRNA *prop, FloatArrayPropertyGetFunc getfunc, FloatArrayPropertySetFunc setfunc, FloatPropertyRangeFunc rangefunc)
Definition: rna_define.c:3197
PropertyRNA * RNA_def_float_vector_xyz(StructOrFunctionRNA *cont_, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
Definition: rna_define.c:3894
const EnumPropertyItem rna_enum_snap_element_items[]
Definition: rna_scene.c:146
bool ED_gizmotypes_snap_3d_invert_snap_get(struct wmGizmo *UNUSED(gz))
Definition: snap3d_gizmo.c:82
static void gizmo_snap_rna_snap_elements_force_set_fn(struct PointerRNA *ptr, struct PropertyRNA *UNUSED(prop), int value)
Definition: snap3d_gizmo.c:180
void ED_gizmotypes_snap_3d_flag_set(struct wmGizmo *gz, int flag)
Definition: snap3d_gizmo.c:64
static SnapGizmo3D * gizmo_snap_rna_find_operator(PointerRNA *ptr)
Definition: snap3d_gizmo.c:138
static V3DSnapCursorState * gizmo_snap_state_from_rna_get(struct PointerRNA *ptr)
Definition: snap3d_gizmo.c:163
bool ED_gizmotypes_snap_3d_flag_test(struct wmGizmo *gz, int flag)
Definition: snap3d_gizmo.c:76
static void gizmo_snap_rna_normal_get_fn(struct PointerRNA *UNUSED(ptr), struct PropertyRNA *UNUSED(prop), float *values)
Definition: snap3d_gizmo.c:222
static int gizmo_snap_rna_snap_elements_force_get_fn(struct PointerRNA *ptr, struct PropertyRNA *UNUSED(prop))
Definition: snap3d_gizmo.c:173
static int snap_gizmo_test_select(bContext *C, wmGizmo *gz, const int mval[2])
Definition: snap3d_gizmo.c:261
bool ED_gizmotypes_snap_3d_is_enabled(const wmGizmo *UNUSED(gz))
Definition: snap3d_gizmo.c:88
SnapObjectContext * ED_gizmotypes_snap_3d_context_ensure(Scene *scene, wmGizmo *UNUSED(gz))
Definition: snap3d_gizmo.c:59
static int snap_gizmo_invoke(bContext *UNUSED(C), wmGizmo *UNUSED(gz), const wmEvent *UNUSED(event))
Definition: snap3d_gizmo.c:300
static int snap_gizmo_modal(bContext *UNUSED(C), wmGizmo *UNUSED(gz), const wmEvent *UNUSED(event), eWM_GizmoFlagTweak UNUSED(tweak_flag))
Definition: snap3d_gizmo.c:292
void ED_gizmotypes_snap_3d_data_get(const struct bContext *C, wmGizmo *gz, float r_loc[3], float r_nor[3], int r_elem_index[3], eSnapMode *r_snap_elem)
Definition: snap3d_gizmo.c:94
void ED_gizmotypes_snap_3d_flag_clear(struct wmGizmo *gz, int flag)
Definition: snap3d_gizmo.c:70
static void snap_gizmo_snap_elements_update(SnapGizmo3D *snap_gizmo)
Definition: snap3d_gizmo.c:44
static void gizmo_snap_rna_location_get_fn(struct PointerRNA *UNUSED(ptr), struct PropertyRNA *UNUSED(prop), float *values)
Definition: snap3d_gizmo.c:206
static void snap_gizmo_free(wmGizmo *gz)
Definition: snap3d_gizmo.c:307
struct SnapGizmo3D SnapGizmo3D
static void gizmo_snap_rna_prevpoint_set_fn(struct PointerRNA *ptr, struct PropertyRNA *UNUSED(prop), const float *values)
Definition: snap3d_gizmo.c:198
void ED_gizmotypes_snap_3d(void)
Definition: snap3d_gizmo.c:412
static void gizmo_snap_rna_snap_elem_index_get_fn(struct PointerRNA *UNUSED(ptr), struct PropertyRNA *UNUSED(prop), int *values)
Definition: snap3d_gizmo.c:230
static void snap_gizmo_setup(wmGizmo *gz)
Definition: snap3d_gizmo.c:244
static void gizmo_snap_rna_prevpoint_get_fn(struct PointerRNA *ptr, struct PropertyRNA *UNUSED(prop), float *values)
Definition: snap3d_gizmo.c:188
static void gizmo_snap_rna_location_set_fn(struct PointerRNA *UNUSED(ptr), struct PropertyRNA *UNUSED(prop), const float *values)
Definition: snap3d_gizmo.c:214
static void snap_gizmo_draw(const bContext *UNUSED(C), wmGizmo *UNUSED(gz))
Definition: snap3d_gizmo.c:256
static void GIZMO_GT_snap_3d(wmGizmoType *gzt)
Definition: snap3d_gizmo.c:315
void * data
Definition: RNA_types.h:38
wmGizmo gizmo
Definition: snap3d_gizmo.c:40
V3DSnapCursorState * snap_state
Definition: snap3d_gizmo.c:41
eSnapMode snap_elem
Definition: ED_view3d.h:303
eV3DSnapCursor flag
Definition: ED_view3d.h:317
uchar color_point[4]
Definition: ED_view3d.h:321
struct wmGizmoGroupType * gzgrp_type
Definition: ED_view3d.h:323
eSnapMode snap_elem_force
Definition: ED_view3d.h:326
int ymin
Definition: DNA_vec_types.h:64
int xmin
Definition: DNA_vec_types.h:63
struct wmGizmoGroupType * type
PropertyRNA * prop
wmGizmoFnDraw draw
wmGizmoFnModal modal
wmGizmoFnSetup setup
const char * idname
wmGizmoFnTestSelect test_select
struct StructRNA * srna
wmGizmoFnInvoke invoke
wmGizmoFnFree free
struct wmGizmoGroup * parent_gzgroup
float color[4]
eWM_GizmoFlag flag
struct wmWindow * winactive
struct wmEvent * eventstate
PointerRNA * ptr
Definition: wm_files.c:3480
const ListBase * WM_gizmomap_group_list(wmGizmoMap *gzmap)
Definition: wm_gizmo_map.c:222
wmGizmoProperty * WM_gizmo_target_property_find(wmGizmo *gz, const char *idname)
void WM_gizmotype_target_property_def(wmGizmoType *gzt, const char *idname, int data_type, int array_length)
void WM_gizmotype_append(void(*gtfunc)(struct wmGizmoType *))
Definition: wm_gizmo_type.c:93