[Bf-blender-cvs] [7af2df4732] temp-sybren-alembic: FIXUP reinstated GHash *

Sybren A. Stüvel noreply at git.blender.org
Wed Mar 1 17:32:54 CET 2017


Commit: 7af2df47329e9be038c0c884baa17de72678852b
Author: Sybren A. Stüvel
Date:   Wed Mar 1 17:32:48 2017 +0100
Branches: temp-sybren-alembic
https://developer.blender.org/rB7af2df47329e9be038c0c884baa17de72678852b

FIXUP reinstated GHash *

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

M	source/blender/alembic/intern/alembic_capi.cc

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

diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 9d55eabef5..71814ab781 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -376,10 +376,9 @@ void ABC_export(
 
 /* ********************** Import file ********************** */
 
-typedef std::map<std::string, AbcObjectReader *> readers_map_type;
 static int visit_object(const IObject &object,
                          std::vector<AbcObjectReader *> &readers,
-                         readers_map_type & readers_map,
+                         GHash * readers_map,
                          ImportSettings &settings)
 {
 	const std::string & full_name = object.getFullName();
@@ -524,8 +523,13 @@ static int visit_object(const IObject &object,
 		BLI_strncpy(abc_path->path, full_name.c_str(), PATH_MAX);
 		BLI_addtail(&settings.cache_file->object_paths, abc_path);
 
-		BLI_assert(readers_map.find(full_name) == readers_map.end());
-		readers_map[full_name] = reader;
+		/* We have to take a copy of the name, because Alembic can reuse
+		 * memory, for example when dealing with instances. */
+		char * name_copy = static_cast<char *>(MEM_mallocN(
+		                                           full_name.length() + 1,
+		                                           "Alembic readers_map key"));
+		BLI_strncpy(name_copy, full_name.c_str(), full_name.length() + 1);
+		BLI_ghash_insert(readers_map, name_copy, reader);
 	}
 
 	return parent_is_part_of_this_object;
@@ -543,7 +547,7 @@ struct ImportJobData {
 	char filename[1024];
 	ImportSettings settings;
 
-	readers_map_type reader_map;
+	GHash * readers_map;
 	std::vector<AbcObjectReader *> readers;
 
 	short *stop;
@@ -618,10 +622,10 @@ static void import_startjob(void *user_data, short *stop, short *do_update, floa
 	*data->do_update = true;
 	*data->progress = 0.05f;
 
-	data->reader_map.clear();
+	data->readers_map = BLI_ghash_str_new("Alembic readers_map ghash");
 
 	/* Parse Alembic Archive. */
-	visit_object(archive->getTop(), data->readers, data->reader_map, data->settings);
+	visit_object(archive->getTop(), data->readers, data->readers_map, data->settings);
 
 	if (G.is_break) {
 		data->was_cancelled = true;
@@ -691,11 +695,11 @@ static void import_startjob(void *user_data, short *stop, short *do_update, floa
 		IObject alembic_parent = iobject.getParent();
 
 		while (alembic_parent) {
-			readers_map_type::iterator it;
-			it = data->reader_map.find(alembic_parent.getFullName());
-
-			if (it != data->reader_map.end()) {
-				parent_reader = it->second;
+			const char * parent_name = alembic_parent.getFullName().c_str();
+			parent_reader = reinterpret_cast<AbcObjectReader *>(
+			                    BLI_ghash_lookup(data->readers_map,
+			                                     parent_name));
+			if (parent_reader != NULL) {
 				break;  // found the parent reader.
 			}
 
@@ -780,7 +784,9 @@ static void import_endjob(void *user_data)
 		}
 	}
 
-	data->reader_map.clear();
+	if (data->readers_map) {
+		BLI_ghash_free(data->readers_map, MEM_freeN, NULL);
+	}
 
 	switch (data->error_code) {
 		default:
@@ -815,6 +821,7 @@ void ABC_import(bContext *C, const char *filepath, float scale, bool is_sequence
 	job->settings.sequence_len = sequence_len;
 	job->settings.offset = offset;
 	job->settings.validate_meshes = validate_meshes;
+	job->readers_map = NULL;
 	job->error_code = ABC_NO_ERROR;
 	job->was_cancelled = false;




More information about the Bf-blender-cvs mailing list