[Bf-blender-cvs] [5a898d915bb] temp-lineart-contained: Revert "LineArt: Index calculation based adjacent lookup WIP"

YimingWu noreply at git.blender.org
Wed Apr 20 05:09:11 CEST 2022


Commit: 5a898d915bbb63813695c0bcf6c22e67c33bb648
Author: YimingWu
Date:   Wed Apr 20 10:53:35 2022 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB5a898d915bbb63813695c0bcf6c22e67c33bb648

Revert "LineArt: Index calculation based adjacent lookup WIP"

This reverts commit 7ef1f7648f423cc2991c7599a7b3743971fdd184.

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

M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c

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

diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index af82edfd0aa..2a3f7653bdb 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -1450,28 +1450,6 @@ static void lineart_vert_transform(
   mul_v4_m4v3_db(vt->fbcoord, mvp_mat, co);
 }
 
-static void lineart_vert_transform_me(
-    MVert *v, int index, LineartVert *RvBuf, double (*mv_mat)[4], double (*mvp_mat)[4])
-{
-  double co[4];
-  LineartVert *vt = &RvBuf[index];
-  copy_v3db_v3fl(co, v->co);
-  mul_v3_m4v3_db(vt->gloc, mv_mat, co);
-  mul_v4_m4v3_db(vt->fbcoord, mvp_mat, co);
-}
-
-typedef struct LineartAdjacentItem {
-  unsigned int v1;
-  unsigned int v2;
-  unsigned int e;
-} LineartAdjacentItem;
-
-typedef struct LineartEdgeNeighbor {
-  int e;
-  short flags;
-  int v1, v2;
-} LineartEdgeNeighbor;
-
 typedef struct VertData {
   MVert *mvert;
   LineartVert *v_arr;
@@ -1700,163 +1678,6 @@ static uint16_t lineart_identify_medge_feature_edges(
   return edge_flag_result;
 }
 
-__attribute__((optimize("O0"))) static uint16_t lineart_identify_feature_line_me(
-    LineartRenderBuffer *rb,
-    int eindex,
-    LineartTriangle *rt_array,
-    LineartVert *rv_array,
-    float crease_threshold,
-    bool use_auto_smooth,
-    bool use_freestyle_edge,
-    bool use_freestyle_face,
-    Mesh *me,
-    LineartEdgeNeighbor *en,
-    float (*normals)[3])
-{
-
-  MPoly *ll = NULL, *lr = NULL;
-
-  int t1i = -1, t1e = -1, t2i = -1;
-  if (en[eindex].e >= 0) {
-    t1i = en[eindex].e / 3;
-    t1e = en[eindex].e;
-  }
-  if (t1e >= 0 && en[t1e].e >= 0) {
-    t2i = en[t1e].e / 3;
-  }
-
-  if (t1i >= 0) {
-    ll = &me->mpoly[me->runtime.looptris.array[t1i].poly];
-  }
-  if (t2i >= 0) {
-    lr = &me->mpoly[me->runtime.looptris.array[t2i].poly];
-  }
-
-  if (t1i < 0 && t2i < 0) {
-    if (!rb->use_loose_as_contour) {
-      if (use_freestyle_face && rb->filter_face_mark) {
-        if (rb->filter_face_mark_invert) {
-          return LRT_EDGE_FLAG_LOOSE;
-        }
-        return 0;
-      }
-      return LRT_EDGE_FLAG_LOOSE;
-    }
-  }
-
-  FreestyleEdge *fel, *fer;
-  bool face_mark_filtered = false;
-  bool only_contour = false;
-
-  uint16_t edge_flag_result = 0;
-
-  /* Mesh boundary */
-  if (!ll || !lr) {
-    return (edge_flag_result | LRT_EDGE_FLAG_CONTOUR);
-  }
-
-  LineartTriangle *tri1, *tri2;
-  LineartVert *l;
-
-  /* The mesh should already be triangulated now, so we can assume each face is a triangle. */
-  tri1 = lineart_triangle_from_index(rb, rt_array, t1i);
-  tri2 = lineart_triangle_from_index(rb, rt_array, t2i);
-
-  l = &rv_array[en[eindex].v1];
-
-  double vv[3];
-  double *view_vector = vv;
-  double dot_1 = 0, dot_2 = 0;
-  double result;
-  bool material_back_face = ((tri1->flags | tri2->flags) & LRT_TRIANGLE_MAT_BACK_FACE_CULLING);
-
-  if (rb->use_contour || rb->use_back_face_culling || material_back_face) {
-
-    if (rb->cam_is_persp) {
-      sub_v3_v3v3_db(view_vector, rb->camera_pos, l->gloc);
-    }
-    else {
-      view_vector = rb->view_vector;
-    }
-
-    dot_1 = dot_v3v3_db(view_vector, tri1->gn);
-    dot_2 = dot_v3v3_db(view_vector, tri2->gn);
-
-    if (rb->use_contour && (result = dot_1 * dot_2) <= 0 && (fabs(dot_1) + fabs(dot_2))) {
-      edge_flag_result |= LRT_EDGE_FLAG_CONTOUR;
-    }
-
-    /* Because the ray points towards the camera, so backface is when dot value being negative.*/
-    if (rb->use_back_face_culling) {
-      if (dot_1 < 0) {
-        tri1->flags |= LRT_CULL_DISCARD;
-      }
-      if (dot_2 < 0) {
-        tri2->flags |= LRT_CULL_DISCARD;
-      }
-    }
-    if (material_back_face) {
-      if (tri1->flags & LRT_TRIANGLE_MAT_BACK_FACE_CULLING && dot_1 < 0) {
-        tri1->flags |= LRT_CULL_DISCARD;
-      }
-      if (tri2->flags & LRT_TRIANGLE_MAT_BACK_FACE_CULLING && dot_2 < 0) {
-        tri2->flags |= LRT_CULL_DISCARD;
-      }
-    }
-  }
-
-  /* For when face mark filtering decided that we discard the face but keep_contour option is on.
-   * so we still have correct full contour around the object. */
-  if (only_contour) {
-    return edge_flag_result;
-  }
-
-  if (rb->use_light_contour) {
-    if (rb->light_is_sun) {
-      view_vector = rb->light_vector;
-    }
-    else {
-      view_vector = vv;
-      sub_v3_v3v3_db(view_vector, l->gloc, rb->light_vector);
-    }
-
-    dot_1 = dot_v3v3_db(view_vector, tri1->gn);
-    dot_2 = dot_v3v3_db(view_vector, tri2->gn);
-
-    if ((result = dot_1 * dot_2) <= 0 && (dot_1 + dot_2)) {
-      edge_flag_result |= LRT_EDGE_FLAG_LIGHT_CONTOUR;
-    }
-  }
-
-  /* For when face mark filtering decided that we discard the face but keep_contour option is on.
-   * so we still have correct full contour around the object. */
-  if (only_contour) {
-    return edge_flag_result;
-  }
-
-  /* Do not show lines other than contour on back face (because contour has one adjacent face that
-   * isn't a back face).
-   * TODO(Yiming): Do we need separate option for this? */
-  if (rb->use_back_face_culling ||
-      ((tri1->flags & tri2->flags) & LRT_TRIANGLE_MAT_BACK_FACE_CULLING)) {
-    if (dot_1 < 0 && dot_2 < 0) {
-      return edge_flag_result;
-    }
-  }
-
-  if (rb->use_crease) {
-    if (dot_v3v3_db(tri1->gn, tri2->gn) < crease_threshold) {
-      edge_flag_result |= LRT_EDGE_FLAG_CREASE;
-    }
-  }
-
-  if (rb->use_material && (ll->mat_nr != lr->mat_nr)) {
-    edge_flag_result |= LRT_EDGE_FLAG_MATERIAL;
-  }
-
-  return edge_flag_result;
-}
-
 static uint16_t lineart_identify_feature_line(LineartRenderBuffer *rb,
                                               BMEdge *e,
                                               LineartTriangle *rt_array,
@@ -2122,7 +1943,6 @@ typedef struct TriData {
   LineartTriangle *tri_arr;
   int lineart_triangle_size;
   LineartTriangleAdjacent *tri_adj;
-  LineartEdgeNeighbor *en;
 } TriData;
 
 typedef struct TriDataReduce {
@@ -2267,54 +2087,6 @@ static void lineart_load_tri_reduce(const void *__restrict UNUSED(userdata),
   BLI_edgehash_free(data_reduce->edge_hash, NULL);
 }
 
-static int cmp_adjacent_items(const void *ps1, const void *ps2)
-{
-  LineartAdjacentItem *p1 = (LineartAdjacentItem *)ps1;
-  LineartAdjacentItem *p2 = (LineartAdjacentItem *)ps2;
-  int a = (int)p1->v1 - (int)p2->v1;
-  int b = (int)p1->v2 - (int)p2->v2;
-  return a ? a : b;
-}
-static LineartEdgeNeighbor *lineart_build_edge_neighbor(Mesh *me, int total_edges)
-{
-  /* Because the mesh is traingulated, so me->totedge should be reliable? */
-  LineartAdjacentItem *ai = MEM_mallocN(sizeof(LineartAdjacentItem) * total_edges,
-                                        "LineartAdjacentItem arr");
-  LineartEdgeNeighbor *en = MEM_mallocN(sizeof(LineartEdgeNeighbor) * total_edges,
-                                        "LineartEdgeNeighbor arr");
-
-  MLoopTri *lt = me->runtime.looptris.array;
-
-  for (int i = 0; i < total_edges; i++) {
-    ai[i].e = i;
-    ai[i].v1 = me->mloop[lt[i / 3].tri[i % 3]].v;
-    ai[i].v2 = me->mloop[lt[i / 3].tri[(i + 1) % 3]].v;
-    if (ai[i].v1 > ai[i].v2) {
-      SWAP(unsigned int, ai[i].v1, ai[i].v2);
-    }
-    en[i].e = -1;
-
-    en[i].v1 = ai[i].v1;
-    en[i].v2 = ai[i].v2;
-  }
-
-  en[total_edges - 1].v1 = ai[total_edges - 1].v1;
-  en[total_edges - 1].v2 = ai[total_edges - 1].v2;
-
-  qsort(ai, total_edges, sizeof(LineartAdjacentItem), cmp_adjacent_items);
-
-  for (int i = 0; i < total_edges - 1; i++) {
-    if (ai[i].v1 == ai[i + 1].v1 && ai[i].v2 == ai[i + 1].v2) {
-      en[ai[i].e].e = ai[i + 1].e;
-      en[ai[i].e + 1].e = ai[i].e;
-    }
-  }
-
-  MEM_freeN(ai);
-
-  return en;
-}
-
 static void lineart_geometry_object_load_no_bmesh(LineartObjectInfo *ob_info,
                                                   LineartRenderBuffer *re_buf)
 {
@@ -2477,9 +2249,6 @@ static void lineart_geometry_object_load_no_bmesh(LineartObjectInfo *ob_info,
   tri_data.lineart_triangle_size = re_buf->triangle_size;
   tri_data.tri_adj = tri_adj;
 
-  unsigned int total_edges = me->runtime.looptris.len * 3;
-  tri_data.en = lineart_build_edge_neighbor(me, total_edges);
-
   BLI_task_parallel_range(0, tot_tri, &tri_data, lineart_load_tri_task, &tri_settings);
 
   EdgeHash *edge_hash = reduce_data.edge_hash;
@@ -2676,262 +2445,6 @@ static void lineart_geometry_object_load_no_bmesh(LineartObjectInfo *ob_info,
   }
 }
 
-static void lineart_geometry_object_load_edge_neighbor(LineartObjectInfo *obi,
-                                                       LineartRenderBuffer *rb)
-{
-  MVert *v;
-  MPoly *f;
-  MEdge *e;
-  MLoop *loop;
-  MLoopTri *looptri;
-  LineartEdge *la_e;
-  LineartEdgeSegment *la_s;
-  LineartTriangle *tri;
-  LineartTriangleAdjacent *orta;
-  double(*model_view_proj)[4] = obi->model_view_proj, (*model_view)[4] = obi->model_view,
-  (*normal)[4] = obi->normal;
-  LineartElementLinkNode *eln;
-  LineartVert *orv;
-  LineartEdge *o_la_e;
-  LineartEdgeSegment *o_la_s;
-  LineartTriangle *ort;
-  Object *orig_ob;
-  bool can_find_freestyle_edge = false;
-  bool can_find_freestyle_face = false;
-  int i;
-  float use_crease = 0;
-
-  int usage = obi->usage;
-
-  Mesh *me = obi->original_me;
-
-  BKE_mesh_runtime_looptri_ensure(me);
-  float(*poly_normals)[3] = BKE_mesh_poly_normals_ensure(me);
-  const int tot_tri = me->runtime.looptris.len;
-
-  unsigned int total_edges = me->runtime.looptris.len * 3;
-  LineartEdgeNeighbor *en = lineart_build_edge_neighbor(me, total_edges);
-
-  if (CustomData_has_layer(&me->edata, CD_FREESTYLE_EDGE)) {
-    can_find_freestyle_edge = true;
-  }
-  if (CustomData_has_layer(&me->pdata, CD_FREESTYLE_FACE)) {
-    can_find_freestyle_face = true;
-  }
-
-  /* If we allow duplicated edges, one edge should get added multiple times if is has been
-   * classified as more than one edge type. This is so we can create multiple different line type
-   * chains containing the same edge. */
-  orv = lineart_mem_acquire_thread(&rb->render_data_pool, sizeof(LineartVert) * me->totvert);
-  ort = lineart_mem_acquire_thread(&rb->render_data_pool, tot_tri * rb->triangle_size);
-
-  orig_ob = obi->original_ob;
-
-  BLI_spin

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list