[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