Alembic: added frame offset property
authorSybren A. Stüvel <sybren@stuvel.eu>
Sun, 29 Oct 2017 16:23:50 +0000 (17:23 +0100)
committerSybren A. Stüvel <sybren@stuvel.eu>
Sun, 29 Oct 2017 16:23:50 +0000 (17:23 +0100)
The offset is subtracted, so that it's intuitive (dragging slider pushes
the animation further that way on the timeline).

source/blender/blenkernel/intern/cachefile.c
source/blender/editors/interface/interface_templates.c
source/blender/makesdna/DNA_cachefile_types.h
source/blender/makesrna/intern/rna_cachefile.c
source/blender/modifiers/intern/MOD_meshsequencecache.c

index 1916531b066a23bd2905a373fcfaea5a82303bb5..e821a14da2e9693a16902132371d8475d4300bcc 100644 (file)
@@ -211,8 +211,9 @@ bool BKE_cachefile_filepath_get(
 
 float BKE_cachefile_time_offset(CacheFile *cache_file, const float time, const float fps)
 {
+       const float time_offset = cache_file->frame_offset / fps;
        const float frame = (cache_file->override_frame ? cache_file->frame : time);
-       return cache_file->is_sequence ? frame : frame / fps;
+       return cache_file->is_sequence ? frame : frame / fps - time_offset;
 }
 
 /* TODO(kevin): replace this with some depsgraph mechanism, or something similar. */
index c392464ec3e1a14e15ba3face50b3f8905bbc22c..7f23f26491184bc8aeb92b91e834063f28287749 100644 (file)
@@ -4041,6 +4041,9 @@ void uiTemplateCacheFile(uiLayout *layout, bContext *C, PointerRNA *ptr, const c
        uiLayoutSetEnabled(row, RNA_boolean_get(&fileptr, "override_frame"));
        uiItemR(row, &fileptr, "frame", 0, "Frame", ICON_NONE);
 
+       row = uiLayoutRow(layout, false);
+       uiItemR(row, &fileptr, "frame_offset", 0, "Frame Offset", ICON_NONE);
+
        row = uiLayoutRow(layout, false);
        uiItemL(row, IFACE_("Manual Transform:"), ICON_NONE);
 
index a353c94ae64d8b87a9feb2b0fbb2197a69455ee2..c0e662d8a48f96f7a01070fefc9446f8158c5e0b 100644 (file)
@@ -75,9 +75,12 @@ typedef struct CacheFile {
 
        float scale;
        float frame;  /* The frame/time to lookup in the cache file. */
+       float frame_offset; /* The frame offset to subtract. */
 
        short flag;  /* Animation flag. */
        short draw_flag;
+
+       char padding[4];
 } CacheFile;
 
 #ifdef __cplusplus
index 09fdeb15b10921d61d765dbd473a6ca0e5aef249..81b0c539e3389b880fd05545c30097ec8280073f 100644 (file)
@@ -148,6 +148,15 @@ static void rna_def_cachefile(BlenderRNA *brna)
                                                " or to determine which file to use in a file sequence");
        RNA_def_property_update(prop, 0, "rna_CacheFile_update");
 
+       prop = RNA_def_property(srna, "frame_offset", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "frame_offset");
+       RNA_def_property_range(prop, -MAXFRAME, MAXFRAME);
+       RNA_def_property_ui_text(prop, "Frame Offset",
+                                "Subtracted from the current frame to use for "
+                                "looking up the data in the cache file, or to "
+                                "determine which file to use in a file sequence");
+       RNA_def_property_update(prop, 0, "rna_CacheFile_update");
+
        /* ----------------- Axis Conversion ----------------- */
 
        prop = RNA_def_property(srna, "forward_axis", PROP_ENUM, PROP_NONE);
index 5b059ef89d25ca3c726d92ade863056113a155af..3e527489d20f31c4689302e519589a93474a5157 100644 (file)
@@ -109,7 +109,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
        Scene *scene = md->scene;
        const float frame = BKE_scene_frame_get(scene);
        const float time = BKE_cachefile_time_offset(mcmd->cache_file, frame, FPS);
-
        const char *err_str = NULL;
 
        CacheFile *cache_file = mcmd->cache_file;