diff options
Diffstat (limited to 'source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c')
-rw-r--r-- | source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c | 484 |
1 files changed, 329 insertions, 155 deletions
diff --git a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c index b8ee1722cb3..b2d3a2e1576 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c @@ -27,11 +27,14 @@ * \brief Snap gizmo which exposes the location, normal and index in the props. */ +#include "BLI_listbase.h" #include "BLI_math.h" #include "DNA_scene_types.h" #include "BKE_context.h" +#include "BKE_global.h" +#include "BKE_main.h" #include "GPU_immediate.h" #include "GPU_state.h" @@ -57,11 +60,6 @@ typedef struct SnapGizmo3D { wmGizmo gizmo; - PropertyRNA *prop_prevpoint; - PropertyRNA *prop_location; - PropertyRNA *prop_normal; - PropertyRNA *prop_elem_index; - PropertyRNA *prop_snap_force; /* We could have other snap contexts, for now only support 3D view. */ SnapObjectContext *snap_context_v3d; @@ -70,7 +68,9 @@ typedef struct SnapGizmo3D { struct { int x; int y; +#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK short shift, ctrl, alt, oskey; +#endif } last_eventstate; #ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK @@ -78,8 +78,18 @@ typedef struct SnapGizmo3D { int snap_on; bool invert_snap; #endif - int use_snap_override; + + /* Setup. */ + eSnapGizmo flag; + float *prevpoint; + float prevpoint_stack[3]; + short snap_elem_force; + + /* Return values. */ short snap_elem; + float loc[3]; + float nor[3]; + int elem_index[3]; /** Enabled when snap is activated, even if it didn't find anything. */ bool is_enabled; @@ -91,28 +101,30 @@ static bool eventstate_has_changed(SnapGizmo3D *snap_gizmo, const wmWindowManage if (wm && wm->winactive) { const wmEvent *event = wm->winactive->eventstate; if ((event->x != snap_gizmo->last_eventstate.x) || - (event->y != snap_gizmo->last_eventstate.y) || - (event->ctrl != snap_gizmo->last_eventstate.ctrl) || - (event->shift != snap_gizmo->last_eventstate.shift) || - (event->alt != snap_gizmo->last_eventstate.alt) || - (event->oskey != snap_gizmo->last_eventstate.oskey)) { + (event->y != snap_gizmo->last_eventstate.y)) { return true; } +#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK + if (!(snap_gizmo->flag & ED_SNAPGIZMO_TOGGLE_ALWAYS_TRUE)) { + if ((event->ctrl != snap_gizmo->last_eventstate.ctrl) || + (event->shift != snap_gizmo->last_eventstate.shift) || + (event->alt != snap_gizmo->last_eventstate.alt) || + (event->oskey != snap_gizmo->last_eventstate.oskey)) { + return true; + } + } +#endif } return false; } /* Copies the current eventstate. */ -static void eventstate_save(SnapGizmo3D *snap_gizmo, const wmWindowManager *wm) +static void eventstate_save_xy(SnapGizmo3D *snap_gizmo, const wmWindowManager *wm) { if (wm && wm->winactive) { const wmEvent *event = wm->winactive->eventstate; snap_gizmo->last_eventstate.x = event->x; snap_gizmo->last_eventstate.y = event->y; - snap_gizmo->last_eventstate.ctrl = event->ctrl; - snap_gizmo->last_eventstate.shift = event->shift; - snap_gizmo->last_eventstate.alt = event->alt; - snap_gizmo->last_eventstate.oskey = event->oskey; } } @@ -132,11 +144,12 @@ static bool invert_snap(SnapGizmo3D *snap_gizmo, const wmWindowManager *wm) return snap_gizmo->invert_snap; } - if (snap_gizmo->keymap == NULL) { - /* Lazy initialization. */ - snap_gizmo->keymap = WM_modalkeymap_find(wm->defaultconf, "Generic Gizmo Tweak Modal Map"); - RNA_enum_value_from_id(snap_gizmo->keymap->modal_items, "SNAP_ON", &snap_gizmo->snap_on); - } + /* Save new eventstate. */ + snap_gizmo->last_eventstate.ctrl = event->ctrl; + snap_gizmo->last_eventstate.shift = event->shift; + snap_gizmo->last_eventstate.alt = event->alt; + snap_gizmo->last_eventstate.oskey = event->oskey; + const int snap_on = snap_gizmo->snap_on; wmKeyMap *keymap = WM_keymap_active(wm, snap_gizmo->keymap); @@ -158,6 +171,19 @@ static bool invert_snap(SnapGizmo3D *snap_gizmo, const wmWindowManager *wm) } #endif +static short snap_gizmo_snap_elements(SnapGizmo3D *snap_gizmo) +{ + int snap_elements = snap_gizmo->snap_elem_force; + + wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(&snap_gizmo->gizmo, "snap_elements"); + if (gz_prop->prop) { + snap_elements |= RNA_property_enum_get(&gz_prop->ptr, gz_prop->prop); + } + snap_elements &= (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE | + SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR); + return (ushort)snap_elements; +} + /* -------------------------------------------------------------------- */ /** \name ED_gizmo_library specific API * \{ */ @@ -265,26 +291,32 @@ SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(Scene *scene, return snap_gizmo->snap_context_v3d; } -bool ED_gizmotypes_snap_3d_invert_snap_get(struct wmGizmo *gz) +void ED_gizmotypes_snap_3d_flag_set(struct wmGizmo *gz, eSnapGizmo flag) { -#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; - return snap_gizmo->invert_snap; -#else - return false; -#endif + snap_gizmo->flag |= flag; } -void ED_gizmotypes_snap_3d_toggle_set(wmGizmo *gz, bool enable) +void ED_gizmotypes_snap_3d_flag_clear(struct wmGizmo *gz, eSnapGizmo flag) { SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; - snap_gizmo->use_snap_override = (int)enable; + snap_gizmo->flag &= ~flag; } -void ED_gizmotypes_snap_3d_toggle_clear(wmGizmo *gz) +bool ED_gizmotypes_snap_3d_flag_test(struct wmGizmo *gz, eSnapGizmo flag) { SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; - snap_gizmo->use_snap_override = -1; + return (snap_gizmo->flag & flag) != 0; +} + +bool ED_gizmotypes_snap_3d_invert_snap_get(struct wmGizmo *gz) +{ +#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK + SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; + return snap_gizmo->invert_snap; +#else + return false; +#endif } bool ED_gizmotypes_snap_3d_is_enabled(wmGizmo *gz) @@ -298,29 +330,17 @@ short ED_gizmotypes_snap_3d_update(wmGizmo *gz, const ARegion *region, const View3D *v3d, const wmWindowManager *wm, - const float mval_fl[2], - float r_loc[3], - float r_nor[3]) + const float mval_fl[2]) { SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; snap_gizmo->is_enabled = false; - if (snap_gizmo->use_snap_override != -1) { - if (snap_gizmo->use_snap_override == false) { - snap_gizmo->snap_elem = 0; - return 0; - } - } - -#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK - snap_gizmo->invert_snap = invert_snap(snap_gizmo, wm); -#endif - - eventstate_save(snap_gizmo, wm); Scene *scene = DEG_get_input_scene(depsgraph); #ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK - if (snap_gizmo->use_snap_override == -1) { + if (!(snap_gizmo->flag & ED_SNAPGIZMO_TOGGLE_ALWAYS_TRUE)) { + snap_gizmo->invert_snap = invert_snap(snap_gizmo, wm); + const ToolSettings *ts = scene->toolsettings; if (snap_gizmo->invert_snap != !(ts->snap_flag & SCE_SNAP)) { snap_gizmo->snap_elem = 0; @@ -328,6 +348,7 @@ short ED_gizmotypes_snap_3d_update(wmGizmo *gz, } } #endif + eventstate_save_xy(snap_gizmo, wm); snap_gizmo->is_enabled = true; @@ -336,43 +357,50 @@ short ED_gizmotypes_snap_3d_update(wmGizmo *gz, int snap_elem_index[3] = {-1, -1, -1}; int index = -1; - wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, "snap_elements"); - int snap_elements = RNA_property_enum_get(&gz_prop->ptr, gz_prop->prop); - if (gz_prop->prop != snap_gizmo->prop_snap_force) { - int snap_elements_force = RNA_property_enum_get(gz->ptr, snap_gizmo->prop_snap_force); - snap_elements |= snap_elements_force; - } - snap_elements &= (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE | - SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR); + ushort snap_elements = snap_gizmo_snap_elements(snap_gizmo); if (snap_elements) { float prev_co[3] = {0.0f}; - if (RNA_property_is_set(gz->ptr, snap_gizmo->prop_prevpoint)) { - RNA_property_float_get_array(gz->ptr, snap_gizmo->prop_prevpoint, prev_co); + if (snap_gizmo->prevpoint) { + copy_v3_v3(prev_co, snap_gizmo->prevpoint); } else { snap_elements &= ~SCE_SNAP_MODE_EDGE_PERPENDICULAR; } + eSnapSelect snap_select = (snap_gizmo->flag & ED_SNAPGIZMO_SNAP_ONLY_ACTIVE) ? + SNAP_ONLY_ACTIVE : + SNAP_ALL; + + eSnapEditType edit_mode_type = (snap_gizmo->flag & ED_SNAPGIZMO_SNAP_EDIT_GEOM_FINAL) ? + SNAP_GEOM_FINAL : + (snap_gizmo->flag & ED_SNAPGIZMO_SNAP_EDIT_GEOM_CAGE) ? + SNAP_GEOM_CAGE : + SNAP_GEOM_EDIT; + + bool use_occlusion_test = (snap_gizmo->flag & ED_SNAPGIZMO_OCCLUSION_ALWAYS_TRUE) ? false : + true; + float dist_px = 12.0f * U.pixelsize; ED_gizmotypes_snap_3d_context_ensure(scene, region, v3d, gz); - snap_elem = ED_transform_snap_object_project_view3d_ex(snap_gizmo->snap_context_v3d, - depsgraph, - snap_elements, - &(const struct SnapObjectParams){ - .snap_select = SNAP_ALL, - .use_object_edit_cage = true, - .use_occlusion_test = true, - }, - mval_fl, - prev_co, - &dist_px, - co, - no, - &index, - NULL, - NULL); + snap_elem = ED_transform_snap_object_project_view3d_ex( + snap_gizmo->snap_context_v3d, + depsgraph, + snap_elements, + &(const struct SnapObjectParams){ + .snap_select = snap_select, + .edit_mode_type = edit_mode_type, + .use_occlusion_test = use_occlusion_test, + }, + mval_fl, + prev_co, + &dist_px, + co, + no, + &index, + NULL, + NULL); } if (snap_elem == 0) { @@ -392,45 +420,166 @@ short ED_gizmotypes_snap_3d_update(wmGizmo *gz, } snap_gizmo->snap_elem = snap_elem; - RNA_property_float_set_array(gz->ptr, snap_gizmo->prop_location, co); - RNA_property_float_set_array(gz->ptr, snap_gizmo->prop_normal, no); - RNA_property_int_set_array(gz->ptr, snap_gizmo->prop_elem_index, snap_elem_index); + copy_v3_v3(snap_gizmo->loc, co); + copy_v3_v3(snap_gizmo->nor, no); + copy_v3_v3_int(snap_gizmo->elem_index, snap_elem_index); + + return snap_elem; +} +void ED_gizmotypes_snap_3d_data_get( + wmGizmo *gz, float r_loc[3], float r_nor[3], int r_elem_index[3], int *r_snap_elem) +{ + SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; + BLI_assert(snap_gizmo->is_enabled); if (r_loc) { - copy_v3_v3(r_loc, co); + copy_v3_v3(r_loc, snap_gizmo->loc); } - if (r_nor) { - copy_v3_v3(r_nor, no); + copy_v3_v3(r_nor, snap_gizmo->nor); + } + if (r_elem_index) { + copy_v3_v3_int(r_elem_index, snap_gizmo->elem_index); + } + if (r_snap_elem) { + *r_snap_elem = snap_gizmo->snap_elem; } - - return snap_elem; } /** \} */ /* -------------------------------------------------------------------- */ -/** \name GIZMO_GT_snap_3d +/** \name RNA callbacks * \{ */ -static void snap_gizmo_setup(wmGizmo *gz) +/* Based on 'rna_GizmoProperties_find_operator'. */ +static struct SnapGizmo3D *gizmo_snap_rna_find_operator(PointerRNA *ptr) { - SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; + IDProperty *properties = ptr->data; + for (bScreen *screen = G_MAIN->screens.first; screen; screen = screen->id.next) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + if (area->spacetype != SPACE_VIEW3D) { + continue; + } + LISTBASE_FOREACH (ARegion *, region, &area->regionbase) { + if (region->regiontype == RGN_TYPE_WINDOW && region->gizmo_map) { + wmGizmoMap *gzmap = region->gizmo_map; + LISTBASE_FOREACH (wmGizmoGroup *, gzgroup, WM_gizmomap_group_list(gzmap)) { + LISTBASE_FOREACH (wmGizmo *, gz, &gzgroup->gizmos) { + if (gz->properties == properties) { + return (SnapGizmo3D *)gz; + } + } + } + } + } + } + } + return NULL; +} + +static int gizmo_snap_rna_snap_elements_force_get_fn(struct PointerRNA *ptr, + struct PropertyRNA *UNUSED(prop)) +{ + SnapGizmo3D *snap_gizmo = gizmo_snap_rna_find_operator(ptr); + if (snap_gizmo) { + return snap_gizmo->snap_elem_force; + } + return 0; +} + +static void gizmo_snap_rna_snap_elements_force_set_fn(struct PointerRNA *ptr, + struct PropertyRNA *UNUSED(prop), + int value) +{ + SnapGizmo3D *snap_gizmo = gizmo_snap_rna_find_operator(ptr); + if (snap_gizmo) { + snap_gizmo->snap_elem_force = (short)value; + } +} + +static void gizmo_snap_rna_prevpoint_get_fn(struct PointerRNA *ptr, + struct PropertyRNA *UNUSED(prop), + float *values) +{ + SnapGizmo3D *snap_gizmo = gizmo_snap_rna_find_operator(ptr); + if (snap_gizmo) { + copy_v3_v3(values, snap_gizmo->prevpoint_stack); + } +} - /* For quick access to the props. */ - snap_gizmo->prop_prevpoint = RNA_struct_find_property(gz->ptr, "prev_point"); - snap_gizmo->prop_location = RNA_struct_find_property(gz->ptr, "location"); - snap_gizmo->prop_normal = RNA_struct_find_property(gz->ptr, "normal"); - snap_gizmo->prop_elem_index = RNA_struct_find_property(gz->ptr, "snap_elem_index"); - snap_gizmo->prop_snap_force = RNA_struct_find_property(gz->ptr, "snap_elements_force"); +static void gizmo_snap_rna_prevpoint_set_fn(struct PointerRNA *ptr, + struct PropertyRNA *UNUSED(prop), + const float *values) +{ + SnapGizmo3D *snap_gizmo = gizmo_snap_rna_find_operator(ptr); + if (snap_gizmo) { + if (values) { + copy_v3_v3(snap_gizmo->prevpoint_stack, values); + snap_gizmo->prevpoint = snap_gizmo->prevpoint_stack; + } + else { + snap_gizmo->prevpoint = NULL; + } + } +} - snap_gizmo->use_snap_override = -1; +static void gizmo_snap_rna_location_get_fn(struct PointerRNA *ptr, + struct PropertyRNA *UNUSED(prop), + float *values) +{ + SnapGizmo3D *snap_gizmo = gizmo_snap_rna_find_operator(ptr); + if (snap_gizmo) { + copy_v3_v3(values, snap_gizmo->loc); + } +} - /* Prop fallback. */ - WM_gizmo_target_property_def_rna(gz, "snap_elements", gz->ptr, "snap_elements_force", -1); +static void gizmo_snap_rna_location_set_fn(struct PointerRNA *ptr, + struct PropertyRNA *UNUSED(prop), + const float *values) +{ + SnapGizmo3D *snap_gizmo = gizmo_snap_rna_find_operator(ptr); + if (snap_gizmo) { + copy_v3_v3(snap_gizmo->loc, values); + } +} - /* Flags. */ +static void gizmo_snap_rna_normal_get_fn(struct PointerRNA *ptr, + struct PropertyRNA *UNUSED(prop), + float *values) +{ + SnapGizmo3D *snap_gizmo = gizmo_snap_rna_find_operator(ptr); + if (snap_gizmo) { + copy_v3_v3(values, snap_gizmo->nor); + } +} + +static void gizmo_snap_rna_snap_elem_index_get_fn(struct PointerRNA *ptr, + struct PropertyRNA *UNUSED(prop), + int *values) +{ + SnapGizmo3D *snap_gizmo = gizmo_snap_rna_find_operator(ptr); + if (snap_gizmo) { + copy_v3_v3_int(values, snap_gizmo->elem_index); + } +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name GIZMO_GT_snap_3d + * \{ */ + +static void snap_gizmo_setup(wmGizmo *gz) +{ gz->flag |= WM_GIZMO_NO_TOOLTIP; + +#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK + SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; + snap_gizmo->keymap = WM_modalkeymap_find(gz->parent_gzgroup->type->keyconf, + "Generic Gizmo Tweak Modal Map"); + RNA_enum_value_from_id(snap_gizmo->keymap->modal_items, "SNAP_ON", &snap_gizmo->snap_on); +#endif } static void snap_gizmo_draw(const bContext *C, wmGizmo *gz) @@ -455,42 +604,50 @@ static void snap_gizmo_draw(const bContext *C, wmGizmo *gz) return; } - float location[3], prev_point_stack[3], *prev_point = NULL; uchar color_line[4], color_point[4]; - - RNA_property_float_get_array(gz->ptr, snap_gizmo->prop_location, location); - UI_GetThemeColor3ubv(TH_TRANSFORM, color_line); color_line[3] = 128; rgba_float_to_uchar(color_point, gz->color); - if (RNA_property_is_set(gz->ptr, snap_gizmo->prop_prevpoint)) { - RNA_property_float_get_array(gz->ptr, snap_gizmo->prop_prevpoint, prev_point_stack); - prev_point = prev_point_stack; - } - GPU_line_smooth(false); GPU_line_width(1.0f); + + const float *prev_point = (snap_gizmo_snap_elements(snap_gizmo) & + SCE_SNAP_MODE_EDGE_PERPENDICULAR) ? + snap_gizmo->prevpoint : + NULL; + ED_gizmotypes_snap_3d_draw_util( - rv3d, prev_point, location, NULL, color_line, color_point, snap_gizmo->snap_elem); + rv3d, prev_point, snap_gizmo->loc, NULL, color_line, color_point, snap_gizmo->snap_elem); } static int snap_gizmo_test_select(bContext *C, wmGizmo *gz, const int mval[2]) { SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz; wmWindowManager *wm = CTX_wm_manager(C); + ARegion *region = CTX_wm_region(C); + + /* FIXME: this hack is to ignore drag events, otherwise drag events + * cause momentary snap gizmo re-positioning at the drag-start location, see: T87511. */ + if (wm && wm->winactive) { + const wmEvent *event = wm->winactive->eventstate; + int mval_compare[2] = {event->x - region->winrct.xmin, event->y - region->winrct.ymin}; + if (!equals_v2v2_int(mval_compare, mval)) { + return snap_gizmo->snap_elem ? 0 : -1; + } + } + if (!eventstate_has_changed(snap_gizmo, wm)) { /* Performance, do not update. */ return snap_gizmo->snap_elem ? 0 : -1; } - ARegion *region = CTX_wm_region(C); View3D *v3d = CTX_wm_view3d(C); const float mval_fl[2] = {UNPACK2(mval)}; short snap_elem = ED_gizmotypes_snap_3d_update( - gz, CTX_data_ensure_evaluated_depsgraph(C), region, v3d, wm, mval_fl, NULL, NULL); + gz, CTX_data_ensure_evaluated_depsgraph(C), region, v3d, wm, mval_fl); if (snap_elem) { ED_region_tag_redraw_editor_overlays(region); @@ -553,57 +710,74 @@ static void GIZMO_GT_snap_3d(wmGizmoType *gzt) } /* Setup. */ - RNA_def_enum_flag(gzt->srna, - "snap_elements_force", - rna_enum_snap_element_items, - SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE, - "Snap Elements", - ""); - - RNA_def_float_vector(gzt->srna, - "prev_point", - 3, - NULL, - FLT_MIN, - FLT_MAX, - "Previous Point", - "Point that defines the location of the perpendicular snap", - FLT_MIN, - FLT_MAX); + PropertyRNA *prop; + prop = RNA_def_enum_flag(gzt->srna, + "snap_elements_force", + rna_enum_snap_element_items, + SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE, + "Snap Elements", + ""); + + RNA_def_property_enum_funcs_runtime(prop, + gizmo_snap_rna_snap_elements_force_get_fn, + gizmo_snap_rna_snap_elements_force_set_fn, + NULL); + + prop = RNA_def_float_array(gzt->srna, + "prev_point", + 3, + NULL, + FLT_MIN, + FLT_MAX, + "Previous Point", + "Point that defines the location of the perpendicular snap", + FLT_MIN, + FLT_MAX); + + RNA_def_property_float_array_funcs_runtime( + prop, gizmo_snap_rna_prevpoint_get_fn, gizmo_snap_rna_prevpoint_set_fn, NULL); /* Returns. */ - RNA_def_float_vector(gzt->srna, - "location", - 3, - NULL, - FLT_MIN, - FLT_MAX, - "Location", - "Snap Point Location", - FLT_MIN, - FLT_MAX); - - RNA_def_float_vector(gzt->srna, - "normal", - 3, - NULL, - FLT_MIN, - FLT_MAX, - "Normal", - "Snap Point Normal", - FLT_MIN, - FLT_MAX); - - RNA_def_int_vector(gzt->srna, - "snap_elem_index", - 3, - NULL, - INT_MIN, - INT_MAX, - "Snap Element", - "Array index of face, edge and vert snapped", - INT_MIN, - INT_MAX); + prop = RNA_def_float_translation(gzt->srna, + "location", + 3, + NULL, + FLT_MIN, + FLT_MAX, + "Location", + "Snap Point Location", + FLT_MIN, + FLT_MAX); + + RNA_def_property_float_array_funcs_runtime( + prop, gizmo_snap_rna_location_get_fn, gizmo_snap_rna_location_set_fn, NULL); + + prop = RNA_def_float_vector_xyz(gzt->srna, + "normal", + 3, + NULL, + FLT_MIN, + FLT_MAX, + "Normal", + "Snap Point Normal", + FLT_MIN, + FLT_MAX); + + RNA_def_property_float_array_funcs_runtime(prop, gizmo_snap_rna_normal_get_fn, NULL, NULL); + + prop = RNA_def_int_vector(gzt->srna, + "snap_elem_index", + 3, + NULL, + INT_MIN, + INT_MAX, + "Snap Element", + "Array index of face, edge and vert snapped", + INT_MIN, + INT_MAX); + + RNA_def_property_int_array_funcs_runtime( + prop, gizmo_snap_rna_snap_elem_index_get_fn, NULL, NULL); /* Read/Write. */ WM_gizmotype_target_property_def(gzt, "snap_elements", PROP_ENUM, 1); |