[Bf-blender-cvs] [e8416ce70f0] lineart-shadow: Merge branch 'temp-lineart-contained' into lineart-shadow

YimingWu noreply at git.blender.org
Sat May 7 15:02:46 CEST 2022


Commit: e8416ce70f0555593b46ec2aabfe7039bf141adb
Author: YimingWu
Date:   Wed May 4 22:36:05 2022 +0800
Branches: lineart-shadow
https://developer.blender.org/rBe8416ce70f0555593b46ec2aabfe7039bf141adb

Merge branch 'temp-lineart-contained' into lineart-shadow

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



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

diff --cc source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 0cfd3892489,2756ca20716..bcae97e21df
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@@ -1646,141 -1579,166 +1621,183 @@@ static void lineart_identify_mlooptri_f
    if (enable_face_mark && !face_mark_filtered && !only_contour) {
      return;
    }
-   else {
  
-     /* Mesh boundary */
-     if (en[i].e == -1) {
-       en[i].flags = LRT_EDGE_FLAG_CONTOUR;
-       reduce_data->feat_edges += 1;
-       return;
-     }
+   /* Mesh boundary */
+   if (edge_nabr[i].e == -1) {
+     edge_nabr[i].flags = LRT_EDGE_FLAG_CONTOUR;
+     reduce_data->feat_edges += 1;
+     return;
+   }
  
-     LineartTriangle *tri1, *tri2;
-     LineartVert *vert;
-     LineartRenderBuffer *rb = e_feat_data->rb;
+   LineartTriangle *tri1, *tri2;
+   LineartVert *vert;
+   LineartRenderBuffer *rb = e_feat_data->rb;
  
-     int f1 = i / 3, f2 = en[i].e / 3;
+   int f1 = i / 3, f2 = edge_nabr[i].e / 3;
  
-     /* The mesh should already be triangulated now, so we can assume each face is a triangle. */
-     tri1 = lineart_triangle_from_index(rb, e_feat_data->tri_array, f1);
-     tri2 = lineart_triangle_from_index(rb, e_feat_data->tri_array, f2);
+   /* The mesh should already be triangulated now, so we can assume each face is a triangle. */
+   tri1 = lineart_triangle_from_index(rb, e_feat_data->tri_array, f1);
+   tri2 = lineart_triangle_from_index(rb, e_feat_data->tri_array, f2);
  
-     vert = &e_feat_data->v_array[en[i].v1];
+   vert = &e_feat_data->v_array[edge_nabr[i].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);
+   double view_vector_persp[3];
+   double *view_vector = view_vector_persp;
+   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, vert->gloc);
-       }
-       else {
-         view_vector = rb->view_vector;
-       }
+   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, vert->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);
+     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_CONTOUR;
-       }
+     if ((result = dot_1 * dot_2) <= 0 && (dot_1 + dot_2)) {
+       edge_flag_result |= LRT_EDGE_FLAG_CONTOUR;
+     }
  
-       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 (rb->use_back_face_culling) {
+       if (dot_1 < 0) {
+         tri1->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;
-         }
+       if (dot_2 < 0) {
+         tri2->flags |= LRT_CULL_DISCARD;
        }
      }
