[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