From 216a2218768d005c18032df370c19c1c0f571797 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 18 Sep 2020 16:57:33 +0200 Subject: [PATCH] Implement ID properties support for TimeMarker Allows scripters to store additional information in the marker itself instead of using work-around approach based on marker names and such. Differential Revision: https://developer.blender.org/D8944 --- source/blender/blenkernel/intern/scene.c | 28 +++++++++++++++++-- source/blender/blenloader/intern/readfile.c | 9 ++++++ source/blender/blenloader/intern/writefile.c | 4 +++ .../intern/builder/deg_builder_nodes_scene.cc | 4 +++ .../builder/deg_builder_relations_scene.cc | 4 +++ .../blender/editors/animation/anim_markers.c | 9 ++++++ source/blender/makesdna/DNA_scene_types.h | 1 + source/blender/makesrna/intern/rna_timeline.c | 14 ++++++++++ 8 files changed, 71 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 34af226ef72..2a3ac89a8a7 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -223,6 +223,16 @@ static void scene_init_data(ID *id) BKE_view_layer_add(scene, "View Layer", NULL, VIEWLAYER_ADD_NEW); } +static void scene_copy_markers(Scene *scene_dst, const Scene *scene_src, const int flag) +{ + BLI_duplicatelist(&scene_dst->markers, &scene_src->markers); + LISTBASE_FOREACH (TimeMarker *, marker, &scene_dst->markers) { + if (marker->prop != NULL) { + marker->prop = IDP_CopyProperty_ex(marker->prop, flag); + } + } +} + static void scene_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { Scene *scene_dst = (Scene *)id_dst; @@ -253,7 +263,8 @@ static void scene_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int BKE_view_layer_copy_data(scene_dst, scene_src, view_layer_dst, view_layer_src, flag_subdata); } - BLI_duplicatelist(&(scene_dst->markers), &(scene_src->markers)); + scene_copy_markers(scene_dst, scene_src, flag); + BLI_duplicatelist(&(scene_dst->transform_spaces), &(scene_src->transform_spaces)); BLI_duplicatelist(&(scene_dst->r.views), &(scene_src->r.views)); BKE_keyingsets_copy(&(scene_dst->keyingsets), &(scene_src->keyingsets)); @@ -336,6 +347,17 @@ static void scene_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int BKE_scene_copy_data_eevee(scene_dst, scene_src); } +static void scene_free_markers(Scene *scene, bool do_id_user) +{ + LISTBASE_FOREACH_MUTABLE (TimeMarker *, marker, &scene->markers) { + if (marker->prop != NULL) { + IDP_FreePropertyContent_ex(marker->prop, do_id_user); + MEM_freeN(marker->prop); + } + MEM_freeN(marker); + } +} + static void scene_free_data(ID *id) { @@ -372,7 +394,7 @@ static void scene_free_data(ID *id) scene->r.ffcodecdata.properties = NULL; } - BLI_freelistN(&scene->markers); + scene_free_markers(scene, do_id_user); BLI_freelistN(&scene->transform_spaces); BLI_freelistN(&scene->r.views); @@ -524,6 +546,8 @@ static void scene_foreach_id(ID *id, LibraryForeachIDData *data) LISTBASE_FOREACH (TimeMarker *, marker, &scene->markers) { BKE_LIB_FOREACHID_PROCESS(data, marker->camera, IDWALK_CB_NOP); + IDP_foreach_property( + marker->prop, IDP_TYPE_FILTER_ID, BKE_lib_query_idpropertiesForeachIDLink_callback, data); } ToolSettings *toolsett = scene->toolsettings; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 6e0fc1752a9..2b68c5ea203 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4450,6 +4450,8 @@ static void lib_link_scene(BlendLibReader *reader, Scene *sce) SEQ_ALL_END; LISTBASE_FOREACH (TimeMarker *, marker, &sce->markers) { + IDP_BlendReadLib(reader, marker->prop); + if (marker->camera) { BLO_read_id_address(reader, sce->id.lib, &marker->camera); } @@ -4809,6 +4811,11 @@ static void direct_link_scene(BlendDataReader *reader, Scene *sce) } BLO_read_list(reader, &(sce->markers)); + LISTBASE_FOREACH (TimeMarker *, marker, &sce->markers) { + BLO_read_data_address(reader, &marker->prop); + IDP_BlendDataRead(reader, &marker->prop); + } + BLO_read_list(reader, &(sce->transform_spaces)); BLO_read_list(reader, &(sce->r.layers)); BLO_read_list(reader, &(sce->r.views)); @@ -7969,6 +7976,8 @@ static void expand_scene(BlendExpander *expander, Scene *sce) } LISTBASE_FOREACH (TimeMarker *, marker, &sce->markers) { + IDP_BlendReadExpand(expander, marker->prop); + if (marker->camera) { BLO_expand(expander, marker->camera); } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index db51bb79f41..336276bdd40 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1702,6 +1702,10 @@ static void write_scene(BlendWriter *writer, Scene *sce, const void *id_address) /* writing dynamic list of TimeMarkers to the blend file */ LISTBASE_FOREACH (TimeMarker *, marker, &sce->markers) { BLO_write_struct(writer, TimeMarker, marker); + + if (marker->prop != NULL) { + IDP_BlendWrite(writer, marker->prop); + } } /* writing dynamic list of TransformOrientations to the blend file */ diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc index ee40fa3f5c8..fd457e0b2bf 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc @@ -71,6 +71,10 @@ void DepsgraphNodeBuilder::build_scene_parameters(Scene *scene) * in when building scene from view layer, so this particular case does not make things * marginally worse. */ build_scene_compositor(scene); + + LISTBASE_FOREACH (TimeMarker *, marker, &scene->markers) { + build_idproperties(marker->prop); + } } void DepsgraphNodeBuilder::build_scene_compositor(Scene *scene) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc index 6ebf5210b63..703c6c7cd68 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc @@ -59,6 +59,10 @@ void DepsgraphRelationBuilder::build_scene_parameters(Scene *scene) &scene->id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EXIT); OperationKey scene_eval_key(&scene->id, NodeType::PARAMETERS, OperationCode::SCENE_EVAL); add_relation(parameters_eval_key, scene_eval_key, "Parameters -> Scene Eval"); + + LISTBASE_FOREACH (TimeMarker *, marker, &scene->markers) { + build_idproperties(marker->prop); + } } void DepsgraphRelationBuilder::build_scene_compositor(Scene *scene) diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index 6298ae16d8b..d60b217593f 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -36,6 +36,7 @@ #include "BKE_context.h" #include "BKE_fcurve.h" +#include "BKE_idprop.h" #include "BKE_layer.h" #include "BKE_main.h" #include "BKE_report.h" @@ -1104,6 +1105,10 @@ static void ed_marker_duplicate_apply(bContext *C) newmarker->camera = marker->camera; #endif + if (marker->prop != NULL) { + newmarker->prop = IDP_CopyProperty(marker->prop); + } + /* new marker is added to the beginning of list */ // FIXME: bad ordering! BLI_addhead(markers, newmarker); @@ -1458,6 +1463,10 @@ static int ed_marker_delete_exec(bContext *C, wmOperator *UNUSED(op)) for (marker = markers->first; marker; marker = nmarker) { nmarker = marker->next; if (marker->flag & SELECT) { + if (marker->prop != NULL) { + IDP_FreePropertyContent(marker->prop); + MEM_freeN(marker->prop); + } BLI_freelinkN(markers, marker); changed = true; } diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 1a63c532c68..9d1af5a2cdc 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -837,6 +837,7 @@ typedef struct TimeMarker { char name[64]; unsigned int flag; struct Object *camera; + struct IDProperty *prop; } TimeMarker; /* *************************************************************** */ diff --git a/source/blender/makesrna/intern/rna_timeline.c b/source/blender/makesrna/intern/rna_timeline.c index ed17a509fc2..c0bd9fd92a2 100644 --- a/source/blender/makesrna/intern/rna_timeline.c +++ b/source/blender/makesrna/intern/rna_timeline.c @@ -30,8 +30,21 @@ #ifdef RNA_RUNTIME +# include "BKE_idprop.h" # include "WM_api.h" +static IDProperty *rna_TimelineMarker_idprops(PointerRNA *ptr, bool create) +{ + TimeMarker *marker = ptr->data; + + if (create && marker->prop == NULL) { + IDPropertyTemplate val = {0}; + marker->prop = IDP_New(IDP_GROUP, &val, "Marker ID properties"); + } + + return marker->prop; +} + static void rna_TimelineMarker_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *UNUSED(ptr)) @@ -50,6 +63,7 @@ static void rna_def_timeline_marker(BlenderRNA *brna) srna = RNA_def_struct(brna, "TimelineMarker", NULL); RNA_def_struct_sdna(srna, "TimeMarker"); RNA_def_struct_ui_text(srna, "Marker", "Marker for noting points in the timeline"); + RNA_def_struct_idprops_func(srna, "rna_TimelineMarker_idprops"); /* String values */ prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);