Commit: 72f685386569dfa630c599fd7c48398a0438123a
Author: Kévin Dietrich
Date:   Tue Jun 7 10:06:22 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB72f685386569dfa630c599fd7c48398a0438123a

Add option to setup scene's frame range based on that of the imported
archive.

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

M       source/blender/alembic/ABC_alembic.h
M       source/blender/alembic/intern/abc_camera.cc
M       source/blender/alembic/intern/abc_hair.cc
M       source/blender/alembic/intern/abc_mesh.cc
M       source/blender/alembic/intern/abc_nurbs.cc
M       source/blender/alembic/intern/abc_object.cc
M       source/blender/alembic/intern/abc_object.h
M       source/blender/alembic/intern/abc_points.cc
M       source/blender/alembic/intern/abc_transform.cc
M       source/blender/alembic/intern/abc_util.h
M       source/blender/alembic/intern/alembic_capi.cc
M       source/blender/editors/io/io_alembic.c

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

diff --git a/source/blender/alembic/ABC_alembic.h 
b/source/blender/alembic/ABC_alembic.h
index 70fa85f..819e487 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -57,7 +57,7 @@ int ABC_export(struct Scene *scene, struct bContext *C, const 
char *filepath,
                int geogroups, int compression,
                bool packuv, float scale);
 
-void ABC_import(struct bContext *C, const char *filepath, float scale, bool 
is_sequence);
+void ABC_import(struct bContext *C, const char *filepath, float scale, bool 
is_sequence, bool set_frame_range);
 
 void ABC_get_vertex_cache(const char *filepath, float time, void *verts, int 
max_verts, const char *object_path, int is_mvert);
 
