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. --- source/blender/blenkernel/BKE_gpencil_modifier.h | 7 + .../blender/blenkernel/intern/gpencil_modifier.c | 160 +++++++++++++++++++++ source/blender/blenloader/intern/readfile.c | 95 +----------- source/blender/blenloader/intern/writefile.c | 67 +-------- 4 files changed, 170 insertions(+), 159 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h index 78a17e3568d..7729d2c53ab 100644 --- a/source/blender/blenkernel/BKE_gpencil_modifier.h +++ b/source/blender/blenkernel/BKE_gpencil_modifier.h @@ -35,6 +35,9 @@ struct Main; struct ModifierUpdateDepsgraphContext; struct Object; struct Scene; +struct BlendWriter; +struct BlendDataReader; +struct BlendLibReader; /* NOTE: bakeModifier() called from UI: * needs to create new data-blocks, hence the need for this. */ struct bGPDframe; @@ -303,6 +306,10 @@ struct bGPDframe *BKE_gpencil_frame_retime_get(struct Depsgraph *depsgraph, struct Object *ob, struct bGPDlayer *gpl); +void BKE_gpencil_modifier_blend_write(struct BlendWriter *writer, struct ListBase *modbase); +void BKE_gpencil_modifier_blend_read_data(struct BlendDataReader *reader, struct ListBase *lb); +void BKE_gpencil_modifier_blend_read_lib(struct BlendLibReader *reader, struct Object *ob); + #ifdef __cplusplus } #endif 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; + } + } +} diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index fa1e832c9f8..2b93f5222db 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2745,18 +2745,6 @@ void blo_do_versions_key_uidgen(Key *key) /** \name Read ID: Object * \{ */ -static void lib_link_gpencil_modifiers(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; - } - } -} - static void lib_link_object(BlendLibReader *reader, Object *ob) { bool warn = false; @@ -2911,7 +2899,7 @@ static void lib_link_object(BlendLibReader *reader, Object *ob) BKE_particle_system_blend_read_lib(reader, ob, &ob->id, &ob->particlesystem); BKE_modifier_blend_read_lib(reader, ob); - lib_link_gpencil_modifiers(reader, ob); + BKE_gpencil_modifier_blend_read_lib(reader, ob); BKE_shaderfx_blend_read_lib(reader, ob); if (ob->rigidbody_constraint) { @@ -2988,85 +2976,6 @@ static void direct_link_pose(BlendDataReader *reader, bPose *pose) } } -static void direct_link_gpencil_modifiers(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); - } - } - } -} - static void direct_link_object(BlendDataReader *reader, Object *ob) { PartEff *paf; @@ -3111,7 +3020,7 @@ static void direct_link_object(BlendDataReader *reader, Object *ob) /* do it here, below old data gets converted */ BKE_modifier_blend_read_data(reader, &ob->modifiers, ob); - direct_link_gpencil_modifiers(reader, &ob->greasepencil_modifiers); + BKE_gpencil_modifier_blend_read_data(reader, &ob->greasepencil_modifiers); BKE_shaderfx_blend_read_data(reader, &ob->shader_fx); BLO_read_list(reader, &ob->effect); diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index b46880e0373..ea3c81ba121 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -942,71 +942,6 @@ static void write_fmaps(BlendWriter *writer, ListBase *fbase) } } -static void write_gpencil_modifiers(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); - } - } - } -} - static void write_object(BlendWriter *writer, Object *ob, const void *id_address) { const bool is_undo = BLO_write_is_undo(writer); @@ -1072,7 +1007,7 @@ static void write_object(BlendWriter *writer, Object *ob, const void *id_address BKE_particle_system_blend_write(writer, &ob->particlesystem); BKE_modifier_blend_write(writer, &ob->modifiers); - write_gpencil_modifiers(writer, &ob->greasepencil_modifiers); + BKE_gpencil_modifier_blend_write(writer, &ob->greasepencil_modifiers); BKE_shaderfx_blend_write(writer, &ob->shader_fx); BLO_write_struct_list(writer, LinkData, &ob->pc_ids); -- cgit v1.2.3