[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