Commit: 8dcffc0f05dcbf40eb383c0aee677c1b475463fd
Author: Lukas Tönne
Date:   Fri Apr 24 14:30:21 2015 +0200
Branches: alembic
https://developer.blender.org/rB8dcffc0f05dcbf40eb383c0aee677c1b475463fd

Use a wrapper around alembic read_sample function calls, to catch
Alembic exceptions and prevent crashing.

Alembic can throw exceptions on relatively common and uncritical errors,
such as mismatching properties in files which don't fit the expected
schema. These cases should now be handled gracefully and simple reject
the cache file with an error message.

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

M       source/blender/pointcache/alembic/abc_cloth.cpp
M       source/blender/pointcache/alembic/abc_cloth.h
M       source/blender/pointcache/alembic/abc_group.cpp
M       source/blender/pointcache/alembic/abc_group.h
M       source/blender/pointcache/alembic/abc_mesh.cpp
M       source/blender/pointcache/alembic/abc_mesh.h
M       source/blender/pointcache/alembic/abc_object.cpp
M       source/blender/pointcache/alembic/abc_object.h
M       source/blender/pointcache/alembic/abc_particles.cpp
M       source/blender/pointcache/alembic/abc_particles.h
M       source/blender/pointcache/alembic/abc_reader.cpp
M       source/blender/pointcache/alembic/abc_reader.h
M       source/blender/pointcache/alembic/abc_simdebug.cpp
M       source/blender/pointcache/alembic/abc_simdebug.h

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

diff --git a/source/blender/pointcache/alembic/abc_cloth.cpp 
b/source/blender/pointcache/alembic/abc_cloth.cpp
index d6ca2bb..6d8c86c 100644
--- a/source/blender/pointcache/alembic/abc_cloth.cpp
+++ b/source/blender/pointcache/alembic/abc_cloth.cpp
@@ -193,7 +193,7 @@ static void apply_sample_goal_positions(Cloth *cloth, 
P3fArraySamplePtr sample)
        }
 }
 
-PTCReadSampleResult AbcClothReader::read_sample(float frame)
+PTCReadSampleResult AbcClothReader::read_sample_abc(float frame)
 {
        Cloth *cloth = m_clmd->clothObject;
        
diff --git a/source/blender/pointcache/alembic/abc_cloth.h 
b/source/blender/pointcache/alembic/abc_cloth.h
index 42460d1..da8ebf5 100644
--- a/source/blender/pointcache/alembic/abc_cloth.h
+++ b/source/blender/pointcache/alembic/abc_cloth.h
@@ -55,7 +55,7 @@ public:
        
        void init_abc(Abc::IObject parent);
        
-       PTCReadSampleResult read_sample(float frame);
+       PTCReadSampleResult read_sample_abc(float frame);
        
 private:
        AbcGeom::IPoints m_points;
diff --git a/source/blender/pointcache/alembic/abc_group.cpp 
b/source/blender/pointcache/alembic/abc_group.cpp
index 0571b05..361ffd6 100644
--- a/source/blender/pointcache/alembic/abc_group.cpp
+++ b/source/blender/pointcache/alembic/abc_group.cpp
@@ -95,7 +95,7 @@ void AbcGroupReader::init_abc(IObject object)
        m_abc_object = object;
 }
 
