[Bf-blender-cvs] [3b52d6c72cc] soc-2018-npr: Chain works, but occlusion is broken. (memory not cleaned up, drawing function is still the old one)

Nick Wu noreply at git.blender.org
Wed Jul 18 17:49:56 CEST 2018


Commit: 3b52d6c72cc719e071edfdfbbb054e1babb233e8
Author: Nick Wu
Date:   Wed Jul 18 23:49:14 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB3b52d6c72cc719e071edfdfbbb054e1babb233e8

Chain works, but occlusion is broken. (memory not cleaned up, drawing function is still the old one)

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

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

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 787b008c823..d5a24d758e6 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -349,6 +349,7 @@ typedef struct LANPR_RenderBuffer {
 
 	nListHandle Chains;
 	Gwn_Batch*  ChainDrawBatch;
+	DRWShadingGroup* ChainShgrp;
 
 	SpinLock csInfo;
 	SpinLock csData;
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index 6c1bd8f5f9b..dd19ee80204 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -37,7 +37,7 @@ LANPR_RenderLine* lanpr_GetConnectedRenderLine(LANPR_BoundingArea* ba, LANPR_Ren
     for(lip = ba->LinkedLines.pFirst; lip; lip=lip->pNext){
         nrl = lip->p;
 
-        if(nrl->Flags & LANPR_EDGE_FLAG_CHAIN_PICKED) continue;
+        if((!(nrl->Flags&LANPR_EDGE_FLAG_ALL_TYPE)) || (nrl->Flags & LANPR_EDGE_FLAG_CHAIN_PICKED)) continue;
 
         // always chain connected lines for now.
         // simplification will take care of the sharp points.
@@ -96,20 +96,26 @@ void lanpr_reduce_render_line_chain_recursive(LANPR_RenderLineChain* rlc, LANPR_
     LANPR_RenderLineChainItem* max_rlci=0;
 
     // find the max distance item
-    for(rlci = from; rlci!= to->Item.pNext; rlci=next_rlci){
+    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;
 
-        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; continue;}
-
-        if(dist<=dist_threshold) lstRemoveItem(&rlc->Chain, (void*)rlci);
+		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; }
+		//if (dist <= dist_threshold) lstRemoveItem(&rlc->Chain, (void*)rlci);
     }
 
-    if (from->Item.pNext != max_rlci) lanpr_reduce_render_line_chain_recursive(rlc, from, max_rlci, dist_threshold);
-	if (to->Item.pPrev != max_rlci)   lanpr_reduce_render_line_chain_recursive(rlc, max_rlci, to, dist_threshold);
+	if (!max_rlci) {
+		if (from->Item.pNext == to) return;
+		for (rlci = from->Item.pNext; rlci != to; rlci = next_rlci) {
+			next_rlci = rlci->Item.pNext;
+			lstRemoveItem(&rlc->Chain, (void*)rlci);
+		}
+	}else {
+		if (from->Item.pNext != max_rlci) lanpr_reduce_render_line_chain_recursive(rlc, from, max_rlci, dist_threshold);
+		if (to->Item.pPrev != max_rlci)   lanpr_reduce_render_line_chain_recursive(rlc, max_rlci, to, dist_threshold);
+	}
 }
 
 
@@ -124,7 +130,7 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
 
     for(rl = rb->AllRenderLines.pFirst; rl;rl=rl->Item.pNext){
 
-        if(rl->Flags & LANPR_EDGE_FLAG_CHAIN_PICKED) continue;
+        if((!(rl->Flags&LANPR_EDGE_FLAG_ALL_TYPE)) || (rl->Flags & LANPR_EDGE_FLAG_CHAIN_PICKED)) continue;
 
         rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
 
@@ -138,78 +144,80 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
         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);
-        while(new_rl = lanpr_GetConnectedRenderLine(ba,&new_rv)){
+        while(new_rl = lanpr_GetConnectedRenderLine(ba,new_rv)){
             new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
             new_rv = LANPR_OTHER_RV(new_rl,new_rv);
 
             int last_occlude;
             
-            if(new_rv==new_rl->R){
-                for(rls = new_rl->Segments.pFirst; rls;rls=rls->Item.pNext){
+            if(new_rv==new_rl->L){
+                for(rls = new_rl->Segments.pLast; rls;rls=rls->Item.pPrev){
                     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_push_render_line_chain_point(rb,rlc,px,py,rl->Flags, rls->OccludeLevel);
+                    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);
                 }
-            }elif(new_rv==new_rl->L){
-                rls = new_rl->Segments.pLast;
+            }elif(new_rv==new_rl->R){
+                rls = new_rl->Segments.pFirst;
                 last_occlude = rls->OccludeLevel;
-                rls=rls->Item.pPrev;
-                for(rls; rls; rls= rls->Item.pPrev){
+                rls=rls->Item.pNext;
+                for(rls; rls; rls= rls->Item.pNext){
                     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_push_render_line_chain_point(rb,rlc,px,py,rl->Flags,last_occlude);
+                    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,rl->L->FrameBufferCoord[0],rl->L->FrameBufferCoord[1],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_occlude);
             }
             ba = lanpr_GetPointBoundingArea(rb,new_rv->FrameBufferCoord[0], new_rv->FrameBufferCoord[1]);
         }
 
         // step 2: this line
-        for(rls = new_rl->Segments.pFirst; rls;rls=rls->Item.pNext){
+		rls = rl->Segments.pFirst;
+        for(rls = rls->Item.pNext; rls;rls=rls->Item.pNext){
             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_push_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->OccludeLevel);
         }
+		lanpr_append_render_line_chain_point(rb, rlc, rl->R->FrameBufferCoord[0], rl->R->FrameBufferCoord[1], rl->Flags, 0);
 
         // step 3: grow right
         ba = lanpr_GetPointBoundingArea(rb,rl->R->FrameBufferCoord[0], rl->R->FrameBufferCoord[1]);
         new_rv = rl->R;
         // below already done in step 2
         // lanpr_push_render_line_chain_point(rb,rlc,new_rv->FrameBufferCoord[0],new_rv->FrameBufferCoord[1],rl->Flags,0);
-        while(new_rl = lanpr_GetConnectedRenderLine(ba,&new_rv)){
+        while(new_rl = lanpr_GetConnectedRenderLine(ba,new_rv)){
             new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
             new_rv = LANPR_OTHER_RV(new_rl,new_rv);
 
             int last_occlude;
             
-            if(new_rv==new_rl->R){
-                for(rls = new_rl->Segments.pFirst; rls;rls= rls->Item.pNext){
-                    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_push_render_line_chain_point(rb,rlc,px,py,rl->Flags, rls->OccludeLevel);
-                }
-            }elif(new_rv==new_rl->L){
-                rls = new_rl->Segments.pLast;
-                last_occlude = rls->OccludeLevel;
-                rls=rls->Item.pPrev;
-                for(rls; rls; rls= rls->Item.pPrev){
-                    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_push_render_line_chain_point(rb,rlc,px,py,rl->Flags,last_occlude);
-                    last_occlude = rls->OccludeLevel;
-                }
-                lanpr_push_render_line_chain_point(rb,rlc,rl->L->FrameBufferCoord[0],rl->L->FrameBufferCoord[1],rl->Flags,last_occlude);
-            }
-            ba = lanpr_GetPointBoundingArea(rb,new_rv->FrameBufferCoord[0], new_rv->FrameBufferCoord[1]);
+			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_append_render_line_chain_point(rb, rlc, px, py, new_rl->Flags, rls->OccludeLevel);
+				}
+			}elif(new_rv == new_rl->R) {
+				rls = new_rl->Segments.pFirst;
+				last_occlude = rls->OccludeLevel;
+				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, new_rl->R->FrameBufferCoord[0], new_rl->R->FrameBufferCoord[1], new_rl->Flags, last_occlude);
+			}
+			ba = lanpr_GetPointBoundingArea(rb, new_rv->FrameBufferCoord[0]

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list