63 float gridf, imat[3][3], bmat[3][3], vec[3];
73 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
74 Object *obedit = objects[ob_index];
97 vec[0] = gridf *
floorf(0.5f + vec[0] / gridf);
98 vec[1] = gridf *
floorf(0.5f + vec[1] / gridf);
99 vec[2] = gridf *
floorf(0.5f + vec[2] / gridf);
113 uint objects_len = 0;
115 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
116 Object *ob_eval = objects_eval[ob_index];
133 vec[0] = gridf *
floorf(0.5f + nLoc[0] / gridf);
134 vec[1] = gridf *
floorf(0.5f + nLoc[1] / gridf);
135 vec[2] = gridf *
floorf(0.5f + nLoc[2] / gridf);
145 pchan->
loc[0] = vec[0];
148 pchan->
loc[1] = vec[1];
151 pchan->
loc[2] = vec[2];
184 uint objects_eval_len;
194 if (use_transform_skip_children) {
199 for (
int ob_index = 0; ob_index < objects_eval_len; ob_index++) {
200 Object *ob_eval = objects_eval[ob_index];
206 xcs, view_layer, objects, objects_eval_len);
209 if (use_transform_data_origin) {
214 for (
int ob_index = 0; ob_index < objects_eval_len; ob_index++) {
215 Object *ob_eval = objects_eval[ob_index];
217 vec[0] = -ob_eval->
obmat[3][0] + gridf *
floorf(0.5f + ob_eval->
obmat[3][0] / gridf);
218 vec[1] = -ob_eval->
obmat[3][1] + gridf *
floorf(0.5f + ob_eval->
obmat[3][1] / gridf);
219 vec[2] = -ob_eval->
obmat[3][2] + gridf *
floorf(0.5f + ob_eval->
obmat[3][2] / gridf);
222 float originmat[3][3];
229 ob->
loc[0] = ob_eval->
loc[0] + vec[0];
232 ob->
loc[1] = ob_eval->
loc[1] + vec[1];
235 ob->
loc[2] = ob_eval->
loc[2] + vec[2];
241 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";
298 const float snap_target_global[3],
299 const bool use_offset,
300 const int pivot_point,
301 const bool use_toolsettings)
309 float imat[3][3], bmat[3][3];
310 float center_global[3];
311 float offset_global[3];
321 sub_v3_v3v3(offset_global, snap_target_global, center_global);
325 float snap_target_local[3];
327 uint objects_len = 0;
329 view_layer, v3d, &objects_len);
330 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
331 obedit = objects[ob_index];
354 float offset_local[3];
378 uint objects_len = 0;
381 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
382 Object *ob = objects[ob_index];
385 float snap_target_local[3];
409 float cursor_pose[3];
423 if (use_toolsettings) {
425 pchan->
loc[0] = cursor_pose[0];
428 pchan->
loc[1] = cursor_pose[1];
431 pchan->
loc[2] = cursor_pose[2];
477 const bool use_transform_skip_children = use_toolsettings &&
480 const bool use_transform_data_origin = use_toolsettings &&
486 if (use_transform_skip_children) {
490 xcs, view_layer, objects, objects_len);
492 if (use_transform_data_origin) {
498 for (
int ob_index = 0; ob_index < objects_len; ob_index++) {
499 Object *ob = objects[ob_index];
504 for (
int ob_index = 0; ob_index < objects_len; ob_index++) {
505 Object *ob = objects[ob_index];
510 float cursor_parent[3];
516 copy_v3_v3(cursor_parent, snap_target_global);
522 float originmat[3][3], parentmat[4][4];
533 if (use_toolsettings) {
535 ob->
loc[0] += cursor_parent[0];
538 ob->
loc[1] += cursor_parent[1];
541 ob->
loc[2] += cursor_parent[2];
558 if (use_transform_skip_children) {
562 if (use_transform_data_origin) {
574 const float snap_target_global[3],
575 const int pivot_point)
579 const bool use_offset =
true;
582 const bool use_toolsettings =
false;
584 C, snap_target_global, use_offset, pivot_point, use_toolsettings);
611 ot->
name =
"Snap Selection to Cursor";
613 ot->
idname =
"VIEW3D_OT_snap_selected_to_cursor";
627 "If the selection should be snapped as a whole or by each object center");
639 float snap_target_global[3];
655 ot->
name =
"Snap Selection to Active";
656 ot->
description =
"Snap selected item(s) to the active item";
657 ot->
idname =
"VIEW3D_OT_snap_selected_to_active";
684 curs[0] = gridf *
floorf(0.5f + curs[0] / gridf);
685 curs[1] = gridf *
floorf(0.5f + curs[1] / gridf);
686 curs[2] = gridf *
floorf(0.5f + curs[2] / gridf);
697 ot->
name =
"Snap Cursor to Grid";
698 ot->
description =
"Snap 3D cursor to the nearest grid division";
699 ot->
idname =
"VIEW3D_OT_snap_cursor_to_grid";
725 float min[3],
max[3], mat[4][4],
pos[3], cammat[4][4];
782 float bmat[3][3], vec[3],
min[3],
max[3], centroid[3];
790 uint objects_len = 0;
793 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
794 obedit = objects[ob_index];
896 ot->
name =
"Snap Cursor to Selected";
897 ot->
description =
"Snap 3D cursor to the middle of the selected item(s)";
898 ot->
idname =
"VIEW3D_OT_snap_cursor_to_selected";
945 ot->
name =
"Snap Cursor to Active";
947 ot->
idname =
"VIEW3D_OT_snap_cursor_to_active";
982 ot->
name =
"Snap Cursor to World Origin";
984 ot->
idname =
"VIEW3D_OT_snap_cursor_to_center";
1004 float centroid[3], vec[3], bmat[3][3];
1008 float ob_min[3], ob_max[3];
Blender kernel action and pose functionality.
struct bPoseChannel * BKE_pose_channel_find_name(const struct bPose *pose, const char *name)
void BKE_armature_loc_pose_to_bone(struct bPoseChannel *pchan, const float inloc[3], float outloc[3])
bool BKE_armature_bone_flag_test_recursive(const struct Bone *bone, int flag)
#define PBONE_VISIBLE(arm, bone)
struct Scene * CTX_data_scene(const bContext *C)
struct Object * CTX_data_edit_object(const bContext *C)
struct ViewLayer * CTX_data_view_layer(const bContext *C)
struct Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
struct Object * CTX_data_active_object(const bContext *C)
struct View3D * CTX_wm_view3d(const bContext *C)
struct ARegion * CTX_wm_region(const bContext *C)
struct Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
struct Main * CTX_data_main(const bContext *C)
BMEditMesh * BKE_editmesh_from_object(struct 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 BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, v3d, r_len)
#define FOREACH_SELECTED_EDITABLE_OBJECT_BEGIN(_view_layer, _v3d, _instance)
#define FOREACH_SELECTED_OBJECT_END
bool BKE_mball_minmax_ex(const struct MetaBall *mb, float min[3], float max[3], const float obmat[4][4], short flag)
General operations, lookup, etc. for blender objects.
struct MovieClip * BKE_object_movieclip_get(struct Scene *scene, struct Object *ob, bool use_default)
void BKE_object_get_parent_matrix(struct Object *ob, struct Object *par, float r_parentmat[4][4])
struct Object ** BKE_object_pose_array_get(struct ViewLayer *view_layer, struct View3D *v3d, unsigned int *r_objects_len)
void BKE_object_where_is_calc_ex(struct Depsgraph *depsgraph, struct Scene *scene, struct RigidBodyWorld *rbw, struct Object *ob, float r_originmat[3][3])
bool BKE_object_flag_test_recursive(const struct Object *ob, short flag)
void BKE_report(ReportList *reports, eReportType type, const char *message)
void BKE_scene_cursor_mat3_to_rot(struct View3DCursor *cursor, const float mat[3][3], bool use_compat)
void BKE_scene_graph_evaluated_ensure(struct Depsgraph *depsgraph, struct Main *bmain)
void BKE_tracking_get_camera_object_matrix(struct Object *camera_object, float mat[4][4])
void BKE_tracking_camera_get_reconstructed_interpolate(struct MovieTracking *tracking, struct MovieTrackingObject *object, float framenr, float mat[4][4])
#define TRACK_SELECTED(track)
struct ListBase * BKE_tracking_object_get_tracks(struct MovieTracking *tracking, struct MovieTrackingObject *object)
A (mainly) macro array library.
#define BLI_array_append(arr, item)
#define BLI_array_declare(arr)
#define BLI_array_len(arr)
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])
bool invert_m4(float R[4][4])
void unit_m3(float m[3][3])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
bool invert_m3_m3(float R[3][3], const float A[3][3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void mul_m3_m4m4(float R[3][3], const float A[4][4], const float B[4][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)
struct Depsgraph Depsgraph
void DEG_id_tag_update(struct ID *id, int flag)
struct Object * DEG_get_original_object(struct Object *object)
struct ViewLayer * DEG_get_evaluated_view_layer(const struct Depsgraph *graph)
struct Object * DEG_get_evaluated_object(const struct Depsgraph *depsgraph, struct Object *object)
@ ID_RECALC_COPY_ON_WRITE
Object is a sort of wrapper for general info.
#define OBPOSE_FROM_OBACT(ob)
@ SCE_XFORM_SKIP_CHILDREN
#define OBEDIT_FROM_OBACT(ob)
@ V3D_AROUND_CENTER_BOUNDS
#define V3D_SHOW_RECONSTRUCTION
#define ANIM_KS_LOCATION_ID
void ED_object_xform_skip_child_container_item_ensure_from_array(struct XFormObjectSkipChild_Container *xcs, struct ViewLayer *view_layer, struct Object **objects, uint objects_len)
bool ED_object_calc_active_center(struct Object *ob, bool select_only, float r_center[3])
void ED_object_xform_skip_child_container_update_all(struct XFormObjectSkipChild_Container *xcs, struct Main *bmain, struct Depsgraph *depsgraph)
void ED_object_xform_skip_child_container_destroy(struct XFormObjectSkipChild_Container *xcs)
struct XFormObjectSkipChild_Container * ED_object_xform_skip_child_container_create(void)
void ED_object_data_xform_container_destroy(struct XFormObjectData_Container *xds)
void ED_object_data_xform_container_item_ensure(struct XFormObjectData_Container *xds, struct Object *ob)
void ED_object_data_xform_container_update_all(struct XFormObjectData_Container *xds, struct Main *bmain, struct Depsgraph *depsgraph)
struct XFormObjectData_Container * ED_object_data_xform_container_create(void)
bool ED_operator_view3d_active(struct bContext *C)
bool ED_operator_region_view3d_active(struct bContext *C)
void ED_transverts_update_obedit(TransVertStore *tvs, struct Object *obedit)
void ED_transverts_create_from_obedit(TransVertStore *tvs, const struct Object *obedit, int mode)
void ED_transverts_free(TransVertStore *tvs)
bool ED_transverts_check_obedit(const struct Object *obedit)
float ED_view3d_grid_view_scale(struct Scene *scene, struct View3D *v3d, struct ARegion *region, const char **r_grid_unit)
Read Guarded memory(de)allocation.
const Depsgraph * depsgraph
bool ED_autokeyframe_object(bContext *C, Scene *scene, Object *ob, KeyingSet *ks)
bool ED_autokeyframe_pchan(bContext *C, Scene *scene, Object *ob, bPoseChannel *pchan, KeyingSet *ks)
KeyingSet * ANIM_get_keyingset_for_autokeying(const Scene *scene, const char *transformKSName)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
struct MovieTracking tracking
struct MovieTrackingObject * next
struct MovieTrackingTrack * next
struct ToolSettings * toolsettings
struct TransVert * transverts
struct bPoseChannel * next
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
struct ReportList * reports
bool ED_view3d_minmax_verts(Object *obedit, float r_min[3], float r_max[3])
static int snap_sel_to_grid_exec(bContext *C, wmOperator *UNUSED(op))
void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
static void bundle_midpoint(Scene *scene, Object *ob, float r_vec[3])
bool ED_view3d_snap_selected_to_location(bContext *C, const float snap_target_global[3], const int pivot_point)
static bool snap_curs_to_sel_ex(bContext *C, const int pivot_point, float r_cursor[3])
static int snap_curs_to_active_exec(bContext *C, wmOperator *UNUSED(op))
static int snap_curs_to_grid_exec(bContext *C, wmOperator *UNUSED(op))
void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot)
void VIEW3D_OT_snap_cursor_to_selected(wmOperatorType *ot)
static bool snap_selected_to_location(bContext *C, const float snap_target_global[3], const bool use_offset, const int pivot_point, const bool use_toolsettings)
static int snap_selected_to_active_exec(bContext *C, wmOperator *op)
void VIEW3D_OT_snap_cursor_to_center(wmOperatorType *ot)
static int snap_curs_to_sel_exec(bContext *C, wmOperator *UNUSED(op))
static bool snap_calc_active_center(bContext *C, const bool select_only, float r_center[3])
static int snap_selected_to_cursor_exec(bContext *C, wmOperator *op)
void VIEW3D_OT_snap_selected_to_active(wmOperatorType *ot)
static int snap_curs_to_center_exec(bContext *C, wmOperator *UNUSED(op))
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)