Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.c484
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);