From 57414e6d1de53c1c0c32304252a2e790d2fc4786 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 6 Nov 2020 17:22:20 +0100 Subject: Refactor: move gpencil modifier .blend I/O to blenkernel Ref T76372. --- .../blender/blenkernel/intern/gpencil_modifier.c | 160 +++++++++++++++++++++ 1 file changed, 160 insertions(+) (limited to 'source/blender/blenkernel/intern/gpencil_modifier.c') diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c index 934791ccc35..be06638ab64 100644 --- a/source/blender/blenkernel/intern/gpencil_modifier.c +++ b/source/blender/blenkernel/intern/gpencil_modifier.c @@ -37,10 +37,12 @@ #include "DNA_gpencil_modifier_types.h" #include "DNA_gpencil_types.h" #include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "BKE_colortools.h" #include "BKE_gpencil.h" #include "BKE_gpencil_geom.h" #include "BKE_gpencil_modifier.h" @@ -55,6 +57,8 @@ #include "MOD_gpencil_modifiertypes.h" +#include "BLO_read_write.h" + #include "CLG_log.h" static CLG_LogRef LOG = {"bke.gpencil_modifier"}; @@ -777,3 +781,159 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob) /* Clear any lattice data. */ BKE_gpencil_lattice_clear(ob); } + +void BKE_gpencil_modifier_blend_write(BlendWriter *writer, ListBase *modbase) +{ + if (modbase == NULL) { + return; + } + + LISTBASE_FOREACH (GpencilModifierData *, md, modbase) { + const GpencilModifierTypeInfo *mti = BKE_gpencil_modifier_get_info(md->type); + if (mti == NULL) { + return; + } + + BLO_write_struct_by_name(writer, mti->struct_name, md); + + if (md->type == eGpencilModifierType_Thick) { + ThickGpencilModifierData *gpmd = (ThickGpencilModifierData *)md; + + if (gpmd->curve_thickness) { + BKE_curvemapping_blend_write(writer, gpmd->curve_thickness); + } + } + else if (md->type == eGpencilModifierType_Noise) { + NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md; + + if (gpmd->curve_intensity) { + BKE_curvemapping_blend_write(writer, gpmd->curve_intensity); + } + } + else if (md->type == eGpencilModifierType_Hook) { + HookGpencilModifierData *gpmd = (HookGpencilModifierData *)md; + + if (gpmd->curfalloff) { + BKE_curvemapping_blend_write(writer, gpmd->curfalloff); + } + } + else if (md->type == eGpencilModifierType_Tint) { + TintGpencilModifierData *gpmd = (TintGpencilModifierData *)md; + if (gpmd->colorband) { + BLO_write_struct(writer, ColorBand, gpmd->colorband); + } + if (gpmd->curve_intensity) { + BKE_curvemapping_blend_write(writer, gpmd->curve_intensity); + } + } + else if (md->type == eGpencilModifierType_Smooth) { + SmoothGpencilModifierData *gpmd = (SmoothGpencilModifierData *)md; + if (gpmd->curve_intensity) { + BKE_curvemapping_blend_write(writer, gpmd->curve_intensity); + } + } + else if (md->type == eGpencilModifierType_Color) { + ColorGpencilModifierData *gpmd = (ColorGpencilModifierData *)md; + if (gpmd->curve_intensity) { + BKE_curvemapping_blend_write(writer, gpmd->curve_intensity); + } + } + else if (md->type == eGpencilModifierType_Opacity) { + OpacityGpencilModifierData *gpmd = (OpacityGpencilModifierData *)md; + if (gpmd->curve_intensity) { + BKE_curvemapping_blend_write(writer, gpmd->curve_intensity); + } + } + } +} + +void BKE_gpencil_modifier_blend_read_data(BlendDataReader *reader, ListBase *lb) +{ + BLO_read_list(reader, lb); + + LISTBASE_FOREACH (GpencilModifierData *, md, lb) { + md->error = NULL; + + /* if modifiers disappear, or for upward compatibility */ + if (NULL == BKE_gpencil_modifier_get_info(md->type)) { + md->type = eModifierType_None; + } + + if (md->type == eGpencilModifierType_Lattice) { + LatticeGpencilModifierData *gpmd = (LatticeGpencilModifierData *)md; + gpmd->cache_data = NULL; + } + else if (md->type == eGpencilModifierType_Hook) { + HookGpencilModifierData *hmd = (HookGpencilModifierData *)md; + + BLO_read_data_address(reader, &hmd->curfalloff); + if (hmd->curfalloff) { + BKE_curvemapping_blend_read(reader, hmd->curfalloff); + } + } + else if (md->type == eGpencilModifierType_Noise) { + NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md; + + BLO_read_data_address(reader, &gpmd->curve_intensity); + if (gpmd->curve_intensity) { + BKE_curvemapping_blend_read(reader, gpmd->curve_intensity); + /* initialize the curve. Maybe this could be moved to modififer logic */ + BKE_curvemapping_init(gpmd->curve_intensity); + } + } + else if (md->type == eGpencilModifierType_Thick) { + ThickGpencilModifierData *gpmd = (ThickGpencilModifierData *)md; + + BLO_read_data_address(reader, &gpmd->curve_thickness); + if (gpmd->curve_thickness) { + BKE_curvemapping_blend_read(reader, gpmd->curve_thickness); + BKE_curvemapping_init(gpmd->curve_thickness); + } + } + else if (md->type == eGpencilModifierType_Tint) { + TintGpencilModifierData *gpmd = (TintGpencilModifierData *)md; + BLO_read_data_address(reader, &gpmd->colorband); + BLO_read_data_address(reader, &gpmd->curve_intensity); + if (gpmd->curve_intensity) { + BKE_curvemapping_blend_read(reader, gpmd->curve_intensity); + BKE_curvemapping_init(gpmd->curve_intensity); + } + } + else if (md->type == eGpencilModifierType_Smooth) { + SmoothGpencilModifierData *gpmd = (SmoothGpencilModifierData *)md; + BLO_read_data_address(reader, &gpmd->curve_intensity); + if (gpmd->curve_intensity) { + BKE_curvemapping_blend_read(reader, gpmd->curve_intensity); + BKE_curvemapping_init(gpmd->curve_intensity); + } + } + else if (md->type == eGpencilModifierType_Color) { + ColorGpencilModifierData *gpmd = (ColorGpencilModifierData *)md; + BLO_read_data_address(reader, &gpmd->curve_intensity); + if (gpmd->curve_intensity) { + BKE_curvemapping_blend_read(reader, gpmd->curve_intensity); + BKE_curvemapping_init(gpmd->curve_intensity); + } + } + else if (md->type == eGpencilModifierType_Opacity) { + OpacityGpencilModifierData *gpmd = (OpacityGpencilModifierData *)md; + BLO_read_data_address(reader, &gpmd->curve_intensity); + if (gpmd->curve_intensity) { + BKE_curvemapping_blend_read(reader, gpmd->curve_intensity); + BKE_curvemapping_init(gpmd->curve_intensity); + } + } + } +} + +void BKE_gpencil_modifier_blend_read_lib(BlendLibReader *reader, Object *ob) +{ + BKE_gpencil_modifiers_foreach_ID_link(ob, BKE_object_modifiers_lib_link_common, reader); + + /* If linking from a library, clear 'local' library override flag. */ + if (ob->id.lib != NULL) { + LISTBASE_FOREACH (GpencilModifierData *, mod, &ob->greasepencil_modifiers) { + mod->flag &= ~eGpencilModifierFlag_OverrideLibrary_Local; + } + } +} -- cgit v1.2.3