[Bf-blender-cvs] [7431839712b] soc-2018-npr: Chain now accept line segments (multiple occlusion level on one line is possible)

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


Commit: 7431839712ba22f279c733ce523807896c2dca0c
Author: Nick Wu
Date:   Wed Jul 18 16:20:21 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB7431839712ba22f279c733ce523807896c2dca0c

Chain now accept line segments (multiple occlusion level on one line is possible)

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

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_ops.c

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 96882b60876..787b008c823 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -424,7 +424,6 @@ typedef struct LANPR_RenderLineSegment {
 	//real     Begin, End;  // 0->At[L] 1->At[R]
 	real at;
 	u8bit OccludeLevel;    //after
-	int PreviewIndex;
 }LANPR_RenderLineSegment;
 
 typedef struct LANPR_RenderVert {
@@ -471,9 +470,9 @@ typedef struct LANPR_RenderLineChain {
 
 typedef struct LANPR_RenderLineChainItem {
 	nListItem   Item;
-	LANPR_RenderVert*       rv;     // this is for point. similar structure as ListItemPointer
-	char        LineType;
-	//char        OccludeLevel;
+	float       pos[2];
+	char        LineType;      //      style of [1]       style of [2]
+	char        OccludeLevel;  // [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 548c5c3ced5..6ee41f59f5e 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -27,10 +27,7 @@
 #include <math.h>
 
 int lanpr_GetLineBoundingAreas(LANPR_RenderBuffer *rb, LANPR_RenderLine *rl, int *RowBegin, int *RowEnd, int *ColBegin, int *ColEnd) ;
-
-real lanpr_ThreePointCosine(LANPR_RenderVert* l,LANPR_RenderVert* c, LANPR_RenderVert* r){
-
-}
+LANPR_BoundingArea* lanpr_GetPointBoundingArea(LANPR_RenderBuffer *rb, real x, real y) ;
 
 LANPR_RenderLine* lanpr_GetConnectedRenderLine(LANPR_BoundingArea* ba, LANPR_RenderVert* rv, LANPR_RenderVert** NextV){
     nListItemPointer* lip;
@@ -68,22 +65,24 @@ LANPR_RenderLineChain* lanpr_create_render_line_chain(LANPR_RenderBuffer *rb){
     return rlc;
 }
 
-LANPR_RenderLineChainItem* lanpr_append_render_line_chain_point(LANPR_RenderBuffer *rb, LANPR_RenderLineChain* rlc, LANPR_RenderVert*rv, char type){
+LANPR_RenderLineChainItem* lanpr_append_render_line_chain_point(LANPR_RenderBuffer *rb, LANPR_RenderLineChain* rlc, float x, float y, char type, int level){
     LANPR_RenderLineChainItem* rlci;
     rlci = memStaticAquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineChainItem));
 
-    rlci->rv = rv;
+    rlci->pos[0] = x;
+    rlci->pos[1] = y;
     rlci->LineType = type&LANPR_EDGE_FLAG_ALL_TYPE;
     lstAppendItem(&rlc->Chain,rlci);
 
     return rlci;
 }
 
-LANPR_RenderLineChainItem* lanpr_push_render_line_chain_point(LANPR_RenderBuffer *rb, LANPR_RenderLineChain* rlc, LANPR_RenderVert*rv, char type){
+LANPR_RenderLineChainItem* lanpr_push_render_line_chain_point(LANPR_RenderBuffer *rb, LANPR_RenderLineChain* rlc, float x, float y, char type, int level){
     LANPR_RenderLineChainItem* rlci;
     rlci = memStaticAquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineChainItem));
 
-    rlci->rv = rv;
+    rlci->pos[0] = x;
+    rlci->pos[1] = y;
     rlci->LineType = type&LANPR_EDGE_FLAG_ALL_TYPE;
     lstPushItem(&rlc->Chain,rlci);
 
@@ -97,15 +96,13 @@ void lanpr_reduce_render_line_chain_recursive(LANPR_RenderLineChain* rlc, LANPR_
     float max_dist=0;
     LANPR_RenderLineChainItem* max_rlci=0;
 
-    copy_v2fl_v2db(l,from->rv->FrameBufferCoord);
-    copy_v2fl_v2db(r,to->rv->FrameBufferCoord);
-
     // find the max distance item
     for(rlci = from; rlci!= to->Item.pNext; rlci=next_rlci){
         next_rlci = rlci->Item.pNext;
 
-        copy_v2fl_v2db(c,rlci->rv->FrameBufferCoord);
-        float dist = dist_to_line_segment_v2(c,l,r);
+        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;}
 
@@ -123,6 +120,8 @@ 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_RenderLine* rl;
+    LANPR_BoundingArea* ba;
+    LANPR_RenderLineSegment* rls;
 
     for(rl = rb->AllRenderLines.pFirst; rl;rl=rl->Item.pNext){
 
@@ -135,32 +134,83 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_thresh
 		int r1, r2, c1, c2, row, col;
         LANPR_RenderLine* new_rl = rl;
         LANPR_RenderVert* new_rv;
-		if (lanpr_GetLineBoundingAreas(rb, rl, &r1, &r2, &c1, &c2)) {
-            for (row = r1; row != r2 + 1; row++) {
-                for (col = c1, col != c2 + 1; col++) {
-
-                    //grow left side
-                    new_rv = rl->L;
-                    lanpr_push_render_line_chain_point(rb,rlc,new_rv,rl->Flags);
-                    while(new_rl = lanpr_GetConnectedRenderLine(&rb->InitialBoundingAreas[row * 20 + col],&new_rv)){
-                        new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
-                        new_rv = LANPR_OTHER_RV(new_rl,new_rv);
-                        
-                    }
-
-                    //grow right side
-                    new_rv = rl->R;
-                    lanpr_append_render_line_chain_point(rb,rlc,new_rv,rl->Flags);
-                    while(new_rl = lanpr_GetConnectedRenderLine(&rb->InitialBoundingAreas[row * 20 + col],&new_rv)){
-                        new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
-                        new_rv = LANPR_OTHER_RV(new_rl,new_rv);
-                    }
-
-                    //simplification
-                    lanpr_reduce_render_line_chain_recursive(rlc, rlc->Chain.pFirst; rlc->Chain.pLast, dist_threshold);
+
+        // 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);
+        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=rsl->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=rsl->Item.pPrev;
+                for(rls; rls; rls=rsl->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]);
         }
+
+        // step 2: this line
+        for(rls = new_rl->Segments.pFirst; rls;rls=rsl->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);
+        }
+
+        // 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)){
+            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=rsl->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=rsl->Item.pPrev;
+                for(rls; rls; rls=rsl->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]);
+        }
+
+        lanpr_reduce_render_line_chain_recursive(rlc,rlc->Chain.pFirst, rlc->Chain.pLast, dist_threshold);
     }
 }
 
@@ -213,6 +263,6 @@ void lanpr_ChainGenerateDrawCommand(LANPR_RenderBuffer *rb){
         }
     }
 
-    rb->ChainDrawBatc

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list