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;

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

Reply via email to