79 float gridf, imat[3][3], bmat[3][3], vec[3];
89 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
90 Object *obedit = objects[ob_index];
113 vec[0] = gridf *
floorf(0.5f + vec[0] / gridf);
114 vec[1] = gridf *
floorf(0.5f + vec[1] / gridf);
115 vec[2] = gridf *
floorf(0.5f + vec[2] / gridf);
129 uint objects_len = 0;
131 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
132 Object *ob_eval = objects_eval[ob_index];
149 vec[0] = gridf *
floorf(0.5f + nLoc[0] / gridf);
150 vec[1] = gridf *
floorf(0.5f + nLoc[1] / gridf);
151 vec[2] = gridf *
floorf(0.5f + nLoc[2] / gridf);
161 pchan->
loc[0] = vec[0];
164 pchan->
loc[1] = vec[1];
167 pchan->
loc[2] = vec[2];
200 uint objects_eval_len;
210 if (use_transform_skip_children) {
215 for (
int ob_index = 0; ob_index < objects_eval_len; ob_index++) {
216 Object *ob_eval = objects_eval[ob_index];
222 xcs, view_layer, objects, objects_eval_len);
225 if (use_transform_data_origin) {
230 for (
int ob_index = 0; ob_index < objects_eval_len; ob_index++) {
231 Object *ob_eval = objects_eval[ob_index];
233 vec[0] = -ob_eval->
obmat[3][0] + gridf *
floorf(0.5f + ob_eval->
obmat[3][0] / gridf);
234 vec[1] = -ob_eval->
obmat[3][1] + gridf *
floorf(0.5f + ob_eval->
obmat[3][1] / gridf);
235 vec[2] = -ob_eval->
obmat[3][2] + gridf *
floorf(0.5f + ob_eval->
obmat[3][2] / gridf);
238 float originmat[3][3];
245 ob->
loc[0] = ob_eval->
loc[0] + vec[0];
248 ob->
loc[1] = ob_eval->
loc[1] + vec[1];
251 ob->
loc[2] = ob_eval->
loc[2] + vec[2];
257 if (use_transform_data_origin) {
268 if (use_transform_skip_children) {
272 if (use_transform_data_origin) {
286 ot->
name =
"Snap Selection to Grid";
287 ot->
description =
"Snap selected item(s) to their nearest grid division";
288 ot->
idname =
"VIEW3D_OT_snap_selected_to_grid";
314 const float snap_target_global[3],
315 const bool use_offset)
323 float imat[3][3], bmat[3][3];
324 float center_global[3];
325 float offset_global[3];
336 sub_v3_v3v3(offset_global, snap_target_global, center_global);
340 float snap_target_local[3];
342 uint objects_len = 0;
345 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
346 obedit = objects[ob_index];
369 float offset_local[3];
393 uint objects_len = 0;
396 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
397 Object *ob = objects[ob_index];
400 float snap_target_local[3];
424 float cursor_pose[3];
439 pchan->
loc[0] = cursor_pose[0];
442 pchan->
loc[1] = cursor_pose[1];
445 pchan->
loc[2] = cursor_pose[2];
494 if (use_transform_skip_children) {
498 xcs, view_layer, objects, objects_len);
500 if (use_transform_data_origin) {
506 for (
int ob_index = 0; ob_index < objects_len; ob_index++) {
507 Object *ob = objects[ob_index];
512 for (
int ob_index = 0; ob_index < objects_len; ob_index++) {
513 Object *ob = objects[ob_index];
517 float cursor_parent[3];
523 copy_v3_v3(cursor_parent, snap_target_global);
529 float originmat[3][3], parentmat[4][4];
541 ob->
loc[0] += cursor_parent[0];
544 ob->
loc[1] += cursor_parent[1];
547 ob->
loc[2] += cursor_parent[2];
561 if (use_transform_skip_children) {
565 if (use_transform_data_origin) {
596 ot->
name =
"Snap Selection to Cursor";
598 ot->
idname =
"VIEW3D_OT_snap_selected_to_cursor";
612 "If the selection should be snapped as a whole or by each object center");
624 float snap_target_global[3];
637 ot->
name =
"Snap Selection to Active";
638 ot->
description =
"Snap selected item(s) to the active item";
639 ot->
idname =
"VIEW3D_OT_snap_selected_to_active";
666 curs[0] = gridf *
floorf(0.5f + curs[0] / gridf);
667 curs[1] = gridf *
floorf(0.5f + curs[1] / gridf);
668 curs[2] = gridf *
floorf(0.5f + curs[2] / gridf);
679 ot->
name =
"Snap Cursor to Grid";
680 ot->
description =
"Snap 3D cursor to the nearest grid division";
681 ot->
idname =
"VIEW3D_OT_snap_cursor_to_grid";
707 float min[3],
max[3], mat[4][4],
pos[3], cammat[4][4];
764 float bmat[3][3], vec[3],
min[3],
max[3], centroid[3];
772 uint objects_len = 0;
775 for (
uint ob_index = 0; ob_index < objects_len; ob_index++) {
776 obedit = objects[ob_index];
877 ot->
name =
"Snap Cursor to Selected";
878 ot->
description =
"Snap 3D cursor to the middle of the selected item(s)";
879 ot->
idname =
"VIEW3D_OT_snap_cursor_to_selected";
926 ot->
name =
"Snap Cursor to Active";
928 ot->
idname =
"VIEW3D_OT_snap_cursor_to_active";
963 ot->
name =
"Snap Cursor to World Origin";
965 ot->
idname =
"VIEW3D_OT_snap_cursor_to_center";
989 float centroid[3], vec[3], bmat[3][3];
993 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], const 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, ReportType 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)
#define OBEDIT_FROM_OBACT(ob)
@ SCE_XFORM_SKIP_CHILDREN
@ 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, const 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)
bool ED_transverts_check_obedit(Object *obedit)
void ED_transverts_update_obedit(TransVertStore *tvs, struct Object *obedit)
void ED_transverts_free(TransVertStore *tvs)
void ED_transverts_create_from_obedit(TransVertStore *tvs, struct Object *obedit, const int mode)
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])
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 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_location(bContext *C, const float snap_target_global[3], const bool use_offset)
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))
static bool snap_curs_to_sel_ex(bContext *C, float cursor[3])
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)