diff --git a/source/blender/alembic/intern/abc_camera.cc 
b/source/blender/alembic/intern/abc_camera.cc
index df0273b..2b627b2 100644
--- a/source/blender/alembic/intern/abc_camera.cc
+++ b/source/blender/alembic/intern/abc_camera.cc
@@ -116,6 +116,8 @@ AbcCameraReader::AbcCameraReader(const 
Alembic::Abc::IObject &object, ImportSett
 {
        ICamera abc_cam(m_iobject, kWrapExisting);
        m_schema = abc_cam.getSchema();
+
+       get_min_max_time(m_schema, m_min_time, m_max_time);
 }
 
 bool AbcCameraReader::valid() const
diff --git a/source/blender/alembic/intern/abc_hair.cc 
b/source/blender/alembic/intern/abc_hair.cc
index 6cca00d..9ea344e 100644
--- a/source/blender/alembic/intern/abc_hair.cc
+++ b/source/blender/alembic/intern/abc_hair.cc
@@ -304,6 +304,8 @@ AbcHairReader::AbcHairReader(const Alembic::Abc::IObject 
&object, ImportSettings
 {
        ICurves abc_curves(object, kWrapExisting);
        m_curves_schema = abc_curves.getSchema();
+
+       get_min_max_time(m_curves_schema, m_min_time, m_max_time);
 }
 
 bool AbcHairReader::valid() const
diff --git a/source/blender/alembic/intern/abc_mesh.cc 
b/source/blender/alembic/intern/abc_mesh.cc
index 4ef0c07..bff4345 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -1074,6 +1074,8 @@ AbcMeshReader::AbcMeshReader(const IObject &object, 
ImportSettings &settings, bo
                IPolyMesh ipoly_mesh(m_iobject, kWrapExisting);
                m_schema = ipoly_mesh.getSchema();
        }
+
+       get_min_max_time(m_schema, m_min_time, m_max_time);
 }
 
 bool AbcMeshReader::valid() const
diff --git a/source/blender/alembic/intern/abc_nurbs.cc 
b/source/blender/alembic/intern/abc_nurbs.cc
index fdf374d..c55e5aa 100644
--- a/source/blender/alembic/intern/abc_nurbs.cc
+++ b/source/blender/alembic/intern/abc_nurbs.cc
@@ -210,6 +210,7 @@ AbcNurbsReader::AbcNurbsReader(const IObject &object, 
ImportSettings &settings)
     : AbcObjectReader(object, settings)
 {
        getNurbsPatches(m_iobject);
+       get_min_max_time(m_schemas[0].first, m_min_time, m_max_time);
 }
 
 bool AbcNurbsReader::valid() const
diff --git a/source/blender/alembic/intern/abc_object.cc 
b/source/blender/alembic/intern/abc_object.cc
index f6508db..12c2452 100644
--- a/source/blender/alembic/intern/abc_object.cc
+++ b/source/blender/alembic/intern/abc_object.cc
@@ -347,6 +347,8 @@ AbcObjectReader::AbcObjectReader(const IObject &object, 
ImportSettings &settings
     , m_object(NULL)
     , m_iobject(object)
     , m_settings(&settings)
+    , m_min_time(std::numeric_limits<chrono_t>::max())
+    , m_max_time(std::numeric_limits<chrono_t>::min())
 {
        m_name = object.getFullName();
        std::vector<std::string> parts;
@@ -420,3 +422,13 @@ void AbcObjectReader::addDefaultModifier(Main *bmain) const
        DAG_id_tag_update(&m_object->id, OB_RECALC_DATA);
        DAG_relations_tag_update(bmain);
 }
+
+chrono_t AbcObjectReader::minTime() const
+{
+       return m_min_time;
+}
+
+chrono_t AbcObjectReader::maxTime() const
+{
+       return m_max_time;
+}
diff --git a/source/blender/alembic/intern/abc_object.h 
b/source/blender/alembic/intern/abc_object.h
index db45334..c050286 100644
--- a/source/blender/alembic/intern/abc_object.h
+++ b/source/blender/alembic/intern/abc_object.h
@@ -94,10 +94,13 @@ struct ImportSettings {
        int from_forward;
        float scale;
        bool is_sequence;
+       bool set_frame_range;
 };
 
 /* ************************************************************************** 
*/
 
+using Alembic::AbcCoreAbstract::chrono_t;
+
 class AbcObjectReader {
 protected:
        std::string m_name;
@@ -108,6 +111,9 @@ protected:
 
        ImportSettings *m_settings;
 
+       chrono_t m_min_time;
+       chrono_t m_max_time;
+
 public:
        explicit AbcObjectReader(const Alembic::Abc::IObject &object, 
ImportSettings &settings);
 
@@ -124,4 +130,7 @@ public:
        void readObjectMatrix(const float time);
 
        void addDefaultModifier(Main *bmain) const;
+
+       chrono_t minTime() const;
+       chrono_t maxTime() const;
 };
diff --git a/source/blender/alembic/intern/abc_points.cc 
b/source/blender/alembic/intern/abc_points.cc
index ef66140..184ce86 100644
--- a/source/blender/alembic/intern/abc_points.cc
+++ b/source/blender/alembic/intern/abc_points.cc
@@ -28,6 +28,7 @@
 
 #include "abc_mesh.h"
 #include "abc_transform.h"
+#include "abc_util.h"
 
 extern "C" {
 #include "DNA_mesh_types.h"
@@ -139,6 +140,7 @@ AbcPointsReader::AbcPointsReader(const 
Alembic::Abc::IObject &object, ImportSett
 {
        IPoints ipoints(m_iobject, kWrapExisting);
        m_schema = ipoints.getSchema();
+       get_min_max_time(m_schema, m_min_time, m_max_time);
 }
 
 bool AbcPointsReader::valid() const
diff --git a/source/blender/alembic/intern/abc_transform.cc 
b/source/blender/alembic/intern/abc_transform.cc
index 4c07abf..a69c4fa 100644
--- a/source/blender/alembic/intern/abc_transform.cc
+++ b/source/blender/alembic/intern/abc_transform.cc
@@ -116,7 +116,9 @@ bool AbcTransformWriter::hasAnimation(Object */*ob*/) const
 
 AbcEmptyReader::AbcEmptyReader(const Alembic::Abc::IObject &object, 
ImportSettings &settings)
     : AbcObjectReader(object, settings)
-{}
+{
+       get_min_max_time(m_schema, m_min_time, m_max_time);
+}
 
 bool AbcEmptyReader::valid() const
 {
diff --git a/source/blender/alembic/intern/abc_util.h 
b/source/blender/alembic/intern/abc_util.h
index 368035a..219e190 100644
--- a/source/blender/alembic/intern/abc_util.h
+++ b/source/blender/alembic/intern/abc_util.h
@@ -53,3 +53,25 @@ bool is_locator(const Alembic::AbcGeom::IObject &object);
 void create_input_transform(const Alembic::AbcGeom::ISampleSelector 
&sample_sel,
                             const Alembic::AbcGeom::IXform &ixform, Object *ob,
                             float r_mat[4][4]);
+
+using Alembic::Abc::chrono_t;
+
+template <typename Schema>
+void get_min_max_time(const Schema &schema, chrono_t &min, chrono_t &max)
+{
+       using Alembic::Abc::TimeSamplingPtr;
+
+       TimeSamplingPtr time_samp = schema.getTimeSampling();
+
+    if (!schema.isConstant()) {
+        const size_t num_samps = schema.getNumSamples();
+
+        if (num_samps > 0) {
+            const chrono_t min_time = time_samp->getSampleTime(0);
+            min = std::min(min, min_time);
+
+            const chrono_t max_time = time_samp->getSampleTime(num_samps - 1);
+            max = std::max(max, max_time);
+        }
+    }
+}
diff --git a/source/blender/alembic/intern/alembic_capi.cc 
b/source/blender/alembic/intern/alembic_capi.cc
index 8fa1f26..3f33eef 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -473,19 +473,31 @@ static void import_startjob(void *cjv, short *stop, short 
*do_update, float *pro
        const float size = static_cast<float>(readers.size());
        size_t i = 0;
 
-       std::vector<AbcObjectReader *>::iterator iter;
+       Scene *scene = data->scene;
+
+       chrono_t min_time = std::numeric_limits<chrono_t>::max();
+       chrono_t max_time = std::numeric_limits<chrono_t>::min();
 
+       std::vector<AbcObjectReader *>::iterator iter;
        for (iter = readers.begin(); iter != readers.end(); ++iter) {
                AbcObjectReader *reader = *iter;
 
                if (reader->valid()) {
-                       reader->readObjectData(data->bmain, data->scene, 0.0f);
+                       reader->readObjectData(data->bmain, scene, 0.0f);
                        reader->readObjectMatrix(0.0f);
+                       min_time = std::min(min_time, reader->minTime());
+                       max_time = std::max(max_time, reader->maxTime());
                }
 
                *data->progress = 0.1f + 0.6f * (++i / size);
        }
 
+       if (data->settings.set_frame_range && (min_time < max_time)) {
+               SFRA = min_time * FPS;
+               EFRA = max_time * FPS;
+               CFRA = SFRA;
+       }
+
        i = 0;
        for (iter = readers.begin(); iter != readers.end(); ++iter) {
                const AbcObjectReader *reader = *iter;
@@ -527,10 +539,10 @@ static void import_startjob(void *cjv, short *stop, short 
*do_update, float *pro
 
        BLI_ghash_free(parent_map, NULL, NULL);
 
-       WM_main_add_notifier(NC_SCENE | ND_FRAME, data->scene);
+       WM_main_add_notifier(NC_SCENE | ND_FRAME, scene);
 }
 
-void ABC_import(bContext *C, const char *filepath, float scale, bool 
is_sequence)
+void ABC_import(bContext *C, const char *filepath, float scale, bool 
is_sequence, bool set_frame_range)
 {
        ImportJobData *job = static_cast<ImportJobData 
*>(MEM_mallocN(sizeof(ImportJobData), "ImportJobData"));
        job->bmain = CTX_data_main(C);
@@ -539,6 +551,7 @@ void ABC_import(bContext *C, const char *filepath, float 
scale, bool is_sequence
 
        job->settings.scale = scale;
        job->settings.is_sequence = is_sequence;
+       job->settings.set_frame_range = set_frame_range;
 
        wmJob *wm_job = WM_jobs_get(CTX_wm_manager(C),
                                    CTX_wm_window(C),
diff --git a/source/blender/editors/io/io_alembic.c 
b/source/blender/editors/io/io_alembic.c
index f9d544e..4ad85f5 100644
--- a/source/blender/editors/io/io_alembic.c
+++ b/source/blender/editors/io/io_alembic.c
@@ -305,6 +305,9 @@ static void ui_alembic_import_settings(uiLayout *layout, 
PointerRNA *imfptr)
        uiItemL(row, IFACE_("Options:"), ICON_NONE);
 
        row = uiLayoutRow(box, false);
+       uiItemR(row, imfptr, "set_frame_range", 0, NULL, ICON_NONE);
+
+       row = uiLayoutRow(box, false);
        uiItemR(row, imfptr, "is_sequence", 0, NULL, ICON_NONE);
 }
 
@@ -328,8 +331,9 @@ static int wm_alembic_import_exec(bContext *C, wmOperator 
*op)
 
        const float scale = RNA_float_get(op->ptr, "scale");
        const bool is_sequence = RNA_boolean_get(op->ptr, "is_sequence");
+       const bool set_frame_range = RNA_boolean_get(op->ptr, 
"set_frame_range");
 
-       ABC_import(C, filename, scale, is_sequence);
+       ABC_import(C, filename, scale, is_sequence, set_frame_range);
 
        

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to