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:
parent
3791dbea1e
commit
216a221876
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user