-PTCReadSampleResult AbcGroupReader::read_sample(float /*frame*/)
+PTCReadSampleResult AbcGroupReader::read_sample_abc(float /*frame*/)
 {
        if (!m_abc_object)
                return PTC_READ_SAMPLE_INVALID;
@@ -408,7 +408,7 @@ void AbcDupliCacheReader::read_dupligroup_object(IObject 
object, float frame)
                                AbcDerivedMeshReader dm_reader("mesh", b_ob);
                                dm_reader.init(abc_archive());
                                dm_reader.init_abc(child);
-                               if (dm_reader.read_sample(frame) != 
PTC_READ_SAMPLE_INVALID) {
+                               if (dm_reader.read_sample_abc(frame) != 
PTC_READ_SAMPLE_INVALID) {
                                        if (!dupli_data) {
                                                dupli_data = 
BKE_dupli_cache_add_object(dupli_cache, b_ob);
                                                
insert_dupli_data(object.getPtr(), dupli_data);
@@ -427,7 +427,7 @@ void AbcDupliCacheReader::read_dupligroup_object(IObject 
object, float frame)
                                AbcStrandsReader strands_reader(strands, 
children, m_read_strands_motion, m_read_strands_children);
                                strands_reader.init(abc_archive());
                                strands_reader.init_abc(child);
-                               if (strands_reader.read_sample(frame) != 
PTC_READ_SAMPLE_INVALID) {
+                               if (strands_reader.read_sample_abc(frame) != 
PTC_READ_SAMPLE_INVALID) {
                                        if (!dupli_data) {
                                                dupli_data = 
BKE_dupli_cache_add_object(dupli_cache, b_ob);
                                                
insert_dupli_data(object.getPtr(), dupli_data);
@@ -485,7 +485,7 @@ void AbcDupliCacheReader::read_dupligroup_group(IObject 
abc_group, const ISample
        }
 }
 
-PTCReadSampleResult AbcDupliCacheReader::read_sample(float frame)
+PTCReadSampleResult AbcDupliCacheReader::read_sample_abc(float frame)
 {
        ISampleSelector ss = abc_archive()->get_frame_sample_selector(frame);
        
@@ -510,7 +510,7 @@ PTCReadSampleResult AbcDupliCacheReader::read_sample(float 
frame)
                        m_simdebug_reader->init(abc_archive());
                        
m_simdebug_reader->init_abc(abc_top.getChild("sim_debug"));
                        
-                       m_simdebug_reader->read_sample(frame);
+                       m_simdebug_reader->read_sample_abc(frame);
                }
        }
        
@@ -695,7 +695,7 @@ void AbcDupliObjectReader::read_dupligroup_object(IObject 
object, float frame)
                                AbcDerivedMeshReader dm_reader("mesh", m_ob);
                                dm_reader.init(abc_archive());
                                dm_reader.init_abc(child);
-                               if (dm_reader.read_sample(frame) != 
PTC_READ_SAMPLE_INVALID) {
+                               if (dm_reader.read_sample_abc(frame) != 
PTC_READ_SAMPLE_INVALID) {
                                        
BKE_dupli_object_data_set_mesh(dupli_data, dm_reader.acquire_result());
                                }
                                else {
@@ -709,7 +709,7 @@ void AbcDupliObjectReader::read_dupligroup_object(IObject 
object, float frame)
                                AbcStrandsReader strands_reader(strands, 
children, m_read_strands_motion, m_read_strands_children);
                                strands_reader.init(abc_archive());
                                strands_reader.init_abc(child);
-                               if (strands_reader.read_sample(frame) != 
PTC_READ_SAMPLE_INVALID) {
+                               if (strands_reader.read_sample_abc(frame) != 
PTC_READ_SAMPLE_INVALID) {
                                        Strands *newstrands = 
strands_reader.acquire_result();
                                        if (strands && strands != newstrands) {
                                                /* reader can replace strands 
internally if topology does not match */
@@ -733,7 +733,7 @@ void AbcDupliObjectReader::read_dupligroup_object(IObject 
object, float frame)
        }
 }
 
-PTCReadSampleResult AbcDupliObjectReader::read_sample(float frame)
+PTCReadSampleResult AbcDupliObjectReader::read_sample_abc(float frame)
 {
        if (!m_abc_object)
                return PTC_READ_SAMPLE_INVALID;
diff --git a/source/blender/pointcache/alembic/abc_group.h 
b/source/blender/pointcache/alembic/abc_group.h
index bea9b27..6a26999 100644
--- a/source/blender/pointcache/alembic/abc_group.h
+++ b/source/blender/pointcache/alembic/abc_group.h
@@ -59,7 +59,7 @@ public:
        
        void init_abc(Abc::IObject object);
        
-       PTCReadSampleResult read_sample(float frame);
+       PTCReadSampleResult read_sample_abc(float frame);
        
 private:
        Abc::IObject m_abc_object;
@@ -142,7 +142,7 @@ public:
        
        void init_abc(Abc::IObject object);
        
-       PTCReadSampleResult read_sample(float frame);
+       PTCReadSampleResult read_sample_abc(float frame);
        
 protected:
        void read_dupligroup_object(Abc::IObject object, float frame);
@@ -202,7 +202,7 @@ public:
        void init(ReaderArchive *archive);
        void init_abc(Abc::IObject object);
        
-       PTCReadSampleResult read_sample(float frame);
+       PTCReadSampleResult read_sample_abc(float frame);
        
 protected:
        void read_dupligroup_object(Abc::IObject object, float frame);
diff --git a/source/blender/pointcache/alembic/abc_mesh.cpp 
b/source/blender/pointcache/alembic/abc_mesh.cpp
index 7397b55..407c714 100644
--- a/source/blender/pointcache/alembic/abc_mesh.cpp
+++ b/source/blender/pointcache/alembic/abc_mesh.cpp
@@ -500,7 +500,7 @@ static PTCReadSampleResult apply_sample_loops(DerivedMesh 
*dm, Int32ArraySampleP
        return PTC_READ_SAMPLE_EXACT;
 }
 
-PTCReadSampleResult AbcDerivedMeshReader::read_sample(float frame)
+PTCReadSampleResult AbcDerivedMeshReader::read_sample_abc(float frame)
 {
 #ifdef USE_TIMING
        double start_time;
diff --git a/source/blender/pointcache/alembic/abc_mesh.h 
b/source/blender/pointcache/alembic/abc_mesh.h
index 5caaf6e..fe38cbd 100644
--- a/source/blender/pointcache/alembic/abc_mesh.h
+++ b/source/blender/pointcache/alembic/abc_mesh.h
@@ -85,7 +85,7 @@ public:
        
        void init_abc(Abc::IObject object);
        
-       PTCReadSampleResult read_sample(float frame);
+       PTCReadSampleResult read_sample_abc(float frame);
        
 private:
        AbcGeom::IPolyMesh m_mesh;
diff --git a/source/blender/pointcache/alembic/abc_object.cpp 
b/source/blender/pointcache/alembic/abc_object.cpp
index d3e2d1a..0b2c1a8 100644
--- a/source/blender/pointcache/alembic/abc_object.cpp
+++ b/source/blender/pointcache/alembic/abc_object.cpp
@@ -143,7 +143,7 @@ void AbcObjectReader::init_abc(IObject object)
        m_abc_object = object;
 }
 
-PTCReadSampleResult AbcObjectReader::read_sample(float /*frame*/)
+PTCReadSampleResult AbcObjectReader::read_sample_abc(float /*frame*/)
 {
        if (!m_abc_object)
                return PTC_READ_SAMPLE_INVALID;
diff --git a/source/blender/pointcache/alembic/abc_object.h 
b/source/blender/pointcache/alembic/abc_object.h
index 436bb49..d0b88a9 100644
--- a/source/blender/pointcache/alembic/abc_object.h
+++ b/source/blender/pointcache/alembic/abc_object.h
@@ -70,7 +70,7 @@ public:
        
        void init_abc(Abc::IObject object);
        
-       PTCReadSampleResult read_sample(float frame);
+       PTCReadSampleResult read_sample_abc(float frame);
        
 private:
        Abc::IObject m_abc_object;
diff --git a/source/blender/pointcache/alembic/abc_particles.cpp 
b/source/blender/pointcache/alembic/abc_particles.cpp
index 89ab4e6..3f7612c 100644
--- a/source/blender/pointcache/alembic/abc_particles.cpp
+++ b/source/blender/pointcache/alembic/abc_particles.cpp
@@ -694,7 +694,7 @@ void AbcStrandsChildrenReader::init_abc(IObject object)
        m_prop_parent_weights = IFloatArrayProperty(user_props, 
"parent_weights", 0);
 }
 
-PTCReadSampleResult AbcStrandsChildrenReader::read_sample(float frame)
+PTCReadSampleResult AbcStrandsChildrenReader::read_sample_abc(float frame)
 {
        ISampleSelector ss = abc_archive()->get_frame_sample_selector(frame);
        
@@ -845,7 +845,7 @@ void AbcStrandsReader::init_abc(IObject object)
        }
 }
 
-PTCReadSampleResult AbcStrandsReader::read_sample(float frame)
+PTCReadSampleResult AbcStrandsReader::read_sample_abc(float frame)
 {
        ISampleSelector ss = abc_archive()->get_frame_sample_selector(frame);
        
@@ -962,7 +962,7 @@ PTCReadSampleResult AbcStrandsReader::read_sample(float 
frame)
        BKE_strands_ensure_normals(m_strands);
        
        if (m_read_children) {
-               m_child_reader.read_sample(frame);
+               m_child_reader.read_sample_abc(frame);
        }
        
        return PTC_READ_SAMPLE_EXACT;
diff --git a/source/blender/pointcache/alembic/abc_particles.h 
b/source/blender/pointcache/alembic/abc_particles.h
index 3df6015..496c238 100644
--- a/source/blender/pointcache/alembic/abc_particles.h
+++ b/source/blender/pointcache/alembic/abc_particles.h
@@ -147,7 +147,7 @@ public:
        
        void init_abc(Abc::IObject object);
        
-       PTCReadSampleResult read_sample(float frame);
+       PTCReadSampleResult read_sample_abc(float frame);
        
        StrandsChildren *get_result() { return m_strands; }
        StrandsChildren *acquire_result();
@@ -173,7 +173,7 @@ public:
        void init(ReaderArchive *archive);
        void init_abc(Abc::IObject object);
        
-       PTCReadSampleResult read_sample(float frame);
+       PTCReadSampleResult read_sample_abc(float frame);
        
        Strands *acquire_result();
        void discard_result();
diff --git a/source/blender/pointcache/alembic/abc_reader.cpp 
b/source/blender/pointcache/alembic/abc_reader.cpp
index 03bb31d..7f19087 100644
--- a/source/blender/pointcache/alembic/abc_reader.cpp
+++ b/source/blender/pointcache/alembic/abc_reader.cpp
@@ -150,4 +150,17 @@ PTCReadSampleResult AbcReader::test_sample(float frame)
        }
 }
 
+PTCReadSampleResult AbcReader::read_sample(float frame)
+{
+       
+       try {
+               return read_sample_abc(frame);
+       }
+       catch (Alembic::Util::Exception e) {
+               handle_alembic_exception(ErrorHandler::get_default_handler(), 
PTC_ERROR_CRITICAL, e);
+               return PTC_READ_SAMPLE_INVALID;
+       }
+       return P

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to