RNA: add 3D cursor matrix attribute
authorCampbell Barton <ideasman42@gmail.com>
Thu, 16 May 2019 03:38:33 +0000 (13:38 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 16 May 2019 03:50:00 +0000 (13:50 +1000)
Avoids having to check rotation modes to get the orientation.

source/blender/blenkernel/BKE_scene.h
source/blender/blenkernel/intern/scene.c
source/blender/editors/include/ED_view3d.h
source/blender/editors/mesh/editmesh_add_gizmo.c
source/blender/editors/space_view3d/view3d_utils.c
source/blender/editors/transform/transform_gizmo_3d.c
source/blender/editors/transform/transform_orientations.c
source/blender/makesrna/intern/rna_scene.c

index 75ff5ea..581df64 100644 (file)
@@ -240,6 +240,11 @@ void BKE_scene_cursor_quat_to_rot(struct View3DCursor *cursor,
                                   const float quat[4],
                                   bool use_compat);
 
+void BKE_scene_cursor_to_mat4(const struct View3DCursor *cursor, float mat[4][4]);
+void BKE_scene_cursor_from_mat4(struct View3DCursor *cursor,
+                                const float mat[4][4],
+                                bool use_compat);
+
 #ifdef __cplusplus
 }
 #endif
index 714261c..a1e6aa6 100644 (file)
@@ -2386,4 +2386,20 @@ void BKE_scene_cursor_quat_to_rot(View3DCursor *cursor, const float quat[4], boo
   }
 }
 
+void BKE_scene_cursor_to_mat4(const View3DCursor *cursor, float mat[4][4])
+{
+  float mat3[3][3];
+  BKE_scene_cursor_rot_to_mat3(cursor, mat3);
+  copy_m4_m3(mat, mat3);
+  copy_v3_v3(mat[3], cursor->location);
+}
+
+void BKE_scene_cursor_from_mat4(View3DCursor *cursor, const float mat[4][4], bool use_compat)
+{
+  float mat3[3][3];
+  copy_m3_m4(mat3, mat);
+  BKE_scene_cursor_mat3_to_rot(cursor, mat3, use_compat);
+  copy_v3_v3(cursor->location, mat[3]);
+}
+
 /** \} */
index 3503d38..8974f3d 100644 (file)
@@ -108,8 +108,6 @@ enum eV3DCursorOrient {
 void ED_view3d_background_color_get(const struct Scene *scene,
                                     const struct View3D *v3d,
                                     float r_color[3]);
-void ED_view3d_cursor3d_calc_mat3(const struct Scene *scene, float mat[3][3]);
-void ED_view3d_cursor3d_calc_mat4(const struct Scene *scene, float mat[4][4]);
 void ED_view3d_cursor3d_position(struct bContext *C,
                                  const int mval[2],
                                  const bool use_depth,
index 839ee18..f6729fb 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "BKE_context.h"
 #include "BKE_editmesh.h"
+#include "BKE_scene.h"
 
 #include "ED_gizmo_library.h"
 #include "ED_gizmo_utils.h"
@@ -75,7 +76,7 @@ static void calc_initial_placement_point_from_view(bContext *C,
 
   float cursor_matrix[4][4];
   float orient_matrix[3][3];
-  ED_view3d_cursor3d_calc_mat4(scene, cursor_matrix);
+  BKE_scene_cursor_to_mat4(&scene->cursor, cursor_matrix);
 
   float dots[3] = {
       dot_v3v3(rv3d->viewinv[2], cursor_matrix[0]),
index 9131365..bb8c1a4 100644 (file)
@@ -86,21 +86,6 @@ void ED_view3d_background_color_get(const Scene *scene, const View3D *v3d, float
   UI_GetThemeColor3fv(TH_BACK, r_color);
 }
 
-void ED_view3d_cursor3d_calc_mat3(const Scene *scene, float mat[3][3])
-{
-  const View3DCursor *cursor = &scene->cursor;
-  BKE_scene_cursor_rot_to_mat3(cursor, mat);
-}
-
-void ED_view3d_cursor3d_calc_mat4(const Scene *scene, float mat[4][4])
-{
-  const View3DCursor *cursor = &scene->cursor;
-  float mat3[3][3];
-  BKE_scene_cursor_rot_to_mat3(cursor, mat3);
-  copy_m4_m3(mat, mat3);
-  copy_v3_v3(mat[3], cursor->location);
-}
-
 Camera *ED_view3d_camera_data_get(View3D *v3d, RegionView3D *rv3d)
 {
   /* establish the camera object,
index 35fda39..e43379d 100644 (file)
@@ -703,7 +703,7 @@ void ED_transform_calc_orientation_from_type_ex(const bContext *C,
       break;
     }
     case V3D_ORIENT_CURSOR: {
-      ED_view3d_cursor3d_calc_mat3(scene, r_mat);
+      BKE_scene_cursor_rot_to_mat3(&scene->cursor, r_mat);
       ok = true;
       break;
     }
index e16579a..70bb2bf 100644 (file)
@@ -485,7 +485,7 @@ void initTransformOrientation(bContext *C, TransInfo *t)
       break;
     case V3D_ORIENT_CURSOR: {
       BLI_strncpy(t->spacename, IFACE_("cursor"), sizeof(t->spacename));
-      ED_view3d_cursor3d_calc_mat3(t->scene, t->spacemtx);
+      BKE_scene_cursor_rot_to_mat3(&t->scene->cursor, t->spacemtx);
       break;
     }
     case V3D_ORIENT_CUSTOM_MATRIX:
index ed9db68..b739920 100644 (file)
@@ -1849,6 +1849,20 @@ static void rna_View3DCursor_rotation_axis_angle_set(PointerRNA *ptr, const floa
   copy_v3_v3(cursor->rotation_axis, &value[1]);
 }
 
+static void rna_View3DCursor_matrix_get(PointerRNA *ptr, float *values)
+{
+  const View3DCursor *cursor = ptr->data;
+  BKE_scene_cursor_to_mat4(cursor, (float(*)[4])values);
+}
+
+static void rna_View3DCursor_matrix_set(PointerRNA *ptr, const float *values)
+{
+  View3DCursor *cursor = ptr->data;
+  float unit_mat[4][4];
+  normalize_m4_m4(unit_mat, (const float(*)[4])values);
+  BKE_scene_cursor_from_mat4(cursor, unit_mat, false);
+}
+
 static char *rna_View3DCursor_path(PointerRNA *UNUSED(ptr))
 {
   return BLI_strdup("cursor");
@@ -2586,6 +2600,14 @@ static void rna_def_view3d_cursor(BlenderRNA *brna)
   RNA_def_property_enum_funcs(prop, NULL, "rna_View3DCursor_rotation_mode_set", NULL);
   RNA_def_property_ui_text(prop, "Rotation Mode", "");
   RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+  /* Matrix access to avoid having to check current rotation mode. */
+  prop = RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
+  RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+  RNA_def_property_flag(prop, PROP_THICK_WRAP); /* no reference to original data */
+  RNA_def_property_ui_text(prop, "Transform Matrix", "Matrix combining loc/rot of the cursor");
+  RNA_def_property_float_funcs(
+      prop, "rna_View3DCursor_matrix_get", "rna_View3DCursor_matrix_set", NULL);
 }
 
 static void rna_def_tool_settings(BlenderRNA *brna)