[Bf-blender-cvs] [1f58a0ea3c7] master: Cleanup: use doxy sections and rearrange editmesh_knife.c

Germano Cavalcante noreply at git.blender.org
Tue Mar 30 16:52:21 CEST 2021


Commit: 1f58a0ea3c7a9ef0f6c3b35d254167227ffad6fb
Author: Germano Cavalcante
Date:   Tue Mar 30 11:49:58 2021 -0300
Branches: master
https://developer.blender.org/rB1f58a0ea3c7a9ef0f6c3b35d254167227ffad6fb

Cleanup: use doxy sections and rearrange editmesh_knife.c

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

M	source/blender/editors/mesh/editmesh_knife.c

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

diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c
index 19510712565..fb107795c2a 100644
--- a/source/blender/editors/mesh/editmesh_knife.c
+++ b/source/blender/editors/mesh/editmesh_knife.c
@@ -257,19 +257,263 @@ enum {
   KNF_MODAL_ADD_CUT_CLOSED,
 };
 
-static ListBase *knife_get_face_kedges(KnifeTool_OpData *kcd, BMFace *f);
+/* -------------------------------------------------------------------- */
+/** \name Drawing
+ * \{ */
 
-static void knife_input_ray_segment(KnifeTool_OpData *kcd,
-                                    const float mval[2],
-                                    const float ofs,
-                                    float r_origin[3],
-                                    float r_origin_ofs[3]);
+static void knifetool_draw_angle_snapping(const KnifeTool_OpData *kcd)
+{
+  float v1[3], v2[3];
+  float planes[4][4];
+
+  planes_from_projmat(
+      (const float(*)[4])kcd->projmat, planes[2], planes[0], planes[3], planes[1], NULL, NULL);
+
+  /* ray-cast all planes */
+  {
+    float ray_dir[3];
+    float ray_hit_best[2][3] = {{UNPACK3(kcd->prev.cage)}, {UNPACK3(kcd->curr.cage)}};
+    float lambda_best[2] = {-FLT_MAX, FLT_MAX};
+    int i;
+
+    /* we (sometimes) need the lines to be at the same depth before projecting */
+#if 0
+    sub_v3_v3v3(ray_dir, kcd->curr.cage, kcd->prev.cage);
+#else
+    {
+      float curr_cage_adjust[3];
+      float co_depth[3];
+
+      copy_v3_v3(co_depth, kcd->prev.cage);
+      mul_m4_v3(kcd->ob->obmat, co_depth);
+      ED_view3d_win_to_3d(kcd->vc.v3d, kcd->region, co_depth, kcd->curr.mval, curr_cage_adjust);
+      mul_m4_v3(kcd->ob->imat, curr_cage_adjust);
+
+      sub_v3_v3v3(ray_dir, curr_cage_adjust, kcd->prev.cage);
+    }
+#endif
+
+    for (i = 0; i < 4; i++) {
+      float ray_hit[3];
+      float lambda_test;
+      if (isect_ray_plane_v3(kcd->prev.cage, ray_dir, planes[i], &lambda_test, false)) {
+        madd_v3_v3v3fl(ray_hit, kcd->prev.cage, ray_dir, lambda_test);
+        if (lambda_test < 0.0f) {
+          if (lambda_test > lambda_best[0]) {
+            copy_v3_v3(ray_hit_best[0], ray_hit);
+            lambda_best[0] = lambda_test;
+          }
+        }
+        else {
+          if (lambda_test < lambda_best[1]) {
+            copy_v3_v3(ray_hit_best[1], ray_hit);
+            lambda_best[1] = lambda_test;
+          }
+        }
+      }
+    }
+
+    copy_v3_v3(v1, ray_hit_best[0]);
+    copy_v3_v3(v2, ray_hit_best[1]);
+  }
+
+  uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+
+  immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+  immUniformThemeColor3(TH_TRANSFORM);
+  GPU_line_width(2.0);
+
+  immBegin(GPU_PRIM_LINES, 2);
+  immVertex3fv(pos, v1);
+  immVertex3fv(pos, v2);
+  immEnd();
+
+  immUnbindProgram();
+}
+
+/* modal loop selection drawing callback */
+static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(region), void *arg)
+{
+  const KnifeTool_OpData *kcd = arg;
+  GPU_depth_test(GPU_DEPTH_NONE);
+
+  GPU_matrix_push_projection();
+  GPU_polygon_offset(1.0f, 1.0f);
+
+  GPU_matrix_push();
+  GPU_matrix_mul(kcd->ob->obmat);
+
+  if (kcd->mode == MODE_DRAGGING && kcd->is_angle_snapping) {
+    knifetool_draw_angle_snapping(kcd);
+  }
+
+  GPUVertFormat *format = immVertexFormat();
+  uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+
+  immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+
+  if (kcd->mode == MODE_DRAGGING) {
+    immUniformColor3ubv(kcd->colors.line);
+    GPU_line_width(2.0);
+
+    immBegin(GPU_PRIM_LINES, 2);
+    immVertex3fv(pos, kcd->prev.cage);
+    immVertex3fv(pos, kcd->curr.cage);
+    immEnd();
+  }
+
+  if (kcd->prev.vert) {
+    immUniformColor3ubv(kcd->colors.point);
+    GPU_point_size(11 * UI_DPI_FAC);
+
+    immBegin(GPU_PRIM_POINTS, 1);
+    immVertex3fv(pos, kcd->prev.cage);
+    immEnd();
+  }
+
+  if (kcd->prev.bmface || kcd->prev.edge) {
+    immUniformColor3ubv(kcd->colors.curpoint);
+    GPU_point_size(9 * UI_DPI_FAC);
+
+    immBegin(GPU_PRIM_POINTS, 1);
+    immVertex3fv(pos, kcd->prev.cage);
+    immEnd();
+  }
+
+  if (kcd->curr.vert) {
+    immUniformColor3ubv(kcd->colors.point);
+    GPU_point_size(11 * UI_DPI_FAC);
+
+    immBegin(GPU_PRIM_POINTS, 1);
+    immVertex3fv(pos, kcd->curr.cage);
+    immEnd();
+  }
+  else if (kcd->curr.edge) {
+    immUniformColor3ubv(kcd->colors.edge);
+    GPU_line_width(2.0);
+
+    immBegin(GPU_PRIM_LINES, 2);
+    immVertex3fv(pos, kcd->curr.edge->v1->cageco);
+    immVertex3fv(pos, kcd->curr.edge->v2->cageco);
+    immEnd();
+  }
+
+  if (kcd->curr.bmface || kcd->curr.edge) {
+    immUniformColor3ubv(kcd->colors.curpoint);
+    GPU_point_size(9 * UI_DPI_FAC);
+
+    immBegin(GPU_PRIM_POINTS, 1);
+    immVertex3fv(pos, kcd->curr.cage);
+    immEnd();
+  }
+
+  if (kcd->totlinehit > 0) {
+    KnifeLineHit *lh;
+    int i, snapped_verts_count, other_verts_count;
+    float fcol[4];
+
+    GPU_blend(GPU_BLEND_ALPHA);
+
+    GPUVertBuf *vert = GPU_vertbuf_create_with_format(format);
+    GPU_vertbuf_data_alloc(vert, kcd->totlinehit);
+
+    lh = kcd->linehits;
+    for (i = 0, snapped_verts_count = 0, other_verts_count = 0; i < kcd->totlinehit; i++, lh++) {
+      if (lh->v) {
+        GPU_vertbuf_attr_set(vert, pos, snapped_verts_count++, lh->cagehit);
+      }
+      else {
+        GPU_vertbuf_attr_set(vert, pos, kcd->totlinehit - 1 - other_verts_count++, lh->cagehit);
+      }
+    }
+
+    GPUBatch *batch = GPU_batch_create_ex(GPU_PRIM_POINTS, vert, NULL, GPU_BATCH_OWNS_VBO);
+    GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_UNIFORM_COLOR);
+
+    /* draw any snapped verts first */
+    rgba_uchar_to_float(fcol, kcd->colors.point_a);
+    GPU_batch_uniform_4fv(batch, "color", fcol);
+    GPU_point_size(11 * UI_DPI_FAC);
+    if (snapped_verts_count > 0) {
+      GPU_batch_draw_range(batch, 0, snapped_verts_count);
+    }
+
+    /* now draw the rest */
+    rgba_uchar_to_float(fcol, kcd->colors.curpoint_a);
+    GPU_batch_uniform_4fv(batch, "color", fcol);
+    GPU_point_size(7 * UI_DPI_FAC);
+    if (other_verts_count > 0) {
+      GPU_batch_draw_range(batch, snapped_verts_count, other_verts_count);
+    }
+
+    GPU_batch_discard(batch);
+
+    GPU_blend(GPU_BLEND_NONE);
+  }
+
+  if (kcd->totkedge > 0) {
+    BLI_mempool_iter iter;
+    KnifeEdge *kfe;
+
+    immUniformColor3ubv(kcd->colors.line);
+    GPU_line_width(1.0);
+
+    GPUBatch *batch = immBeginBatchAtMost(GPU_PRIM_LINES, BLI_mempool_len(kcd->kedges) * 2);
+
+    BLI_mempool_iternew(kcd->kedges, &iter);
+    for (kfe = BLI_mempool_iterstep(&iter); kfe; kfe = BLI_mempool_iterstep(&iter)) {
+      if (!kfe->is_cut) {
+        continue;
+      }
+
+      immVertex3fv(pos, kfe->v1->cageco);
+      immVertex3fv(pos, kfe->v2->cageco);
+    }
+
+    immEnd();
+
+    GPU_batch_draw(batch);
+    GPU_batch_discard(batch);
+  }
+
+  if (kcd->totkvert > 0) {
+    BLI_mempool_iter iter;
+    KnifeVert *kfv;
+
+    immUniformColor3ubv(kcd->colors.point);
+    GPU_point_size(5.0 * UI_DPI_FAC);
+
+    GPUBatch *batch = immBeginBatchAtMost(GPU_PRIM_POINTS, BLI_mempool_len(kcd->kverts));
+
+    BLI_mempool_iternew(kcd->kverts, &iter);
+    for (kfv = BLI_mempool_iterstep(&iter); kfv; kfv = BLI_mempool_iterstep(&iter)) {
+      if (!kfv->is_cut) {
+        continue;
+      }
+
+      immVertex3fv(pos, kfv->cageco);
+    }
+
+    immEnd();
+
+    GPU_batch_draw(batch);
+    GPU_batch_discard(batch);
+  }
+
+  immUnbindProgram();
+
+  GPU_matrix_pop();
+  GPU_matrix_pop_projection();
 