- 
-     if (rb->use_contour_secondary) {
-       view_vector = vv;
-       if (rb->cam_is_persp_secondary) {
-         sub_v3_v3v3_db(view_vector, vert->gloc, rb->camera_pos_secondary);
+     if (material_back_face) {
+       if (tri1->flags & LRT_TRIANGLE_MAT_BACK_FACE_CULLING && dot_1 < 0) {
+         tri1->flags |= LRT_CULL_DISCARD;
        }
-       else {
-         view_vector = rb->view_vector_secondary;
+       if (tri2->flags & LRT_TRIANGLE_MAT_BACK_FACE_CULLING && dot_2 < 0) {
+         tri2->flags |= LRT_CULL_DISCARD;
        }
+     }
+   }
  
-       dot_1 = dot_v3v3_db(view_vector, tri1->gn);
-       dot_2 = dot_v3v3_db(view_vector, tri2->gn);
++  if (rb->use_contour_secondary) {
++    view_vector = view_vector_persp;
++    if (rb->cam_is_persp_secondary) {
++      sub_v3_v3v3_db(view_vector, vert->gloc, rb->camera_pos_secondary);
++    }
++    else {
++      view_vector = rb->view_vector_secondary;
++    }
 +
-       if ((result = dot_1 * dot_2) <= 0 && (dot_1 + dot_2)) {
-         edge_flag_result |= LRT_EDGE_FLAG_CONTOUR_SECONDARY;
-       }
++    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_CONTOUR_SECONDARY;
 +    }
++  }
 +
-     if (!only_contour) {
+   if (!only_contour) {
  
-       if (rb->use_crease) {
-         bool do_crease = true;
-         if (!rb->force_crease && !e_feat_data->use_auto_smooth &&
-             (me->mpoly[mlooptri[f1].poly].flag & ME_SMOOTH) &&
-             (me->mpoly[mlooptri[f2].poly].flag & ME_SMOOTH)) {
-           do_crease = false;
-         }
-         if (do_crease && (dot_v3v3_db(tri1->gn, tri2->gn) < e_feat_data->crease_threshold)) {
-           edge_flag_result |= LRT_EDGE_FLAG_CREASE;
-         }
+     if (rb->use_crease) {
+       bool do_crease = true;
+       if (!rb->force_crease && !e_feat_data->use_auto_smooth &&
+           (me->mpoly[mlooptri[f1].poly].flag & ME_SMOOTH) &&
+           (me->mpoly[mlooptri[f2].poly].flag & ME_SMOOTH)) {
+         do_crease = false;
+       }
+       if (do_crease && (dot_v3v3_db(tri1->gn, tri2->gn) < e_feat_data->crease_threshold)) {
+         edge_flag_result |= LRT_EDGE_FLAG_CREASE;
        }
+     }
  
-       int mat1 = me->mpoly[mlooptri[f1].poly].mat_nr;
-       int mat2 = me->mpoly[mlooptri[f2].poly].mat_nr;
+     int mat1 = me->mpoly[mlooptri[f1].poly].mat_nr;
+     int mat2 = me->mpoly[mlooptri[f2].poly].mat_nr;
  
-       if (rb->use_material && mat1 != mat2) {
-         edge_flag_result |= LRT_EDGE_FLAG_MATERIAL;
-       }
+     if (rb->use_material && mat1 != mat2) {
+       edge_flag_result |= LRT_EDGE_FLAG_MATERIAL;
      }
-     else {                     /* only_contour */
-       if (!edge_flag_result) { /* Other edge types inhibited */
-         return;
-       }
+   }
+   else {                     /* only_contour */
+     if (!edge_flag_result) { /* Other edge types inhibited */
+       return;
      }
+   }
  
-     int real_edges[3];
-     BKE_mesh_looptri_get_real_edges(me, &mlooptri[i / 3], real_edges);
+   int real_edges[3];
+   BKE_mesh_looptri_get_real_edges(me, &mlooptri[i / 3], real_edges);
  
-     if (real_edges[i % 3] >= 0) {
-       MEdge *medge = &me->medge[real_edges[i % 3]];
+   if (real_edges[i % 3] >= 0) {
+     MEdge *medge = &me->medge[real_edges[i % 3]];
  
-       if (rb->use_crease && rb->sharp_as_crease && (medge->flag & ME_SHARP)) {
-         edge_flag_result |= LRT_EDGE_FLAG_CREASE;
-       }
+     if (rb->use_crease && rb->sharp_as_crease && (medge->flag & ME_SHARP)) {
+       edge_flag_result |= LRT_EDGE_FLAG_CREASE;
+     }
  
-       if (rb->use_edge_marks && e_feat_data->use_freestyle_edge) {
-         FreestyleEdge *fe;
-         int index = e_feat_data->freestyle_edge_index;
-         fe = &((FreestyleEdge *)me->edata.layers[index].data)[real_edges[i % 3]];
-         if (fe->flag & FREESTYLE_EDGE_MARK) {
-           edge_flag_result |= LRT_EDGE_FLAG_EDGE_MARK;
-         }
+     if (rb->use_edge_marks && e_feat_data->use_freestyle_edge) {
+       FreestyleEdge *fe;
+       int index = e_feat_data->freestyle_edge_index;
+       fe = &((FreestyleEdge *)me->edata.layers[index].data)[real_edges[i % 3]];
+       if (fe->flag & FREESTYLE_EDGE_MARK) {
+         edge_flag_result |= LRT_EDGE_FLAG_EDGE_MARK;
        }
      }
+   }
  
-     en[i].flags = edge_flag_result;
+   edge_nabr[i].flags = edge_flag_result;
  
-     if (edge_flag_result) {
-       /* Only allocate for feature edge (instead of all edges) to save memory.
-        * If allow duplicated edges, one edge gets added multiple times if it has multiple types.
-        */
-       reduce_data->feat_edges += e_feat_data->rb->allow_duplicated_types ?
-                                      lineart_edge_type_duplication_count(edge_flag_result) :
-                                      1;
-     }
+   if (edge_flag_result) {
+     /* Only allocate for feature edge (instead of all edges) to save memory.
+      * If allow duplicated edges, one edge gets added multiple times if it has multiple types.
+      */
+     reduce_data->feat_edges += e_feat_data->rb->allow_duplicated_types ?
+                                    lineart_edge_type_duplication_count(edge_flag_result) :
+                                    1;
+   }
+ }
+ 
+ typedef struct LooseEdgeData {
+   int loose_count;
+   int loose_max;
+   MEdge **loose_array;
+   Mesh *me;
+ } LooseEdgeData;
+ 
+ static void lineart_loose_data_reallocate(LooseEdgeData *loose_data, int count)
+ {
+   MEdge **new_arr = MEM_callocN(sizeof(MEdge *) * count, "loose edge array");
+   if (loose_data->loose_array) {
+     memcpy(new_arr, loose_data->loose_array, sizeof(MEdge *) * loose_data->loose_max);
+     MEM_freeN(loose_data->loose_array);
    }
+   loose_data->loose_max = count;
+   loose_data->loose_array = new_arr;
+ }
+ 
+ static void lineart_join_loose_edge_arr(LooseEdgeData *loose_data, LooseEdgeData *to_be_joined)
+ {
+   if (!to_be_joined->loose_array) {
+     return;
+   }
+   int new_count = loose_data->loose_count + to_be_joined->loose_count;
+   if (new_count >= loose_data->loose_max) {
+     lineart_loose_data_reallocate(loose_data, new_count);
+   }
+   memcpy(&loose_data->loose_array[loose_data->loose_count],
+          to_be_joined->loose_array,
+          sizeof(MEdge *) * to_be_joined->loose_count);
+   loose_data->loose_count += to_be_joined->loo

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list