[Bf-blender-cvs] [8dcffc0] alembic: Use a wrapper around alembic read_sample function calls, to catch Alembic exceptions and prevent crashing.

Lukas Tönne noreply at git.blender.org
Fri Apr 24 17:36:16 CEST 2015


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




More information about the Bf-blender-cvs mailing list