[Bf-blender-cvs] [4b67aa48481] soc-2018-npr: Implementing Chaining. Have problems for half-occluded line. Still thinking for solution.

Nick Wu noreply at git.blender.org
Wed Jul 18 08:54:51 CEST 2018


Commit: 4b67aa484814285cde1e68d634562742fadf445c
Author: Nick Wu
Date:   Wed Jul 18 14:54:24 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB4b67aa484814285cde1e68d634562742fadf445c

Implementing Chaining. Have problems for half-occluded line. Still thinking for solution.

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

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 20c22663025..96882b60876 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -347,6 +347,9 @@ typedef struct LANPR_RenderBuffer {
 	nListItemPointer *EdgeMarkManaged;
 	nListHandle EdgeMarks;
 
+	nListHandle Chains;
+	Gwn_Batch*  ChainDrawBatch;
+
 	SpinLock csInfo;
 	SpinLock csData;
 	SpinLock csManagement;
@@ -439,8 +442,15 @@ typedef struct LANPR_RenderVert {
 }LANPR_RenderVert;
 
 #define LANPR_EDGE_FLAG_EDGE_MARK    1
+#define LANPR_EDGE_FLAG_CONTOUR      2
+#define LANPR_EDGE_FLAG_CREASE       4
+#define LANPR_EDGE_FLAG_MATERIAL     8
+#define LANPR_EDGE_FLAG_INTERSECTION 16
+#define LANPR_EDGE_FLAG_FLOATING     32 // floating edge, unimplemented yet
 #define LANPR_EDGE_FLAG_CHAIN_PICKED 64
 
+#define LANPR_EDGE_FLAG_ALL_TYPE     0x3f
+
 typedef struct LANPR_RenderLine {
 	nListItem Item;
 	struct LANPR_RenderVert *L, *R;
@@ -449,16 +459,23 @@ typedef struct LANPR_RenderLine {
 	//tnsEdge*       Edge;//should be edge material
 	//tnsRenderTriangle* Testing;//Should Be tRT** Testing[NumOfThreads]
 	char MinOcclude;
-	char Flags;
+	char Flags; // also for line type determination on chainning
 	struct Object *ObjectRef;
 }LANPR_RenderLine;
 
 typedef struct LANPR_RenderLineChain {
 	nListItem   Item;
 	nListHandle Chain;
-	int         SegmentCount;
+	//int         SegmentCount;  // we count before draw cmd.
 }LANPR_RenderLineChain;
 
+typedef struct LANPR_RenderLineChainItem {
+	nListItem   Item;
+	LANPR_RenderVert*       rv;     // this is for point. similar structure as ListItemPointer
+	char        LineType;
+	//char        OccludeLevel;
+}LANPR_RenderLineChainItem;
+
 typedef struct LANPR_BoundingArea {
 	real L, R, U, B;
 	real CX, CY;
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index 8d61ff60313..548c5c3ced5 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -2,6 +2,7 @@
 #include "DRW_render.h"
 #include "BLI_listbase.h"
 #include "BLI_linklist.h"
+#include "BLI_math.h"
 #include "lanpr_all.h"
 #include "DRW_render.h"
 #include "BKE_object.h"
@@ -58,10 +59,68 @@ int lanpr_GetNearByRenderLine(LANPR_BoundingArea* ba, LANPR_RenderLine* rl){
     // hold on
 }
 
+LANPR_RenderLineChain* lanpr_create_render_line_chain(LANPR_RenderBuffer *rb){
+    LANPR_RenderLineChain* rlc;
+    rlc = memStaticAquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineChain));
+
+    lstAppendItem(&rb->Chains,rlc);
+
+    return rlc;
+}
+
+LANPR_RenderLineChainItem* lanpr_append_render_line_chain_point(LANPR_RenderBuffer *rb, LANPR_RenderLineChain* rlc, LANPR_RenderVert*rv, char type){
+    LANPR_RenderLineChainItem* rlci;
+    rlci = memStaticAquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineChainItem));
+
+    rlci->rv = rv;
+    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* rlci;
+    rlci = memStaticAquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineChainItem));
+
+    rlci->rv = rv;
+    rlci->LineType = type&LANPR_EDGE_FLAG_ALL_TYPE;
+    lstPushItem(&rlc->Chain,rlci);
+
+    return rlci;
+}
+
+
+void lanpr_reduce_render_line_chain_recursive(LANPR_RenderLineChain* rlc, LANPR_RenderLineChainItem* from, LANPR_RenderLineChainItem* to, float dist_threshold){
+    LANPR_RenderLineChainItem* rlci,*next_rlci;
+    float l[2],r[2],c[2];
+    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(dist>dist_threshold && dist>max_dist){ max_dist = dist; max_rlci=rlci; continue;}
+
+        if(dist<=dist_threshold) lstRemoveItem(&rlc->Chain, rlci);
+    }
+
+    lanpr_reduce_render_line_chain_recursive(rlc, from, max_rlci, dist_threshold);
+    lanpr_reduce_render_line_chain_recursive(rlc, max_rlci, to, dist_threshold);
+}
+
+
 #define LANPR_OTHER_RV(rl,rv)\
 ((rv) == (rl)->L?(rl)->R:(rl)->L) 
 
