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