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; } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs