Fix for [#35238] Blender does not save custom orientations from "view"
authorBastien Montagne <montagne29@wanadoo.fr>
Sun, 12 May 2013 15:52:05 +0000 (15:52 +0000)
committerBastien Montagne <montagne29@wanadoo.fr>
Sun, 12 May 2013 15:52:05 +0000 (15:52 +0000)
Actually more a feature request... Now create orientations operator has an additional option, use_view, when this one is enabled it will use current view instead of active object to create the new space.

Also made some cleanup (made some funcs static).

source/blender/editors/include/ED_transform.h
source/blender/editors/transform/transform.h
source/blender/editors/transform/transform_ops.c
source/blender/editors/transform/transform_orientations.c

index 74c150d9a0015bb212150ec62f601fdff105bde0..e613a44b1c379aa347e08febae6dad5ff9d0b09f 100644 (file)
@@ -123,7 +123,8 @@ struct ReportList;
 void BIF_clearTransformOrientation(struct bContext *C);
 void BIF_removeTransformOrientation(struct bContext *C, struct TransformOrientation *ts);
 void BIF_removeTransformOrientationIndex(struct bContext *C, int index);
-void BIF_createTransformOrientation(struct bContext *C, struct ReportList *reports, char *name, int use, int overwrite);
+void BIF_createTransformOrientation(struct bContext *C, struct ReportList *reports, char *name, int use_view,
+                                    int use, int overwrite);
 void BIF_selectTransformOrientation(struct bContext *C, struct TransformOrientation *ts);
 void BIF_selectTransformOrientationValue(struct bContext *C, int orientation);
 
index 26f36db2f4c85c83f5de5149361a718b994ccee3..583a6a47036f247f7c3ae2dca5e4b083de10d717 100644 (file)
@@ -725,10 +725,6 @@ void getViewVector(TransInfo *t, float coord[3], float vec[3]);
 
 void initTransformOrientation(struct bContext *C, TransInfo *t);
 
-struct TransformOrientation *createObjectSpace(struct bContext *C, struct ReportList *reports, char *name, int overwrite);
-struct TransformOrientation *createMeshSpace(struct bContext *C, struct ReportList *reports, char *name, int overwrite);
-struct TransformOrientation *createBoneSpace(struct bContext *C, struct ReportList *reports, char *name, int overwrite);
-
 /* Those two fill in mat and return non-zero on success */
 bool createSpaceNormal(float mat[3][3], const float normal[3]);
 bool createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3]);
index 4f46e969c3ce4d0ea712ab7d979f5f3e882ab72d..e2668416cfcc6d5af9da0ac6890048b16c4a1d29 100644 (file)
@@ -252,7 +252,8 @@ static int create_orientation_exec(bContext *C, wmOperator *op)
        char name[MAX_NAME];
        int use = RNA_boolean_get(op->ptr, "use");
        int overwrite = RNA_boolean_get(op->ptr, "overwrite");
-       
+       int use_view = RNA_boolean_get(op->ptr, "use_view");
+
        RNA_string_get(op->ptr, "name", name);
 
        if (use && !CTX_wm_view3d(C)) {
@@ -260,7 +261,7 @@ static int create_orientation_exec(bContext *C, wmOperator *op)
                return OPERATOR_CANCELLED;
        }
 
-       BIF_createTransformOrientation(C, op->reports, name, use, overwrite);
+       BIF_createTransformOrientation(C, op->reports, name, use_view, use, overwrite);
 
        WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, CTX_wm_view3d(C));
        WM_event_add_notifier(C, NC_SCENE | NA_EDITED, CTX_data_scene(C));
@@ -268,11 +269,6 @@ static int create_orientation_exec(bContext *C, wmOperator *op)
        return OPERATOR_FINISHED;
 }
 
-static int create_orientation_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
-{
-       return create_orientation_exec(C, op);
-}
-
 static void TRANSFORM_OT_create_orientation(struct wmOperatorType *ot)
 {
        /* identifiers */
@@ -282,14 +278,15 @@ static void TRANSFORM_OT_create_orientation(struct wmOperatorType *ot)
        ot->flag   = OPTYPE_REGISTER | OPTYPE_UNDO;
 
        /* api callbacks */
-       ot->invoke = create_orientation_invoke;
        ot->exec   = create_orientation_exec;
        ot->poll   = ED_operator_areaactive;
-       ot->flag   = OPTYPE_REGISTER | OPTYPE_UNDO;
 
-       RNA_def_string(ot->srna, "name", "", MAX_NAME, "Name", "Text to insert at the cursor position");
-       RNA_def_boolean(ot->srna, "use", 0, "Use after creation", "Select orientation after its creation");
-       RNA_def_boolean(ot->srna, "overwrite", 0, "Overwrite previous", "Overwrite previously created orientation with same name");
+       RNA_def_string(ot->srna, "name", "", MAX_NAME, "Name", "Name of the new custom orientation");
+       RNA_def_boolean(ot->srna, "use_view", FALSE, "Use View",
+                       "Use the current view instead of the active object to create the new orientation");
+       RNA_def_boolean(ot->srna, "use", FALSE, "Use after creation", "Select orientation after its creation");
+       RNA_def_boolean(ot->srna, "overwrite", FALSE, "Overwrite previous",
+                       "Overwrite previously created orientation with same name");
 }
 
 static void transformops_exit(bContext *C, wmOperator *op)
