[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