[Bf-blender-cvs] [1d532325bd1] soc-2019-npr: LANPR: feature line modifier manual update

YimingWu noreply at git.blender.org
Sun Jun 23 12:02:37 CEST 2019


Commit: 1d532325bd160cfb08f8652e0c59e817583fc0cb
Author: YimingWu
Date:   Sun Jun 23 14:28:29 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rB1d532325bd160cfb08f8652e0c59e817583fc0cb

LANPR: feature line modifier manual update

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

M	source/blender/blenkernel/BKE_gpencil.h
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/draw/engines/lanpr/lanpr_ops.c

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

diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 8fc513d8a14..5b89c8bbadf 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -135,6 +135,8 @@ struct bGPDframe *BKE_gpencil_layer_getframe(struct bGPDlayer *gpl,
 struct bGPDframe *BKE_gpencil_layer_find_frame(struct bGPDlayer *gpl, int cframe);
 bool BKE_gpencil_layer_delframe(struct bGPDlayer *gpl, struct bGPDframe *gpf);
 
+struct bGPDlayer *BKE_gpencil_layer_get_index(struct bGPdata* gpd, int index, int first_if_not_found);
+
 struct bGPDlayer *BKE_gpencil_layer_getactive(struct bGPdata *gpd);
 void BKE_gpencil_layer_setactive(struct bGPdata *gpd, struct bGPDlayer *active);
 void BKE_gpencil_layer_delete(struct bGPdata *gpd, struct bGPDlayer *gpl);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 8f900d21873..865a01d64c2 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -984,6 +984,30 @@ bGPDlayer *BKE_gpencil_layer_getactive(bGPdata *gpd)
   return NULL;
 }
 
+bGPDlayer *BKE_gpencil_layer_get_index(bGPdata* gpd, int index, int first_if_not_found){
+  bGPDlayer *gpl;
+  int i=0;
+
+  /* error checking */
+  if (ELEM(NULL, gpd, gpd->layers.first)) {
+    return NULL;
+  }
+
+  /* loop over layers until found (assume only one active) */
+  for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
+    if (i==index) {
+      return gpl;
+    }
+    i++;
+  }
+
+  /* no such layer */
+  if(first_if_not_found){
+    return gpd->layers.first;
+  }
+  return NULL;
+}
+
 /* set the active gp-layer */
 void BKE_gpencil_layer_setactive(bGPdata *gpd, bGPDlayer *active)
 {
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index 756f6832eff..cc139152a17 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -4261,32 +4261,49 @@ int lanpr_auto_create_line_layer_exec(struct bContext *C, struct wmOperator *op)
 
   return OPERATOR_FINISHED;
 }
-int lanpr_update_gp_strokes_exec(struct bContext *C, struct wmOperator *op)
-{
-  Scene *scene = CTX_data_scene(C);
-  SceneLANPR *lanpr = &scene->lanpr;
+
+void lanpr_update_gp_strokes_recursive(Depsgraph *dg, struct Collection *col, int frame){
   Object *ob;
   Object *gpobj;
   ModifierData *md;
   bGPdata *gpd;
   bGPDlayer *gpl;
   bGPDframe *gpf;
+  CollectionObject* co;
+  CollectionChild* cc;
 
-  return;
-  // XXX this iteration will not work. try to get an object list.
-  for (ob = scene->collection->objects.first; ob; ob = ob->id.next) {
-    // TODO: Object visibility in render and viewport.
+  for(co = col->gobject.first;co;co=co->next){
+    ob = co->ob;
     for (md = ob->modifiers.first; md; md = md->next) {
       if (md->type == eModifierType_FeatureLine) {
-        FeatureLineModifierData *flmd = (FeatureLineModifierData *)flmd;
+        FeatureLineModifierData *flmd = (FeatureLineModifierData *)md;
         if (flmd->target && flmd->target->type == OB_GPENCIL) {
           gpobj = flmd->target;
           gpd = gpobj->data;
-          // add strokes
+          gpl = BKE_gpencil_layer_get_index(gpd,flmd->layer,1);
+          if(!gpl){
+            gpl = BKE_gpencil_layer_addnew(gpd,"lanpr_layer",true);
+          }
+          gpf = BKE_gpencil_frame_addnew(gpl,frame);
+          // add strokes, currently only once because object selection is broken now
+          lanpr_generate_gpencil_from_chain(md, dg, ob, gpl, gpf);
+          return; // immediately
         }
       }
     }
   }
+  for(cc=col->children.first;cc;cc=cc->next){
+    lanpr_update_gp_strokes_recursive(dg, cc->collection,frame);
+  }
+}
+int lanpr_update_gp_strokes_exec(struct bContext *C, struct wmOperator *op)
+{
+  Scene *scene = CTX_data_scene(C);
+  Depsgraph* dg = CTX_data_depsgraph(C);
+  SceneLANPR *lanpr = &scene->lanpr;
+  int frame = scene->r.cfra;
+
+  lanpr_update_gp_strokes_recursive(dg, scene->master_collection, frame);
 
   return OPERATOR_FINISHED;
 }



More information about the Bf-blender-cvs mailing list