diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/include/ED_transform.h | 3 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.h | 4 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_ops.c | 21 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_orientations.c | 80 |
4 files changed, 66 insertions, 42 deletions
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h index 74c150d9a00..e613a44b1c3 100644 --- a/source/blender/editors/include/ED_transform.h +++ b/source/blender/editors/include/ED_transform.h @@ -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); diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 26f36db2f4c..583a6a47036 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -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]); diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 4f46e969c3c..e2668416cfc 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -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) diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c index 343592d4501..25c4682a588 100644 --- a/source/blender/editors/transform/transform_orientations.c +++ b/source/blender/editors/transform/transform_orientations.c @@ -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; |