[Bf-blender-cvs] [60e443986e9] new-object-types: Cycles: load OpenVDB grids directly in Cycles (still as dense grid)

Brecht Van Lommel noreply at git.blender.org
Thu Mar 12 12:55:34 CET 2020


Commit: 60e443986e90a8c0ff764d278260cc4e09d4de5b
Author: Brecht Van Lommel
Date:   Wed Mar 11 11:49:11 2020 +0100
Branches: new-object-types
https://developer.blender.org/rB60e443986e90a8c0ff764d278260cc4e09d4de5b

Cycles: load OpenVDB grids directly in Cycles (still as dense grid)

===================================================================

M	intern/cycles/CMakeLists.txt
M	intern/cycles/blender/CMakeLists.txt
M	intern/cycles/blender/blender_util.h
M	intern/cycles/blender/blender_volume.cpp
M	intern/cycles/render/CMakeLists.txt
A	intern/cycles/render/image_vdb.cpp
A	intern/cycles/render/image_vdb.h

===================================================================

diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt
index 6d4d2e38e82..024a94ea437 100644
--- a/intern/cycles/CMakeLists.txt
+++ b/intern/cycles/CMakeLists.txt
@@ -350,17 +350,6 @@ if(WITH_CYCLES_NETWORK)
   add_definitions(-DWITH_NETWORK)
 endif()
 
-if(WITH_OPENCOLORIO)
-  add_definitions(-DWITH_OCIO)
-  include_directories(
-    SYSTEM
-    ${OPENCOLORIO_INCLUDE_DIRS}
-  )
-  if(WIN32)
-    add_definitions(-DOpenColorIO_STATIC)
-  endif()
-endif()
-
 if(WITH_CYCLES_STANDALONE OR WITH_CYCLES_NETWORK OR WITH_CYCLES_CUBIN_COMPILER)
   add_subdirectory(app)
 endif()
diff --git a/intern/cycles/blender/CMakeLists.txt b/intern/cycles/blender/CMakeLists.txt
index b538ed62c65..496e8e9310b 100644
--- a/intern/cycles/blender/CMakeLists.txt
+++ b/intern/cycles/blender/CMakeLists.txt
@@ -96,6 +96,16 @@ if(WITH_NEW_OBJECT_TYPES)
   add_definitions(-DWITH_NEW_OBJECT_TYPES)
 endif()
 
+if(WITH_OPENVDB)
+  add_definitions(-DWITH_OPENVDB ${OPENVDB_DEFINITIONS})
+  list(APPEND INC_SYS
+    ${OPENVDB_INCLUDE_DIRS}
+  )
+  list(APPEND LIB
+    ${OPENVDB_LIBRARIES}
+  )
+endif()
+
 blender_add_lib(bf_intern_cycles "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
 
 # avoid link failure with clang 3.4 debug
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
index ea7b8cd53b0..ad90a5f8d52 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -36,21 +36,6 @@ void BKE_image_user_frame_calc(void *ima, void *iuser, int cfra);
 void BKE_image_user_file_path(void *iuser, void *ima, char *path);
 unsigned char *BKE_image_get_pixels_for_frame(void *image, int frame, int tile);
 float *BKE_image_get_float_pixels_for_frame(void *image, int frame, int tile);
-
-struct VolumeGrid;
-bool BKE_volume_grid_dense_bounds(const Volume *volume,
-                                  VolumeGrid *volume_grid,
-                                  int64_t min[3],
-                                  int64_t max[3]);
-void BKE_volume_grid_dense_transform_matrix(const VolumeGrid *volume_grid,
-                                            const int64_t min[3],
-                                            const int64_t max[3],
-                                            float mat[4][4]);
-void BKE_volume_grid_dense_voxels(const Volume *volume,
-                                  VolumeGrid *volume_grid,
-                                  const int64_t min[3],
-                                  const int64_t max[3],
-                                  float *voxels);
 }
 
 CCL_NAMESPACE_BEGIN
