[Bf-blender-cvs] [1ddd3d60bff] soc-2018-npr: Chain support line types and levels. Still bugs in chaining, hard to find, but results good enough in most of the conditions.

Nick Wu noreply at git.blender.org
Mon Jul 23 16:34:42 CEST 2018


Commit: 1ddd3d60bff06729f3bc08544ab8a9392db5ca12
Author: Nick Wu
Date:   Mon Jul 23 17:57:34 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB1ddd3d60bff06729f3bc08544ab8a9392db5ca12

Chain support line types and levels.
Still bugs in chaining, hard to find, but results good enough in most of the conditions.

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

M	source/blender/draw/engines/lanpr/lanpr_all.h
M	source/blender/draw/engines/lanpr/lanpr_chain.c
M	source/blender/draw/engines/lanpr/lanpr_engine.c
M	source/blender/draw/engines/lanpr/lanpr_ops.c
M	source/blender/draw/engines/lanpr/shaders/lanpr_software_line_width.geometry
M	source/blender/draw/engines/lanpr/shaders/lanpr_software_scale_compensate.vertex

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 702c22e1132..1b070a54002 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -424,7 +424,7 @@ typedef struct LANPR_RenderLineSegment {
 	nListItem Item;
 	//real     Begin, End;  // 0->At[L] 1->At[R]
 	real at;
-	u8bit OccludeLevel;    //after
+	u8bit OcclusionLevel;    //after
 }LANPR_RenderLineSegment;
 
 typedef struct LANPR_RenderVert {
@@ -474,7 +474,7 @@ typedef struct LANPR_RenderLineChainItem {
 	nListItem   Item;
 	float       pos[3]; // need z value for fading
 	char        LineType;      //      style of [1]       style of [2]
-	char        OccludeLevel;  // [1]--------------->[2]---------------->[3]--....
+	char        OcclusionLevel;  // [1]--------------->[2]---------------->[3]--....
 }LANPR_RenderLineChainItem;
 
 typedef struct LANPR_BoundingArea {
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index d60c75bd11b..fbbea5b5578 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -85,9 +85,10 @@ LANPR_RenderLineChainItem* lanpr_append_render_line_chain_point(LANPR_RenderBuff
     rlci->pos[0] = x;
     rlci->pos[1] = y;
     rlci->LineType = type&LANPR_EDGE_FLAG_ALL_TYPE;
+	rlci->OcclusionLevel = level;
     lstAppendItem(&rlc->Chain,rlci);
 
-	//printf("a %f %f\n", x, y);
+    //printf("a %f,%f %d\n", x, y, level);
 
     return rlci;
 }
@@ -99,9 +100,10 @@ LANPR_RenderLineChainItem* lanpr_push_render_line_chain_point(LANPR_RenderBuffer
     rlci->pos[0] = x;
     rlci->pos[1] = y;
     rlci->LineType = type&LANPR_EDGE_FLAG_ALL_TYPE;
+	rlci->OcclusionLevel = level;
     lstPushItem(&rlc->Chain,rlci);
 
-	//printf("p %f %f\n", x, y);
+	//printf("p %f,%f %d\n", x, y, level);
 
     return rlci;
 }
@@ -117,7 +119,7 @@ void lanpr_reduce_render_line_chain_recursive(LANPR_RenderLineChain* rlc, LANPR_
     for(rlci = from->Item.pNext; rlci!= to; rlci=next_rlci){
         next_rlci = rlci->Item.pNext;
 
-        if(next_rlci && (next_rlci->OccludeLevel!= rlci->OccludeLevel || next_rlci->LineType!= rlci->LineType)) continue;
+        if(next_rlci && (next_rlci->OcclusionLevel!= rlci->OcclusionLevel || next_rlci->LineType!= rlci->LineType)) continue;
 
 		float dist = dist_to_line_segment_v2(rlci->pos, from->pos, to->pos);
 		if (dist>dist_threshold && dist>max_dist) { max_dist = dist; max_rlci = rlci; }
@@ -128,7 +130,7 @@ void lanpr_reduce_render_line_chain_recursive(LANPR_RenderLineChain* rlc, LANPR_
 		if (from->Item.pNext == to) return;
 		for (rlci = from->Item.pNext; rlci != to; rlci = next_rlci) {
 			next_rlci = rlci->Item.pNext;
-			if (next_rlci && (next_rlci->OccludeLevel != rlci->OccludeLevel || next_rlci->LineType != rlci->LineType)) continue;
+			if (next_rlci && (next_rlci->OcclusionLevel != rlci->OcclusionLevel || next_rlci->LineType != rlci->LineType)) continue;
 			lstRemoveItem(&rlc->Chain, (void*)rlci);
 		}
 	}else {
@@ -140,6 +142,7 @@ void lanpr_reduce_render_line_chain_recursive(LANPR_RenderLineChain* rlc, LANPR_
 
 void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_threshold){
     LANPR_RenderLineChain* rlc;
+	LANPR_RenderLineChainItem* rlci;
     LANPR_RenderLine* rl;
     LANPR_BoundingArea* ba;
     LANPR_RenderLineSegment* rls;
@@ -159,31 +162,32 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
         // step 1: grow left
         ba = lanpr_GetPointBoundingArea(rb,rl->L->FrameBufferCoord[0], rl->L->FrameBufferCoord[1]);
         new_rv = rl->L;
-        lanpr_push_render_line_chain_point(rb,rlc,new_rv->FrameBufferCoord[0],new_rv->FrameBufferCoord[1],rl->Flags,0);
+		rls = rl->Segments.pFirst;
+        lanpr_push_render_line_chain_point(rb,rlc,new_rv->FrameBufferCoord[0],new_rv->FrameBufferCoord[1],rl->Flags, rls->OcclusionLevel);
         while(ba &&(new_rl = lanpr_GetConnectedRenderLine(ba,new_rv,&new_rv))){
             new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
 
-            int last_occlude;
+            int last_occlusion;
             
             if(new_rv==new_rl->L){
                 for(rls = new_rl->Segments.pLast; rls;rls=rls->Item.pPrev){
                     float px,py;
                     px = tnsLinearItp(new_rl->L->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[0], rls->at);
                     py = tnsLinearItp(new_rl->L->FrameBufferCoord[1], new_rl->R->FrameBufferCoord[1], rls->at);
-                    lanpr_push_render_line_chain_point(rb,rlc,px,py, new_rl->Flags, rls->OccludeLevel);
+                    lanpr_push_render_line_chain_point(rb,rlc,px,py, new_rl->Flags, rls->OcclusionLevel);
                 }
             }elif(new_rv==new_rl->R){
                 rls = new_rl->Segments.pFirst;
-                last_occlude = rls->OccludeLevel;
+                last_occlusion = rls->OcclusionLevel;
                 rls=rls->Item.pNext;
                 for(rls; rls; rls= rls->Item.pNext){
                     float px,py;
                     px = tnsLinearItp(new_rl->L->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[0], rls->at);
                     py = tnsLinearItp(new_rl->L->FrameBufferCoord[1], new_rl->R->FrameBufferCoord[1], rls->at);
-                    lanpr_push_render_line_chain_point(rb,rlc,px,py, new_rl->Flags,last_occlude);
-                    last_occlude = rls->OccludeLevel;
+                    lanpr_push_render_line_chain_point(rb,rlc,px,py, new_rl->Flags,last_occlusion);
+                    last_occlusion = rls->OcclusionLevel;
                 }
-                lanpr_push_render_line_chain_point(rb,rlc, new_rl->R->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[1], new_rl->Flags,last_occlude);
+                lanpr_push_render_line_chain_point(rb,rlc, new_rl->R->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[1], new_rl->Flags,last_occlusion);
             }
             ba = lanpr_GetPointBoundingArea(rb,new_rv->FrameBufferCoord[0], new_rv->FrameBufferCoord[1]);
         }
@@ -194,7 +198,7 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
             float px,py;
             px = tnsLinearItp(rl->L->FrameBufferCoord[0], rl->R->FrameBufferCoord[0], rls->at);
             py = tnsLinearItp(rl->L->FrameBufferCoord[1], rl->R->FrameBufferCoord[1], rls->at);
-            lanpr_append_render_line_chain_point(rb,rlc,px,py,rl->Flags, rls->OccludeLevel);
+            lanpr_append_render_line_chain_point(rb,rlc,px,py,rl->Flags, rls->OcclusionLevel);
         }
 		lanpr_append_render_line_chain_point(rb, rlc, rl->R->FrameBufferCoord[0], rl->R->FrameBufferCoord[1], rl->Flags, 0);
 
@@ -206,27 +210,38 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
         while(ba && (new_rl = lanpr_GetConnectedRenderLine(ba,new_rv,&new_rv))){
             new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
 
-            int last_occlude;
+            int last_occlusion;
+
+			// fix leading vertex type
+			rlci = rlc->Chain.pLast;
+			rlci->LineType = new_rl->Flags&LANPR_EDGE_FLAG_ALL_TYPE;
             
 			if (new_rv == new_rl->L) {
+				rls = new_rl->Segments.pLast;
+				last_occlusion = rls->OcclusionLevel;
+				rlci->OcclusionLevel = last_occlusion;
+				rls = rls->Item.pPrev;
+				if (rls) last_occlusion = rls->OcclusionLevel;
 				for (rls = new_rl->Segments.pLast; rls; rls = rls->Item.pPrev) {
 					float px, py;
 					px = tnsLinearItp(new_rl->L->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[0], rls->at);
 					py = tnsLinearItp(new_rl->L->FrameBufferCoord[1], new_rl->R->FrameBufferCoord[1], rls->at);
-					lanpr_append_render_line_chain_point(rb, rlc, px, py, new_rl->Flags, rls->OccludeLevel);
+					last_occlusion = rls->Item.pPrev ? ((LANPR_RenderLineSegment*)rls->Item.pPrev)->OcclusionLevel : 0;
+					lanpr_append_render_line_chain_point(rb, rlc, px, py, new_rl->Flags, last_occlusion);
 				}
 			}elif(new_rv == new_rl->R) {
 				rls = new_rl->Segments.pFirst;
-				last_occlude = rls->OccludeLevel;
+				last_occlusion = rls->OcclusionLevel;
+				rlci->OcclusionLevel = last_occlusion;
 				rls = rls->Item.pNext;
 				for (rls; rls; rls = rls->Item.pNext) {
 					float px, py;
 					px = tnsLinearItp(new_rl->L->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[0], rls->at);
 					py = tnsLinearItp(new_rl->L->FrameBufferCoord[1], new_rl->R->FrameBufferCoord[1], rls->at);
-					lanpr_append_render_line_chain_point(rb, rlc, px, py, new_rl->Flags, last_occlude);
-					last_occlude = rls->OccludeLevel;
+					lanpr_append_render_line_chain_point(rb, rlc, px, py, new_rl->Flags, rls->OcclusionLevel);
+					//last_occlusion = rls->OcclusionLevel;
 				}
-				lanpr_append_render_line_chain_point(rb, rlc, new_rl->R->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[1], new_rl->Flags, last_occlude);
+				lanpr_append_render_line_chain_point(rb, rlc, new_rl->R->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[1], new_rl->Flags, 0);
 			}
 			ba = lanpr_GetPointBoundingArea(rb, new_rv->FrameBufferCoord[0], new_rv->FrameBufferCoord[1]);
         }
@@ -234,11 +249,11 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
 		//LANPR_RenderLineChainItem* rlci;
 		//printf("line:\n");
 		//for (rlci = rlc->Chain.pFirst; rlci; rlci = rlci->Item.pNext) {
-		//	printf("  %f %f\n", rlci->pos[0],rlci->pos[1]);
+		//	printf("  %f,%f %d\n", rlci->pos[0],rlci->pos[1], rlci->OcclusionLevel);
 		//}
 		//printf("--------\n");
 
-        lanpr_reduce_render_line_chain_recursive(rlc,rlc->Chain.pFirst, rlc->Chain.pLast, dist_threshold);
+        //lanpr_reduce_render_line_chain_recursive(rlc,rlc->Chain.pFirst, rlc->Chain.pLast, dist_threshold);
     }
 }
 
@@ -270,21 +285,33 @@ float lanpr_ComputeChainLength(LANPR_RenderLineChain* rlc, float* lengths, int b
 	return offset_accum;
 }
 
+int lanpr_GetGPULineType(LANPR_RenderLineChainItem* rlci) {
+	switch (rlci->LineType) {
+		case LANPR_EDGE_FLAG_CONTOUR:         return 0;
+		case LANPR_EDGE_FLAG_CREASE:          return 1;
+		case LANPR_EDGE_FLAG_MATERIAL:        return 2;
+		case LANPR_EDGE_FLAG

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list