Cleanup: de-duplicate active item center access
This commit is contained in:
parent
8a804d5da7
commit
0835c224ba
|
@ -71,6 +71,14 @@ struct Object *ED_object_context(struct bContext *C); /* context.o
|
|||
struct Object *ED_object_active_context(struct bContext *C); /* context.object or context.active_object */
|
||||
void ED_hide_collections_menu_draw(const struct bContext *C, struct uiLayout *layout);
|
||||
|
||||
/* object_utils.c */
|
||||
bool ED_object_calc_active_center_for_editmode(
|
||||
struct Object *obedit, const bool select_only, float r_center[3]);
|
||||
bool ED_object_calc_active_center_for_posemode(
|
||||
struct Object *ob, const bool select_only, float r_center[3]);
|
||||
bool ED_object_calc_active_center(
|
||||
struct Object *ob, const bool select_only, float r_center[3]);
|
||||
|
||||
/* object_ops.c */
|
||||
void ED_operatortypes_object(void);
|
||||
void ED_operatormacros_object(void);
|
||||
|
@ -135,9 +143,6 @@ bool ED_object_editmode_enter_ex(struct Main *bmain, struct Scene *scene, struct
|
|||
bool ED_object_editmode_enter(struct bContext *C, int flag);
|
||||
bool ED_object_editmode_load(struct Main *bmain, struct Object *obedit);
|
||||
|
||||
bool ED_object_editmode_calc_active_center(struct Object *obedit, const bool select_only, float r_center[3]);
|
||||
|
||||
|
||||
void ED_object_vpaintmode_enter_ex(
|
||||
struct Main *bmain, struct Depsgraph *depsgraph, struct wmWindowManager *wm,
|
||||
struct Scene *scene, struct Object *ob);
|
||||
|
|
|
@ -7367,7 +7367,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
|
|||
new_mode = EDBM_CLNOR_POINTTO_MODE_COORDINATES;
|
||||
view3d_operator_needs_opengl(C);
|
||||
if (EDBM_select_pick(C, event->mval, false, false, false)) {
|
||||
ED_object_editmode_calc_active_center(obedit, false, target); /* Point to newly selected active. */
|
||||
ED_object_calc_active_center_for_editmode(obedit, false, target); /* Point to newly selected active. */
|
||||
add_v3_v3(target, obedit->loc);
|
||||
ret = OPERATOR_RUNNING_MODAL;
|
||||
}
|
||||
|
@ -7412,7 +7412,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
|
|||
break;
|
||||
|
||||
case V3D_AROUND_ACTIVE:
|
||||
if (!ED_object_editmode_calc_active_center(obedit, false, target)) {
|
||||
if (!ED_object_calc_active_center_for_editmode(obedit, false, target)) {
|
||||
zero_v3(target);
|
||||
}
|
||||
add_v3_v3(target, obedit->loc);
|
||||
|
|
|
@ -64,6 +64,7 @@ set(SRC
|
|||
object_shapekey.c
|
||||
object_data_transfer.c
|
||||
object_transform.c
|
||||
object_utils.c
|
||||
object_warp.c
|
||||
object_vgroup.c
|
||||
|
||||
|
|
|
@ -1766,68 +1766,6 @@ void OBJECT_OT_mode_set_or_submode(wmOperatorType *ot)
|
|||
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
|
||||
}
|
||||
|
||||
bool ED_object_editmode_calc_active_center(Object *obedit, const bool select_only, float r_center[3])
|
||||
{
|
||||
switch (obedit->type) {
|
||||
case OB_MESH:
|
||||
{
|
||||
BMEditMesh *em = BKE_editmesh_from_object(obedit);
|
||||
BMEditSelection ese;
|
||||
|
||||
if (BM_select_history_active_get(em->bm, &ese)) {
|
||||
BM_editselection_center(&ese, r_center);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OB_ARMATURE:
|
||||
{
|
||||
bArmature *arm = obedit->data;
|
||||
EditBone *ebo = arm->act_edbone;
|
||||
|
||||
if (ebo && (!select_only || (ebo->flag & (BONE_SELECTED | BONE_ROOTSEL)))) {
|
||||
copy_v3_v3(r_center, ebo->head);
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case OB_CURVE:
|
||||
case OB_SURF:
|
||||
{
|
||||
Curve *cu = obedit->data;
|
||||
|
||||
if (ED_curve_active_center(cu, r_center)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OB_MBALL:
|
||||
{
|
||||
MetaBall *mb = obedit->data;
|
||||
MetaElem *ml_act = mb->lastelem;
|
||||
|
||||
if (ml_act && (!select_only || (ml_act->flag & SELECT))) {
|
||||
copy_v3_v3(r_center, &ml_act->x);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OB_LATTICE:
|
||||
{
|
||||
BPoint *actbp = BKE_lattice_active_point_get(obedit->data);
|
||||
|
||||
if (actbp) {
|
||||
copy_v3_v3(r_center, actbp->vec);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool move_to_collection_poll(bContext *C)
|
||||
{
|
||||
if (CTX_wm_space_outliner(C) != NULL) {
|
||||
|
|
|
@ -0,0 +1,153 @@
|
|||
/*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
/** \file blender/editors/object/object_utils.c
|
||||
* \ingroup edobj
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "DNA_anim_types.h"
|
||||
#include "DNA_armature_types.h"
|
||||
#include "DNA_meta_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_collection_types.h"
|
||||
|
||||
#include "BLI_math.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "BKE_action.h"
|
||||
#include "BKE_editmesh.h"
|
||||
#include "BKE_lattice.h"
|
||||
|
||||
#include "WM_types.h"
|
||||
|
||||
#include "ED_armature.h"
|
||||
#include "ED_curve.h"
|
||||
#include "ED_object.h" /* own include */
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Active Element Center
|
||||
* \{ */
|
||||
|
||||
bool ED_object_calc_active_center_for_editmode(
|
||||
Object *obedit, const bool select_only, float r_center[3])
|
||||
{
|
||||
switch (obedit->type) {
|
||||
case OB_MESH:
|
||||
{
|
||||
BMEditMesh *em = BKE_editmesh_from_object(obedit);
|
||||
BMEditSelection ese;
|
||||
|
||||
if (BM_select_history_active_get(em->bm, &ese)) {
|
||||
BM_editselection_center(&ese, r_center);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OB_ARMATURE:
|
||||
{
|
||||
bArmature *arm = obedit->data;
|
||||
EditBone *ebo = arm->act_edbone;
|
||||
|
||||
if (ebo && (!select_only || (ebo->flag & (BONE_SELECTED | BONE_ROOTSEL)))) {
|
||||
copy_v3_v3(r_center, ebo->head);
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case OB_CURVE:
|
||||
case OB_SURF:
|
||||
{
|
||||
Curve *cu = obedit->data;
|
||||
|
||||
if (ED_curve_active_center(cu, r_center)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OB_MBALL:
|
||||
{
|
||||
MetaBall *mb = obedit->data;
|
||||
MetaElem *ml_act = mb->lastelem;
|
||||
|
||||
if (ml_act && (!select_only || (ml_act->flag & SELECT))) {
|
||||
copy_v3_v3(r_center, &ml_act->x);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OB_LATTICE:
|
||||
{
|
||||
BPoint *actbp = BKE_lattice_active_point_get(obedit->data);
|
||||
|
||||
if (actbp) {
|
||||
copy_v3_v3(r_center, actbp->vec);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ED_object_calc_active_center_for_posemode(
|
||||
Object *ob, const bool select_only, float r_center[3])
|
||||
{
|
||||
bPoseChannel *pchan = BKE_pose_channel_active(ob);
|
||||
if (pchan && (!select_only || (pchan->bone->flag & BONE_SELECTED))) {
|
||||
copy_v3_v3(r_center, pchan->pose_head);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ED_object_calc_active_center(
|
||||
Object *ob, const bool select_only, float r_center[3])
|
||||
{
|
||||
if (ob->mode & OB_MODE_EDIT) {
|
||||
if (ED_object_calc_active_center_for_editmode(ob, select_only, r_center)) {
|
||||
mul_m4_v3(ob->obmat, r_center);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else if (ob->mode & OB_MODE_POSE) {
|
||||
if (ED_object_calc_active_center_for_posemode(ob, select_only, r_center)) {
|
||||
mul_m4_v3(ob->obmat, r_center);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
if (!select_only || (ob->flag & SELECT)) {
|
||||
copy_v3_v3(r_center, ob->obmat[3]);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
|
@ -755,44 +755,11 @@ void VIEW3D_OT_snap_cursor_to_selected(wmOperatorType *ot)
|
|||
*
|
||||
* Note: this could be exported to be a generic function.
|
||||
* see: calculateCenterActive
|
||||
**/
|
||||
*/
|
||||
static bool snap_calc_active_center(bContext *C, const bool select_only, float r_center[3])
|
||||
{
|
||||
const Depsgraph *depsgraph = CTX_data_depsgraph(C);
|
||||
Object *obedit = CTX_data_edit_object(C);
|
||||
|
||||
if (obedit) {
|
||||
if (ED_object_editmode_calc_active_center(obedit, select_only, r_center)) {
|
||||
mul_m4_v3(obedit->obmat, r_center);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
if (ob) {
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
|
||||
if (ob->mode & OB_MODE_POSE) {
|
||||
bPoseChannel *pchan = BKE_pose_channel_active(ob_eval);
|
||||
if (pchan) {
|
||||
if (!select_only || (pchan->bone->flag & BONE_SELECTED)) {
|
||||
copy_v3_v3(r_center, pchan->pose_head);
|
||||
mul_m4_v3(ob_eval->obmat, r_center);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
if (!select_only || (ob_eval->flag & SELECT)) {
|
||||
copy_v3_v3(r_center, ob_eval->obmat[3]);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
return ED_object_calc_active_center(ob, select_only, r_center);
|
||||
}
|
||||
|
||||
static int snap_curs_to_active_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
|
|
|
@ -2005,21 +2005,17 @@ bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3])
|
|||
bool ok = false;
|
||||
|
||||
if (tc->obedit) {
|
||||
if (ED_object_editmode_calc_active_center(tc->obedit, select_only, r_center)) {
|
||||
if (ED_object_calc_active_center_for_editmode(tc->obedit, select_only, r_center)) {
|
||||
mul_m4_v3(tc->obedit->obmat, r_center);
|
||||
ok = true;
|
||||
}
|
||||
}
|
||||
else if (t->flag & T_POSE) {
|
||||
ViewLayer *view_layer = t->view_layer;
|
||||
Object *ob = OBACT(view_layer);
|
||||
if (ob) {
|
||||
bPoseChannel *pchan = BKE_pose_channel_active(ob);
|
||||
if (pchan && (!select_only || (pchan->bone->flag & BONE_SELECTED))) {
|
||||
copy_v3_v3(r_center, pchan->pose_head);
|
||||
mul_m4_v3(ob->obmat, r_center);
|
||||
ok = true;
|
||||
}
|
||||
Object *ob = OBACT(view_layer) ;
|
||||
if (ED_object_calc_active_center_for_posemode(ob, select_only, r_center)) {
|
||||
mul_m4_v3(ob->obmat, r_center);
|
||||
ok = true;
|
||||
}
|
||||
}
|
||||
else if (t->options & CTX_PAINT_CURVE) {
|
||||
|
|
Loading…
Reference in New Issue