Commit: deeb09a5cbc340a314f4f3d5ed680745d2064a20
Author: Lukas Tönne
Date:   Tue Feb 17 13:40:00 2015 +0100
Branches: alembic_pointcache
https://developer.blender.org/rBdeeb09a5cbc340a314f4f3d5ed680745d2064a20

Sanity checks for Alembic archive validity to avoid crashes when trying
an invalid file operation (e.g. overwriting files).

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

M       source/blender/pointcache/alembic/abc_cloth.cpp
M       source/blender/pointcache/alembic/abc_dynamicpaint.cpp
M       source/blender/pointcache/alembic/abc_mesh.cpp
M       source/blender/pointcache/alembic/abc_particles.cpp
M       source/blender/pointcache/alembic/abc_rigidbody.cpp
M       source/blender/pointcache/alembic/abc_smoke.cpp
M       source/blender/pointcache/alembic/abc_softbody.cpp

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

diff --git a/source/blender/pointcache/alembic/abc_cloth.cpp 
b/source/blender/pointcache/alembic/abc_cloth.cpp
index e3f3951..67fd42e 100644
--- a/source/blender/pointcache/alembic/abc_cloth.cpp
+++ b/source/blender/pointcache/alembic/abc_cloth.cpp
@@ -43,14 +43,16 @@ AbcClothWriter::AbcClothWriter(Scene *scene, Object *ob, 
ClothModifierData *clmd
 {
        set_error_handler(new ModifierErrorHandler(&clmd->modifier));
        
-       OObject root = m_archive.archive.getTop();
-       m_points = OPoints(root, m_clmd->modifier.name, 
m_archive.frame_sampling_index());
-       
-       OPointsSchema &schema = m_points.getSchema();
-       OCompoundProperty geom_params = schema.getArbGeomParams();
-       
-       m_param_velocities = OV3fGeomParam(geom_params, "velocities", false, 
kVaryingScope, 1, 0);
-       m_param_goal_positions = OP3fGeomParam(geom_params, "goal_positions", 
false, kVaryingScope, 1, 0);
+       if (m_archive.archive) {
+               OObject root = m_archive.archive.getTop();
+               m_points = OPoints(root, m_clmd->modifier.name, 
m_archive.frame_sampling_index());
+               
+               OPointsSchema &schema = m_points.getSchema();
+               OCompoundProperty geom_params = schema.getArbGeomParams();
+               
+               m_param_velocities = OV3fGeomParam(geom_params, "velocities", 
false, kVaryingScope, 1, 0);
+               m_param_goal_positions = OP3fGeomParam(geom_params, 
"goal_positions", false, kVaryingScope, 1, 0);
+       }
 }
 
 AbcClothWriter::~AbcClothWriter()
@@ -87,6 +89,9 @@ static P3fArraySample create_sample_goal_positions(Cloth 
*cloth, std::vector<V3f
 
 void AbcClothWriter::write_sample()
 {
+       if (!m_archive.archive)
+               return;
+       
        Cloth *cloth = m_clmd->clothObject;
        if (!cloth)
                return;
diff --git a/source/blender/pointcache/alembic/abc_dynamicpaint.cpp 
b/source/blender/pointcache/alembic/abc_dynamicpaint.cpp
index aa9d928..49ae62b 100644
--- a/source/blender/pointcache/alembic/abc_dynamicpaint.cpp
+++ b/source/blender/pointcache/alembic/abc_dynamicpaint.cpp
@@ -36,6 +36,8 @@ AbcDynamicPaintWriter::AbcDynamicPaintWriter(Scene *scene, 
Object *ob, DynamicPa
     DynamicPaintWriter(scene, ob, surface, &m_archive),
     m_archive(scene, &ob->id, surface->pointcache, m_error_handler)
 {
+       if (m_archive.archive) {
+       }
 }
 
 AbcDynamicPaintWriter::~AbcDynamicPaintWriter()
@@ -44,6 +46,8 @@ AbcDynamicPaintWriter::~AbcDynamicPaintWriter()
 
 void AbcDynamicPaintWriter::write_sample()
 {
+       if (!m_archive.archive)
+               return;
 }
 
 
diff --git a/source/blender/pointcache/alembic/abc_mesh.cpp 
b/source/blender/pointcache/alembic/abc_mesh.cpp
index 78587e2..8183087 100644
--- a/source/blender/pointcache/alembic/abc_mesh.cpp
+++ b/source/blender/pointcache/alembic/abc_mesh.cpp
@@ -50,18 +50,20 @@ AbcPointCacheWriter::AbcPointCacheWriter(Scene *scene, 
Object *ob, PointCacheMod
 {
        set_error_handler(new ModifierErrorHandler(&pcmd->modifier));
        
-       OObject root = m_archive.archive.getTop();
-       m_mesh = OPolyMesh(root, m_pcmd->modifier.name, 
m_archive.frame_sampling_index());
-       
-       OPolyMeshSchema &schema = m_mesh.getSchema();
-       OCompoundProperty geom_props = schema.getArbGeomParams();
-       OCompoundProperty user_props = schema.getUserProperties();
-       
-       m_param_smooth = OBoolGeomParam(geom_props, "smooth", false, 
kUniformScope, 1, 0);
-       m_prop_edges = OInt32ArrayProperty(user_props, "edges", 0);
-       m_prop_edges_index = OInt32ArrayProperty(user_props, "edges_index", 0);
-       m_param_poly_normals = ON3fGeomParam(geom_props, "poly_normals", false, 
kUniformScope, 1, 0);
-       m_param_vertex_normals = ON3fGeomParam(geom_props, "vertex_normals", 
false, kVertexScope, 1, 0);
+       if (m_archive.archive) {
+               OObject root = m_archive.archive.getTop();
+               m_mesh = OPolyMesh(root, m_pcmd->modifier.name, 
m_archive.frame_sampling_index());
+               
+               OPolyMeshSchema &schema = m_mesh.getSchema();
+               OCompoundProperty geom_props = schema.getArbGeomParams();
+               OCompoundProperty user_props = schema.getUserProperties();
+               
+               m_param_smooth = OBoolGeomParam(geom_props, "smooth", false, 
kUniformScope, 1, 0);
+               m_prop_edges = OInt32ArrayProperty(user_props, "edges", 0);
+               m_prop_edges_index = OInt32ArrayProperty(user_props, 
"edges_index", 0);
+               m_param_poly_normals = ON3fGeomParam(geom_props, 
"poly_normals", false, kUniformScope, 1, 0);
+               m_param_vertex_normals = ON3fGeomParam(geom_props, 
"vertex_normals", false, kVertexScope, 1, 0);
+       }
 }
 
 AbcPointCacheWriter::~AbcPointCacheWriter()
@@ -233,6 +235,9 @@ static N3fArraySample 
create_sample_vertex_normals(DerivedMesh *dm, std::vector<
 
 void AbcPointCacheWriter::write_sample()
 {
+       if (!m_archive.archive)
+               return;
+       
        DerivedMesh *output_dm = m_pcmd->output_dm;
        if (!output_dm)
                return;
diff --git a/source/blender/pointcache/alembic/abc_particles.cpp 
b/source/blender/pointcache/alembic/abc_particles.cpp
index 6952d5f..a647864 100644
--- a/source/blender/pointcache/alembic/abc_particles.cpp
+++ b/source/blender/pointcache/alembic/abc_particles.cpp
@@ -41,8 +41,10 @@ AbcParticlesWriter::AbcParticlesWriter(Scene *scene, Object 
*ob, ParticleSystem
     ParticlesWriter(scene, ob, psys, &m_archive),
     m_archive(scene, &ob->id, psys->pointcache, m_error_handler)
 {
-       OObject root = m_archive.archive.getTop();
-       m_points = OPoints(root, m_psys->name, 
m_archive.frame_sampling_index());
+       if (m_archive.archive) {
+               OObject root = m_archive.archive.getTop();
+               m_points = OPoints(root, m_psys->name, 
m_archive.frame_sampling_index());
+       }
 }
 
 AbcParticlesWriter::~AbcParticlesWriter()
@@ -51,6 +53,9 @@ AbcParticlesWriter::~AbcParticlesWriter()
 
 void AbcParticlesWriter::write_sample()
 {
+       if (!m_archive.archive)
+               return;
+       
        OPointsSchema &schema = m_points.getSchema();
        
        int totpart = m_psys->totpart;
@@ -128,10 +133,12 @@ AbcParticlePathsWriter::AbcParticlePathsWriter(Scene 
*scene, Object *ob, Particl
     m_archive(NULL)
 {
 #if 0
-       OObject root = m_archive.archive.getTop();
-       /* XXX non-escaped string construction here ... */
-       m_parent_curves = OCurves(root, std::string(m_psys->name) + 
"__parent_paths", m_archive.frame_sampling_index());
-       m_child_curves = OCurves(root, std::string(m_psys->name) + 
"__child_paths", m_archive.frame_sampling_index());
+       if (m_archive->archive) {
+               OObject root = m_archive.archive.getTop();
+               /* XXX non-escaped string construction here ... */
+               m_parent_curves = OCurves(root, std::string(m_psys->name) + 
"__parent_paths", m_archive.frame_sampling_index());
+               m_child_curves = OCurves(root, std::string(m_psys->name) + 
"__child_paths", m_archive.frame_sampling_index());
+       }
 #endif
 }
 
@@ -291,6 +298,8 @@ static OFloatGeomParam::Sample 
paths_create_sample_times(ParticleCacheKey **path
 
 void AbcParticlePathsWriter::write_sample()
 {
+       if (!m_archive->archive)
+               return;
        if (!(*m_pathcache))
                return;
        
diff --git a/source/blender/pointcache/alembic/abc_rigidbody.cpp 
b/source/blender/pointcache/alembic/abc_rigidbody.cpp
index 2cc4c24..8f9f711 100644
--- a/source/blender/pointcache/alembic/abc_rigidbody.cpp
+++ b/source/blender/pointcache/alembic/abc_rigidbody.cpp
@@ -36,6 +36,8 @@ AbcRigidBodyWriter::AbcRigidBodyWriter(Scene *scene, 
RigidBodyWorld *rbw) :
     RigidBodyWriter(scene, rbw, &m_archive),
     m_archive(scene, &scene->id, rbw->pointcache, m_error_handler)
 {
+       if (m_archive.archive) {
+       }
 }
 
 AbcRigidBodyWriter::~AbcRigidBodyWriter()
@@ -44,6 +46,8 @@ AbcRigidBodyWriter::~AbcRigidBodyWriter()
 
 void AbcRigidBodyWriter::write_sample()
 {
+       if (!m_archive.archive)
+               return;
 }
 
 
diff --git a/source/blender/pointcache/alembic/abc_smoke.cpp 
b/source/blender/pointcache/alembic/abc_smoke.cpp
index af0f491..c03f18b 100644
--- a/source/blender/pointcache/alembic/abc_smoke.cpp
+++ b/source/blender/pointcache/alembic/abc_smoke.cpp
@@ -36,8 +36,10 @@ AbcSmokeWriter::AbcSmokeWriter(Scene *scene, Object *ob, 
SmokeDomainSettings *do
     SmokeWriter(scene, ob, domain, &m_archive),
     m_archive(scene, &ob->id, domain->point_cache[0], m_error_handler)
 {
-       OObject root = m_archive.archive.getTop();
-//     m_points = OPoints(root, m_psys->name, 
m_archive.frame_sampling_index());
+       if (m_archive.archive) {
+//             OObject root = m_archive.archive.getTop();
+//             m_points = OPoints(root, m_psys->name, 
m_archive.frame_sampling_index());
+       }
 }
 
 AbcSmokeWriter::~AbcSmokeWriter()
@@ -46,6 +48,8 @@ AbcSmokeWriter::~AbcSmokeWriter()
 
 void AbcSmokeWriter::write_sample()
 {
+       if (!m_archive.archive)
+               return;
 }
 
 
diff --git a/source/blender/pointcache/alembic/abc_softbody.cpp 
b/source/blender/pointcache/alembic/abc_softbody.cpp
index 138f62f..f824206 100644
--- a/source/blender/pointcache/alembic/abc_softbody.cpp
+++ b/source/blender/pointcache/alembic/abc_softbody.cpp
@@ -36,8 +36,10 @@ AbcSoftBodyWriter::AbcSoftBodyWriter(Scene *scene, Object 
*ob, SoftBody *softbod
     SoftBodyWriter(scene, ob, softbody, &m_archive),
     m_archive(scene, &ob->id, softbody->pointcache, m_error_handler)
 {
-       OObject root = m_archive.archive.getTop();
-//     m_points = OPoints(root, m_psys->name, 
m_archive.frame_sampling_index());
+       if (m_archive.archive) {
+//             OObject root = m_archive.archive.getTop();
+//             m_points = OPoints(root, m_psys->name, 
m_archive.frame_sampling_index());
+       }
 }
 
 AbcSoftBodyWriter::~AbcSoftBodyWriter()
@@ -46,6 +48,8 @@ AbcSoftBodyWriter::~AbcSoftBodyWriter()
 
 void AbcSoftBodyWriter::write_sample()
 {
+       if (!m_archive.archive)
+               return;
 }

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

Reply via email to