diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2014-05-05 22:56:38 +0400 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2014-05-05 22:57:52 +0400 |
commit | 036de9bfa58dcfceb09d804eda651f48a9986a8f (patch) | |
tree | d919d5e89196bd372fa5e5755104648f3f6fcde9 /source/blender | |
parent | f5687323a362847a2f8d101da8512f06e3c1f5f3 (diff) |
Make bpy.types.EditBone.matrix writeable.
Makes importing armatures from matrices (FBX...) *much* easier.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/armature/armature_utils.c | 25 | ||||
-rw-r--r-- | source/blender/editors/include/ED_armature.h | 3 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_armature.c | 15 |
3 files changed, 39 insertions, 4 deletions
diff --git a/source/blender/editors/armature/armature_utils.c b/source/blender/editors/armature/armature_utils.c index 52e3285d240..f22e668bcb7 100644 --- a/source/blender/editors/armature/armature_utils.c +++ b/source/blender/editors/armature/armature_utils.c @@ -216,6 +216,31 @@ void ED_armature_ebone_to_mat4(EditBone *ebone, float mat[4][4]) copy_v3_v3(mat[3], ebone->head); } +void ED_armature_ebone_from_mat3(EditBone *ebone, float mat[3][3]) +{ + float vec[3], roll; + const float len = len_v3v3(ebone->head, ebone->tail); + + mat3_to_vec_roll(mat, vec, &roll); + + madd_v3_v3v3fl(ebone->tail, ebone->head, vec, len); + ebone->roll = roll; +} + +void ED_armature_ebone_from_mat4(EditBone *ebone, float mat[4][4]) +{ + float mat3[3][3]; + + copy_m3_m4(mat3, mat); + /* We want normalized matrix here, to be consistent with ebone_to_mat. */ + BLI_ASSERT_UNIT_M3(mat3); + + sub_v3_v3(ebone->tail, ebone->head); + copy_v3_v3(ebone->head, mat[3]); + add_v3_v3(ebone->tail, mat[3]); + ED_armature_ebone_from_mat3(ebone, mat3); +} + /** * Return a pointer to the bone of the given name */ diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h index be2c7daac85..7579f6cba65 100644 --- a/source/blender/editors/include/ED_armature.h +++ b/source/blender/editors/include/ED_armature.h @@ -143,6 +143,9 @@ EditBone *ED_armature_bone_find_shared_parent(EditBone *ebone_child[], const uns void ED_armature_ebone_to_mat3(EditBone *ebone, float mat[3][3]); void ED_armature_ebone_to_mat4(EditBone *ebone, float mat[4][4]); +void ED_armature_ebone_from_mat3(EditBone *ebone, float mat[3][3]); +void ED_armature_ebone_from_mat4(EditBone *ebone, float mat[4][4]); + void transform_armature_mirror_update(struct Object *obedit); void ED_armature_origin_set(struct Scene *scene, struct Object *ob, float cursor[3], int centermode, int around); diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c index 612ce14f039..1bccceab5ab 100644 --- a/source/blender/makesrna/intern/rna_armature.c +++ b/source/blender/makesrna/intern/rna_armature.c @@ -401,6 +401,12 @@ static void rna_EditBone_matrix_get(PointerRNA *ptr, float *values) ED_armature_ebone_to_mat4(ebone, (float(*)[4])values); } +static void rna_EditBone_matrix_set(PointerRNA *ptr, const float *values) +{ + EditBone *ebone = (EditBone *)(ptr->data); + ED_armature_ebone_from_mat4(ebone, (float(*)[4])values); +} + static void rna_Armature_editbone_transform_update(Main *bmain, Scene *scene, PointerRNA *ptr) { bArmature *arm = (bArmature *)ptr->id.data; @@ -795,11 +801,12 @@ static void rna_def_edit_bone(BlenderRNA *brna) prop = RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX); /*RNA_def_property_float_sdna(prop, NULL, ""); *//* doesnt access any real data */ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); + //RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_flag(prop, PROP_THICK_WRAP); /* no reference to original data */ - RNA_def_property_ui_text(prop, "Editbone Matrix", "Read-only matrix calculated from the roll (armature space)"); - /* TODO - this could be made writable also */ - RNA_def_property_float_funcs(prop, "rna_EditBone_matrix_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Editbone Matrix", + "Matrix combining loc/rot of the bone (head position, direction and roll), " + "in armature space (WARNING: does not include/support bone's length/size)"); + RNA_def_property_float_funcs(prop, "rna_EditBone_matrix_get", "rna_EditBone_matrix_set", NULL); RNA_api_armature_edit_bone(srna); |