[Bf-blender-cvs] [7351253] alembic_basic_io: Prevent misusage of object path property, display an error in the modifier UI if necessary.

Kévin Dietrich noreply at git.blender.org
Tue Jul 12 16:04:03 CEST 2016


Commit: 7351253064d96f12df07a477108f416d581a970d
Author: Kévin Dietrich
Date:   Tue Jul 12 11:44:33 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB7351253064d96f12df07a477108f416d581a970d

Prevent misusage of object path property, display an error in the
modifier UI if necessary.

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

M	source/blender/alembic/ABC_alembic.h
M	source/blender/alembic/intern/alembic_capi.cc
M	source/blender/modifiers/intern/MOD_meshsequencecache.c

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

diff --git a/source/blender/alembic/ABC_alembic.h b/source/blender/alembic/ABC_alembic.h
index f1ba6c3..940793f 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -89,7 +89,8 @@ struct DerivedMesh *ABC_read_mesh(AbcArchiveHandle *handle,
                                   struct Object *ob,
                                   struct DerivedMesh *dm,
                                   const char *object_path,
-                                  const float time);
+                                  const float time,
+                                  const char **err_str);
 
 bool ABC_has_velocity_cache(AbcArchiveHandle *handle, const char *object_path, const float time);
 void ABC_get_velocity_cache(AbcArchiveHandle *handle, const char *object_path, float *values, float time);
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 97d9c18..f4d956e 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -981,33 +981,56 @@ static DerivedMesh *read_curves_sample(Object *ob, const IObject &iobject, const
 	return CDDM_from_curve(ob);
 }
 
-DerivedMesh *ABC_read_mesh(AbcArchiveHandle *handle, Object *ob, DerivedMesh *dm, const char *object_path, const float time)
+DerivedMesh *ABC_read_mesh(AbcArchiveHandle *handle,
+                           Object *ob,
+                           DerivedMesh *dm,
+                           const char *object_path,
+                           const float time,
+                           const char **err_str)
 {
 	IArchive *archive = archive_from_handle(handle);
 
 	if (!archive || !archive->valid()) {
-		return dm;
+		*err_str = "Invalid archive!";
+		return NULL;
 	}
 
 	IObject iobject;
 	find_iobject(archive->getTop(), iobject, object_path);
 
 	if (!iobject.valid()) {
+		*err_str = "Invalid object: verify object path";
 		return NULL;
 	}
 
 	const ObjectHeader &header = iobject.getHeader();
 
 	if (IPolyMesh::matches(header)) {
+		if (ob->type != OB_MESH) {
+			*err_str = "Object type mismatch: object path points to a mesh!";
+			return NULL;
+		}
+
 		return read_mesh_sample(dm, iobject, time);
 	}
 	else if (IPoints::matches(header)) {
+		if (ob->type != OB_MESH) {
+			*err_str = "Object type mismatch: object path points to a point cloud (requires a mesh object)!";
+			return NULL;
+		}
+
 		return read_points_sample(dm, iobject, time);
 	}
 	else if (ICurves::matches(header)) {
+		if (ob->type != OB_CURVE) {
+			*err_str = "Object type mismatch: object path points to a curve!";
+			return NULL;
+		}
+
 		return read_curves_sample(ob, iobject, time);
 	}
 
+	*err_str = "Unsupported object type: verify object path"; // or poke developer
 	return NULL;
 }
 
diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c b/source/blender/modifiers/intern/MOD_meshsequencecache.c
index d44ccff..d088ce0 100644
--- a/source/blender/modifiers/intern/MOD_meshsequencecache.c
+++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c
@@ -93,11 +93,18 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	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;
+
 	DerivedMesh *result = ABC_read_mesh(mcmd->cache_file->handle,
 	                                    ob,
 	                                    dm,
 	                                    mcmd->abc_object_path,
-	                                    time);
+	                                    time,
+	                                    &err_str);
+
+	if (err_str) {
+		modifier_setError(md, "%s", err_str);
+	}
 
 	return result ? result : dm;
 	UNUSED_VARS(flag);




More information about the Bf-blender-cvs mailing list