284fd1ceeaebd205ea730495064b6f0593cb3d78
[blender.git] / intern / openvdb / intern / openvdb_dense_convert.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2015 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Kevin Dietrich
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef __OPENVDB_DENSE_CONVERT_H__
29 #define __OPENVDB_DENSE_CONVERT_H__
30
31 #include "openvdb_reader.h"
32 #include "openvdb_writer.h"
33
34 #include <openvdb/tools/Clip.h>
35 #include <openvdb/tools/Dense.h>
36
37 #include <cstdio>
38
39 #define TOLERANCE 1e-3f
40
41 namespace internal {
42
43 openvdb::Mat4R convertMatrix(const float mat[4][4]);
44
45 template <typename GridType, typename T>
46 GridType *OpenVDB_export_grid(
47         OpenVDBWriter *writer,
48         const openvdb::Name &name,
49         const T *data,
50         const int res[3],
51         float fluid_mat[4][4],
52         const openvdb::FloatGrid *mask)
53 {
54         using namespace openvdb;
55
56         math::CoordBBox bbox(Coord(0), Coord(res[0] - 1, res[1] - 1, res[2] - 1));
57         Mat4R mat = convertMatrix(fluid_mat);
58         math::Transform::Ptr transform = math::Transform::createLinearTransform(mat);
59
60         typename GridType::Ptr grid = GridType::create(T(0));
61
62         tools::Dense<const T, openvdb::tools::LayoutXYZ> dense_grid(bbox, data);
63         tools::copyFromDense(dense_grid, grid->tree(), (T)TOLERANCE);
64
65         grid->setTransform(transform);
66
67         /* Avoid clipping against an empty grid. */
68         if (mask && !mask->tree().empty()) {
69                 grid = tools::clip(*grid, *mask);
70         }
71
72         grid->setName(name);
73         grid->setIsInWorldSpace(false);
74         grid->setVectorType(openvdb::VEC_INVARIANT);
75
76         writer->insert(grid);
77
78         return grid.get();
79 }
80
81 template <typename GridType, typename T>
82 void OpenVDB_import_grid(
83         OpenVDBReader *reader,
84         const openvdb::Name &name,
85         T **data,
86         const int res[3])
87 {
88         using namespace openvdb;
89
90         if (!reader->hasGrid(name)) {
91                 std::fprintf(stderr, "OpenVDB grid %s not found in file!\n", name.c_str());
92                 memset(*data, 0, sizeof(T) * res[0] * res[1] * res[2]);
93                 return;
94         }
95
96         typename GridType::Ptr grid = gridPtrCast<GridType>(reader->getGrid(name));
97         typename GridType::ConstAccessor acc = grid->getConstAccessor();
98
99         math::Coord xyz;
100         int &x = xyz[0], &y = xyz[1], &z = xyz[2];
101
102         size_t index = 0;
103         for (z = 0; z < res[2]; ++z) {
104                 for (y = 0; y < res[1]; ++y) {
105                         for (x = 0; x < res[0]; ++x, ++index) {
106                                 (*data)[index] = acc.getValue(xyz);
107                         }
108                 }
109         }
110 }
111
112 openvdb::GridBase *OpenVDB_export_vector_grid(
113         OpenVDBWriter *writer,
114         const openvdb::Name &name,
115         const float *data_x, const float *data_y, const float *data_z,
116         const int res[3],
117         float fluid_mat[4][4],
118         openvdb::VecType vec_type,
119         const bool is_color,
120         const openvdb::FloatGrid *mask);
121
122
123 void OpenVDB_import_grid_vector(
124         OpenVDBReader *reader,
125         const openvdb::Name &name,
126         float **data_x, float **data_y, float **data_z,
127         const int res[3]);
128
129 }  /* namespace internal */
130
131 #endif /* __OPENVDB_DENSE_CONVERT_H__ */