[Bf-blender-cvs] [3f941ab] openvdb: Somewhat improve behaviour of the vdb file reader:

Kévin Dietrich noreply at git.blender.org
Sun Jun 7 11:38:52 CEST 2015


Commit: 3f941ab8f55a4f4dc2648988302d44184cf405d9
Author: Kévin Dietrich
Date:   Sun Jun 7 04:29:50 2015 +0200
Branches: openvdb
https://developer.blender.org/rB3f941ab8f55a4f4dc2648988302d44184cf405d9

Somewhat improve behaviour of the vdb file reader:

- it now stores a pointer to an io::File to avoid deleting and
reallocating the reader itself for each frame when importing.
- if a file is inder 10 Mb a private copy of it should be made by VDB to
ensure it is not modified while reading. This could become a user
setting at some point.

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

M	intern/openvdb/intern/openvdb_reader.cpp
M	intern/openvdb/intern/openvdb_reader.h
M	intern/openvdb/openvdb_capi.cpp
M	intern/openvdb/openvdb_capi.h
M	source/blender/blenkernel/intern/smoke.c

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

diff --git a/intern/openvdb/intern/openvdb_reader.cpp b/intern/openvdb/intern/openvdb_reader.cpp
index d9a4f53..1ed080e 100644
--- a/intern/openvdb/intern/openvdb_reader.cpp
+++ b/intern/openvdb/intern/openvdb_reader.cpp
@@ -25,18 +25,37 @@
 
 #include "openvdb_reader.h"
 
-OpenVDBReader::OpenVDBReader(const std::string &filename)
-    : m_file(filename)
+#define COPY_MAX_BYTES 10485760 /* 10 Mb */
+
+OpenVDBReader::OpenVDBReader()
+    : m_meta_map(new openvdb::MetaMap)
 {
 	/* Although it is safe, it may not be good to have this here... */
 	openvdb::initialize();
-
-	m_file.open();
-	m_meta_map = m_file.getMetadata();
+	m_file = NULL;
 }
 
 OpenVDBReader::~OpenVDBReader()
-{}
+{
+	if (m_file) {
+		m_file->close();
+		delete m_file;
+	}
+}
+
+void OpenVDBReader::open(const std::string &filename)
+{
+	if (m_file) {
+		m_file->close();
+		delete m_file;
+	}
+
+	m_file = new openvdb::io::File(filename);
+	m_file->setCopyMaxBytes(COPY_MAX_BYTES);
+	m_file->open();
+
+	m_meta_map = m_file->getMetadata();
+}
 
 void OpenVDBReader::floatMeta(const std::string &name, float &value)
 {
@@ -79,10 +98,10 @@ void OpenVDBReader::mat4sMeta(const std::string &name, float value[4][4])
 
 openvdb::GridBase::Ptr OpenVDBReader::getGrid(const std::string &name)
 {
-	return m_file.readGrid(name);
+	return m_file->readGrid(name);
 }
 
 size_t OpenVDBReader::numGrids() const
 {
-	return m_file.getGrids()->size();
+	return m_file->getGrids()->size();
 }
diff --git a/intern/openvdb/intern/openvdb_reader.h b/intern/openvdb/intern/openvdb_reader.h
index f90dcd2..ae79b63 100644
--- a/intern/openvdb/intern/openvdb_reader.h
+++ b/intern/openvdb/intern/openvdb_reader.h
@@ -28,23 +28,15 @@
 
 #include <openvdb/openvdb.h>
 
-class OpenVDBFile {
-	openvdb::io::File m_file;
-
-public:
-	OpenVDBFile(const std::string &name);
-	openvdb::MetaMap::Ptr metamap() const;
-};
-
 class OpenVDBReader {
 	openvdb::MetaMap::Ptr m_meta_map;
-	openvdb::io::File m_file;
+	openvdb::io::File *m_file;
 
 public:
-	OpenVDBReader(const std::string &filename);
+	OpenVDBReader();
 	~OpenVDBReader();
 
-	void read(const std::string &filename);
+	void open(const std::string &filename);
 
 	void floatMeta(const std::string &name, float &value);
 	void intMeta(const std::string &name, int &value);
diff --git a/intern/openvdb/openvdb_capi.cpp b/intern/openvdb/openvdb_capi.cpp
index 3e30c31..9fa3f5b 100644
--- a/intern/openvdb/openvdb_capi.cpp
+++ b/intern/openvdb/openvdb_capi.cpp
@@ -203,9 +203,9 @@ void OpenVDBWriter_write(OpenVDBWriter *writer, const char *filename)
 	writer->write(filename);
 }
 
-OpenVDBReader *OpenVDBReader_create(const char *filename)
+OpenVDBReader *OpenVDBReader_create()
 {
-	return new OpenVDBReader(filename);
+	return new OpenVDBReader();
 }
 
 void OpenVDBReader_free(OpenVDBReader *reader)
@@ -214,6 +214,11 @@ void OpenVDBReader_free(OpenVDBReader *reader)
 	reader = NULL;
 }
 