-void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb){
+void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb, float dist_threshold){
     LANPR_RenderLineChain* rlc;
     LANPR_RenderLine* rl;
 
@@ -69,34 +128,91 @@ void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb){
 
         if(rl->Flags & LANPR_EDGE_FLAG_CHAIN_PICKED) continue;
 
+        rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
+
+        rlc = lanpr_create_render_line_chain(rb);
+
 		int r1, r2, c1, c2, row, col;
         LANPR_RenderLine* new_rl = rl;
-        LANPR_RenderVert* new_rv = rl->L;
+        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
-                    while(new_rl = lanpr_GetNearByRenderLine(&rb->InitialBoundingAreas[row * 20 + col],new_rl)){
-                        new_rl->Flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
-                    }
+                    lanpr_reduce_render_line_chain_recursive(rlc, rlc->Chain.pFirst; rlc->Chain.pLast, dist_threshold);
                 }
             }
         }
     }
+}
+
+int lanpr_CountChainVertices(LANPR_RenderLineChain* rlc){
+    LANPR_RenderLineChainItem* rlci;
+    int Count = 0;
+    for(rlci = rlc->Chain.pFirst;rlci = rlci->Item.pNext){
+        Count++;
+    }
+    return Count;
+}
+
+void lanpr_ChainGenerateDrawCommand(LANPR_RenderBuffer *rb){
+    LANPR_RenderLineChain* rlc;
+    LANPR_RenderLineChainItem* rlci;
+    int vert_count;
+    int i=0;
+    float point[2];
+    float last_point[2];
+    float offset_accum=0;
+
+    static Gwn_VertFormat format = { 0 };
+	static struct { uint pos, offset, type, level; } attr_id;
+	if (format.attr_len == 0) {
+		attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
+        attr_id.offset = GWN_vertformat_attr_add(&format, "offset", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
+		attr_id.type = GWN_vertformat_attr_add(&format, "type", GWN_COMP_I32, 1, GWN_FETCH_FLOAT);
+		attr_id.level = GWN_vertformat_attr_add(&format, "level", GWN_COMP_I32, 1, GWN_FETCH_INT);
+	}
+
+	Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format);
+
+    for(rlc = rb->Chains.pFirst; rlc;rlc=rlc->Item.pNext){
+        vert_count += lanpr_CountChainVertices(rlc);
+    }
+
+    GWN_vertbuf_data_alloc(vbo, vert_count);
+
+    for(rlc = rb->Chains.pFirst; rlc;rlc=rlc->Item.pNext){
+        for(rlci = rlc->Chain.pFirst;rlci = rlci->Item.pNext){
+            copy_v2fl_v2db(point,rlci->rv->FrameBufferCoord);
+            
+            GWN_vertbuf_attr_set(vbo, attr_id.pos, i, c);
+            GWN_vertbuf_attr_set(vbo, attr_id.offset, i, &offset_accum);
+
+            offset_accum += len_v2v2(point,last_point);
+            copy_v2fl_v2db(last_point,point);
+
+            i++;
+        }
+    }
 
+    rb->ChainDrawBatch = GWN_batch_create_ex(GWN_PRIM_POINTS, vbo, 0, GWN_USAGE_DYNAMIC | GWN_BATCH_OWNS_VBO);
 
 }
\ No newline at end of file
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index 1c2b959f7de..c75d525b5a1 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -356,7 +356,7 @@ int lanpr_GetLineBoundingAreas(LANPR_RenderBuffer *rb, LANPR_RenderLine *rl, int
 	real SpW = rb->WidthPerTile, SpH = rb->HeightPerTile;
 	real B[4];
 
-	if (!rt->V[0] || !rt->V[1] || !rt->V[2]) return 0;
+	if (!rl->L || !rl->R) return 0;
 
 	B[0] = MIN2(rl->L->FrameBufferCoord[0], rl->R->FrameBufferCoord[0]);
 	B[1] = MAX2(rl->L->FrameBufferCoord[0], rl->R->FrameBufferCoord[0]);
@@ -2368,6 +2368,7 @@ LANPR_RenderLine *lanpr_TriangleGenerateIntersectionLineOnly(LANPR_RenderBuffer
 	LANPR_RenderLineSegment *rls = memStaticAquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
 	lstAppendItem(&Result->Segments, rls);
 	lstAppendItem(&rb->AllRenderLines, Result);
+	Result->Flags |= LANPR_EDGE_FLAG_INTERSECTION;
 	lstAppendPointerStatic(&rb->IntersectionLines, &rb->RenderDataPool, Result);
 
 	//tnsglobal_TriangleIntersectionCount++;
@@ -2491,6 +2492,7 @@ void lanpr_ComputeSceneContours(LANPR_RenderBuffer *rb) {
 		//	continue;
 
 		if (rl->Flags & LANPR_EDGE_FLAG_EDGE_MARK) {
+			// no need to mark again
 			lstAppendPointerStatic(&rb->EdgeMarks, &rb->RenderDataPool, rl);
 			continue;
 		}
@@ -2512,14 +2514,17 @@ void lanpr_ComputeSceneContours(LANPR_RenderBuffer *rb) {
 		}
 
 		if (Add == 1) {
+			rl->Flags |= LANPR_EDGE_FLAG_CONTOUR;
 			lstAppendPointerStatic(&rb->Contours, &rb->RenderDataPool, rl);
 			ContourCount++;
 		} elif(Add == 2)
 		{
+			rl->Flags |= LANPR_EDGE_FLAG_CREASE;
 			lstAp

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list