[Bf-blender-cvs] [4069c157594] soc-2018-npr: Implementing software result chaining. Do NOT compile!

Nick Wu noreply at git.blender.org
Tue Jul 17 17:24:07 CEST 2018


Commit: 4069c157594e206c0d3b1dc8809bdd045c5df279
Author: Nick Wu
Date:   Tue Jul 17 17:26:30 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB4069c157594e206c0d3b1dc8809bdd045c5df279

Implementing software result chaining. Do NOT compile!

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

M	source/blender/draw/engines/lanpr/lanpr_all.h
A	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/lanpr_snake.c

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 5c0f3e6c031..20c22663025 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -438,7 +438,8 @@ typedef struct LANPR_RenderVert {
 	char EdgeUsed;                    //                      <|		       |>
 }LANPR_RenderVert;
 
-#define LANPR_EDGE_FLAG_EDGE_MARK 1
+#define LANPR_EDGE_FLAG_EDGE_MARK    1
+#define LANPR_EDGE_FLAG_CHAIN_PICKED 64
 
 typedef struct LANPR_RenderLine {
 	nListItem Item;
@@ -450,10 +451,14 @@ typedef struct LANPR_RenderLine {
 	char MinOcclude;
 	char Flags;
 	struct Object *ObjectRef;
-	//char            IgnoreConnectedFace;
-	//char            CullStatus;
 }LANPR_RenderLine;
 
+typedef struct LANPR_RenderLineChain {
+	nListItem   Item;
+	nListHandle Chain;
+	int         SegmentCount;
+}LANPR_RenderLineChain;
+
 typedef struct LANPR_BoundingArea {
 	real L, R, U, B;
 	real CX, CY;
@@ -466,21 +471,16 @@ typedef struct LANPR_BoundingArea {
 	nListHandle BP;
 
 	int TriangleCount;
-	nListHandle AssociatedTriangles;
+	nListHandle LinkedTriangles;
+	nListHandle LinkedLines;
+	nListHandle LinkedChains;//reserved for multithread chainning
 }LANPR_BoundingArea;
 
-typedef struct LANPR_RenderSubPixel {
-	real Depth;
-	struct LANPR_RenderTriangle *BelongTo;
-	real Weight[3];                   //belongto->vp 1 2 3
-}LANPR_RenderSubPixel;
-
 
 #define TNS_COMMAND_LINE     0
 #define TNS_COMMAND_MATERIAL 1
 #define TNS_COMMAND_EDGE     2
 
-
 #define TNS_TRANSPARENCY_DRAW_SIMPLE  0
 #define TNS_TRANSPARENCY_DRAW_LAYERED 1
 
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
new file mode 100644
index 00000000000..8d61ff60313
--- /dev/null
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -0,0 +1,102 @@
+#include "DRW_engine.h"
+#include "DRW_render.h"
+#include "BLI_listbase.h"
+#include "BLI_linklist.h"
+#include "lanpr_all.h"
+#include "DRW_render.h"
+#include "BKE_object.h"
+#include "DNA_mesh_types.h"
+#include "DNA_camera_types.h"
+#include "GPU_immediate.h"
+#include "GPU_immediate_util.h"
+#include "GPU_framebuffer.h"
+#include "DNA_lanpr_types.h"
+#include "DNA_meshdata_types.h"
+#include "BKE_customdata.h"
+#include "DEG_depsgraph_query.h"
+#include "GPU_draw.h"
+
+#include "GPU_batch.h"
+#include "GPU_framebuffer.h"
+#include "GPU_shader.h"
+#include "GPU_uniformbuffer.h"
+#include "GPU_viewport.h"
+#include "bmesh.h"
+
+#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_RenderLine* lanpr_GetConnectedRenderLine(LANPR_BoundingArea* ba, LANPR_RenderVert* rv, LANPR_RenderVert** NextV){
+    nListItemPointer* lip;
+    LANPR_RenderLine* nrl;
+    real cosine;
+
+    for(lip = ba->LinkedLines.pFirst; lip; lip=lip->Item.pNext){
+        nrl = lip->p;
+
+        if(nrl->Flags & LANPR_EDGE_FLAG_CHAIN_PICKED) continue;
+
+        // always chain connected lines for now.
+        // if(cosine whatever) continue;
+
+        if(rv == nrl->L) *NextV = nrl->R;
+        elif(rv == nrl->R) *NextV = nrl->L;
+        else continue;
+
+        return nrl;
+    }
+
+    return 0;
+}
+
+int lanpr_GetNearByRenderLine(LANPR_BoundingArea* ba, LANPR_RenderLine* rl){
+    // hold on
+}
+
+#define LANPR_OTHER_RV(rl,rv)\
+((rv) == (rl)->L?(rl)->R:(rl)->L) 
+
+void lanpr_ChainFeatureLines_NO_THREAD(LANPR_RenderBuffer *rb){
+    LANPR_RenderLineChain* rlc;
+    LANPR_RenderLine* rl;
+
+    for(rl = rb->AllRenderLines.pFirst; rl;rl=rl->Item.pNext){
+
+        if(rl->Flags & LANPR_EDGE_FLAG_CHAIN_PICKED) continue;
+
+		int r1, r2, c1, c2, row, col;
+        LANPR_RenderLine* new_rl = rl;
+        LANPR_RenderVert* new_rv = rl->L;
+		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
+                    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;
+                    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;
+                    }
+                }
+            }
+        }
+    }
+
+
+}
\ No newline at end of file
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index fa8cad44e43..623519d649d 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -635,4 +635,5 @@ RenderEngineType DRW_engine_viewport_lanpr_type = {
 	NULL,// update in render pass
 	&draw_engine_lanpr_type,
 	{NULL, NULL, NULL}
-};
\ 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 bc393956127..1c2b959f7de 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -186,7 +186,7 @@ void lanpr_ConnectNewBoundingAreas(LANPR_RenderBuffer *rb, LANPR_BoundingArea *R
 	while (lstPopPointerNoFree(&Root->UP));
 	while (lstPopPointerNoFree(&Root->BP));
 }
