[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