[Bf-blender-cvs] [a400ce4a3d3] soc-2019-npr: LANPR: collection GP target now working.

YimingWu noreply at git.blender.org
Wed Jun 26 11:06:02 CEST 2019


Commit: a400ce4a3d3c8bc12fc77d4f0adc711991d1056c
Author: YimingWu
Date:   Wed Jun 26 17:02:18 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rBa400ce4a3d3c8bc12fc77d4f0adc711991d1056c

LANPR: collection GP target now working.

===================================================================

M	source/blender/draw/engines/lanpr/lanpr_access.c
M	source/blender/draw/engines/lanpr/lanpr_access.h
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_ops.c

===================================================================

diff --git a/source/blender/draw/engines/lanpr/lanpr_access.c b/source/blender/draw/engines/lanpr/lanpr_access.c
index a2cd35dec73..6dbc2f33b2d 100644
--- a/source/blender/draw/engines/lanpr/lanpr_access.c
+++ b/source/blender/draw/engines/lanpr/lanpr_access.c
@@ -45,7 +45,8 @@ void lanpr_generate_gpencil_from_chain(Depsgraph *depsgraph,
                                        bGPDframe *gpf,
                                        int qi_begin,
                                        int qi_end,
-                                       int material_nr)
+                                       int material_nr,
+                                       Collection *col)
 {
   Scene *scene = DEG_get_evaluated_scene(depsgraph);
   LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
@@ -74,8 +75,11 @@ void lanpr_generate_gpencil_from_chain(Depsgraph *depsgraph,
   LANPR_RenderLineChainItem *rlci;
   for (rlc = rb->chains.first; rlc; rlc = (LANPR_RenderLineChain *)rlc->item.next) {
 
+    if (rlc->picked) {
+      continue;
+    }
     if (!rlc->object_ref) {
-      continue; /*  XXX: intersection lines are lost */
+      continue; /* intersection lines are lost! */
     }
     if (rlc->level > qi_end || rlc->level < qi_begin) {
       continue;
@@ -83,6 +87,13 @@ void lanpr_generate_gpencil_from_chain(Depsgraph *depsgraph,
     if (ob && &ob->id != rlc->object_ref->id.orig_id) {
       continue;
     }
+    if (col) {
+      if (!BKE_collection_has_object_recursive(col, (Object *)rlc->object_ref->id.orig_id)) {
+        continue;
+      }
+    }
+
+    rlc->picked = 1;
 
     int array_idx = 0;
     int count = lanpr_count_chain(rlc);
diff --git a/source/blender/draw/engines/lanpr/lanpr_access.h b/source/blender/draw/engines/lanpr/lanpr_access.h
index ac99975ad06..a8d34ed2bb8 100644
--- a/source/blender/draw/engines/lanpr/lanpr_access.h
+++ b/source/blender/draw/engines/lanpr/lanpr_access.h
@@ -11,17 +11,20 @@
 typedef struct LANPR_RenderLineChain LANPR_RenderLineChain;
 
 void lanpr_generate_gpencil_from_chain(Depsgraph *depsgraph,
-                                       Object *ob,
+                                       struct Object *ob,
                                        bGPDlayer *gpl,
                                        bGPDframe *gpf,
                                        int qi_begin,
                                        int qi_end,
-                                       int material_nr);
+                                       int material_nr,
+                                       struct Collection *col);
 
 void lanpr_update_data_for_external(Depsgraph *depsgraph);
 
 int lanpr_count_chain(LANPR_RenderLineChain *rlc);
 
+void lanpr_chain_clear_picked_flag(struct LANPR_RenderBuffer *rb);
+
 int lanpr_compute_feature_lines_internal(Depsgraph *depsgraph);
 
 void lanpr_destroy_render_data(struct LANPR_RenderBuffer *rb);
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index 266d1edf8ae..651c0c1aae2 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -864,3 +864,14 @@ void lanpr_chain_generate_draw_command(LANPR_RenderBuffer *rb)
   rb->chain_draw_batch = GPU_batch_create_ex(
       GPU_PRIM_LINES_ADJ, vbo, GPU_indexbuf_build(&elb), GPU_USAGE_DYNAMIC | GPU_BATCH_OWNS_VBO);
 }
+
+void lanpr_chain_clear_picked_flag(LANPR_RenderBuffer *rb)
+{
+  LANPR_RenderLineChain *rlc;
+  if (!rb) {
+    return;
+  }
+  for (rlc = rb->chains.first; rlc; rlc = (LANPR_RenderLineChain *)rlc->item.next) {
+    rlc->picked = 0;
+  }
+}
diff --git a/source/blender/draw/engines/lanpr/lanpr_data_types.h b/source/blender/draw/engines/lanpr/lanpr_data_types.h
index fa7ec63dc61..50865c26066 100644
--- a/source/blender/draw/engines/lanpr/lanpr_data_types.h
+++ b/source/blender/draw/engines/lanpr/lanpr_data_types.h
@@ -125,7 +125,7 @@ typedef struct LANPR_RenderLineChain {
   ListBase chain;
   /*  int         SegmentCount;  /*  we count before draw cmd. */
   float length; /*  calculated before draw cmd. */
-  char picked;  /*  used when re-connecting */
+  char picked;  /*  used when re-connecting and gp stroke generation */
   char level;
   struct Object *object_ref;
 } LANPR_RenderLineChain;
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index cb7be61d6b0..035a77a91a0 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -4476,7 +4476,8 @@ void lanpr_update_gp_strokes_recursive(Depsgraph *dg, struct Collection *col, in
                                             flmd->level_begin,
                                             flmd->use_multiple_levels ? flmd->level_end :
                                                                         flmd->level_begin,
-                                            flmd->material);
+                                            flmd->material,
+                                            NULL);
         }
       }
     }
@@ -4485,6 +4486,46 @@ void lanpr_update_gp_strokes_recursive(Depsgraph *dg, struct Collection *col, in
     lanpr_update_gp_strokes_recursive(dg, cc->collection, frame);
   }
 }
+void lanpr_update_gp_strokes_collection(Depsgraph *dg, struct Collection *col, int frame)
+{
+  Object *ob;
+  Object *gpobj;
+  ModifierData *md;
+  bGPdata *gpd;
+  bGPDlayer *gpl;
+  bGPDframe *gpf;
+  CollectionObject *co;
+  CollectionChild *cc;
+
+  /* depth first */
+  for (cc = col->children.first; cc; cc = cc->next) {
+    lanpr_update_gp_strokes_collection(dg, cc->collection, frame);
+  }
+
+  if (col->lanpr.usage != COLLECTION_LANPR_INCLUDE || !col->lanpr.target) {
+    return;
+  }
+
+  gpobj = col->lanpr.target;
+  gpd = gpobj->data;
+  gpl = BKE_gpencil_layer_get_index(gpd, col->lanpr.layer, 1);
+  if (!gpl) {
+    gpl = BKE_gpencil_layer_addnew(gpd, "lanpr_layer", true);
+  }
+  gpf = BKE_gpencil_layer_getframe(gpl, frame, GP_GETFRAME_ADD_NEW);
+  /* BKE_gpencil_free_strokes(gpf);   will be overwritten. need another solution */
+  /* Please manually delete those strokes before clicking Update once again. */
+
+  lanpr_generate_gpencil_from_chain(dg,
+                                    NULL,
+                                    gpl,
+                                    gpf,
+                                    col->lanpr.level_begin,
+                                    col->lanpr.use_multiple_levels ? col->lanpr.level_end :
+                                                                     col->lanpr.level_begin,
+                                    col->lanpr.material,
+                                    col);
+}
 int lanpr_update_gp_strokes_exec(struct bContext *C, struct wmOperator *op)
 {
   Scene *scene = CTX_data_scene(C);
@@ -4492,8 +4533,12 @@ int lanpr_update_gp_strokes_exec(struct bContext *C, struct wmOperator *op)
   SceneLANPR *lanpr = &scene->lanpr;
   int frame = scene->r.cfra;
 
+  lanpr_chain_clear_picked_flag(lanpr_share.render_buffer_shared);
+
   lanpr_update_gp_strokes_recursive(dg, scene->master_collection, frame);
 
+  lanpr_update_gp_strokes_collection(dg, scene->master_collection, frame);
+
   return OPERATOR_FINISHED;
 }



More information about the Bf-blender-cvs mailing list