292 lines
9.9 KiB
C++
292 lines
9.9 KiB
C++
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
/** \file
|
|
* \ingroup wm
|
|
*
|
|
* \name Generic Gizmos.
|
|
*
|
|
* This is exposes predefined gizmos for re-use.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* initialize gizmos */
|
|
void ED_gizmotypes_arrow_3d(void);
|
|
void ED_gizmotypes_button_2d(void);
|
|
void ED_gizmotypes_cage_2d(void);
|
|
void ED_gizmotypes_cage_3d(void);
|
|
void ED_gizmotypes_dial_3d(void);
|
|
void ED_gizmotypes_move_3d(void);
|
|
void ED_gizmotypes_facemap_3d(void);
|
|
void ED_gizmotypes_preselect_3d(void);
|
|
void ED_gizmotypes_primitive_3d(void);
|
|
void ED_gizmotypes_blank_3d(void);
|
|
void ED_gizmotypes_snap_3d(void);
|
|
|
|
struct ARegion;
|
|
struct Depsgraph;
|
|
struct Object;
|
|
struct SnapObjectContext;
|
|
struct View3D;
|
|
struct bContext;
|
|
struct wmGizmo;
|
|
struct wmWindowManager;
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Shape Presets
|
|
*
|
|
* Intended to be called by custom draw functions.
|
|
*/
|
|
|
|
/* gizmo_library_presets.c */
|
|
void ED_gizmo_draw_preset_box(const struct wmGizmo *gz, float mat[4][4], int select_id);
|
|
void ED_gizmo_draw_preset_arrow(const struct wmGizmo *gz,
|
|
float mat[4][4],
|
|
int axis,
|
|
int select_id);
|
|
void ED_gizmo_draw_preset_circle(const struct wmGizmo *gz,
|
|
float mat[4][4],
|
|
int axis,
|
|
int select_id);
|
|
void ED_gizmo_draw_preset_facemap(const struct bContext *C,
|
|
const struct wmGizmo *gz,
|
|
struct Object *ob,
|
|
const int facemap,
|
|
int select_id);
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* 3D Arrow Gizmo */
|
|
|
|
enum {
|
|
ED_GIZMO_ARROW_STYLE_NORMAL = 0,
|
|
ED_GIZMO_ARROW_STYLE_CROSS = 1,
|
|
ED_GIZMO_ARROW_STYLE_BOX = 2,
|
|
ED_GIZMO_ARROW_STYLE_CONE = 3,
|
|
};
|
|
|
|
/* transform */
|
|
enum {
|
|
/* inverted offset during interaction - if set it also sets constrained below */
|
|
ED_GIZMO_ARROW_XFORM_FLAG_INVERTED = (1 << 3),
|
|
/* clamp arrow interaction to property width */
|
|
ED_GIZMO_ARROW_XFORM_FLAG_CONSTRAINED = (1 << 4),
|
|
};
|
|
|
|
/* draw_options */
|
|
enum {
|
|
/* Show arrow stem. */
|
|
ED_GIZMO_ARROW_DRAW_FLAG_STEM = (1 << 0),
|
|
};
|
|
|
|
void ED_gizmo_arrow3d_set_ui_range(struct wmGizmo *gz, const float min, const float max);
|
|
void ED_gizmo_arrow3d_set_range_fac(struct wmGizmo *gz, const float range_fac);
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Cage Gizmo */
|
|
|
|
enum {
|
|
ED_GIZMO_CAGE2D_XFORM_FLAG_TRANSLATE = (1 << 0), /* Translates */
|
|
ED_GIZMO_CAGE2D_XFORM_FLAG_ROTATE = (1 << 1), /* Rotates */
|
|
ED_GIZMO_CAGE2D_XFORM_FLAG_SCALE = (1 << 2), /* Scales */
|
|
ED_GIZMO_CAGE2D_XFORM_FLAG_SCALE_UNIFORM = (1 << 3), /* Scales uniformly */
|
|
ED_GIZMO_CAGE2D_XFORM_FLAG_SCALE_SIGNED = (1 << 4), /* Negative scale allowed */
|
|
};
|
|
|
|
/* draw_style */
|
|
enum {
|
|
ED_GIZMO_CAGE2D_STYLE_BOX = 0,
|
|
ED_GIZMO_CAGE2D_STYLE_CIRCLE = 1,
|
|
};
|
|
|
|
/* draw_options */
|
|
enum {
|
|
/** Draw a central handle (instead of having the entire area selectable)
|
|
* Needed for large rectangles that we don't want to swallow all events. */
|
|
ED_GIZMO_CAGE2D_DRAW_FLAG_XFORM_CENTER_HANDLE = (1 << 0),
|
|
};
|
|
|
|
/** #wmGizmo.highlight_part */
|
|
enum {
|
|
ED_GIZMO_CAGE2D_PART_TRANSLATE = 0,
|
|
ED_GIZMO_CAGE2D_PART_SCALE_MIN_X = 1,
|
|
ED_GIZMO_CAGE2D_PART_SCALE_MAX_X = 2,
|
|
ED_GIZMO_CAGE2D_PART_SCALE_MIN_Y = 3,
|
|
ED_GIZMO_CAGE2D_PART_SCALE_MAX_Y = 4,
|
|
/* Corners */
|
|
ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MIN_Y = 5,
|
|
ED_GIZMO_CAGE2D_PART_SCALE_MIN_X_MAX_Y = 6,
|
|
ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MIN_Y = 7,
|
|
ED_GIZMO_CAGE2D_PART_SCALE_MAX_X_MAX_Y = 8,
|
|
|
|
ED_GIZMO_CAGE2D_PART_ROTATE = 9,
|
|
};
|
|
|
|
/** #wmGizmo.highlight_part */
|
|
enum {
|
|
/* ordered min/mid/max so we can loop over values (MIN/MID/MAX) on each axis. */
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MIN_X_MIN_Y_MIN_Z = 0,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MIN_X_MIN_Y_MID_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MIN_X_MIN_Y_MAX_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MIN_X_MID_Y_MIN_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MIN_X_MID_Y_MID_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MIN_X_MID_Y_MAX_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MIN_X_MAX_Y_MIN_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MIN_X_MAX_Y_MID_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MIN_X_MAX_Y_MAX_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MID_X_MIN_Y_MIN_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MID_X_MIN_Y_MID_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MID_X_MIN_Y_MAX_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MID_X_MID_Y_MIN_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MID_X_MID_Y_MID_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MID_X_MID_Y_MAX_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MID_X_MAX_Y_MIN_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MID_X_MAX_Y_MID_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MID_X_MAX_Y_MAX_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MIN_Y_MIN_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MIN_Y_MID_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MIN_Y_MAX_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MID_Y_MIN_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MID_Y_MID_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MID_Y_MAX_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MAX_Y_MIN_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MAX_Y_MID_Z,
|
|
ED_GIZMO_CAGE3D_PART_SCALE_MAX_X_MAX_Y_MAX_Z,
|
|
|
|
ED_GIZMO_CAGE3D_PART_TRANSLATE,
|
|
|
|
ED_GIZMO_CAGE3D_PART_ROTATE,
|
|
};
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Dial Gizmo */
|
|
|
|
/* draw_options */
|
|
enum {
|
|
ED_GIZMO_DIAL_DRAW_FLAG_NOP = 0,
|
|
ED_GIZMO_DIAL_DRAW_FLAG_CLIP = (1 << 0),
|
|
ED_GIZMO_DIAL_DRAW_FLAG_FILL = (1 << 1),
|
|
ED_GIZMO_DIAL_DRAW_FLAG_FILL_SELECT = (1 << 2),
|
|
ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR = (1 << 3),
|
|
ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_START_Y = (1 << 4),
|
|
/* Always show the angle value as an arc in the dial. */
|
|
ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE = (1 << 5),
|
|
};
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Move Gizmo */
|
|
|
|
/* draw_options */
|
|
enum {
|
|
ED_GIZMO_MOVE_DRAW_FLAG_NOP = 0,
|
|
/* only for solid shapes */
|
|
ED_GIZMO_MOVE_DRAW_FLAG_FILL = (1 << 0),
|
|
ED_GIZMO_MOVE_DRAW_FLAG_FILL_SELECT = (1 << 1),
|
|
ED_GIZMO_MOVE_DRAW_FLAG_ALIGN_VIEW = (1 << 2),
|
|
};
|
|
|
|
enum {
|
|
ED_GIZMO_MOVE_STYLE_RING_2D = 0,
|
|
ED_GIZMO_MOVE_STYLE_CROSS_2D = 1,
|
|
};
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Button Gizmo */
|
|
|
|
enum {
|
|
ED_GIZMO_BUTTON_SHOW_OUTLINE = (1 << 0),
|
|
ED_GIZMO_BUTTON_SHOW_BACKDROP = (1 << 1),
|
|
/**
|
|
* Draw a line from the origin to the offset (similar to an arrow)
|
|
* sometimes needed to show what the button edits.
|
|
*/
|
|
ED_GIZMO_BUTTON_SHOW_HELPLINE = (1 << 2),
|
|
};
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Primitive Gizmo */
|
|
|
|
enum {
|
|
ED_GIZMO_PRIMITIVE_STYLE_PLANE = 0,
|
|
};
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
/* Specific gizmos utils */
|
|
|
|
/* dial3d_gizmo.c */
|
|
struct Dial3dParams {
|
|
int draw_options;
|
|
float angle_ofs;
|
|
float angle_delta;
|
|
float angle_increment;
|
|
float arc_partial_angle;
|
|
float arc_inner_factor;
|
|
float *clip_plane;
|
|
};
|
|
void ED_gizmotypes_dial_3d_draw_util(const float matrix_basis[4][4],
|
|
const float matrix_final[4][4],
|
|
const float line_width,
|
|
const float color[4],
|
|
const bool select,
|
|
struct Dial3dParams *params);
|
|
|
|
/* snap3d_gizmo.c */
|
|
#define USE_SNAP_DETECT_FROM_KEYMAP_HACK
|
|
void ED_gizmotypes_snap_3d_draw_util(struct RegionView3D *rv3d,
|
|
const float loc_prev[3],
|
|
const float loc_curr[3],
|
|
const float normal[3],
|
|
const uchar color_line[4],
|
|
const uchar color_point[4],
|
|
const short snap_elem_type);
|
|
struct SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(struct Scene *scene,
|
|
const struct ARegion *region,
|
|
const struct View3D *v3d,
|
|
struct wmGizmo *gz);
|
|
|
|
typedef enum {
|
|
ED_SNAPGIZMO_TOGGLE_ALWAYS_TRUE = 1 << 0,
|
|
ED_SNAPGIZMO_OCCLUSION_ALWAYS_TRUE = 1 << 1,
|
|
ED_SNAPGIZMO_OCCLUSION_ALWAYS_FALSE = 1 << 2, /* TODO. */
|
|
ED_SNAPGIZMO_SNAP_ONLY_ACTIVE = 1 << 3,
|
|
ED_SNAPGIZMO_SNAP_EDIT_GEOM_FINAL = 1 << 4,
|
|
ED_SNAPGIZMO_SNAP_EDIT_GEOM_CAGE = 1 << 5,
|
|
} eSnapGizmo;
|
|
|
|
void ED_gizmotypes_snap_3d_flag_set(struct wmGizmo *gz, eSnapGizmo flag);
|
|
void ED_gizmotypes_snap_3d_flag_clear(struct wmGizmo *gz, eSnapGizmo flag);
|
|
bool ED_gizmotypes_snap_3d_flag_test(struct wmGizmo *gz, eSnapGizmo flag);
|
|
|
|
bool ED_gizmotypes_snap_3d_invert_snap_get(struct wmGizmo *gz);
|
|
bool ED_gizmotypes_snap_3d_is_enabled(const struct wmGizmo *gz);
|
|
|
|
short ED_gizmotypes_snap_3d_update(struct wmGizmo *gz,
|
|
struct Depsgraph *depsgraph,
|
|
const struct ARegion *region,
|
|
const struct View3D *v3d,
|
|
const struct wmWindowManager *wm,
|
|
const float mval_fl[2]);
|
|
void ED_gizmotypes_snap_3d_data_get(
|
|
struct wmGizmo *gz, float r_loc[3], float r_nor[3], int r_elem_index[3], int *r_snap_elem);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|