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