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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to