[Bf-blender-cvs] [626ab18f18a] lanpr-under-gp: Lineart: Prior to removing rt->rl.
YimingWu
noreply at git.blender.org
Wed Oct 21 11:11:54 CEST 2020
Commit: 626ab18f18aa8530827b36c3a1f1c5103ae38436
Author: YimingWu
Date: Wed Oct 21 14:45:02 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB626ab18f18aa8530827b36c3a1f1c5103ae38436
Lineart: Prior to removing rt->rl.
===================================================================
M source/blender/editors/include/ED_lineart.h
M source/blender/editors/lineart/lineart_cpu.c
===================================================================
diff --git a/source/blender/editors/include/ED_lineart.h b/source/blender/editors/include/ED_lineart.h
index 57054c4ee8e..53196e23994 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -109,18 +109,21 @@ typedef struct LineartRenderVert {
size_t index;
+ /** This will used in future acceleration for intersection processing.
+ * Add intersection data flag here, when intersecting vert flag is set,
+ * size of the struct is extended to include intersection data.
+ */
+ char edge_used;
+
/** Used as "r" when intersecting */
struct BMVert *v;
struct LineartRenderLine *intersecting_line;
struct LineartRenderLine *intersecting_line2;
struct LineartRenderTriangle *intersecting_with;
-
- /** This will used in future acceleration for intersection processing. */
- char edge_used;
} LineartRenderVert;
typedef struct LineartRenderLine {
- struct LineartRenderLine *next, *prev;
+ struct LineartRenderLine *next, *prev; /* Maybe we won't need this anymore, just use another flag. */
struct LineartRenderVert *l, *r;
struct LineartRenderTriangle *tl, *tr;
ListBase segments;
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 96d4ca87b9c..8c68d43f6f9 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -1529,6 +1529,94 @@ static void lineart_vert_transform(
mul_v4_m4v3_db(rv->fbcoord, mvp_mat, co);
}
+static void lineart_main_compute_scene_contours(LineartRenderBuffer *rb)
+{
+
+ if(!rb->cam_is_persp){
+ copy_v3_v3_db(view_vector, rb->view_vector);
+ }
+
+ LISTBASE_FOREACH (LineartRenderElementLinkNode *, reln, &rb->line_buffer_pointers) {
+ LineartRenderLine *rl = (LineartRenderLine *)reln->pointer;
+ int amount = reln->element_count;
+
+ }
+}
+
+
+static unsigned char lineart_test_feature_line(LineartRenderBuffer* rb, BMEdge* e, LineartRenderTriangle* rt_array,LineartRenderVert* rv_array, float crease_threshold, bool no_crease, bool count_freestyle, BMesh* bm_if_freestyle){
+ BMLoop* ll,*lr;
+ ll = e->l;
+ lr = e->l->radial_next;
+
+ if(ll == lr){
+ return LRT_EDGE_FLAG_CONTOUR;
+ }
+
+ LineartRenderTriangle *rt1, *rt2;
+ LineartRenderVert* l,*r;
+
+ /* We can do so because mesh is already triangulated. */
+ rt1 = &rt_array[BM_elem_index_get(ll)];
+ rt2 = &rt_array[BM_elem_index_get(lr)];
+
+ l = &rt_array[BM_elem_index_get(e->v1)];
+ r = &rt_array[BM_elem_index_get(e->v2)];
+
+ double view_vector[3];
+ double view_vector[3];
+ double dot_1 = 0, dot_2 = 0;
+ double result;
+ int add = 0, added = 0;
+ int add = 0;
+ int added = 0;
+ double dot_1 = 0;
+ double dot_2 = 0;
+ FreestyleEdge* fe;
+
+ if (rb->cam_is_persp) {
+ sub_v3_v3v3_db(view_vector, l->gloc, rb->camera_pos);
+ }
+
+ // currently not compatible with use_smooth_contour_modifier_contour
+
+ dot_1 = dot_v3v3_db(view_vector, rt1->gn);
+ dot_2 = dot_v3v3_db(view_vector, rt2->gn);
+
+ if ((result = dot_1 * dot_2) < 0 && (dot_1 + dot_2)) {
+ return LRT_EDGE_FLAG_CONTOUR;
+ }
+ else if (rb->use_crease &&
+ (dot_v3v3_db(rt1->gn, rt2->gn) < crease_threshold)) {
+ if(!no_crease) {
+ return LRT_EDGE_FLAG_CREASE;
+ }
+ }
+ else if (rb->use_material &&
+ (rt1->material_id != rt2->material_id)) {
+ return LRT_EDGE_FLAG_MATERIAL;
+ }else if (count_freestyle && rb->use_edge_marks) {
+ fe = CustomData_bmesh_get(&bm_if_freestyle->edata, e->head.data, CD_FREESTYLE_EDGE);
+ if (fe->flag & FREESTYLE_EDGE_MARK) {
+ return LRT_EDGE_FLAG_EDGE_MARK;
+ }
+ }
+ return 0;
+
+ ///-----------------------------------------------------------------
+ if (added) {
+ int r1, r2, c1, c2, row, col;
+ if (lineart_get_line_bounding_areas(rb, rl, &r1, &r2, &c1, &c2)) {
+ for (row = r1; row != r2 + 1; row++) {
+ for (col = c1; col != c2 + 1; col++) {
+ lineart_bounding_area_link_line(rb, &rb->initial_bounding_areas[row * 4 + col], rl);
+ }
+ }
+ }
+ }
+
+}
+
static void lineart_geometry_object_load(Depsgraph *dg,
Object *ob,
double (*mv_mat)[4],
@@ -1682,35 +1770,6 @@ static void lineart_geometry_object_load(Depsgraph *dg,
orv[i].index = i;
}
- rl = orl;
- for (i = 0; i < bm->totedge; i++) {
- e = BM_edge_at_index(bm, i);
- if (CanFindFreestyle) {
- fe = CustomData_bmesh_get(&bm->edata, e->head.data, CD_FREESTYLE_EDGE);
- if (fe->flag & FREESTYLE_EDGE_MARK) {
- rl->flags |= LRT_EDGE_FLAG_EDGE_MARK;
- }
- }
- if (use_smooth_contour_modifier_contour) {
- if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) && BM_elem_flag_test(e->v2, BM_ELEM_SELECT)) {
- rl->flags |= LRT_EDGE_FLAG_CONTOUR;
- }
- }
-
- rl->l = &orv[BM_elem_index_get(e->v1)];
- rl->r = &orv[BM_elem_index_get(e->v2)];
-
- rl->object_ref = orig_ob;
-
- LineartRenderLineSegment *rls = lineart_mem_aquire(&rb->render_data_pool,
- sizeof(LineartRenderLineSegment));
- BLI_addtail(&rl->segments, rls);
- if (usage == OBJECT_LRT_INHERENT || usage == OBJECT_LRT_INCLUDE ||
- usage == OBJECT_LRT_NO_INTERSECTION) {
- BLI_addtail(&rb->all_render_lines, rl);
- }
- rl++;
- }
rt = ort;
for (i = 0; i < bm->totface; i++) {
@@ -1748,6 +1807,40 @@ static void lineart_geometry_object_load(Depsgraph *dg,
rt = (LineartRenderTriangle *)(((unsigned char *)rt) + rb->triangle_size);
}
+
+ /* use BM_ELEM_TAG in f->head.hflag to store needed faces in the first iteration. */
+
+ rl = orl;
+ for (i = 0; i < bm->totedge; i++) {
+ e = BM_edge_at_index(bm, i);
+ if (CanFindFreestyle) {
+ fe = CustomData_bmesh_get(&bm->edata, e->head.data, CD_FREESTYLE_EDGE);
+ if (fe->flag & FREESTYLE_EDGE_MARK) {
+ rl->flags |= LRT_EDGE_FLAG_EDGE_MARK;
+ }
+ }
+ if (use_smooth_contour_modifier_contour) {
+ if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) && BM_elem_flag_test(e->v2, BM_ELEM_SELECT)) {
+ rl->flags |= LRT_EDGE_FLAG_CONTOUR;
+ }
+ }
+
+ rl->l = &orv[BM_elem_index_get(e->v1)];
+ rl->r = &orv[BM_elem_index_get(e->v2)];
+
+ rl->object_ref = orig_ob;
+
+ LineartRenderLineSegment *rls = lineart_mem_aquire(&rb->render_data_pool,
+ sizeof(LineartRenderLineSegment));
+ BLI_addtail(&rl->segments, rls);
+ if (usage == OBJECT_LRT_INHERENT || usage == OBJECT_LRT_INCLUDE ||
+ usage == OBJECT_LRT_NO_INTERSECTION) {
+ BLI_addtail(&rb->all_render_lines, rl);
+ }
+ rl++;
+ }
+
+
BM_mesh_free(bm);
if (ob->type != OB_MESH) {
@@ -2507,120 +2600,6 @@ static void lineart_main_get_view_vector(LineartRenderBuffer *rb)
copy_v3db_v3fl(rb->view_vector, trans);
}
-static void lineart_main_compute_scene_contours(LineartRenderBuffer *rb)
-{
- double view_vector[3];
- double dot_1 = 0, dot_2 = 0;
- double result;
- int add = 0, added = 0;
- int contour_count = 0;
- int crease_count = 0;
- int material_count = 0;
-
- if(!rb->cam_is_persp){
- copy_v3_v3_db(view_vector, rb->view_vector);
- }
-
- LISTBASE_FOREACH (LineartRenderElementLinkNode *, reln, &rb->line_buffer_pointers) {
- LineartRenderLine *rl = (LineartRenderLine *)reln->pointer;
- int amount = reln->element_count;
- for (int i = 0; i < amount; i++) {
- rl = &((LineartRenderLine *)reln->pointer)[i];
- add = 0;
- added = 0;
- dot_1 = 0;
- dot_2 = 0;
-
- if ((rl->flags & LRT_EDGE_FLAG_CHAIN_PICKED) || (!rl->l) || (!rl->r)) {
- continue;
- }
-
- if (rb->cam_is_persp) {
- sub_v3_v3v3_db(view_vector, rl->l->gloc, rb->camera_pos);
- }
-
- if (use_smooth_contour_modifier_contour) {
- if (rl->flags & LRT_EDGE_FLAG_CONTOUR) {
- add = 1;
- }
- }
- else {
- if (rl->tl) {
- dot_1 = dot_v3v3_db(view_vector, rl->tl->gn);
- }
- else {
- add = 1;
- }
- if (rl->tr) {
- dot_2 = dot_v3v3_db(view_vector, rl->tr->gn);
- }
- else {
- add = 1;
- }
- }
-
- if (!add) {
- if ((result = dot_1 * dot_2) < 0 && (dot_1 + dot_2)) {
- add = 1;
- }
- else if (rb->use_crease &&
- (dot_v3v3_db(rl->tl->gn, rl->tr->gn) < reln->crease_threshold)) {
- if (rl->object_ref && rl->object_ref->type == OB_FONT) {
- /* No internal lines in a text object. */
- }
- else {
- add = 2;
- }
- }
- else if (rb->use_material &&
- (rl->tl && rl->tr && rl->tl->material_id != rl->tr->material_id)) {
- add = 3;
- }
- }
-
- if (rb->use_contour && (add == 1)) {
- rl->flags &= ~LRT_EDGE_FLAG_ALL_TYPE;
- rl->flags |= LRT_EDGE_FLAG_CONTOUR;
- lineart_list_append_pointer_static(&rb->contours, &rb->render_data_pool, rl);
- added = 1;
- contour_count++;
- }
- else if (add == 2) {
- rl->flags &= ~LRT_EDGE_FLAG_ALL_TYPE;
- rl->flags |= LRT_EDGE_FLAG_CREASE;
- lineart_list_append_pointer_static(&rb->crease_lines, &rb->render_data_pool, rl);
- added = 1;
- crease_count++;
- }
- else if (rb->use_material && (add == 3)) {
- rl->flags &= ~LRT_EDGE_FLAG_ALL_TYPE;
- rl->flags |= LRT_EDGE_FLAG_MATERIAL;
- lineart_list_append_pointer_static(&rb->material_lines, &rb->render_data_pool, rl);
- added = 1;
- material_count++;
- }
- else if (rb->use_edge_marks && (rl->flags & LRT_EDGE_FLAG_EDGE_MARK)) {
- rl->flags &= ~LRT_EDGE_FLAG_ALL_TYPE;
- rl->flags = LRT_EDGE_FLAG_EDGE_MARK;
- add = 4;
- lineart_list_append_pointer_static(&rb->edge_marks, &rb->render_data_pool, rl);
- added
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list