diff options
Diffstat (limited to 'source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c')
-rw-r--r-- | source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c | 244 |
1 files changed, 125 insertions, 119 deletions
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c index 34ec69bf85a..de0ecd5cda5 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillattice.c @@ -52,156 +52,162 @@ static void initData(GpencilModifierData *md) { - LatticeGpencilModifierData *gpmd = (LatticeGpencilModifierData *)md; - gpmd->pass_index = 0; - gpmd->layername[0] = '\0'; - gpmd->vgname[0] = '\0'; - gpmd->object = NULL; - gpmd->cache_data = NULL; - gpmd->strength = 1.0f; + LatticeGpencilModifierData *gpmd = (LatticeGpencilModifierData *)md; + gpmd->pass_index = 0; + gpmd->layername[0] = '\0'; + gpmd->vgname[0] = '\0'; + gpmd->object = NULL; + gpmd->cache_data = NULL; + gpmd->strength = 1.0f; } static void copyData(const GpencilModifierData *md, GpencilModifierData *target) { - BKE_gpencil_modifier_copyData_generic(md, target); + BKE_gpencil_modifier_copyData_generic(md, target); } -static void deformStroke( - GpencilModifierData *md, Depsgraph *UNUSED(depsgraph), - Object *ob, bGPDlayer *gpl, bGPDstroke *gps) +static void deformStroke(GpencilModifierData *md, + Depsgraph *UNUSED(depsgraph), + Object *ob, + bGPDlayer *gpl, + bGPDstroke *gps) { - LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; - const int def_nr = defgroup_name_index(ob, mmd->vgname); - - if (!is_stroke_affected_by_modifier( - ob, - mmd->layername, mmd->pass_index, mmd->layer_pass, 1, gpl, gps, - mmd->flag & GP_LATTICE_INVERT_LAYER, mmd->flag & GP_LATTICE_INVERT_PASS, - mmd->flag & GP_LATTICE_INVERT_LAYERPASS)) - { - return; - } - - if (mmd->cache_data == NULL) { - return; - } - - for (int i = 0; i < gps->totpoints; i++) { - bGPDspoint *pt = &gps->points[i]; - MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL; - - /* verify vertex group */ - const float weight = get_modifier_point_weight(dvert, (mmd->flag & GP_LATTICE_INVERT_VGROUP) != 0, def_nr); - if (weight < 0.0f) { - continue; - } - calc_latt_deform((struct LatticeDeformData *)mmd->cache_data, &pt->x, mmd->strength * weight); - } + LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; + const int def_nr = defgroup_name_index(ob, mmd->vgname); + + if (!is_stroke_affected_by_modifier(ob, + mmd->layername, + mmd->pass_index, + mmd->layer_pass, + 1, + gpl, + gps, + mmd->flag & GP_LATTICE_INVERT_LAYER, + mmd->flag & GP_LATTICE_INVERT_PASS, + mmd->flag & GP_LATTICE_INVERT_LAYERPASS)) { + return; + } + + if (mmd->cache_data == NULL) { + return; + } + + for (int i = 0; i < gps->totpoints; i++) { + bGPDspoint *pt = &gps->points[i]; + MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL; + + /* verify vertex group */ + const float weight = get_modifier_point_weight( + dvert, (mmd->flag & GP_LATTICE_INVERT_VGROUP) != 0, def_nr); + if (weight < 0.0f) { + continue; + } + calc_latt_deform((struct LatticeDeformData *)mmd->cache_data, &pt->x, mmd->strength * weight); + } } /* FIXME: Ideally we be doing this on a copy of the main depsgraph * (i.e. one where we don't have to worry about restoring state) */ -static void bakeModifier( - Main *bmain, Depsgraph *depsgraph, - GpencilModifierData *md, Object *ob) +static void bakeModifier(Main *bmain, Depsgraph *depsgraph, GpencilModifierData *md, Object *ob) { - LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; - Scene *scene = DEG_get_evaluated_scene(depsgraph); - struct LatticeDeformData *ldata = NULL; - bGPdata *gpd = ob->data; - int oldframe = (int)DEG_get_ctime(depsgraph); - - if (mmd->object == NULL) - return; - - for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { - for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) { - /* apply lattice effects on this frame - * NOTE: this assumes that we don't want lattice animation on non-keyframed frames - */ - CFRA = gpf->framenum; - BKE_scene_graph_update_for_newframe(depsgraph, bmain); - - /* recalculate lattice data */ - BKE_gpencil_lattice_init(ob); - - /* compute lattice effects on this frame */ - for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) { - deformStroke(md, depsgraph, ob, gpl, gps); - } - } - } - - /* free lingering data */ - ldata = (struct LatticeDeformData *)mmd->cache_data; - if (ldata) { - end_latt_deform(ldata); - mmd->cache_data = NULL; - } - - /* return frame state and DB to original state */ - CFRA = oldframe; - BKE_scene_graph_update_for_newframe(depsgraph, bmain); + LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; + Scene *scene = DEG_get_evaluated_scene(depsgraph); + struct LatticeDeformData *ldata = NULL; + bGPdata *gpd = ob->data; + int oldframe = (int)DEG_get_ctime(depsgraph); + + if (mmd->object == NULL) + return; + + for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { + for (bGPDframe *gpf = gpl->frames.first; gpf; gpf = gpf->next) { + /* apply lattice effects on this frame + * NOTE: this assumes that we don't want lattice animation on non-keyframed frames + */ + CFRA = gpf->framenum; + BKE_scene_graph_update_for_newframe(depsgraph, bmain); + + /* recalculate lattice data */ + BKE_gpencil_lattice_init(ob); + + /* compute lattice effects on this frame */ + for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) { + deformStroke(md, depsgraph, ob, gpl, gps); + } + } + } + + /* free lingering data */ + ldata = (struct LatticeDeformData *)mmd->cache_data; + if (ldata) { + end_latt_deform(ldata); + mmd->cache_data = NULL; + } + + /* return frame state and DB to original state */ + CFRA = oldframe; + BKE_scene_graph_update_for_newframe(depsgraph, bmain); } static void freeData(GpencilModifierData *md) { - LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; - struct LatticeDeformData *ldata = (struct LatticeDeformData *)mmd->cache_data; - /* free deform data */ - if (ldata) { - end_latt_deform(ldata); - } + LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; + struct LatticeDeformData *ldata = (struct LatticeDeformData *)mmd->cache_data; + /* free deform data */ + if (ldata) { + end_latt_deform(ldata); + } } static bool isDisabled(GpencilModifierData *md, int UNUSED(userRenderParams)) { - LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; + LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; - return !mmd->object; + return !mmd->object; } static void updateDepsgraph(GpencilModifierData *md, const ModifierUpdateDepsgraphContext *ctx) { - LatticeGpencilModifierData *lmd = (LatticeGpencilModifierData *)md; - if (lmd->object != NULL) { - DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_GEOMETRY, "Lattice Modifier"); - DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_TRANSFORM, "Lattice Modifier"); - } - DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Lattice Modifier"); + LatticeGpencilModifierData *lmd = (LatticeGpencilModifierData *)md; + if (lmd->object != NULL) { + DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_GEOMETRY, "Lattice Modifier"); + DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_TRANSFORM, "Lattice Modifier"); + } + DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Lattice Modifier"); } -static void foreachObjectLink( - GpencilModifierData *md, Object *ob, - ObjectWalkFunc walk, void *userData) +static void foreachObjectLink(GpencilModifierData *md, + Object *ob, + ObjectWalkFunc walk, + void *userData) { - LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; + LatticeGpencilModifierData *mmd = (LatticeGpencilModifierData *)md; - walk(userData, ob, &mmd->object, IDWALK_CB_NOP); + walk(userData, ob, &mmd->object, IDWALK_CB_NOP); } GpencilModifierTypeInfo modifierType_Gpencil_Lattice = { - /* name */ "Lattice", - /* structName */ "LatticeGpencilModifierData", - /* structSize */ sizeof(LatticeGpencilModifierData), - /* type */ eGpencilModifierTypeType_Gpencil, - /* flags */ eGpencilModifierTypeFlag_Single | eGpencilModifierTypeFlag_SupportsEditmode, - - /* copyData */ copyData, - - /* deformStroke */ deformStroke, - /* generateStrokes */ NULL, - /* bakeModifier */ bakeModifier, - /* remapTime */ NULL, - - /* initData */ initData, - /* freeData */ freeData, - /* isDisabled */ isDisabled, - /* updateDepsgraph */ updateDepsgraph, - /* dependsOnTime */ NULL, - /* foreachObjectLink */ foreachObjectLink, - /* foreachIDLink */ NULL, - /* foreachTexLink */ NULL, - /* getDuplicationFactor */ NULL, + /* name */ "Lattice", + /* structName */ "LatticeGpencilModifierData", + /* structSize */ sizeof(LatticeGpencilModifierData), + /* type */ eGpencilModifierTypeType_Gpencil, + /* flags */ eGpencilModifierTypeFlag_Single | eGpencilModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + + /* deformStroke */ deformStroke, + /* generateStrokes */ NULL, + /* bakeModifier */ bakeModifier, + /* remapTime */ NULL, + + /* initData */ initData, + /* freeData */ freeData, + /* isDisabled */ isDisabled, + /* updateDepsgraph */ updateDepsgraph, + /* dependsOnTime */ NULL, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ NULL, + /* foreachTexLink */ NULL, + /* getDuplicationFactor */ NULL, }; |