-void lanpr_AssociateTriangleWithBoundingArea(LANPR_RenderBuffer *rb, LANPR_BoundingArea *RootBoundingArea, LANPR_RenderTriangle *rt, real *LRUB, int Recursive);
+void lanpr_LinkTriangleWithBoundingArea(LANPR_RenderBuffer *rb, LANPR_BoundingArea *RootBoundingArea, LANPR_RenderTriangle *rt, real *LRUB, int Recursive);
 int lanpr_TriangleCalculateIntersectionsInTile(LANPR_RenderBuffer *rb, LANPR_RenderTriangle *rt, LANPR_BoundingArea *ba);
 
 void lanpr_SplitBoundingArea(LANPR_RenderBuffer *rb, LANPR_BoundingArea *Root) {
@@ -225,17 +225,17 @@ void lanpr_SplitBoundingArea(LANPR_RenderBuffer *rb, LANPR_BoundingArea *Root) {
 
 	lanpr_ConnectNewBoundingAreas(rb, Root);
 
-	while (rt = lstPopPointerNoFree(&Root->AssociatedTriangles)) {
+	while (rt = lstPopPointerNoFree(&Root->LinkedTriangles)) {
 		LANPR_BoundingArea *ba = Root->Child;
 		real B[4];
 		B[0] = MIN3(rt->V[0]->FrameBufferCoord[0], rt->V[1]->FrameBufferCoord[0], rt->V[2]->FrameBufferCoord[0]);
 		B[1] = MAX3(rt->V[0]->FrameBufferCoord[0], rt->V[1]->FrameBufferCoord[0], rt->V[2]->FrameBufferCoord[0]);
 		B[2] = MAX3(rt->V[0]->FrameBufferCoord[1], rt->V[1]->FrameBufferCoord[1], rt->V[2]->FrameBufferCoord[1]);
 		B[3] = MIN3(rt->V[0]->FrameBufferCoord[1], rt->V[1]->FrameBufferCoord[1], rt->V[2]->FrameBufferCoord[1]);
-		if (TNS_BOUND_AREA_CROSSES(B, &ba[0].L)) lanpr_AssociateTriangleWithBoundingArea(rb, &ba[0], rt, B, 0);
-		if (TNS_BOUND_AREA_CROSSES(B, &ba[1].L)) lanpr_AssociateTriangleWithBoundingArea(rb, &ba[1], rt, B, 0);
-		if (TNS_BOUND_AREA_CROSSES(B, &ba[2].L)) lanpr_AssociateTriangleWithBoundingArea(rb, &ba[2], rt, B, 0);
-		if (TNS_BOUND_AREA_CROSSES(B, &ba[3].L)) lanpr_AssociateTriangleWithBoundingArea(rb, &ba[3], rt, B, 0);
+		if (TNS_BOUND_AREA_CROSSES(B, &ba[0].L)) lanpr_LinkTriangleWithBoundingArea(rb, &ba[0], rt, B, 0);
+		if (TNS_BOUND_AREA_CROSSES(B, &ba[1].L)) lanpr_LinkTriangleWithBoundingArea(rb, &ba[1], rt, B, 0);
+		if (TNS_BOUND_AREA_CROSSES(B, &ba[2].L)) lanpr_LinkTriangleWithBoundingArea(rb, &ba[2], rt, B, 0);
+		if (TNS_BOUND_AREA_CROSSES(B, &ba[3].L)) lanpr_LinkTriangleWithBoundingArea(rb, &ba[3], rt, B, 0);
 	}
 
 	rb->BoundingAreaCount += 3;
@@ -297,10 +297,10 @@ int lanpr_TriangleCoversBoundingArea(LANPR_RenderBuffer *fb, LANPR_RenderTriangl
 
 	return 0;
 }
-void lanpr_AssociateTriangleWithBoundingArea(LANPR_RenderBuffer *rb, LANPR_BoundingArea *RootBoundingArea, LANPR_RenderTriangle *rt, real *LRUB, int Recursive) {
+void lanpr_LinkTriangleWithBoundingArea(LANPR_RenderBuffer *rb, LANPR_BoundingArea *RootBoundingArea, LANPR_RenderTriangle *rt, real *LRUB, int Recursive) {
 	if (!lanpr_TriangleCoversBoundingArea(rb, rt, RootBoundingArea)) return;
 	if (!RootBoundingArea->Child) {
-		lstAppendPointerStaticPool(&rb->RenderDataPool, &RootBoundingArea->AssociatedTriangles, rt);
+		lstAppendPointerStaticPool(&rb->RenderDataPool, &RootBoundingArea->LinkedTriangles, rt);
 		RootBoundingArea->TriangleCount++;
 		if (RootBoundingArea->TriangleCount > 200 && Recursive) {
 			lanpr_SplitBoundingArea(rb, RootBoundingArea);
@@ -318,13 +318,16 @@ void lanpr_AssociateTriangleWithBoundingArea(LANPR_RenderBuffer *rb, LANPR_Bound
 			B[3] = MIN3(rt->V[0]->FrameBufferCoord[1], rt->V[1]->FrameBufferCoord[1], rt->V[2]->FrameBufferCoord[1]);
 			B1 = B;
 		}
-		if (TNS_BOUND_AREA_CROSSES(B1, &ba[0].L)) lanpr_AssociateTriangleWithBoundingArea(rb, &ba[0], rt, B1, Recursive);
-		if (TNS_BOUND_AREA_CROSSES(B1, &ba[1].L)) lanpr_AssociateTriangleWithBoundingArea(rb, &ba[1], rt, B1, Recursive);
-		if (TNS_BOUND_AREA_CROSSES(B1, &ba[2].L)) lanpr_AssociateTriangleWithBoundingArea(rb, &ba[2], rt, B1, Recursive);
-		if (TNS_BOUND_AREA_CROSSES(B1, &ba[3].L)) lanpr_AssociateTriangleWithBoundingArea(rb, &ba[3], rt, B1, Recursive);
+		if (TNS_BOUND_AREA_CROSSES(B1, &ba[0].L)) lanpr_LinkTriangleWithBoundingArea(rb, &ba[0], rt, B1, Recursive);
+		if (TNS_BOUND_AREA_CROSSES(B1, &ba[1].L)) lanpr_LinkTriangleWithBoundingArea(rb, &ba[1], rt, B1, Recursive);
+		if (TNS_BOUND_AREA_CROSSES(B1, &ba[2].L)) lanpr_LinkTriangleWithBoundingArea(rb, &ba[2], rt, B1, Recursive);
+		if (TNS_BOUND_AREA_CROSSES(B1, &ba[3].L)) lanpr_LinkTriangleWithBoundingArea(rb, &ba[3], rt, B1, Recursive);
 	}
 }
-int lanpr_GetTriangleBou

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list