+void OpenVDBReader_open(OpenVDBReader *reader, const char *filename)
+{
+	reader->open(filename);
+}
+
 void OpenVDBReader_get_meta_fl(OpenVDBReader *reader, const char *name, float *value)
 {
 	reader->floatMeta(name, *value);
diff --git a/intern/openvdb/openvdb_capi.h b/intern/openvdb/openvdb_capi.h
index 63ec534..077d806 100644
--- a/intern/openvdb/openvdb_capi.h
+++ b/intern/openvdb/openvdb_capi.h
@@ -107,8 +107,9 @@ void OpenVDBWriter_add_meta_v3_int(struct OpenVDBWriter *writer, const char *nam
 void OpenVDBWriter_add_meta_mat4(struct OpenVDBWriter *writer, const char *name, float value[4][4]);
 void OpenVDBWriter_write(struct OpenVDBWriter *writer, const char *filename);
 
-struct OpenVDBReader *OpenVDBReader_create(const char *filename);
+struct OpenVDBReader *OpenVDBReader_create(void);
 void OpenVDBReader_free(struct OpenVDBReader *reader);
+void OpenVDBReader_open(struct OpenVDBReader *reader, const char *filename);
 void OpenVDBReader_get_meta_fl(struct OpenVDBReader *reader, const char *name, float *value);
 void OpenVDBReader_get_meta_int(struct OpenVDBReader *reader, const char *name, int *value);
 void OpenVDBReader_get_meta_v3(struct OpenVDBReader *reader, const char *name, float value[3]);
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index f15fb01..bc013de 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -402,6 +402,7 @@ static void smokeModifier_freeDomain(SmokeModifierData *smd)
 		while ((cache = BLI_pophead(&(smd->domain->vdb_caches)))) {
 #ifdef WITH_OPENVDB
 			OpenVDBWriter_free(cache->writer);
+			OpenVDBReader_free(cache->reader);
 #endif
 			MEM_freeN(cache);
 		}
@@ -3400,17 +3401,17 @@ void smokeModifier_OpenVDB_import(SmokeModifierData *smd, Scene *scene, Object *
 		return;
 	}
 
+	if (cache->reader == NULL) {
+		cache->reader = OpenVDBReader_create();
+	}
+
 	for_display = true;
 
 	BKE_openvdb_cache_filename(filename, cache->path, cache->name, relbase, CFRA);
-	cache->reader = OpenVDBReader_create(filename);
-
+	OpenVDBReader_open(cache->reader, filename);
 	OpenVDB_read_fluid_settings(sds, cache->reader);
 	OpenVDB_import_smoke(sds, cache->reader, for_display);
 
-	/* XXX */
-	OpenVDBReader_free(cache->reader);
-
 	if (ret == OPENVDB_IO_ERROR) {
 		/* TODO(kevin): report error "OpenVDB import error, see console for details" */
 		return;




More information about the Bf-blender-cvs mailing list