[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