Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/object/object_transform.c')
-rw-r--r--source/blender/editors/object/object_transform.c926
1 files changed, 0 insertions, 926 deletions
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
deleted file mode 100644
index 2b207f2f27c..00000000000
--- a/source/blender/editors/object/object_transform.c
+++ /dev/null
@@ -1,926 +0,0 @@
-/**
- * $Id$
- *
- * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * Contributor(s): Blender Foundation, 2002-2008 full recode
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <stdlib.h>
-
-#include "DNA_armature_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_key_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_object_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_view3d_types.h"
-
-#include "BLI_arithb.h"
-#include "BLI_editVert.h"
-#include "BLI_listbase.h"
-
-#include "BKE_context.h"
-#include "BKE_curve.h"
-#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-#include "BKE_main.h"
-#include "BKE_mesh.h"
-#include "BKE_object.h"
-#include "BKE_report.h"
-#include "BKE_utildefines.h"
-
-#include "RNA_define.h"
-#include "RNA_access.h"
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "ED_anim_api.h"
-#include "ED_armature.h"
-#include "ED_curve.h"
-#include "ED_mesh.h"
-#include "ED_object.h"
-#include "ED_screen.h"
-#include "ED_view3d.h"
-
-#include "object_intern.h"
-
-/*************************** Clear Transformation ****************************/
-
-static int object_location_clear_exec(bContext *C, wmOperator *op)
-{
- int armature_clear= 0;
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
- if((ob->protectflag & OB_LOCK_LOCX)==0)
- ob->loc[0]= ob->dloc[0]= 0.0f;
- if((ob->protectflag & OB_LOCK_LOCY)==0)
- ob->loc[1]= ob->dloc[1]= 0.0f;
- if((ob->protectflag & OB_LOCK_LOCZ)==0)
- ob->loc[2]= ob->dloc[2]= 0.0f;
- }
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- if(armature_clear==0) /* in this case flush was done */
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_location_clear(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Clear Location";
- ot->description = "Clear the object's location.";
- ot->idname= "OBJECT_OT_location_clear";
-
- /* api callbacks */
- ot->exec= object_location_clear_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-static int object_rotation_clear_exec(bContext *C, wmOperator *op)
-{
- int armature_clear= 0;
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
- /* eulers can only get cleared if they are not protected */
- if((ob->protectflag & OB_LOCK_ROTX)==0)
- ob->rot[0]= ob->drot[0]= 0.0f;
- if((ob->protectflag & OB_LOCK_ROTY)==0)
- ob->rot[1]= ob->drot[1]= 0.0f;
- if((ob->protectflag & OB_LOCK_ROTZ)==0)
- ob->rot[2]= ob->drot[2]= 0.0f;
- }
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- if(armature_clear==0) /* in this case flush was done */
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_rotation_clear(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Clear Rotation";
- ot->description = "Clear the object's rotation.";
- ot->idname= "OBJECT_OT_rotation_clear";
-
- /* api callbacks */
- ot->exec= object_rotation_clear_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-static int object_scale_clear_exec(bContext *C, wmOperator *op)
-{
- int armature_clear= 0;
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
- if((ob->protectflag & OB_LOCK_SCALEX)==0) {
- ob->dsize[0]= 0.0f;
- ob->size[0]= 1.0f;
- }
- if((ob->protectflag & OB_LOCK_SCALEY)==0) {
- ob->dsize[1]= 0.0f;
- ob->size[1]= 1.0f;
- }
- if((ob->protectflag & OB_LOCK_SCALEZ)==0) {
- ob->dsize[2]= 0.0f;
- ob->size[2]= 1.0f;
- }
- }
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- if(armature_clear==0) /* in this case flush was done */
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_scale_clear(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Clear Scale";
- ot->description = "Clear the object's scale.";
- ot->idname= "OBJECT_OT_scale_clear";
-
- /* api callbacks */
- ot->exec= object_scale_clear_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-static int object_origin_clear_exec(bContext *C, wmOperator *op)
-{
- float *v1, *v3, mat[3][3];
- int armature_clear= 0;
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(ob->parent) {
- v1= ob->loc;
- v3= ob->parentinv[3];
-
- Mat3CpyMat4(mat, ob->parentinv);
- VECCOPY(v3, v1);
- v3[0]= -v3[0];
- v3[1]= -v3[1];
- v3[2]= -v3[2];
- Mat3MulVecfl(mat, v3);
- }
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- if(armature_clear==0) /* in this case flush was done */
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_origin_clear(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Clear Origin";
- ot->description = "Clear the object's origin.";
- ot->idname= "OBJECT_OT_origin_clear";
-
- /* api callbacks */
- ot->exec= object_origin_clear_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-/*************************** Apply Transformation ****************************/
-
-/* use this when the loc/size/rot of the parent has changed but the children
- * should stay in the same place, e.g. for apply-size-rot or object center */
-static void ignore_parent_tx(Main *bmain, Scene *scene, Object *ob )
-{
- Object workob;
- Object *ob_child;
-
- /* a change was made, adjust the children to compensate */
- for(ob_child=bmain->object.first; ob_child; ob_child=ob_child->id.next) {
- if(ob_child->parent == ob) {
- ED_object_apply_obmat(ob_child);
- what_does_parent(scene, ob_child, &workob);
- Mat4Invert(ob_child->parentinv, workob.obmat);
- }
- }
-}
-
-static int apply_objects_internal(bContext *C, ReportList *reports, int apply_loc, int apply_scale, int apply_rot)
-{
- Main *bmain= CTX_data_main(C);
- Scene *scene= CTX_data_scene(C);
- Object *ob;
- bArmature *arm;
- Mesh *me;
- Curve *cu;
- Nurb *nu;
- BPoint *bp;
- BezTriple *bezt;
- MVert *mvert;
- float rsmat[3][3], tmat[3][3], obmat[3][3], iobmat[3][3], mat[4][4], scale;
- int a, change = 0;
-
- /* first check if we can execute */
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- ob= base->object;
-
- if(ob->type==OB_MESH) {
- me= ob->data;
-
- if(me->id.us>1) {
- BKE_report(reports, RPT_ERROR, "Can't apply to a multi user mesh, doing nothing.");
- return OPERATOR_CANCELLED;
- }
- }
- else if(ob->type==OB_ARMATURE) {
- arm= ob->data;
-
- if(arm->id.us>1) {
- BKE_report(reports, RPT_ERROR, "Can't apply to a multi user armature, doing nothing.");
- return OPERATOR_CANCELLED;
- }
- }
- else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
- cu= ob->data;
-
- if(cu->id.us>1) {
- BKE_report(reports, RPT_ERROR, "Can't apply to a multi user curve, doing nothing.");
- return OPERATOR_CANCELLED;
- }
- if(cu->key) {
- BKE_report(reports, RPT_ERROR, "Can't apply to a curve with vertex keys, doing nothing.");
- return OPERATOR_CANCELLED;
- }
- }
- }
- CTX_DATA_END;
-
- /* now execute */
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- ob= base->object;
-
- /* calculate rotation/scale matrix */
- if(apply_scale && apply_rot)
- object_to_mat3(ob, rsmat);
- else if(apply_scale)
- object_scale_to_mat3(ob, rsmat);
- else if(apply_rot)
- object_rot_to_mat3(ob, rsmat);
- else
- Mat3One(rsmat);
-
- Mat4CpyMat3(mat, rsmat);
-
- /* calculate translation */
- if(apply_loc) {
- VecCopyf(mat[3], ob->loc);
-
- if(!(apply_scale && apply_rot)) {
- /* correct for scale and rotation that is still applied */
- object_to_mat3(ob, obmat);
- Mat3Inv(iobmat, obmat);
- Mat3MulMat3(tmat, rsmat, iobmat);
- Mat3MulVecfl(tmat, mat[3]);
- }
- }
-
- /* apply to object data */
- if(ob->type==OB_MESH) {
- me= ob->data;
-
- /* adjust data */
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++)
- Mat4MulVecfl(mat, mvert->co);
-
- if(me->key) {
- KeyBlock *kb;
-
- for(kb=me->key->block.first; kb; kb=kb->next) {
- float *fp= kb->data;
-
- for(a=0; a<kb->totelem; a++, fp+=3)
- Mat4MulVecfl(mat, fp);
- }
- }
-
- /* update normals */
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
- }
- else if (ob->type==OB_ARMATURE) {
- ED_armature_apply_transform(ob, mat);
- }
- else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
- cu= ob->data;
-
- scale = Mat3ToScalef(rsmat);
-
- for(nu=cu->nurb.first; nu; nu=nu->next) {
- if(nu->type == CU_BEZIER) {
- a= nu->pntsu;
- for(bezt= nu->bezt; a--; bezt++) {
- Mat4MulVecfl(mat, bezt->vec[0]);
- Mat4MulVecfl(mat, bezt->vec[1]);
- Mat4MulVecfl(mat, bezt->vec[2]);
- bezt->radius *= scale;
- bezt++;
- }
- }
- else {
- a= nu->pntsu*nu->pntsv;
- for(bp= nu->bp; a--; bp++)
- Mat4MulVecfl(mat, bp->vec);
- }
- }
- }
- else
- continue;
-
- if(apply_loc)
- ob->loc[0]= ob->loc[1]= ob->loc[2]= 0.0f;
- if(apply_scale)
- ob->size[0]= ob->size[1]= ob->size[2]= 1.0f;
- if(apply_rot)
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0f;
-
- where_is_object(scene, ob);
- ignore_parent_tx(bmain, scene, ob);
-
- DAG_id_flush_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA);
-
- change = 1;
- }
- CTX_DATA_END;
-
- if(!change)
- return OPERATOR_CANCELLED;
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
- return OPERATOR_FINISHED;
-}
-
-static int visual_transform_apply_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
- int change = 0;
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- where_is_object(scene, ob);
-
- VECCOPY(ob->loc, ob->obmat[3]);
- Mat4ToSize(ob->obmat, ob->size);
- Mat4ToEul(ob->obmat, ob->rot);
-
- where_is_object(scene, ob);
-
- change = 1;
- }
- CTX_DATA_END;
-
- if(!change)
- return OPERATOR_CANCELLED;
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_visual_transform_apply(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Apply Visual Transform";
- ot->description = "Apply the object's visual transformation to its data.";
- ot->idname= "OBJECT_OT_visual_transform_apply";
-
- /* api callbacks */
- ot->exec= visual_transform_apply_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-static int location_apply_exec(bContext *C, wmOperator *op)
-{
- return apply_objects_internal(C, op->reports, 1, 0, 0);
-}
-
-void OBJECT_OT_location_apply(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Apply Location";
- ot->description = "Apply the object's location to its data.";
- ot->idname= "OBJECT_OT_location_apply";
-
- /* api callbacks */
- ot->exec= location_apply_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-static int scale_apply_exec(bContext *C, wmOperator *op)
-{
- return apply_objects_internal(C, op->reports, 0, 1, 0);
-}
-
-void OBJECT_OT_scale_apply(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Apply Scale";
- ot->description = "Apply the object's scale to its data.";
- ot->idname= "OBJECT_OT_scale_apply";
-
- /* api callbacks */
- ot->exec= scale_apply_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-static int rotation_apply_exec(bContext *C, wmOperator *op)
-{
- return apply_objects_internal(C, op->reports, 0, 0, 1);
-}
-
-void OBJECT_OT_rotation_apply(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Apply Rotation";
- ot->description = "Apply the object's rotation to its data.";
- ot->idname= "OBJECT_OT_rotation_apply";
-
- /* api callbacks */
- ot->exec= rotation_apply_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-/************************ Texture Space Transform ****************************/
-
-void texspace_edit(Scene *scene, View3D *v3d)
-{
- Base *base;
- int nr=0;
-
- /* first test if from visible and selected objects
- * texspacedraw is set:
- */
-
- if(scene->obedit) return; // XXX get from context
-
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- break;
- }
- }
-
- if(base==0) {
- return;
- }
-
- nr= 0; // XXX pupmenu("Texture Space %t|Grab/Move%x1|Size%x2");
- if(nr<1) return;
-
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- base->object->dtx |= OB_TEXSPACE;
- }
- }
-
-
- if(nr==1) {
-// XXX initTransform(TFM_TRANSLATION, CTX_TEXTURE);
-// XXX Transform();
- }
- else if(nr==2) {
-// XXX initTransform(TFM_RESIZE, CTX_TEXTURE);
-// XXX Transform();
- }
- else if(nr==3) {
-// XXX initTransform(TFM_ROTATION, CTX_TEXTURE);
-// XXX Transform();
- }
-}
-
-/************************ Mirror Menu ****************************/
-
-void mirrormenu(void)
-{
-// XXX initTransform(TFM_MIRROR, CTX_NO_PET);
-// XXX Transform();
-}
-
-/********************* Set Object Center ************************/
-
-static EnumPropertyItem prop_set_center_types[] = {
- {0, "CENTER", 0, "ObData to Center", "Move object data around Object center"},
- {1, "CENTERNEW", 0, "Center New", "Move Object center to center of object data"},
- {2, "CENTERCURSOR", 0, "Center Cursor", "Move Object Center to position of the 3d cursor"},
- {0, NULL, 0, NULL, NULL}
-};
-
-/* 0 == do center, 1 == center new, 2 == center cursor */
-static int object_center_set_exec(bContext *C, wmOperator *op)
-{
- Main *bmain= CTX_data_main(C);
- Scene *scene= CTX_data_scene(C);
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
- Object *obedit= CTX_data_edit_object(C);
- Object *ob;
- Mesh *me, *tme;
- Curve *cu;
-/* BezTriple *bezt;
- BPoint *bp; */
- Nurb *nu, *nu1;
- EditVert *eve;
- float cent[3], centn[3], min[3], max[3], omat[3][3];
- int a, total= 0;
- int centermode = RNA_enum_get(op->ptr, "type");
-
- /* keep track of what is changed */
- int tot_change=0, tot_lib_error=0, tot_multiuser_arm_error=0;
- MVert *mvert;
-
- if(scene->id.lib || v3d==NULL){
- BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed on Lib data");
- return OPERATOR_CANCELLED;
- }
- if (obedit && centermode > 0) {
- BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed in EditMode");
- return OPERATOR_CANCELLED;
- }
- cent[0]= cent[1]= cent[2]= 0.0;
-
- if(obedit) {
-
- INIT_MINMAX(min, max);
-
- if(obedit->type==OB_MESH) {
- Mesh *me= obedit->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
-
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(v3d->around==V3D_CENTROID) {
- total++;
- VECADD(cent, cent, eve->co);
- }
- else {
- DO_MINMAX(eve->co, min, max);
- }
- }
-
- if(v3d->around==V3D_CENTROID) {
- VecMulf(cent, 1.0f/(float)total);
- }
- else {
- cent[0]= (min[0]+max[0])/2.0f;
- cent[1]= (min[1]+max[1])/2.0f;
- cent[2]= (min[2]+max[2])/2.0f;
- }
-
- for(eve= em->verts.first; eve; eve= eve->next) {
- VecSubf(eve->co, eve->co, cent);
- }
-
- recalc_editnormals(em);
- tot_change++;
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
- BKE_mesh_end_editmesh(me, em);
- }
- }
-
- /* reset flags */
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- base->object->flag &= ~OB_DONE;
- }
- CTX_DATA_END;
-
- for (me= G.main->mesh.first; me; me= me->id.next) {
- me->flag &= ~ME_ISDONE;
- }
-
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- if((base->object->flag & OB_DONE)==0) {
- base->object->flag |= OB_DONE;
-
- if(obedit==NULL && (me=get_mesh(base->object)) ) {
- if (me->id.lib) {
- tot_lib_error++;
- } else {
- if(centermode==2) {
- VECCOPY(cent, give_cursor(scene, v3d));
- Mat4Invert(base->object->imat, base->object->obmat);
- Mat4MulVecfl(base->object->imat, cent);
- } else {
- INIT_MINMAX(min, max);
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- DO_MINMAX(mvert->co, min, max);
- }
-
- cent[0]= (min[0]+max[0])/2.0f;
- cent[1]= (min[1]+max[1])/2.0f;
- cent[2]= (min[2]+max[2])/2.0f;
- }
-
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- VecSubf(mvert->co, mvert->co, cent);
- }
-
- if (me->key) {
- KeyBlock *kb;
- for (kb=me->key->block.first; kb; kb=kb->next) {
- float *fp= kb->data;
-
- for (a=0; a<kb->totelem; a++, fp+=3) {
- VecSubf(fp, fp, cent);
- }
- }
- }
-
- me->flag |= ME_ISDONE;
-
- if(centermode) {
- Mat3CpyMat4(omat, base->object->obmat);
-
- VECCOPY(centn, cent);
- Mat3MulVecfl(omat, centn);
- base->object->loc[0]+= centn[0];
- base->object->loc[1]+= centn[1];
- base->object->loc[2]+= centn[2];
-
- where_is_object(scene, base->object);
- ignore_parent_tx(bmain, scene, base->object);
-
- /* other users? */
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- ob = base->object;
- if((ob->flag & OB_DONE)==0) {
- tme= get_mesh(ob);
-
- if(tme==me) {
-
- ob->flag |= OB_DONE;
- ob->recalc= OB_RECALC_OB|OB_RECALC_DATA;
-
- Mat3CpyMat4(omat, ob->obmat);
- VECCOPY(centn, cent);
- Mat3MulVecfl(omat, centn);
- ob->loc[0]+= centn[0];
- ob->loc[1]+= centn[1];
- ob->loc[2]+= centn[2];
-
- where_is_object(scene, ob);
- ignore_parent_tx(bmain, scene, ob);
-
- if(tme && (tme->flag & ME_ISDONE)==0) {
- mvert= tme->mvert;
- for(a=0; a<tme->totvert; a++, mvert++) {
- VecSubf(mvert->co, mvert->co, cent);
- }
-
- if (tme->key) {
- KeyBlock *kb;
- for (kb=tme->key->block.first; kb; kb=kb->next) {
- float *fp= kb->data;
-
- for (a=0; a<kb->totelem; a++, fp+=3) {
- VecSubf(fp, fp, cent);
- }
- }
- }
-
- tme->flag |= ME_ISDONE;
- }
- }
- }
-
- ob= ob->id.next;
- }
- CTX_DATA_END;
- }
- tot_change++;
- }
- }
- else if (ELEM(base->object->type, OB_CURVE, OB_SURF)) {
-
- /* weak code here... (ton) */
- if(obedit==base->object) {
- ListBase *editnurb= curve_get_editcurve(obedit);
-
- nu1= editnurb->first;
- cu= obedit->data;
- }
- else {
- cu= base->object->data;
- nu1= cu->nurb.first;
- }
-
- if (cu->id.lib) {
- tot_lib_error++;
- } else {
- if(centermode==2) {
- VECCOPY(cent, give_cursor(scene, v3d));
- Mat4Invert(base->object->imat, base->object->obmat);
- Mat4MulVecfl(base->object->imat, cent);
-
- /* don't allow Z change if curve is 2D */
- if( !( cu->flag & CU_3D ) )
- cent[2] = 0.0;
- }
- else {
- INIT_MINMAX(min, max);
-
- nu= nu1;
- while(nu) {
- minmaxNurb(nu, min, max);
- nu= nu->next;
- }
-
- cent[0]= (min[0]+max[0])/2.0f;
- cent[1]= (min[1]+max[1])/2.0f;
- cent[2]= (min[2]+max[2])/2.0f;
- }
-
- nu= nu1;
- while(nu) {
- if(nu->type == CU_BEZIER) {
- a= nu->pntsu;
- while (a--) {
- VecSubf(nu->bezt[a].vec[0], nu->bezt[a].vec[0], cent);
- VecSubf(nu->bezt[a].vec[1], nu->bezt[a].vec[1], cent);
- VecSubf(nu->bezt[a].vec[2], nu->bezt[a].vec[2], cent);
- }
- }
- else {
- a= nu->pntsu*nu->pntsv;
- while (a--)
- VecSubf(nu->bp[a].vec, nu->bp[a].vec, cent);
- }
- nu= nu->next;
- }
-
- if(centermode && obedit==0) {
- Mat3CpyMat4(omat, base->object->obmat);
-
- Mat3MulVecfl(omat, cent);
- base->object->loc[0]+= cent[0];
- base->object->loc[1]+= cent[1];
- base->object->loc[2]+= cent[2];
-
- where_is_object(scene, base->object);
- ignore_parent_tx(bmain, scene, base->object);
- }
-
- tot_change++;
- if(obedit) {
- if (centermode==0) {
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
- }
- break;
- }
- }
- }
- else if(base->object->type==OB_FONT) {
- /* get from bb */
-
- cu= base->object->data;
-
- if(cu->bb==0) {
- /* do nothing*/
- } else if (cu->id.lib) {
- tot_lib_error++;
- } else {
- cu->xof= -0.5f*( cu->bb->vec[4][0] - cu->bb->vec[0][0]);
- cu->yof= -0.5f -0.5f*( cu->bb->vec[0][1] - cu->bb->vec[2][1]); /* extra 0.5 is the height o above line */
-
- /* not really ok, do this better once! */
- cu->xof /= cu->fsize;
- cu->yof /= cu->fsize;
-
- tot_change++;
- }
- }
- else if(base->object->type==OB_ARMATURE) {
- bArmature *arm = base->object->data;
-
- if (arm->id.lib) {
- tot_lib_error++;
- } else if(arm->id.us>1) {
- /*BKE_report(op->reports, RPT_ERROR, "Can't apply to a multi user armature");
- return;*/
- tot_multiuser_arm_error++;
- } else {
- /* Function to recenter armatures in editarmature.c
- * Bone + object locations are handled there.
- */
- docenter_armature(scene, v3d, base->object, centermode);
- tot_change++;
-
- where_is_object(scene, base->object);
- ignore_parent_tx(bmain, scene, base->object);
-
- if(obedit)
- break;
- }
- }
- base->object->recalc= OB_RECALC_OB|OB_RECALC_DATA;
- }
- }
- CTX_DATA_END;
-
- if (tot_change) {
- ED_anim_dag_flush_update(C);
- }
-
- /* Warn if any errors occured */
- if (tot_lib_error+tot_multiuser_arm_error) {
- BKE_reportf(op->reports, RPT_WARNING, "%i Object(s) Not Centered, %i Changed:",tot_lib_error+tot_multiuser_arm_error, tot_change);
- if (tot_lib_error)
- BKE_reportf(op->reports, RPT_WARNING, "|%i linked library objects",tot_lib_error);
- if (tot_multiuser_arm_error)
- BKE_reportf(op->reports, RPT_WARNING, "|%i multiuser armature object(s)",tot_multiuser_arm_error);
- }
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_center_set(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Set Center";
- ot->description = "Set the object's center, by either moving the data, or set to center of data, or use 3d cursor";
- ot->idname= "OBJECT_OT_center_set";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= object_center_set_exec;
-
- ot->poll= ED_operator_view3d_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_set_center_types, 0, "Type", "");
-}
-