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
This commit is contained in:
Sergey Sharybin 2020-09-18 16:57:33 +02:00
parent 3791dbea1e
commit 216a221876
8 changed files with 71 additions and 2 deletions

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

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

@ -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 */

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

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

@ -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;
}

@ -837,6 +837,7 @@ typedef struct TimeMarker {
char name[64];
unsigned int flag;
struct Object *camera;
struct IDProperty *prop;
} TimeMarker;
/* *************************************************************** */

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