Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/openvdb/intern/openvdb_reader.cc')
-rw-r--r--intern/openvdb/intern/openvdb_reader.cc136
1 files changed, 136 insertions, 0 deletions
diff --git a/intern/openvdb/intern/openvdb_reader.cc b/intern/openvdb/intern/openvdb_reader.cc
new file mode 100644
index 00000000000..8b15b81710d
--- /dev/null
+++ b/intern/openvdb/intern/openvdb_reader.cc
@@ -0,0 +1,136 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2015 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Kevin Dietrich
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "openvdb_reader.h"
+#include "openvdb_util.h"
+
+OpenVDBReader::OpenVDBReader()
+ : m_meta_map(new openvdb::MetaMap)
+ , m_file(NULL)
+{
+ /* Although it is safe, it may not be good to have this here, could be done
+ * once instead of everytime we read a file. */
+ openvdb::initialize();
+}
+
+OpenVDBReader::~OpenVDBReader()
+{
+ cleanupFile();
+}
+
+void OpenVDBReader::open(const openvdb::Name &filename)
+{
+ cleanupFile();
+
+ try {
+ m_file = new openvdb::io::File(filename);
+ m_file->setCopyMaxBytes(0);
+ m_file->open();
+
+ m_meta_map = m_file->getMetadata();
+ }
+ /* Mostly to catch exceptions related to Blosc not being supported. */
+ catch (const openvdb::IoError &e) {
+ std::cerr << e.what() << '\n';
+ cleanupFile();
+ }
+}
+
+void OpenVDBReader::floatMeta(const openvdb::Name &name, float &value) const
+{
+ try {
+ value = m_meta_map->metaValue<float>(name);
+ }
+ CATCH_KEYERROR;
+}
+
+void OpenVDBReader::intMeta(const openvdb::Name &name, int &value) const
+{
+ try {
+ value = m_meta_map->metaValue<int>(name);
+ }
+ CATCH_KEYERROR;
+}
+
+void OpenVDBReader::vec3sMeta(const openvdb::Name &name, float value[3]) const
+{
+ try {
+ openvdb::Vec3s meta_val = m_meta_map->metaValue<openvdb::Vec3s>(name);
+
+ value[0] = meta_val.x();
+ value[1] = meta_val.y();
+ value[2] = meta_val.z();
+ }
+ CATCH_KEYERROR;
+}
+
+void OpenVDBReader::vec3IMeta(const openvdb::Name &name, int value[3]) const
+{
+ try {
+ openvdb::Vec3i meta_val = m_meta_map->metaValue<openvdb::Vec3i>(name);
+
+ value[0] = meta_val.x();
+ value[1] = meta_val.y();
+ value[2] = meta_val.z();
+ }
+ CATCH_KEYERROR;
+}
+
+void OpenVDBReader::mat4sMeta(const openvdb::Name &name, float value[4][4]) const
+{
+ try {
+ openvdb::Mat4s meta_val = m_meta_map->metaValue<openvdb::Mat4s>(name);
+
+ for (int i = 0; i < 4; ++i) {
+ for (int j = 0; j < 4; ++j) {
+ value[i][j] = meta_val[i][j];
+ }
+ }
+ }
+ CATCH_KEYERROR;
+}
+
+bool OpenVDBReader::hasGrid(const openvdb::Name &name) const
+{
+ return m_file->hasGrid(name);
+}
+
+openvdb::GridBase::Ptr OpenVDBReader::getGrid(const openvdb::Name &name) const
+{
+ return m_file->readGrid(name);
+}
+
+size_t OpenVDBReader::numGrids() const
+{
+ return m_file->getGrids()->size();
+}
+
+void OpenVDBReader::cleanupFile()
+{
+ if (m_file) {
+ m_file->close();
+ delete m_file;
+ }
+}