70#define USE_AXIS_CONSTRAINTS
74#define MVAL_MAX_PX_DIST 12.0f
87#define RULER_PICK_DIST 12.0f
88#define RULER_PICK_DIST_SQ (RULER_PICK_DIST * RULER_PICK_DIST)
101#ifdef USE_AXIS_CONSTRAINTS
129#ifdef USE_AXIS_CONSTRAINTS
141#ifndef USE_SNAP_DETECT_FROM_KEYMAP_HACK
201 ruler_item->
co[0], ruler_item->
co[1], ruler_item->
co[2]);
209 numstr, numstr_size,
double(ruler_angle), prec,
B_UNIT_ROTATION, unit,
false);
213 const float ruler_len =
len_v3v3(ruler_item->
co[0], ruler_item->
co[2]);
220 numstr, numstr_size, ruler_len, prec,
B_UNIT_LENGTH, unit,
false);
235 int co_index_best = -1;
243 for (j = 0; j < 3; j++) {
250 if (dist < dist_best) {
255 const float3 dist_points = {
271 if (dist < dist_best) {
276 const float2 dist_points = {
281 co_index_best = (dist_points[0] < dist_points[1]) ? 0 : 2;
292 *r_co_index = co_index_best;
341 const bool do_thickness,
345 constexpr float eps_bias = 0.0002f;
355 if (do_thickness && inter->
co_index != 1) {
383 ray_start = co - ray_normal * eps_bias;
398 float3 *prev_point =
nullptr;
404 prev_point = &ruler_item->
co[1];
408 prev_point = &ruler_item->
co[2];
412 prev_point = &ruler_item->
co[0];
416 if (prev_point !=
nullptr) {
426#ifdef USE_AXIS_CONSTRAINTS
449 scene, view_layer, v3d, rv3d, ob, obedit, orient_index, pivot_point, mat.
ptr());
455 for (
int i = 0;
i <= 2;
i++) {
460 ruler_item->
co = mat * ruler_item->
co;
508#define RULER_ID "RulerData3D"
517 if (scene->
gpd ==
nullptr) {
535 bool changed =
false;
541 if (gpl ==
nullptr) {
563 for (j = 0; j < 3; j++) {
574 for (j = 0; j < 3; j += 2) {
598 bool changed =
false;
611 if (gps->totpoints == 3) {
613 for (j = 0; j < 3; j++) {
620 else if (gps->totpoints == 2) {
622 for (j = 0; j < 3; j += 2) {
646 if (gpl_scene != gpl) {
694 constexpr int arc_steps = 24;
695 const float4 color_act = {1.0f, 1.0f, 1.0f, 1.0f};
696 const float4 color_base = {0.0f, 0.0f, 0.0f, 1.0f};
699 float4 color_back = {1.0f, 1.0f, 1.0f, 0.5f};
719 if (
int(color_text[0]) +
int(color_text[1]) +
int(color_text[2]) > 127 * 3 * 0.6f) {
723 const bool is_act = (ruler_info->
item_active == ruler_item);
730 for (j = 0; j < 3; j++) {
746 immVertexFormat(),
"pos", blender::gpu::VertAttrType::SFLOAT_32_32_32);
751 float4 viewport_size(0.0f);
753 immUniform2f(
"viewport_size", viewport_size[2], viewport_size[3]);
756 const float4 &
col = is_act ? color_act : color_base;
802 for (j = 0; j <= arc_steps; j++) {
803 ar_coord = ruler_item->
co[1] + dir_tmp * px_scale;
817 float viewport_size[4];
819 immUniform2f(
"viewport_size", viewport_size[2], viewport_size[3]);
822 const float *
col = is_act ? color_act : color_base;
852 dir_ruler = co_ss[0] - co_ss[1];
855 dir_ruler = co_ss[1] - co_ss[2];
865 immVertex2f(shdr_pos_2d, co_ss[1][0] - cap_size, co_ss[1][1] - cap_size);
866 immVertex2f(shdr_pos_2d, co_ss[1][0] + cap_size, co_ss[1][1] + cap_size);
867 immVertex2f(shdr_pos_2d, co_ss[1][0] - cap_size, co_ss[1][1] + cap_size);
868 immVertex2f(shdr_pos_2d, co_ss[1][0] + cap_size, co_ss[1][1] - cap_size);
876 if (proj_ok[0] || proj_ok[2] || proj_ok[1]) {
880 cap = co_ss[0] + rot_90_vec_a * cap_size;
882 cap = co_ss[0] - rot_90_vec_a * cap_size;
887 cap = co_ss[2] + rot_90_vec_b * cap_size;
889 cap = co_ss[2] - rot_90_vec_b * cap_size;
895 immVertex2f(shdr_pos_2d, co_ss[1][0] - cap_size, co_ss[1][1] - cap_size);
896 immVertex2f(shdr_pos_2d, co_ss[1][0] + cap_size, co_ss[1][1] + cap_size);
897 immVertex2f(shdr_pos_2d, co_ss[1][0] - cap_size, co_ss[1][1] + cap_size);
898 immVertex2f(shdr_pos_2d, co_ss[1][0] + cap_size, co_ss[1][1] - cap_size);
918 posit[0] = co_ss[1][0] - (numstr_size[0] / 2.0f);
919 posit[1] = co_ss[1][1] - (numstr_size[1] / 2.0f);
923 float rot_90_vec[2] = {-dir_ruler[1], dir_ruler[0]};
925 posit[1] += rot_90_vec[0] * numstr_size[1];
926 posit[0] += (rot_90_vec[1] < 0) ? numstr_size[0] : -numstr_size[0];
933 posit[0] - bg_margin,
934 posit[1] - bg_margin,
935 posit[0] + bg_margin + numstr_size[0],
936 posit[1] + bg_margin + numstr_size[1]);
953 dir_ruler = co_ss[0] - co_ss[2];
964 if (proj_ok[0] || proj_ok[2]) {
968 cap = co_ss[0] + rot_90_vec * cap_size;
970 cap = co_ss[0] - rot_90_vec * cap_size;
975 cap = co_ss[2] + rot_90_vec * cap_size;
977 cap = co_ss[2] - rot_90_vec * cap_size;
997 posit = (co_ss[0] + co_ss[2]) / 2.0f;
1000 posit -= numstr_size / 2.0f;
1006 if ((
len < (numstr_size[1] * 2.5f)) ||
1007 ((
len < (numstr_size[0] + bg_margin + bg_margin)) && (
fabs(rot_90_vec[0]) < 0.5f)))
1010 posit[1] = std::min(co_ss[0][1], co_ss[2][1]) - numstr_size[1] - bg_margin - bg_margin;
1012 else if (
fabs(rot_90_vec[0]) < 0.2f) {
1014 posit[1] -= numstr_size[1];
1018 if (proj_ok[0] && proj_ok[2]) {
1022 posit[0] - bg_margin,
1023 posit[1] - bg_margin,
1024 posit[0] + bg_margin + numstr_size[0],
1025 posit[1] + bg_margin + numstr_size[1]);
1032 if (proj_ok[0] && proj_ok[2]) {
1050 const float mval_fl[2] = {
float(mval[0]),
float(mval[1])};
1055 if (co_index == -1) {
1072 bool do_draw =
false;
1079 ruler_info->
region = region;
1081#ifdef USE_AXIS_CONSTRAINTS
1106 do_cursor_update =
true;
1110#ifndef USE_SNAP_DETECT_FROM_KEYMAP_HACK
1121 do_cursor_update =
true;
1124 if (do_cursor_update) {
1128 C,
depsgraph, ruler_info, ruler_item, event->
mval, do_thickness, do_snap))
1156#ifdef USE_AXIS_CONSTRAINTS
1180 CLAMP(fac, 0.0f, 1.0f);
1183 ruler_item_pick->
co[0], ruler_item_pick->
co[2], fac);
1189 C,
depsgraph, ruler_info, ruler_item_pick, event->
mval,
false,
false);
1212 prev_point = (inter->
co_index != 1) ? &ruler_item_pick->
co[1] :
nullptr;
1216 prev_point = &ruler_item_pick->
co[2];
1217 snap_type = ruler_item_pick->
snap_type[2];
1220 prev_point = &ruler_item_pick->
co[0];
1221 snap_type = ruler_item_pick->
snap_type[2];
1279 gzt->
idname =
"VIEW3D_GT_ruler_item";
1325 ruler_info->
wm = wm;
1326 ruler_info->
win = win;
1327 ruler_info->
area = area;
1328 ruler_info->
region = region;
1332 "snap_source_type");
1339 gzgt->
name =
"Ruler Widgets";
1402#ifndef USE_SNAP_DETECT_FROM_KEYMAP_HACK
1404 const bool do_snap =
true;
1427 ot->name =
"Ruler Add";
1428 ot->idname =
"VIEW3D_OT_ruler_add";
1429 ot->description =
"Add ruler";
1488 ot->name =
"Ruler Remove";
1489 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)
ARegion * BKE_area_find_region_type(const ScrArea *area, int region_type)
size_t BKE_unit_value_as_string(char *str, int str_maxncpy, double value, int prec, int type, const UnitSettings &settings, bool pad)
size_t BKE_unit_value_as_string_scaled(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_enable(int fontid, FontFlags flag)
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_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_disable(int fontid, FontFlags flag)
void BLF_position(int fontid, float x, float y, float z)
#define LISTBASE_FOREACH(type, var, list)
void BLI_addtail(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 size_t size_t BLI_snprintf_utf8(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define BLI_STR_UTF8_DEGREE_SIGN
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)
@ 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_line_width(float width)
void GPU_line_smooth(bool enable)
void GPU_blend(GPUBlend blend)
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
BPy_StructRNA * depsgraph
DEG_id_tag_update_ex(cb_data->bmain, cb_data->owner_id, ID_RECALC_TAG_FOR_UNDO|ID_RECALC_SYNC_TO_EVAL)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
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)
MatBase< float, 2, 2 > float2x2
VecBase< float, 4 > float4
VecBase< float, 2 > float2
MatBase< float, 3, 2 > float3x2
MatBase< float, 3, 3 > float3x3
VecBase< float, 3 > float3
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)
blender::ed::transform::SnapObjectContext * ED_gizmotypes_snap_3d_context_ensure(Scene *scene, wmGizmo *)
bool ED_gizmotypes_snap_3d_is_enabled(const wmGizmo *)
void ED_gizmotypes_snap_3d_flag_set(wmGizmo *gz, int flag)
ARegionRuntimeHandle * runtime
PropertyRNA * prop_snap_source_type
struct RulerInfo::@244002166313060124365335164133104061357331232157 drag_state_prev
struct RulerInfo::@102167245014366230146170070050104033360237315112 snap_data
PropertyRNA * prop_prevpoint
struct ToolSettings * toolsettings
const c_style_mat & ptr() const
wmGizmoMapType_Params gzmap_params
eWM_GizmoFlagGroupTypeFlag flag
wmGizmoMap * parent_gzmap
wmGizmoFnTestSelect test_select
wmGizmoFnCursorGet cursor_get
wmGizmoGroup * parent_gzgroup
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 bool view3d_ruler_poll(bContext *C)
static void ruler_state_set(RulerInfo *ruler_info, int state)
static const char * view3d_gzgt_ruler_id
@ RULERITEM_USE_ANGLE_ACTIVE
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 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 void ruler_item_as_string(RulerItem *ruler_item, const UnitSettings &unit, char *numstr, size_t numstr_size, int prec)
void ED_view3d_gizmo_ruler_remove_by_gpencil_layer(bContext *C, bGPDlayer *gpl)
static wmOperatorStatus view3d_ruler_remove_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int gizmo_ruler_test_select(bContext *, wmGizmo *gz, const int mval[2])
static wmOperatorStatus gizmo_ruler_invoke(bContext *C, wmGizmo *gz, const wmEvent *event)
static RulerItem * ruler_item_add(wmGizmoGroup *gzgroup)
static int gizmo_ruler_cursor_get(wmGizmo *gz)
static wmOperatorStatus view3d_ruler_add_invoke(bContext *C, wmOperator *op, const wmEvent *event)
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)
static wmOperatorStatus gizmo_ruler_modal(bContext *C, wmGizmo *gz, const wmEvent *event, eWM_GizmoFlagTweak tweak_flag)
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])
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorStatus WM_operator_name_call(bContext *C, const char *opstring, blender::wm::OpCallContext 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 StringRef idname, bool quiet)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void wmOrtho2_region_pixelspace(const ARegion *region)
Scene * WM_window_get_active_scene(const wmWindow *win)
bScreen * WM_window_get_active_screen(const wmWindow *win)