-static bool knife_verts_edge_in_face(KnifeVert *v1, KnifeVert *v2, BMFace *f);
+  /* Reset default */
+  GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
+}
 
-static void knifetool_free_bmbvh(KnifeTool_OpData *kcd);
+/** \} */
 
-static int knifetool_modal(bContext *C, wmOperator *op, const wmEvent *event);
+/* -------------------------------------------------------------------- */
+/** \name Header
+ * \{ */
 
 static void knife_update_header(bContext *C, wmOperator *op, KnifeTool_OpData *kcd)
 {
@@ -310,44 +554,155 @@ static void knife_update_header(bContext *C, wmOperator *op, KnifeTool_OpData *k
   ED_workspace_status_text(C, header);
 }
 
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Geometry Utils
+ * \{ */
+
 static void knife_project_v2(const KnifeTool_OpData *kcd, const float co[3], float sco[2])
 {
   ED_view3d_project_float_v2_m4(kcd->region, co, sco, (float(*)[4])kcd->projmat);
 }
 
-/* use when lambda is in screen-space */
-static void knife_interp_v3_v3v3(const KnifeTool_OpData *kcd,
-                                 float r_co[3],
-                                 const float v1[3],
-                                 const float v2[3],
-                                 float lambda_ss)
+static void knife_input_ray_segment(KnifeTool_OpData *kcd,
+                                    const float mval[2],
+                                    const float ofs,
+                                    float r_origin[3],
+                                    float r_origin_ofs[3])
 {
-  if (kcd->is_ortho) {
-    interp_v3_v3v3(r_co, v1, v2, lambda_ss);
+  /* unproject to find view ray */
+  ED_view3d_unproject(kcd->vc.region, mval[0], mval[1], 0.0f, r_origin);
+  ED_view3d_unproject(kcd->vc.region, mval[0], mval[1], ofs, r_origin_ofs);
+
+  /* transform into object space */
+  invert_m4_m4(kcd->ob->imat, kcd->ob->obmat);
+
+  mul_m4_v3(kcd->ob->imat, r_origin);
+  mul_m4_v3(kcd->ob->imat, r_origin_ofs);
+}
+
+static bool knife_verts_edge_in_face(KnifeVert *v1, KnifeVert *v2, BMFace *f)
+{
+  bool v1_inside, v2_inside;
+  bool v1_inface, v2_inface;
+  BMLoop *l1, *l2;
+
+  if (!f || !v1 || !v2) {
+    return false;
   }
-  else {
-    /* transform into screen-space, interp, then transform back */
-    float v1_ss[3], v2_ss[3];
 
-    mul_v3_project_m4_v3(v1_ss, (float(*)[4])kcd->projmat, v1);
-    mul_v3_project_m4_v3(v2_ss, (float(*)[4])kcd->projmat, v2);
+  l1 = v1->v ? BM_face_vert_share_loop(f, v1->v) : NULL;
+  l2 = v2->v ? BM_face_vert_share_loop(f, v2->v) : NULL;
 
-    interp_v3_v3v3(r_co, v1_ss, v2_ss, lambda_ss);
+  if ((l1 && l2

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list