83 float gridf, imat[3][3], bmat[3][3], vec[3];
92 for (
Object *obedit : objects) {
110 copy_m3_m4(bmat, obedit->object_to_world().ptr());
117 add_v3_v3(vec, obedit->object_to_world().location());
118 vec[0] = gridf *
floorf(0.5f + vec[0] / gridf);
119 vec[1] = gridf *
floorf(0.5f + vec[1] / gridf);
120 vec[2] = gridf *
floorf(0.5f + vec[2] / gridf);
121 sub_v3_v3(vec, obedit->object_to_world().location());
134 for (
Object *ob_eval : objects_eval) {
138 invert_m4_m4(ob_eval->runtime->world_to_object.ptr(), ob_eval->object_to_world().ptr());
149 mul_m4_v3(ob_eval->object_to_world().ptr(), nLoc);
150 vec[0] = gridf *
floorf(0.5f + nLoc[0] / gridf);
151 vec[1] = gridf *
floorf(0.5f + nLoc[1] / gridf);
152 vec[2] = gridf *
floorf(0.5f + nLoc[2] / gridf);
154 mul_m4_v3(ob_eval->world_to_object().ptr(), vec);
195 objects_eval.
append(ob_eval);
201 if (use_transform_skip_children) {
205 for (
Object *ob_eval : objects_eval) {
211 xcs, scene, view_layer, objects.
data(), objects.
size());
213 if (use_transform_data_origin) {
222 for (
Object *ob_eval : objects_eval) {
224 vec[0] = -ob_eval->object_to_world().location()[0] +
225 gridf *
floorf(0.5f + ob_eval->object_to_world().location()[0] / gridf);
226 vec[1] = -ob_eval->object_to_world().location()[1] +
227 gridf *
floorf(0.5f + ob_eval->object_to_world().location()[1] / gridf);
228 vec[2] = -ob_eval->object_to_world().location()[2] +
229 gridf *
floorf(0.5f + ob_eval->object_to_world().location()[2] / gridf);
232 float originmat[3][3];
245 if (use_transform_data_origin) {
252 if (use_transform_skip_children) {
256 if (use_transform_data_origin) {
270 ot->name =
"Snap Selection to Grid";
271 ot->description =
"Snap selected item(s) to their nearest grid division";
272 ot->idname =
"VIEW3D_OT_snap_selected_to_grid";
318 const bool use_offset,
319 const int pivot_point,
320 const bool use_toolsettings)
329 float imat[3][3], bmat[3][3];
330 float center_global[3];
331 float offset_global[3];
335 const bool use_rotation = target_orientation_global !=
nullptr;
337 target_orientation_global ? target_orientation_global->matrix<
blender::float3x3>() :
347 sub_v3_v3v3(offset_global, target_loc_global, center_global);
354 scene, view_layer, v3d);
356 obedit = objects[ob_index];
375 copy_m3_m4(bmat, obedit->object_to_world().ptr());
379 sub_v3_v3v3(target_loc_local, target_loc_global, obedit->object_to_world().location());
411 for (
Object *ob : objects) {
415 invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr());
416 mul_v3_m4v3(target_loc_local, ob->world_to_object().ptr(), target_loc_global);
435 ((pchan->bone->parent &&
442 mul_v3_m4v3(target_loc_pose, ob->object_to_world().ptr(), pchan->pose_mat[3]);
443 add_v3_v3(target_loc_pose, offset_global);
446 sub_v3_v3(target_loc_pose, target_loc_global);
448 add_v3_v3(target_loc_pose, target_loc_global);
451 mul_m4_v3(ob->world_to_object().ptr(), target_loc_pose);
465 if (use_toolsettings) {
477 if (use_toolsettings) {
482 pchan->rotAngle = rot_angle;
489 if (use_toolsettings) {
499 if (use_toolsettings) {
528 ob =
static_cast<Object *
>(ob->id.next))
544 const bool use_transform_skip_children = use_toolsettings &&
547 const bool use_transform_data_origin = use_toolsettings &&
553 if (use_transform_skip_children) {
556 xcs, scene, view_layer, objects.
data(), objects.
size());
558 if (use_transform_data_origin) {
563 for (
Object *ob : objects) {
572 for (
Object *ob : objects) {
584 add_v3_v3v3(target_loc_local, ob->object_to_world().location(), offset_global);
587 sub_v3_v3(target_loc_local, target_loc_global);
589 add_v3_v3(target_loc_local, target_loc_global);
593 copy_v3_v3(target_loc_local, target_loc_global);
595 sub_v3_v3(target_loc_local, ob->object_to_world().location());
600 float originmat[3][3], parentmat[4][4];
612 if (use_toolsettings) {
624 const bool assign_rotation_directly = (ob->rotmode ==
626 ob->parent ==
nullptr);
630 if (assign_rotation_directly) {
636 if (use_toolsettings) {
646 if (assign_rotation_directly) {
653 if (use_toolsettings) {
658 ob->rotAngle = rot_angle;
663 if (assign_rotation_directly) {
669 if (use_toolsettings) {
684 if (use_transform_skip_children) {
688 if (use_transform_data_origin) {
701 const float target_loc_global[3],
702 const int pivot_point)
706 const bool use_offset =
true;
709 const bool use_toolsettings =
false;
711 C, op, target_loc_global,
nullptr, use_offset, pivot_point, use_toolsettings);
732 C, op, target_loc_global, snap_orientation, use_offset, pivot_point,
true))
742 ot->name =
"Snap Selection to Cursor";
743 ot->description =
"Snap selected item(s) to the 3D cursor";
744 ot->idname =
"VIEW3D_OT_snap_selected_to_cursor";
758 "If the selection should be snapped as a whole or by each object center");
763 "If the selection should be rotated to match the cursor");
775 float target_loc_global[3];
791 ot->name =
"Snap Selection to Active";
792 ot->description =
"Snap selected item(s) to the active item";
793 ot->idname =
"VIEW3D_OT_snap_selected_to_active";
820 curs[0] = gridf *
floorf(0.5f + curs[0] / gridf);
821 curs[1] = gridf *
floorf(0.5f + curs[1] / gridf);
822 curs[2] = gridf *
floorf(0.5f + curs[2] / gridf);
833 ot->name =
"Snap Cursor to Grid";
834 ot->description =
"Snap 3D cursor to the nearest grid division";
835 ot->idname =
"VIEW3D_OT_snap_cursor_to_grid";
859 float min[3],
max[3], mat[4][4],
pos[3], cammat[4][4];
867 copy_m4_m4(cammat, ob->object_to_world().ptr());
883 tracking, tracking_object, scene->
r.
cfra, imat);
913 float bmat[3][3], vec[3],
min[3],
max[3], centroid[3];
924 obedit = objects[ob_index];
943 copy_m3_m4(bmat, obedit_eval->object_to_world().ptr());
949 add_v3_v3(vec, obedit_eval->object_to_world().location());
967 mul_m4_v3(obact_eval->object_to_world().ptr(), vec);
977 copy_v3_v3(vec, ob_eval->object_to_world().location());
1025 ot->name =
"Snap Cursor to Selected";
1026 ot->description =
"Snap 3D cursor to the middle of the selected item(s)";
1027 ot->idname =
"VIEW3D_OT_snap_cursor_to_selected";
1052 if (ob ==
nullptr) {
1074 ot->name =
"Snap Cursor to Active";
1075 ot->description =
"Snap 3D cursor to the active item";
1076 ot->idname =
"VIEW3D_OT_snap_cursor_to_active";
1108 ot->name =
"Snap Cursor to World Origin";
1109 ot->description =
"Snap 3D cursor to the world origin";
1110 ot->idname =
"VIEW3D_OT_snap_cursor_to_center";
1132 if (
mask.is_empty()) {
1133 return std::nullopt;
1140 mask.slice(range).foreach_index([&](const int i) {
1141 math::min_max(math::transform_point(transform, positions[i]), init.min, init.max);
1154 float centroid[3], vec[3], bmat[3][3];
1158 float ob_min[3], ob_max[3];
1164 obedit->object_to_world().ptr(),
1214 std::optional<Bounds<float3>>
bounds = std::nullopt;
1226 ob_orig, info.drawing, info.layer_index, memory);
1233 obedit, ob_orig, info.drawing);
1258 copy_m3_m4(bmat, obedit->object_to_world().ptr());
1264 add_v3_v3(vec, obedit->object_to_world().location());
Functions and classes to work with Actions.
Functions to deal with Armatures.
C++ functions to deal with Armature collections (i.e. the successor of bone layers).
bool ANIM_bonecoll_is_visible_pchan(const bArmature *armature, const bPoseChannel *pchan)
Functions to insert, delete or modify keyframes.
Functionality to interact with keying sets.
static constexpr const char * ANIM_KS_LOCATION_ID
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
void BKE_pchan_protected_rotation_axisangle_set(bPoseChannel *pchan, const float axis[3], float angle)
void BKE_pchan_protected_location_set(bPoseChannel *pchan, const float location[3])
void BKE_armature_loc_pose_to_bone(const bPoseChannel *pchan, const float inloc[3], float outloc[3])
void BKE_pchan_mat3_to_rot(bPoseChannel *pchan, const float mat[3][3], bool use_compat)
void BKE_pchan_protected_rotation_euler_set(bPoseChannel *pchan, const float rotation_euler[3])
void BKE_pchan_protected_rotation_quaternion_set(bPoseChannel *pchan, const float quat[4])
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
Main * CTX_data_main(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
BMEditMesh * BKE_editmesh_from_object(Object *ob)
Return the BMEditMesh for a given object.
#define FOREACH_SELECTED_EDITABLE_OBJECT_END
#define FOREACH_SELECTED_OBJECT_BEGIN(_view_layer, _v3d, _instance)
#define FOREACH_SELECTED_EDITABLE_OBJECT_BEGIN(_view_layer, _v3d, _instance)
#define FOREACH_SELECTED_OBJECT_END
blender::Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
bool BKE_mball_minmax_ex(const MetaBall *mb, float min[3], float max[3], const float obmat[4][4], short flag)
General operations, lookup, etc. for blender objects.
void BKE_object_protected_location_set(Object *ob, const float location[3])
bool BKE_object_flag_test_recursive(const Object *ob, short flag)
MovieClip * BKE_object_movieclip_get(Scene *scene, const Object *ob, bool use_default)
void BKE_object_get_parent_matrix(const Object *ob, Object *par, float r_parentmat[4][4])
void BKE_object_where_is_calc_ex(Depsgraph *depsgraph, Scene *scene, RigidBodyWorld *rbw, Object *ob, float r_originmat[3][3])
void BKE_object_protected_rotation_quaternion_set(Object *ob, const float quat[4])
void BKE_object_protected_rotation_euler_set(Object *ob, const float euler[3])
blender::Vector< Object * > BKE_object_pose_array_get(const Scene *scene, ViewLayer *view_layer, View3D *v3d)
void BKE_object_protected_rotation_axisangle_set(Object *ob, const float axis[3], float angle)
void BKE_report(ReportList *reports, eReportType type, const char *message)
void BKE_scene_graph_evaluated_ensure(Depsgraph *depsgraph, Main *bmain)
void BKE_tracking_get_camera_object_matrix(const struct Object *camera_object, float mat[4][4])
#define TRACK_SELECTED(track)
void BKE_tracking_camera_get_reconstructed_interpolate(struct MovieTracking *tracking, struct MovieTrackingObject *tracking_object, float framenr, float mat[4][4])
#define LISTBASE_FOREACH(type, var, list)
void mul_m3_v3(const float M[3][3], float r[3])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
bool invert_m3_m3(float inverse[3][3], const float mat[3][3])
void mul_m4_v3(const float M[4][4], float r[3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
bool invert_m4(float mat[4][4])
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void mul_m3_m4m4(float R[3][3], const float A[4][4], const float B[4][4])
void mat3_to_axis_angle(float axis[3], float *angle, const float mat[3][3])
void mat3_to_eulO(float eul[3], short order, const float m[3][3])
void mat3_normalized_to_quat(float q[4], const float mat[3][3])
MINLINE void copy_v4_v4(float r[4], const float a[4])
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
#define INIT_MINMAX(min, max)
void DEG_id_tag_update(ID *id, unsigned int flags)
ViewLayer * DEG_get_evaluated_view_layer(const Depsgraph *graph)
T * DEG_get_original(T *id)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
Object is a sort of wrapper for general info.
#define OBPOSE_FROM_OBACT(ob)
#define OBEDIT_FROM_OBACT(ob)
@ SCE_XFORM_SKIP_CHILDREN
@ V3D_SHOW_RECONSTRUCTION
@ V3D_AROUND_CENTER_BOUNDS
bool ED_operator_view3d_active(bContext *C)
bool ED_operator_region_view3d_active(bContext *C)
bool ED_transverts_check_obedit(const Object *obedit)
void ED_transverts_create_from_obedit(TransVertStore *tvs, const Object *obedit, int mode)
void ED_transverts_free(TransVertStore *tvs)
void ED_transverts_update_obedit(TransVertStore *tvs, Object *obedit)
float ED_view3d_grid_view_scale(const Scene *scene, const View3D *v3d, const ARegion *region, const char **r_grid_unit)
void ANIM_deselect_keys_in_animation_editors(bContext *C)
BPy_StructRNA * depsgraph
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
static btDbvtVolume bounds(btDbvtNode **leaves, int count)
void append(const T &value)
IndexRange index_range() const
void append_unchecked(const T &value)
float4x4 to_world_space(const Object &object) const
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
bool is_autokey_on(const Scene *scene)
bool bone_is_visible(const bArmature *armature, const Bone *bone)
KeyingSet * get_keyingset_for_autokeying(const Scene *scene, const char *transformKSName)
bool autokeyframe_pchan(bContext *C, Scene *scene, Object *ob, bPoseChannel *pchan, KeyingSet *ks)
void autokeyframe_object(bContext *C, const Scene *scene, Object *ob, Span< RNAPath > rna_paths)
GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Object *ob_eval, const Object &ob_orig, const bke::greasepencil::Drawing &drawing_orig)
GeometryDeformation get_evaluated_curves_deformation(const Object *ob_eval, const Object &ob_orig)
Bounds< T > merge(const Bounds< T > &a, const Bounds< T > &b)
IndexMask retrieve_selected_points(const bke::CurvesGeometry &curves, IndexMaskMemory &memory)
IndexMask retrieve_editable_and_selected_points(Object &object, const bke::greasepencil::Drawing &drawing, int layer_index, IndexMaskMemory &memory)
Vector< MutableDrawingInfo > retrieve_editable_drawings(const Scene &scene, GreasePencil &grease_pencil)
bool calc_active_center(Object *ob, bool select_only, float r_center[3])
void xform_skip_child_container_item_ensure_from_array(XFormObjectSkipChild_Container *xcs, const Scene *scene, ViewLayer *view_layer, Object **objects, uint objects_len)
void data_xform_container_destroy(XFormObjectData_Container *xds)
bool shape_key_report_if_locked(const Object *obedit, ReportList *reports)
XFormObjectSkipChild_Container * xform_skip_child_container_create()
void data_xform_container_update_all(XFormObjectData_Container *xds, Main *bmain, Depsgraph *depsgraph)
void object_xform_skip_child_container_destroy(XFormObjectSkipChild_Container *xcs)
void data_xform_container_item_ensure(XFormObjectData_Container *xds, Object *ob)
void object_xform_skip_child_container_update_all(XFormObjectSkipChild_Container *xcs, Main *bmain, Depsgraph *depsgraph)
XFormObjectData_Container * data_xform_container_create()
IndexMask retrieve_selected_points(const PointCloud &pointcloud, IndexMaskMemory &memory)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
Value parallel_reduce(IndexRange range, int64_t grain_size, const Value &identity, const Function &function, const Reduction &reduction)
MatBase< float, 4, 4 > float4x4
MatBase< float, 3, 3 > float3x3
VecBase< float, 3 > float3
static void init(bNodeTree *, bNode *node)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
struct MovieTracking tracking
struct ToolSettings * toolsettings
float rotation_quaternion[4]
struct bPoseChannel * parent
struct bPoseChannel_Runtime runtime
const c_style_mat & ptr() const
static MatBase identity()
struct ReportList * reports
void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
static wmOperatorStatus snap_curs_to_grid_exec(bContext *C, wmOperator *)
static wmOperatorStatus snap_curs_to_active_exec(bContext *C, wmOperator *)
static void bundle_midpoint(Scene *scene, Object *ob, float r_vec[3])
static wmOperatorStatus snap_selected_to_active_exec(bContext *C, wmOperator *op)
bool ED_view3d_snap_selected_to_location(bContext *C, wmOperator *op, const float target_loc_global[3], const int pivot_point)
static wmOperatorStatus snap_selected_to_cursor_exec(bContext *C, wmOperator *op)
static bool snap_curs_to_sel_ex(bContext *C, const int pivot_point, float r_cursor[3])
static wmOperatorStatus snap_sel_to_grid_exec(bContext *C, wmOperator *op)
static bool snap_selected_to_location_rotation(bContext *C, wmOperator *op, const blender::float3 &target_loc_global, const View3DCursor *target_orientation_global, const bool use_offset, const int pivot_point, const bool use_toolsettings)
void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot)
static wmOperatorStatus snap_curs_to_sel_exec(bContext *C, wmOperator *)
static wmOperatorStatus snap_curs_to_center_exec(bContext *C, wmOperator *)
void VIEW3D_OT_snap_cursor_to_selected(wmOperatorType *ot)
void VIEW3D_OT_snap_cursor_to_center(wmOperatorType *ot)
bool ED_view3d_minmax_verts(const Scene *scene, Object *obedit, float r_min[3], float r_max[3])
static bool snap_calc_active_center(bContext *C, const bool select_only, float r_center[3])
static std::optional< blender::Bounds< blender::float3 > > bounds_min_max_with_transform(const blender::float4x4 &transform, const blender::Span< blender::float3 > positions, const blender::IndexMask &mask)
void VIEW3D_OT_snap_selected_to_active(wmOperatorType *ot)
static bool pose_bone_runtime_flag_test_recursive(const bPoseChannel *pose_bone, int flag)
void VIEW3D_OT_snap_cursor_to_active(wmOperatorType *ot)
void VIEW3D_OT_snap_selected_to_cursor(wmOperatorType *ot)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)