[Bf-blender-cvs] [89c8b074e78] master: Cleanup: split view3d_placement depth & orientation calculation

Campbell Barton noreply at git.blender.org
Thu Nov 12 06:18:08 CET 2020


Commit: 89c8b074e78d1e98f7e3931ddbc7dbed7f6c4183
Author: Campbell Barton
Date:   Thu Nov 12 16:15:02 2020 +1100
Branches: master
https://developer.blender.org/rB89c8b074e78d1e98f7e3931ddbc7dbed7f6c4183

Cleanup: split view3d_placement depth & orientation calculation

Split out functionality needed for preview plane drawing.

===================================================================

M	source/blender/editors/space_view3d/view3d_placement.c

===================================================================

diff --git a/source/blender/editors/space_view3d/view3d_placement.c b/source/blender/editors/space_view3d/view3d_placement.c
index 25634d9f221..5a0ca8e7d75 100644
--- a/source/blender/editors/space_view3d/view3d_placement.c
+++ b/source/blender/editors/space_view3d/view3d_placement.c
@@ -610,135 +610,62 @@ static void draw_primitive_view(const struct bContext *C, ARegion *UNUSED(region
 /** \} */
 
 /* -------------------------------------------------------------------- */
-/** \name Add Object Modal Operator
+/** \name Calculate The Initial Placement Plane
+ *
+ * Use by both the operator and placement cursor.
  * \{ */
 
-/**
- *
- *  */
-static void view3d_interactive_add_begin(bContext *C, wmOperator *op, const wmEvent *event)
+static void view3d_interactive_add_calc_plane(bContext *C,
+                                              Scene *scene,
+                                              View3D *v3d,
+                                              ARegion *region,
+                                              wmGizmo *snap_gizmo,
+                                              const float mval_fl[2],
+                                              const enum ePlace_Depth plane_depth,
+                                              const enum ePlace_Orient plane_orient,
+                                              const int plane_axis,
+                                              float r_co_src[3],
+                                              float r_matrix_orient[3][3])
 {
-
-  const int plane_axis = RNA_enum_get(op->ptr, "plane_axis");
-  const enum ePlace_Depth plane_depth = RNA_enum_get(op->ptr, "plane_depth");
-  const enum ePlace_Origin plane_origin = RNA_enum_get(op->ptr, "plane_origin");
-  const enum ePlace_Orient plane_orient = RNA_enum_get(op->ptr, "plane_orientation");
-
-  const float mval_fl[2] = {UNPACK2(event->mval)};
-
-  struct InteractivePlaceData *ipd = op->customdata;
-
-  RegionView3D *rv3d = ipd->region->regiondata;
-
-  /* Assign snap gizmo which is may be used as part of the tool. */
-  {
-    wmGizmoMap *gzmap = ipd->region->gizmo_map;
-    wmGizmoGroup *gzgroup = gzmap ? WM_gizmomap_group_find(gzmap, view3d_gzgt_placement_id) : NULL;
-    if ((gzgroup != NULL) && gzgroup->gizmos.first) {
-      ipd->snap_gizmo = gzgroup->gizmos.first;
-    }
-  }
+  const RegionView3D *rv3d = region->regiondata;
+  ED_transform_calc_orientation_from_type(C, r_matrix_orient);
 
   SnapObjectContext *snap_context = NULL;
   bool snap_context_free = false;
+
+  /* Set the orientation. */
   if ((plane_orient == PLACE_ORIENT_SURFACE) || (plane_depth == PLACE_DEPTH_SURFACE)) {
-    /* Need# snap_context */
-    if (ipd->snap_gizmo) {
-      snap_context = ED_gizmotypes_snap_3d_context_ensure(
-          ipd->scene, ipd->region, ipd->v3d, ipd->snap_gizmo);
-    }
-    else {
-      snap_context = ED_transform_snap_object_context_create_view3d(
-          ipd->scene, 0, ipd->region, ipd->v3d);
+    snap_context = (snap_gizmo ?
+                        ED_gizmotypes_snap_3d_context_ensure(scene, region, v3d, snap_gizmo) :
+                        NULL);
+    if (snap_context == NULL) {
+      snap_context = ED_transform_snap_object_context_create_view3d(scene, 0, region, v3d);
       snap_context_free = true;
     }
   }
 
-  ipd->launch_event = WM_userdef_event_type_from_keymap_type(event->type);
-
-  ED_transform_calc_orientation_from_type(C, ipd->matrix_orient);
-
-  /* Set the orientation. */
-  if (snap_context && (plane_orient == PLACE_ORIENT_SURFACE)) {
+  if (plane_orient == PLACE_ORIENT_SURFACE) {
     float matrix_orient_surface[3][3];
 
     /* Use the snap normal as a fallback in case the cursor isn't over a surface
      * but snapping is enabled. */
     float normal_fallback[3];
-    bool use_normal_fallback = ipd->snap_gizmo ?
-                                   idp_snap_normal_from_gizmo(ipd->snap_gizmo, normal_fallback) :
+    bool use_normal_fallback = snap_gizmo ?
+                                   idp_snap_normal_from_gizmo(snap_gizmo, normal_fallback) :
                                    false;
 
-    if (idp_poject_surface_normal(snap_context,
+    if ((snap_context != NULL) &&
+        idp_poject_surface_normal(snap_context,
                                   CTX_data_ensure_evaluated_depsgraph(C),
                                   mval_fl,
-                                  use_normal_fallback ? ipd->matrix_orient : NULL,
+                                  use_normal_fallback ? r_matrix_orient : NULL,
                                   use_normal_fallback ? normal_fallback : NULL,
                                   matrix_orient_surface)) {
-      copy_m3_m3(ipd->matrix_orient, matrix_orient_surface);
+      copy_m3_m3(r_matrix_orient, matrix_orient_surface);
     }
   }
 
-  ipd->orient_axis = plane_axis;
-  ipd->is_centered_init = (plane_origin == PLACE_ORIGIN_CENTER);
-  ipd->step[0].is_centered = ipd->is_centered_init;
-  ipd->step[1].is_centered = ipd->is_centered_init;
-  ipd->step_index = STEP_BASE;
-
-  {
-    PropertyRNA *prop = RNA_struct_find_property(op->ptr, "primitive_type");
-    if (RNA_property_is_set(op->ptr, prop)) {
-      ipd->primitive_type = RNA_property_enum_get(op->ptr, prop);
-      ipd->use_tool = false;
-    }
-    else {
-      ipd->use_tool = true;
-
-      /* Get from the tool, a bit of a non-standard way of operating. */
-      const bToolRef *tref = ipd->area->runtime.tool;
-      if (tref && STREQ(tref->idname, "builtin.primitive_cube_add")) {
-        ipd->primitive_type = PLACE_PRIMITIVE_TYPE_CUBE;
-      }
-      else if (tref && STREQ(tref->idname, "builtin.primitive_cylinder_add")) {
-        ipd->primitive_type = PLACE_PRIMITIVE_TYPE_CYLINDER;
-      }
-      else if (tref && STREQ(tref->idname, "builtin.primitive_cone_add")) {
-        ipd->primitive_type = PLACE_PRIMITIVE_TYPE_CONE;
-      }
-      else if (tref && STREQ(tref->idname, "builtin.primitive_uv_sphere_add")) {
-        ipd->primitive_type = PLACE_PRIMITIVE_TYPE_SPHERE_UV;
-      }
-      else if (tref && STREQ(tref->idname, "builtin.primitive_ico_sphere_add")) {
-        ipd->primitive_type = PLACE_PRIMITIVE_TYPE_SPHERE_ICO;
-      }
-      else {
-        /* If the user runs this as an operator they should set the 'primitive_type',
-         * however running from operator search will end up at this point.  */
-        ipd->primitive_type = PLACE_PRIMITIVE_TYPE_CUBE;
-        ipd->use_tool = false;
-      }
-    }
-  }
-
-  UNUSED_VARS(C, event);
-
-  ipd->draw_handle_view = ED_region_draw_cb_activate(
-      ipd->region->type, draw_primitive_view, ipd, REGION_DRAW_POST_VIEW);
-
-  ED_region_tag_redraw(ipd->region);
-
-  plane_from_point_normal_v3(
-      ipd->step[0].plane, ipd->scene->cursor.location, ipd->matrix_orient[ipd->orient_axis]);
-
-  const bool is_snap_found = ipd->snap_gizmo ?
-                                 idp_snap_point_from_gizmo(ipd->snap_gizmo, ipd->co_src) :
-                                 false;
-  ipd->is_snap_invert = ipd->snap_gizmo ? ED_gizmotypes_snap_3d_invert_snap_get(ipd->snap_gizmo) :
-                                          false;
-  {
-    const ToolSettings *ts = ipd->scene->toolsettings;
-    ipd->use_snap = (ipd->is_snap_invert == !(ts->snap_flag & SCE_SNAP));
-  }
+  const bool is_snap_found = snap_gizmo ? idp_snap_point_from_gizmo(snap_gizmo, r_co_src) : false;
 
   if (is_snap_found) {
     /* pass */
@@ -747,12 +674,12 @@ static void view3d_interactive_add_begin(bContext *C, wmOperator *op, const wmEv
     bool use_depth_fallback = true;
     if (plane_depth == PLACE_DEPTH_CURSOR_VIEW) {
       /* View plane. */
-      ED_view3d_win_to_3d(
-          ipd->v3d, ipd->region, ipd->scene->cursor.location, mval_fl, ipd->co_src);
+      ED_view3d_win_to_3d(v3d, region, scene->cursor.location, mval_fl, r_co_src);
       use_depth_fallback = false;
     }
-    else if (snap_context && (plane_depth == PLACE_DEPTH_SURFACE)) {
-      if (ED_transform_snap_object_project_view3d(snap_context,
+    else if (plane_depth == PLACE_DEPTH_SURFACE) {
+      if ((snap_context != NULL) &&
+          ED_transform_snap_object_project_view3d(snap_context,
                                                   CTX_data_ensure_evaluated_depsgraph(C),
                                                   SCE_SNAP_MODE_FACE,
                                                   &(const struct SnapObjectParams){
@@ -762,7 +689,7 @@ static void view3d_interactive_add_begin(bContext *C, wmOperator *op, const wmEv
                                                   mval_fl,
                                                   NULL,
                                                   NULL,
-                                                  ipd->co_src,
+                                                  r_co_src,
                                                   NULL)) {
         use_depth_fallback = false;
       }
@@ -772,16 +699,15 @@ static void view3d_interactive_add_begin(bContext *C, wmOperator *op, const wmEv
     if (use_depth_fallback || (plane_depth == PLACE_DEPTH_CURSOR_PLANE)) {
       /* Cursor plane. */
       float plane[4];
-      plane_from_point_normal_v3(
-          plane, ipd->scene->cursor.location, ipd->matrix_orient[ipd->orient_axis]);
-      if (ED_view3d_win_to_3d_on_plane(ipd->region, plane, mval_fl, false, ipd->co_src)) {
+      plane_from_point_normal_v3(plane, scene->cursor.location, r_matrix_orient[plane_axis]);
+      if (ED_view3d_win_to_3d_on_plane(region, plane, mval_fl, false, r_co_src)) {
         use_depth_fallback = false;
       }
       /* Even if the calculation works, it's possible the point found is behind the view. */
       if (rv3d->is_persp) {
         float dir[3];
-        sub_v3_v3v3(dir, rv3d->viewinv[3], ipd->co_src);
-        if (dot_v3v3(dir, rv3d->viewinv[2]) < ipd->v3d->clip_start) {
+        sub_v3_v3v3(dir, rv3d->viewinv[3], r_co_src);
+        if (dot_v3v3(dir, rv3d->viewinv[2]) < v3d->clip_start) {
           use_depth_fallback = true;
         }
       }
@@ -791,17 +717,112 @@ static void view3d_interactive_add_begin(bContext *C, wmOperator *op, const wmEv
       float co_depth[3];
       /* Fallback to view center. */
       negate_v3_v3(co_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list