index 343592d4501f3bf9da54e0b1656f2cff89b34798..25c4682a5888f4593309d01bf92be7ed4323fa3a 100644 (file)
@@ -100,31 +100,32 @@ static void uniqueOrientationName(ListBase *lb, char *name)
                          sizeof(((TransformOrientation *)NULL)->name));
 }
 
-void BIF_createTransformOrientation(bContext *C, ReportList *reports, char *name, int use, int overwrite)
+static TransformOrientation *createViewSpace(bContext *C, ReportList *UNUSED(reports), char *name, int overwrite)
 {
-       Object *obedit = CTX_data_edit_object(C);
-       Object *ob = CTX_data_active_object(C);
-       TransformOrientation *ts = NULL;
-       
-       if (obedit) {
-               if (obedit->type == OB_MESH)
-                       ts = createMeshSpace(C, reports, name, overwrite);
-               else if (obedit->type == OB_ARMATURE)
-                       ts = createBoneSpace(C, reports, name, overwrite);
-       }
-       else if (ob && (ob->mode & OB_MODE_POSE)) {
-               ts = createBoneSpace(C, reports, name, overwrite);
-       }
-       else {
-               ts = createObjectSpace(C, reports, name, overwrite);
-       }
-       
-       if (use && ts != NULL) {
-               BIF_selectTransformOrientation(C, ts);
+       RegionView3D *rv3d = CTX_wm_region_view3d(C);
+       float mat[3][3];
+
+       if (!rv3d)
+               return NULL;
+
+       copy_m3_m4(mat, rv3d->viewinv);
+       normalize_m3(mat);
+
+       if (!name[0]) {
+               View3D *v3d = CTX_wm_view3d(C);
+               if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
+                       /* If an object is used as camera, then this space is the same as object space! */
+                       strncpy(name, v3d->camera->id.name + 2, MAX_NAME);
+               }
+               else {
+                       strcpy(name, "Custom View");
+               }
        }
+
+       return addMatrixSpace(C, mat, name, overwrite);
 }
 
-TransformOrientation *createObjectSpace(bContext *C, ReportList *UNUSED(reports), char *name, int overwrite)
+static TransformOrientation *createObjectSpace(bContext *C, ReportList *UNUSED(reports), char *name, int overwrite)
 {
        Base *base = CTX_data_active_base(C);
        Object *ob;
@@ -133,9 +134,8 @@ TransformOrientation *createObjectSpace(bContext *C, ReportList *UNUSED(reports)
        if (base == NULL)
                return NULL;
 
-
        ob = base->object;
-       
+
        copy_m3_m4(mat, ob->obmat);
        normalize_m3(mat);
 
@@ -147,7 +147,7 @@ TransformOrientation *createObjectSpace(bContext *C, ReportList *UNUSED(reports)
        return addMatrixSpace(C, mat, name, overwrite);
 }
 
-TransformOrientation *createBoneSpace(bContext *C, ReportList *reports, char *name, int overwrite)
+static TransformOrientation *createBoneSpace(bContext *C, ReportList *reports, char *name, int overwrite)
 {
        float mat[3][3];
        float normal[3], plane[3];
@@ -166,7 +166,7 @@ TransformOrientation *createBoneSpace(bContext *C, ReportList *reports, char *na
        return addMatrixSpace(C, mat, name, overwrite);
 }
 
-TransformOrientation *createMeshSpace(bContext *C, ReportList *reports, char *name, int overwrite)
+static TransformOrientation *createMeshSpace(bContext *C, ReportList *reports, char *name, int overwrite)
 {
        float mat[3][3];
        float normal[3], plane[3];
@@ -260,6 +260,36 @@ bool createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3]
        return true;
 }
 
+/* name must be a MAX_NAME length string! */
+void BIF_createTransformOrientation(bContext *C, ReportList *reports, char *name, int use_view, int use, int overwrite)
+{
+       TransformOrientation *ts = NULL;
+
+       if (use_view) {
+               ts = createViewSpace(C, reports, name, overwrite);
+       }
+       else {
+               Object *obedit = CTX_data_edit_object(C);
+               Object *ob = CTX_data_active_object(C);
+               if (obedit) {
+                       if (obedit->type == OB_MESH)
+                               ts = createMeshSpace(C, reports, name, overwrite);
+                       else if (obedit->type == OB_ARMATURE)
+                               ts = createBoneSpace(C, reports, name, overwrite);
+               }
+               else if (ob && (ob->mode & OB_MODE_POSE)) {
+                       ts = createBoneSpace(C, reports, name, overwrite);
+               }
+               else {
+                       ts = createObjectSpace(C, reports, name, overwrite);
+               }
+       }
+
+       if (use && ts != NULL) {
+               BIF_selectTransformOrientation(C, ts);
+       }
+}
+
 TransformOrientation *addMatrixSpace(bContext *C, float mat[3][3], char name[], int overwrite)
 {
        ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;