@@ -286,19 +271,6 @@ static inline void render_add_metadata(BL::RenderResult &b_rr, string name, stri
 
 /* Utilities */
 
-static inline Transform get_transform(float mat[4][4])
-{
-  ProjectionTransform projection;
-
-  /* We assume both types to be just 16 floats, and transpose because blender
-   * use column major matrix order while we use row major. */
-  memcpy((void *)&projection, mat, sizeof(float) * 16);
-  projection = projection_transpose(projection);
-
-  /* Drop last row, matrix is assumed to be affine transform. */
-  return projection_to_transform(projection);
-}
-
 static inline Transform get_transform(const BL::Array<float, 16> &array)
 {
   ProjectionTransform projection;
diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp
index f0e0bbe7b3e..ee5b6815d62 100644
--- a/intern/cycles/blender/blender_volume.cpp
+++ b/intern/cycles/blender/blender_volume.cpp
@@ -15,12 +15,20 @@
  */
 
 #include "render/colorspace.h"
+#include "render/image.h"
+#include "render/image_vdb.h"
 #include "render/mesh.h"
 #include "render/object.h"
 
 #include "blender/blender_sync.h"
 #include "blender/blender_util.h"
 
+#ifdef WITH_OPENVDB
+#  include <openvdb/openvdb.h>
+openvdb::GridBase::ConstPtr BKE_volume_grid_openvdb_for_read(const struct Volume *volume,
+                                                             struct VolumeGrid *grid);
+#endif
+
 CCL_NAMESPACE_BEGIN
 
 /* TODO: verify this is not loading unnecessary attributes. */
@@ -211,99 +219,67 @@ static void sync_smoke_volume(Scene *scene, BL::Object &b_ob, Mesh *mesh, float
   }
 }
 
-class BlenderVolumeLoader : public ImageLoader {
+class BlenderVolumeLoader : public VDBImageLoader {
  public:
-  BlenderVolumeLoader(const BL::Volume &b_volume, const string &grid_name)
-      : b_volume(b_volume), grid_name(grid_name), unload(false)
-  {
-  }
-
-  bool load_metadata(ImageMetaData &metadata) override
+  BlenderVolumeLoader(BL::Volume b_volume, const string &grid_name)
+      : VDBImageLoader(grid_name),
+        b_volume(b_volume),
+        b_volume_grid(PointerRNA_NULL),
+        unload(false)
   {
     /* Find grid with matching name. */
     BL::Volume::grids_iterator b_grid_iter;
     for (b_volume.grids.begin(b_grid_iter); b_grid_iter != b_volume.grids.end(); ++b_grid_iter) {
-      BL::VolumeGrid b_grid = *b_grid_iter;
-
-      if (b_grid.name() == grid_name) {
-        Volume *volume = (Volume *)b_volume.ptr.data;
-        VolumeGrid *volume_grid = (VolumeGrid *)b_grid.ptr.data;
-
-        /* Skip grid that we can parse as float channels. */
-        if (b_grid.channels() == 0) {
-          return false;
-        }
-
-        /* Compute grid dimensions. */
-        if (!BKE_volume_grid_dense_bounds(volume, volume_grid, min, max)) {
-          return false;
-        }
-
-        /* Load grid, and free after reading voxels if it wasn't already loaded. */
-        unload = !b_grid.is_loaded();
-
-        /* Set metadata. */
-        metadata.width = max[0] - min[0];
-        metadata.height = max[1] - min[1];
-        metadata.depth = max[2] - min[2];
-        metadata.channels = b_grid.channels();
-
-        if (metadata.channels == 1) {
-          metadata.type = IMAGE_DATA_TYPE_FLOAT;
-        }
-        else {
-          metadata.type = IMAGE_DATA_TYPE_FLOAT4;
-        }
-
-        float mat[4][4];
-        BKE_volume_grid_dense_transform_matrix(volume_grid, min, max, mat);
-        metadata.transform_3d = transform_inverse(get_transform(mat));
-        metadata.use_transform_3d = true;
-        return true;
+      if (b_grid_iter->name() == grid_name) {
+        b_volume_grid = *b_grid_iter;
       }
     }
-
-    return false;
   }
 
-  bool load_pixels(const ImageMetaData &, void *pixels, const size_t, const bool) override
+  bool load_metadata(ImageMetaData &metadata) override
   {
-    /* Find grid with matching name. */
-    BL::Volume::grids_iterator b_grid_iter;
-    for (b_volume.grids.begin(b_grid_iter); b_grid_iter != b_volume.grids.end(); ++b_grid_iter) {
-      BL::VolumeGrid b_grid = *b_grid_iter;
+    if (!b_volume_grid) {
+      return false;
+    }
 
-      if (b_grid.name() == grid_name) {
-        Volume *volume = (Volume *)b_volume.ptr.data;
-        VolumeGrid *volume_grid = (VolumeGrid *)b_grid.ptr.data;
+    unload = !b_volume_grid.is_loaded();
 
-        BKE_volume_grid_dense_voxels(volume, volume_grid, min, max, (float *)pixels);
+    Volume *volume = (Volume *)b_volume.ptr.data;
+    VolumeGrid *volume_grid = (VolumeGrid *)b_volume_grid.ptr.data;
+    grid = BKE_volume_grid_openvdb_for_read(volume, volume_grid);
 
-        if (unload) {
-          b_grid.unload();
-        }
+    return VDBImageLoader::load_metadata(metadata);
+  }
 
-        return true;
-      }
+  bool load_pixels(const ImageMetaData &metadata,
+                   void *pixels,
+                   const size_t pixel_size,
+                   const bool associate_alpha) override
+  {
+    if (!b_volume_grid) {
+      return false;
     }
 
-    return false;
+    return VDBImageLoader::load_pixels(metadata, pixels, pixel_size, associate_alpha);
   }
 
-  string name() const override
+  bool equals(const ImageLoader &other) const override
   {
-    return grid_name;
+    /* TODO: detect multiple volume datablocks with the same filepath. */
+    const BlenderVolumeLoader &other_loader = (const BlenderVolumeLoader &)other;
+    return b_volume == other_loader.b_volume && b_volume_grid == other_loader.b_volume_grid;
   }
 
-  bool equals(const ImageLoader &other) const override
+  void cleanup() override
   {
-    const BlenderVolumeLoader &other_loader = (const BlenderVolumeLoader &)other;
-    return b_volume == other_loader.b_volume && grid_name == other_loader.grid_name;
+    VDBImageLoader::cleanup();
+    if (b_volume_grid && unload) {
+      b_volume_grid.unload();
+    }
   }
 
   BL::Volume b_volume;
-  string grid_name;
-  int64_t min[3], max[3];
+  BL::VolumeGrid b_volume_grid;
   bool unload;
 };
 
diff --git a/intern/cycles/render/CMakeLists.txt b/intern/cycles/render/CMakeLists.txt
index 9922547a8d2..472b5a0c101 100644
--- a/intern/cycles/render/CMakeLists.txt
+++ b/intern/cycles/render/CMakeLists.txt
@@ -24,6 +24,7 @@ set(SRC
   hair.cpp
   image.cpp
   image_oiio.cpp
+  image_vdb.cpp
   integrator.cpp
   jitter.cpp
   light.cpp
@@ -63,6 +64,7 @@ set(SRC_HEADERS
   hair.h
   image.h
   image_oiio.h
+  image_vdb.h
   integrator.h
   light.h
   jitter.h
@@ -98,6 +100,27 @@ if(WITH_CYCLES_OSL)
   SET_PROPERTY(SOURCE osl.cpp PROPERTY COMPILE_FLAGS ${RTTI_DISABLE_FLAGS})
 endif()
 
+if(WITH_OPENCOLORIO)
+  add_definitions(-DWITH_OCIO)
+  include_directories(
+    SYSTEM
+    ${OPENCOLORIO_INCLUDE_DIRS}
+  )
+  if(WIN32)
+    add_definitions(-DOpenColorIO_STATIC)
+  endif()
+endif()
+
+if(WITH_OPENVDB)
+  add_definitions(-DWITH_OPENVDB ${OPENVDB_DEFINITIONS})
+  list(APPEND INC_SYS
+    ${OPENVDB_INCLUDE_DIRS}
+  )
+  list(APPEND LIB
+    ${OPENVDB_LIBRARIES}
+  )
+endif()
+
 include_directories(${INC})
 include_directories(SYSTEM ${INC_SYS})
 
diff --git a/intern/cycles/render/image_vdb.cpp b/intern/cycles/render/image_vdb.cpp
new file mode 100644
index 00000000000..37959150757
--- /dev/null
+++ b/intern/cycles/render/image_vdb.cpp
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2011-2020 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distrib

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list