[Bf-blender-cvs] [1ddd3d60bff] soc-2018-npr: Chain support line types and levels. Still bugs in chaining, hard to find, but results good enough in most of the conditions.
Nick Wu
noreply at git.blender.org
Mon Jul 23 16:34:42 CEST 2018
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. @@
More information about the Bf-blender-cvs
mailing list