[Bf-blender-cvs] [216a2218768] master: Implement ID properties support for TimeMarker

Sergey Sharybin noreply at git.blender.org
Mon Sep 21 12:31:22 CEST 2020


Commit: 216a2218768d005c18032df370c19c1c0f571797
Author: Sergey Sharybin
Date:   Fri Sep 18 16:57:33 2020 +0200
Branches: master
https://developer.blender.org/rB216a2218768d005c18032df370c19c1c0f571797

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

===================================================================

M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc
M	source/blender/editors/animation/anim_markers.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_timeline.c

===================================================================

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);



More information about the Bf-blender-cvs mailing list