69#define USE_AXIS_CONSTRAINTS
73#define MVAL_MAX_PX_DIST 12.0f
86#define RULER_PICK_DIST 12.0f
87#define RULER_PICK_DIST_SQ (RULER_PICK_DIST * RULER_PICK_DIST)
100#ifdef USE_AXIS_CONSTRAINTS
128#ifdef USE_AXIS_CONSTRAINTS
140#ifndef USE_SNAP_DETECT_FROM_KEYMAP_HACK
200 ruler_item->
co[0], ruler_item->
co[1], ruler_item->
co[2]);
208 numstr, numstr_size,
double(ruler_angle), prec,
B_UNIT_ROTATION, unit,
false);
212 const float ruler_len =
len_v3v3(ruler_item->
co[0], ruler_item->
co[2]);
215 BLI_snprintf(numstr, numstr_size,
"%.*f", prec, ruler_len);
220 double(ruler_len * unit->scale_length),
239 int co_index_best = -1;
247 for (j = 0; j < 3; j++) {
254 if (dist < dist_best) {
259 const float3 dist_points = {
275 if (dist < dist_best) {
280 const float2 dist_points = {
285 co_index_best = (dist_points[0] < dist_points[1]) ? 0 : 2;
296 *r_co_index = co_index_best;
345 const bool do_thickness,
349 constexpr float eps_bias = 0.0002f;
359 if (do_thickness && inter->
co_index != 1) {
386 ray_start = co - ray_normal * eps_bias;
401 float3 *prev_point =
nullptr;
407 prev_point = &ruler_item->
co[1];
411 prev_point = &ruler_item->
co[2];
415 prev_point = &ruler_item->
co[0];
419 if (prev_point !=
nullptr) {
429#ifdef USE_AXIS_CONSTRAINTS
448 const int pivot_point = scene->toolsettings->transform_pivot_point;
452 scene, view_layer, v3d, rv3d, ob, obedit, orient_index, pivot_point, mat.ptr());
458 for (
int i = 0; i <= 2; i++) {
463 ruler_item->
co = mat * ruler_item->
co;
511#define RULER_ID "RulerData3D"
520 if (scene->gpd ==
nullptr) {
538 bool changed =
false;
544 if (gpl ==
nullptr) {
566 for (j = 0; j < 3; j++) {
577 for (j = 0; j < 3; j += 2) {
601 bool changed =
false;
614 if (gps->totpoints == 3) {
616 for (j = 0; j < 3; j++) {
623 else if (gps->totpoints == 2) {
625 for (j = 0; j < 3; j += 2) {
656 constexpr int arc_steps = 24;
657 const float4 color_act = {1.0f, 1.0f, 1.0f, 1.0f};
658 const float4 color_base = {0.0f, 0.0f, 0.0f, 1.0f};
661 float4 color_back = {1.0f, 1.0f, 1.0f, 0.5f};
681 if (
int(color_text[0]) +
int(color_text[1]) +
int(color_text[2]) > 127 * 3 * 0.6f) {
685 const bool is_act = (ruler_info->
item_active == ruler_item);
692 for (j = 0; j < 3; j++) {
713 float4 viewport_size(0.0f);
715 immUniform2f(
"viewport_size", viewport_size[2], viewport_size[3]);
718 const float4 &
col = is_act ? color_act : color_base;
764 for (j = 0; j <= arc_steps; j++) {
765 ar_coord = ruler_item->
co[1] + dir_tmp * px_scale;
779 float viewport_size[4];
781 immUniform2f(
"viewport_size", viewport_size[2], viewport_size[3]);
784 const float *
col = is_act ? color_act : color_base;
814 dir_ruler = co_ss[0] - co_ss[1];
817 dir_ruler = co_ss[1] - co_ss[2];
827 immVertex2f(shdr_pos_2d, co_ss[1][0] - cap_size, co_ss[1][1] - cap_size);
828 immVertex2f(shdr_pos_2d, co_ss[1][0] + cap_size, co_ss[1][1] + cap_size);
829 immVertex2f(shdr_pos_2d, co_ss[1][0] - cap_size, co_ss[1][1] + cap_size);
830 immVertex2f(shdr_pos_2d, co_ss[1][0] + cap_size, co_ss[1][1] - cap_size);
838 if (proj_ok[0] || proj_ok[2] || proj_ok[1]) {
842 cap = co_ss[0] + rot_90_vec_a * cap_size;
844 cap = co_ss[0] - rot_90_vec_a * cap_size;
849 cap = co_ss[2] + rot_90_vec_b * cap_size;
851 cap = co_ss[2] - rot_90_vec_b * cap_size;
857 immVertex2f(shdr_pos_2d, co_ss[1][0] - cap_size, co_ss[1][1] - cap_size);
858 immVertex2f(shdr_pos_2d, co_ss[1][0] + cap_size, co_ss[1][1] + cap_size);
859 immVertex2f(shdr_pos_2d, co_ss[1][0] - cap_size, co_ss[1][1] + cap_size);
860 immVertex2f(shdr_pos_2d, co_ss[1][0] + cap_size, co_ss[1][1] - cap_size);
880 posit[0] = co_ss[1][0] - (numstr_size[0] / 2.0f);
881 posit[1] = co_ss[1][1] - (numstr_size[1] / 2.0f);
885 float rot_90_vec[2] = {-dir_ruler[1], dir_ruler[0]};
887 posit[1] += rot_90_vec[0] * numstr_size[1];
888 posit[0] += (rot_90_vec[1] < 0) ? numstr_size[0] : -numstr_size[0];
895 posit[0] - bg_margin,
896 posit[1] - bg_margin,
897 posit[0] + bg_margin + numstr_size[0],
898 posit[1] + bg_margin + numstr_size[1]);
915 dir_ruler = co_ss[0] - co_ss[2];
926 if (proj_ok[0] || proj_ok[2]) {
930 cap = co_ss[0] + rot_90_vec * cap_size;
932 cap = co_ss[0] - rot_90_vec * cap_size;
937 cap = co_ss[2] + rot_90_vec * cap_size;
939 cap = co_ss[2] - rot_90_vec * cap_size;
959 posit = (co_ss[0] + co_ss[2]) / 2.0f;
962 posit -= numstr_size / 2.0f;
968 if ((
len < (numstr_size[1] * 2.5f)) ||
969 ((
len < (numstr_size[0] + bg_margin + bg_margin)) && (
fabs(rot_90_vec[0]) < 0.5f)))
972 posit[1] = std::min(co_ss[0][1], co_ss[2][1]) - numstr_size[1] - bg_margin - bg_margin;
974 else if (
fabs(rot_90_vec[0]) < 0.2f) {
976 posit[1] -= numstr_size[1];
980 if (proj_ok[0] && proj_ok[2]) {
984 posit[0] - bg_margin,
985 posit[1] - bg_margin,
986 posit[0] + bg_margin + numstr_size[0],
987 posit[1] + bg_margin + numstr_size[1]);
994 if (proj_ok[0] && proj_ok[2]) {
1012 const float mval_fl[2] = {
float(mval[0]),
float(mval[1])};
1017 if (co_index == -1) {
1034 bool do_draw =
false;
1041 ruler_info->
region = region;
1043#ifdef USE_AXIS_CONSTRAINTS
1068 do_cursor_update =
true;
1072#ifndef USE_SNAP_DETECT_FROM_KEYMAP_HACK
1077 C, ruler_info->
snap_data.
gizmo,
nullptr,
nullptr,
nullptr,
nullptr);
1083 do_cursor_update =
true;
1086 if (do_cursor_update) {
1090 C,
depsgraph, ruler_info, ruler_item, event->
mval, do_thickness, do_snap))
1118#ifdef USE_AXIS_CONSTRAINTS
1142 CLAMP(fac, 0.0f, 1.0f);
1145 ruler_item_pick->
co[0], ruler_item_pick->
co[2], fac);
1151 C,
depsgraph, ruler_info, ruler_item_pick, event->
mval,
false,
false);
1166 ruler_item_pick->
flag &= ~RULERITEM_USE_ANGLE_ACTIVE;
1174 prev_point = (inter->
co_index != 1) ? &ruler_item_pick->
co[1] :
nullptr;
1178 prev_point = &ruler_item_pick->
co[2];
1179 snap_type = ruler_item_pick->
snap_type[2];
1182 prev_point = &ruler_item_pick->
co[0];
1183 snap_type = ruler_item_pick->
snap_type[2];
1236 gzt->
idname =
"VIEW3D_GT_ruler_item";
1282 ruler_info->
wm = wm;
1283 ruler_info->
win = win;
1284 ruler_info->
area = area;
1285 ruler_info->
region = region;
1289 "snap_source_type");
1296 gzgt->
name =
"Ruler Widgets";
1360#ifndef USE_SNAP_DETECT_FROM_KEYMAP_HACK
1362 const bool do_snap =
true;
1386 ot->
idname =
"VIEW3D_OT_ruler_add";
1444 ot->
name =
"Ruler Remove";
1445 ot->
idname =
"VIEW3D_OT_ruler_remove";
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
bool BKE_gpencil_free_strokes(struct bGPDframe *gpf)
struct bGPDlayer * BKE_gpencil_layer_addnew(struct bGPdata *gpd, const char *name, bool setactive, bool add_to_header)
struct bGPDframe * BKE_gpencil_layer_frame_get(struct bGPDlayer *gpl, int cframe, eGP_GetFrame_Mode addnew)
struct bGPdata * BKE_gpencil_data_addnew(struct Main *bmain, const char name[])
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
void BKE_report(ReportList *reports, eReportType type, const char *message)
int BKE_scene_orientation_get_index(Scene *scene, int slot_index)
size_t BKE_unit_value_as_string(char *str, int str_maxncpy, double value, int prec, int type, const UnitSettings *settings, bool pad)
void BLF_size(int fontid, float size)
void BLF_color3ubv(int fontid, const unsigned char rgb[3])
void BLF_width_and_height(int fontid, const char *str, size_t str_len, float *r_width, float *r_height) ATTR_NONNULL()
void BLF_disable(int fontid, int option)
void BLF_rotation(int fontid, float angle)
void BLF_draw(int fontid, const char *str, size_t str_len, ResultBLF *r_info=nullptr) ATTR_NONNULL(2)
void BLF_enable(int fontid, int option)
void BLF_position(int fontid, float x, float y, float z)
#define LISTBASE_FOREACH(type, var, list)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE float min_ff(float a, float b)
MINLINE float min_fff(float a, float b, float c)
float line_point_factor_v2(const float p[2], const float l1[2], const float l2[2])
MINLINE int min_axis_v3(const float vec[3])
float dist_squared_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2])
void axis_angle_to_quat(float r[4], const float axis[3], float angle)
void mul_qt_v3(const float q[4], float r[3])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE float normalize_v2(float n[2])
MINLINE void copy_v3_fl(float r[3], float f)
float angle_v3v3v3(const float a[3], const float b[3], const float c[3]) ATTR_WARN_UNUSED_RESULT
float angle_normalized_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v2_fl(float r[2], float f)
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define BLI_STR_UTF8_DEGREE_SIGN
void DEG_id_tag_update_ex(Main *bmain, ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
ViewLayer * DEG_get_input_view_layer(const Depsgraph *graph)
Scene * DEG_get_input_scene(const Depsgraph *graph)
Object is a sort of wrapper for general info.
#define OBEDIT_FROM_OBACT(ob)
#define SCE_SNAP_TO_VERTEX
bool ED_gizmo_poll_or_unlink_delayed_from_tool(const bContext *C, wmGizmoGroupType *gzgt)
void ED_region_tag_redraw_editor_overlays(ARegion *region)
bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx, Depsgraph *depsgraph, const View3D *v3d, const SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], float *ray_depth, float r_co[3], float r_no[3])
eSnapMode ED_transform_snap_object_project_view3d(SnapObjectContext *sctx, Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const eSnapMode snap_to, const SnapObjectParams *params, const float init_co[3], const float mval[2], const float prev_co[3], float *dist_px, float r_loc[3], float r_no[3])
@ V3D_PROJ_TEST_CLIP_NEAR
void ED_view3d_win_to_3d_int(const View3D *v3d, const ARegion *region, const float depth_pt[3], const int mval[2], float r_out[3])
float ED_view3d_pixel_size_no_ui_scale(const RegionView3D *rv3d, const float co[3])
@ V3D_SNAPCURSOR_SNAP_EDIT_GEOM_CAGE
eV3DProjStatus ED_view3d_project_float_global(const ARegion *region, const float co[3], float r_co[2], eV3DProjTest flag)
void GPU_matrix_identity_set()
#define GPU_matrix_set(x)
void GPU_matrix_push_projection()
void GPU_matrix_pop_projection()
#define GPU_matrix_projection_set(x)
@ GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR
@ GPU_SHADER_3D_UNIFORM_COLOR
void GPU_blend(eGPUBlend blend)
void GPU_line_width(float width)
void GPU_line_smooth(bool enable)
void GPU_viewport_size_get_f(float coords[4])
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Read Guarded memory(de)allocation.
void UI_GetThemeColor3ubv(int colorid, unsigned char col[3])
eWM_GizmoFlagTweak
Gizmo tweak flag. Bit-flag passed to gizmo while tweaking.
@ WM_GIZMOGROUPTYPE_SCALE
@ WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL
@ WM_OP_INVOKE_REGION_WIN
const Depsgraph * depsgraph
draw_view in_light_buf[] float
void *(* MEM_callocN)(size_t len, const char *str)
ccl_device_inline float2 fabs(const float2 a)
T distance(const T &a, const T &b)
CartesianBasis invert(const CartesianBasis &basis)
AxisSigned cross(const AxisSigned a, const AxisSigned b)
T interpolate(const T &a, const T &b, const FactorT &t)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
T distance_squared(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
void RNA_property_unset(PointerRNA *ptr, PropertyRNA *prop)
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)
bool ED_gizmotypes_snap_3d_is_enabled(const wmGizmo *)
SnapObjectContext * ED_gizmotypes_snap_3d_context_ensure(Scene *scene, wmGizmo *)
void ED_gizmotypes_snap_3d_flag_set(wmGizmo *gz, int flag)
PropertyRNA * prop_snap_source_type
struct RulerInfo::@541 snap_data
PropertyRNA * prop_prevpoint
struct RulerInfo::@540 drag_state_prev
eSnapTargetOP snap_target_select
wmGizmoMapType_Params gzmap_params
eWM_GizmoFlagGroupTypeFlag flag
wmGizmoMap * parent_gzmap
wmGizmoFnTestSelect test_select
wmGizmoFnCursorGet cursor_get
wmGizmoGroup * parent_gzgroup
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
struct ReportList * reports
static void WIDGETGROUP_ruler_setup(const bContext *C, wmGizmoGroup *gzgroup)
static bGPDlayer * view3d_ruler_layer_get(bGPdata *gpd)
static void ruler_item_remove(bContext *C, wmGizmoGroup *gzgroup, RulerItem *ruler_item)
static bool gizmo_ruler_check_for_operator(const wmGizmoGroup *gzgroup)
static int view3d_ruler_add_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static bool view3d_ruler_poll(bContext *C)
static void ruler_state_set(RulerInfo *ruler_info, int state)
static const char * view3d_gzgt_ruler_id
void VIEW3D_OT_ruler_remove(wmOperatorType *ot)
void VIEW3D_GGT_ruler(wmGizmoGroupType *gzgt)
static void gizmo_ruler_draw(const bContext *C, wmGizmo *gz)
void VIEW3D_OT_ruler_add(wmOperatorType *ot)
static void ruler_item_as_string(RulerItem *ruler_item, UnitSettings *unit, char *numstr, size_t numstr_size, int prec)
static bool view3d_ruler_from_gpencil(const bContext *C, wmGizmoGroup *gzgroup)
static bool view3d_ruler_item_mousemove(const bContext *C, Depsgraph *depsgraph, RulerInfo *ruler_info, RulerItem *ruler_item, const int mval[2], const bool do_thickness, const bool do_snap)
static int gizmo_ruler_invoke(bContext *C, wmGizmo *gz, const wmEvent *event)
static int gizmo_ruler_test_select(bContext *, wmGizmo *gz, const int mval[2])
@ RULERITEM_USE_ANGLE_ACTIVE
static RulerItem * ruler_item_add(wmGizmoGroup *gzgroup)
static int gizmo_ruler_cursor_get(wmGizmo *gz)
static int view3d_ruler_remove_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int gizmo_ruler_modal(bContext *C, wmGizmo *gz, const wmEvent *event, eWM_GizmoFlagTweak tweak_flag)
static void view3d_ruler_item_project(RulerInfo *ruler_info, float3 &r_co, const int xy[2])
static void view3d_ruler_gpencil_ensure(bContext *C)
static void gizmo_ruler_exit(bContext *C, wmGizmo *gz, const bool cancel)
static bool view3d_ruler_to_gpencil(bContext *C, wmGizmoGroup *gzgroup)
void VIEW3D_GT_ruler_item(wmGizmoType *gzt)
#define RULER_PICK_DIST_SQ
static RulerItem * gzgroup_ruler_item_first_get(wmGizmoGroup *gzgroup)
static bool view3d_ruler_pick(wmGizmoGroup *gzgroup, RulerItem *ruler_item, const float2 mval, int *r_co_index)
void WM_event_drag_start_mval_fl(const wmEvent *event, const ARegion *region, float r_mval[2])
void WM_event_drag_start_mval(const wmEvent *event, const ARegion *region, int r_mval[2])
int WM_operator_name_call(bContext *C, const char *opstring, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event)
wmGizmo * WM_gizmo_new_ptr(const wmGizmoType *gzt, wmGizmoGroup *gzgroup, PointerRNA *properties)
bool WM_gizmo_highlight_set(wmGizmoMap *gzmap, wmGizmo *gz)
void WM_gizmo_set_flag(wmGizmo *gz, const int flag, const bool enable)
PointerRNA * WM_gizmo_operator_set(wmGizmo *gz, int part_index, wmOperatorType *ot, IDProperty *properties)
void WM_gizmo_set_color(wmGizmo *gz, const float color[4])
void WM_gizmo_unlink(ListBase *gizmolist, wmGizmoMap *gzmap, wmGizmo *gz, bContext *C)
wmGizmoGroup * WM_gizmomap_group_find(wmGizmoMap *gzmap, const char *idname)
const wmGizmoType * WM_gizmotype_find(const char *idname, bool quiet)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void wmOrtho2_region_pixelspace(const ARegion *region)