[Bf-blender-cvs] [b3d98f35321] soc-2019-npr: Grease pencil conversion now projects onto 3D space now. Need perspective correction fix for cut points.
YimingWu
noreply at git.blender.org
Fri May 31 04:48:31 CEST 2019
Commit: b3d98f35321581ddd8c17f5790f348fb9bf02d25
Author: YimingWu
Date: Fri May 31 10:20:35 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rBb3d98f35321581ddd8c17f5790f348fb9bf02d25
Grease pencil conversion now projects onto 3D space now. Need perspective correction fix for cut points.
===================================================================
M source/blender/draw/engines/lanpr/lanpr_access.c
M source/blender/draw/engines/lanpr/lanpr_chain.c
M source/blender/draw/engines/lanpr/lanpr_data_types.h
M source/blender/draw/engines/lanpr/lanpr_engine.c
M source/blender/draw/engines/lanpr/lanpr_snake.c
===================================================================
diff --git a/source/blender/draw/engines/lanpr/lanpr_access.c b/source/blender/draw/engines/lanpr/lanpr_access.c
index 5d667a8a040..417974234aa 100644
--- a/source/blender/draw/engines/lanpr/lanpr_access.c
+++ b/source/blender/draw/engines/lanpr/lanpr_access.c
@@ -270,9 +270,9 @@ void lanpr_generate_gpencil_from_chain(
for(rlci = rlc->chain.first;rlci;rlci=(LANPR_RenderLineChainItem*)rlci->item.next){
float opatity=rlci->occlusion?0.1f:1.0f;
- stroke_data[array_idx] = rlci->pos[0];
- stroke_data[array_idx + 1] = rlci->pos[1];
- stroke_data[array_idx + 2] = rlci->pos[2];
+ stroke_data[array_idx] = rlci->gpos[0];
+ stroke_data[array_idx + 1] = rlci->gpos[1];
+ stroke_data[array_idx + 2] = rlci->gpos[2];
stroke_data[array_idx + 3] = opatity; //thickness
stroke_data[array_idx + 4] = opatity; //hardness?
array_idx+=5;
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index 3f315187e15..045ca737e1a 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -95,6 +95,7 @@ LANPR_RenderLineChainItem *lanpr_append_render_line_chain_point(LANPR_RenderBuff
LANPR_RenderLineChain *rlc,
float x,
float y,
+ float gx, float gy, float gz,
float *normal,
char type,
int level)
@@ -104,6 +105,9 @@ LANPR_RenderLineChainItem *lanpr_append_render_line_chain_point(LANPR_RenderBuff
rlci->pos[0] = x;
rlci->pos[1] = y;
+ rlci->gpos[0] = gx;
+ rlci->gpos[1] = gy;
+ rlci->gpos[2] = gz;
copy_v3_v3(rlci->normal, normal);
rlci->line_type = type & LANPR_EDGE_FLAG_ALL_TYPE;
rlci->occlusion = level;
@@ -118,6 +122,7 @@ LANPR_RenderLineChainItem *lanpr_push_render_line_chain_point(LANPR_RenderBuffer
LANPR_RenderLineChain *rlc,
float x,
float y,
+ float gx, float gy, float gz,
float *normal,
char type,
int level)
@@ -127,6 +132,9 @@ LANPR_RenderLineChainItem *lanpr_push_render_line_chain_point(LANPR_RenderBuffer
rlci->pos[0] = x;
rlci->pos[1] = y;
+ rlci->gpos[0] = gx;
+ rlci->gpos[1] = gy;
+ rlci->gpos[2] = gz;
copy_v3_v3(rlci->normal, normal);
rlci->line_type = type & LANPR_EDGE_FLAG_ALL_TYPE;
rlci->occlusion = level;
@@ -190,6 +198,7 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
LANPR_RenderLine *rl;
LANPR_BoundingArea *ba;
LANPR_RenderLineSegment *rls;
+ real* inv = rb->vp_inverse;
for (rl = rb->all_render_lines.first; rl; rl = (LANPR_RenderLine*)rl->item.next) {
@@ -224,7 +233,11 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
new_rv = rl->l;
rls = rl->segments.first;
lanpr_push_render_line_chain_point(
- rb, rlc, new_rv->fbcoord[0], new_rv->fbcoord[1], N, rl->flags, rls->occlusion);
+ rb, rlc, new_rv->fbcoord[0], new_rv->fbcoord[1],
+ new_rv->gloc[0],
+ new_rv->gloc[1],
+ new_rv->gloc[2],
+ N, rl->flags, rls->occlusion);
while (ba && (new_rl = lanpr_get_connected_render_line(ba, new_rv, &new_rv))) {
new_rl->flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
@@ -247,10 +260,14 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
if (new_rv == new_rl->l) {
for (rls = new_rl->segments.last; rls; rls = (LANPR_RenderLineSegment*)rls->item.prev) {
- float px, py;
- px = tnsLinearItp(new_rl->l->fbcoord[0], new_rl->r->fbcoord[0], rls->at);
- py = tnsLinearItp(new_rl->l->fbcoord[1], new_rl->r->fbcoord[1], rls->at);
- lanpr_push_render_line_chain_point(rb, rlc, px, py, N, new_rl->flags, rls->occlusion);
+ double gpos[3],lpos[3];
+ lanpr_LinearInterpolate3dv(new_rl->l->fbcoord,new_rl->r->fbcoord,rls->at,lpos);
+ lanpr_LinearInterpolate3dv(new_rl->l->gloc,new_rl->r->gloc,rls->at,gpos);
+ lanpr_push_render_line_chain_point(rb, rlc, lpos[0], lpos[1],
+ gpos[0],
+ gpos[1],
+ gpos[2],
+ N, new_rl->flags, rls->occlusion);
}
}
else if (new_rv == new_rl->r) {
@@ -258,16 +275,23 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
last_occlusion = rls->occlusion;
rls = (LANPR_RenderLineSegment*)rls->item.next;
for (rls; rls; rls = (LANPR_RenderLineSegment*)rls->item.next) {
- float px, py;
- px = tnsLinearItp(new_rl->l->fbcoord[0], new_rl->r->fbcoord[0], rls->at);
- py = tnsLinearItp(new_rl->l->fbcoord[1], new_rl->r->fbcoord[1], rls->at);
- lanpr_push_render_line_chain_point(rb, rlc, px, py, N, new_rl->flags, last_occlusion);
+ double gpos[3],lpos[3];
+ lanpr_LinearInterpolate3dv(new_rl->l->fbcoord,new_rl->r->fbcoord,rls->at,lpos);
+ lanpr_LinearInterpolate3dv(new_rl->l->gloc,new_rl->r->gloc,rls->at,gpos);
+ lanpr_push_render_line_chain_point(rb, rlc, lpos[0], lpos[1],
+ gpos[0],
+ gpos[1],
+ gpos[2],
+ N, new_rl->flags, rls->occlusion);
last_occlusion = rls->occlusion;
}
lanpr_push_render_line_chain_point(rb,
rlc,
new_rl->r->fbcoord[0],
new_rl->r->fbcoord[1],
+ new_rl->r->gloc[0],
+ new_rl->r->gloc[1],
+ new_rl->r->gloc[2],
N,
new_rl->flags,
last_occlusion);
@@ -278,13 +302,19 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
// step 2: this line
rls = rl->segments.first;
for (rls = (LANPR_RenderLineSegment*)rls->item.next; rls; rls = (LANPR_RenderLineSegment*)rls->item.next) {
- float px, py;
- px = tnsLinearItp(rl->l->fbcoord[0], rl->r->fbcoord[0], rls->at);
- py = tnsLinearItp(rl->l->fbcoord[1], rl->r->fbcoord[1], rls->at);
- lanpr_append_render_line_chain_point(rb, rlc, px, py, N, rl->flags, rls->occlusion);
+ double gpos[3],lpos[3];
+ lanpr_LinearInterpolate3dv(rl->l->fbcoord,rl->r->fbcoord,rls->at,lpos);
+ lanpr_LinearInterpolate3dv(rl->l->gloc,rl->r->gloc,rls->at,gpos);
+ lanpr_append_render_line_chain_point(rb, rlc,
+ lpos[0], lpos[1],
+ gpos[0], gpos[1],gpos[2],
+ N, rl->flags, rls->occlusion);
}
lanpr_append_render_line_chain_point(
- rb, rlc, rl->r->fbcoord[0], rl->r->fbcoord[1], N, rl->flags, 0);
+ rb, rlc,
+ rl->r->fbcoord[0], rl->r->fbcoord[1],
+ rl->r->gloc[0], rl->r->gloc[1], rl->r->gloc[2],
+ N, rl->flags, 0);
// step 3: grow right
ba = lanpr_get_point_bounding_area(rb, rl->r->fbcoord[0], rl->r->fbcoord[1]);
@@ -308,13 +338,16 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
if (rls)
last_occlusion = rls->occlusion;
for (rls = new_rl->segments.last; rls; rls = (LANPR_RenderLineSegment*)rls->item.prev) {
- float px, py;
- px = tnsLinearItp(new_rl->l->fbcoord[0], new_rl->r->fbcoord[0], rls->at);
- py = tnsLinearItp(new_rl->l->fbcoord[1], new_rl->r->fbcoord[1], rls->at);
+ double gpos[3],lpos[3];
+ lanpr_LinearInterpolate3dv(new_rl->l->fbcoord,new_rl->r->fbcoord,rls->at,lpos);
+ lanpr_LinearInterpolate3dv(new_rl->l->gloc,new_rl->r->gloc,rls->at,gpos);
last_occlusion = (LANPR_RenderLineSegment*)rls->item.prev ?
((LANPR_RenderLineSegment *)rls->item.prev)->occlusion :
0;
- lanpr_append_render_line_chain_point(rb, rlc, px, py, N, new_rl->flags, last_occlusion);
+ lanpr_append_render_line_chain_point(rb, rlc,
+ lpos[0],lpos[1],
+ gpos[0],gpos[1],gpos[2],
+ N, new_rl->flags, last_occlusion);
}
}
else if (new_rv == new_rl->r) {
@@ -323,14 +356,19 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
rlci->occlusion = last_occlusion;
rls = (LANPR_RenderLineSegment*)rls->item.next;
for (rls; rls; rls = (LANPR_RenderLineSegment*)rls->item.next) {
- float px, py;
- px = tnsLinearItp(new_rl->l->fbcoord[0], new_rl->r->fbcoord[0], rls->at);
- py = tnsLinearItp(new_rl->l->fbcoord[1], new_rl->r->fbcoord[1], rls->at);
- lanpr_append_render_line_chain_point(rb, rlc, px, py, N, new_rl->flags, rls->occlusion);
- // last_occlusion = rls->occlusion;
+ double gpos[3],lpos[3];
+ lanpr_LinearInterpolate3dv(new_rl->l->fbcoord,new_rl->r->fbcoord,rls->at,lpos);
+ lanpr_LinearInterpolate3dv(new_rl->l->gloc,new_rl->r->gloc,rls->at,gpos);
+ lanpr_append_render_line_chain_point(rb, rlc,
+ lpos[0],lpos[1],
+ gpos[0],gpos[1],gpos[2],
+ N, new_rl->flags, last_occlusion);
}
lanpr_append_render_line_chain_point(
- rb, rlc, new_rl->r->fbcoord[0], new_rl->r->fbcoord[1], N, new_rl->flags, 0);
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list