diff options
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/alembic.cpp | 24 | ||||
-rw-r--r-- | intern/cycles/render/alembic.h | 16 | ||||
-rw-r--r-- | intern/cycles/render/background.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/render/geometry.cpp | 1 | ||||
-rw-r--r-- | intern/cycles/render/image.cpp | 18 | ||||
-rw-r--r-- | intern/cycles/render/image.h | 12 | ||||
-rw-r--r-- | intern/cycles/render/image_oiio.cpp | 4 | ||||
-rw-r--r-- | intern/cycles/render/image_oiio.h | 2 | ||||
-rw-r--r-- | intern/cycles/render/image_sky.cpp | 2 | ||||
-rw-r--r-- | intern/cycles/render/image_sky.h | 2 | ||||
-rw-r--r-- | intern/cycles/render/image_vdb.cpp | 175 | ||||
-rw-r--r-- | intern/cycles/render/image_vdb.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/object.cpp | 4 |
13 files changed, 170 insertions, 101 deletions
diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp index 1336f81896a..c3a7b20f512 100644 --- a/intern/cycles/render/alembic.cpp +++ b/intern/cycles/render/alembic.cpp @@ -1407,6 +1407,15 @@ void AlembicProcedural::generate(Scene *scene, Progress &progress) need_data_updates = true; } + /* Check if the shaders were modified. */ + if (object->used_shaders_is_modified() && object->get_object() && + object->get_object()->get_geometry()) { + Geometry *geometry = object->get_object()->get_geometry(); + array<Node *> used_shaders = object->get_used_shaders(); + geometry->set_used_shaders(used_shaders); + need_shader_updates = true; + } + /* Check for changes in shaders (e.g. newly requested attributes). */ foreach (Node *shader_node, object->get_used_shaders()) { Shader *shader = static_cast<Shader *>(shader_node); @@ -1586,6 +1595,11 @@ void AlembicProcedural::read_mesh(AlembicObject *abc_object, Abc::chrono_t frame Mesh *mesh = static_cast<Mesh *>(object->get_geometry()); + /* Make sure shader ids are also updated. */ + if (mesh->used_shaders_is_modified()) { + mesh->tag_shader_modified(); + } + cached_data.vertices.copy_to_socket(frame_time, mesh, mesh->get_verts_socket()); cached_data.shader.copy_to_socket(frame_time, mesh, mesh->get_shader_socket()); @@ -1653,6 +1667,11 @@ void AlembicProcedural::read_subd(AlembicObject *abc_object, Abc::chrono_t frame Mesh *mesh = static_cast<Mesh *>(object->get_geometry()); + /* Make sure shader ids are also updated. */ + if (mesh->used_shaders_is_modified()) { + mesh->tag_shader_modified(); + } + /* Cycles overwrites the original triangles when computing displacement, so we always have to * repass the data if something is animated (vertices most likely) to avoid buffer overflows. */ if (!cached_data.is_constant()) { @@ -1743,6 +1762,11 @@ void AlembicProcedural::read_curves(AlembicObject *abc_object, Abc::chrono_t fra Hair *hair = static_cast<Hair *>(object->get_geometry()); + /* Make sure shader ids are also updated. */ + if (hair->used_shaders_is_modified()) { + hair->tag_curve_shader_modified(); + } + cached_data.curve_keys.copy_to_socket(frame_time, hair, hair->get_curve_keys_socket()); cached_data.curve_radius.copy_to_socket(frame_time, hair, hair->get_curve_radius_socket()); diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h index d0c5856a353..3bbd10fad61 100644 --- a/intern/cycles/render/alembic.h +++ b/intern/cycles/render/alembic.h @@ -239,6 +239,7 @@ template<typename T> class DataStore { { invalidate_last_loaded_time(); data.clear(); + index_data_map.clear(); } void invalidate_last_loaded_time() @@ -480,16 +481,23 @@ class AlembicProcedural : public Procedural { * invocation, and updates the data on subsequent invocations if the frame changed. */ void generate(Scene *scene, Progress &progress); - /* Add an object to our list of objects, and tag the socket as modified. */ - void add_object(AlembicObject *object); - /* Tag for an update only if something was modified. */ void tag_update(Scene *scene); - /* Returns a pointer to an existing or a newly created AlembicObject for the given path. */ + /* This should be called by scene exporters to request the rendering of an object located + * in the Alembic archive at the given path. + * + * Since we lazily load object, the function does not validate the existence of the object + * in the archive. If no objects with such path if found in the archive during the next call + * to `generate`, it will be ignored. + * + * Returns a pointer to an existing or a newly created AlembicObject for the given path. */ AlembicObject *get_or_create_object(const ustring &path); private: + /* Add an object to our list of objects, and tag the socket as modified. */ + void add_object(AlembicObject *object); + /* Load the data for all the objects whose data has not yet been loaded. */ void load_objects(Progress &progress); diff --git a/intern/cycles/render/background.cpp b/intern/cycles/render/background.cpp index b3d383afae4..f0a779da012 100644 --- a/intern/cycles/render/background.cpp +++ b/intern/cycles/render/background.cpp @@ -130,6 +130,14 @@ void Background::device_free(Device * /*device*/, DeviceScene * /*dscene*/) void Background::tag_update(Scene *scene) { + Shader *bg_shader = get_shader(scene); + if (bg_shader && bg_shader->is_modified()) { + /* Tag as modified to update the KernelBackground visibility information. + * We only tag the use_shader socket as modified as it is related to the shader + * and to avoid doing unnecessary updates anywhere else. */ + tag_use_shader_modified(); + } + if (ao_factor_is_modified() || use_ao_is_modified()) { scene->integrator->tag_update(scene, Integrator::BACKGROUND_AO_MODIFIED); } diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp index 124a41db21e..8b0c0d94155 100644 --- a/intern/cycles/render/geometry.cpp +++ b/intern/cycles/render/geometry.cpp @@ -1584,7 +1584,6 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro dscene->tri_vnormal.tag_realloc(); dscene->tri_vindex.tag_realloc(); dscene->tri_patch.tag_realloc(); - dscene->tri_vnormal.tag_realloc(); dscene->tri_patch_uv.tag_realloc(); dscene->tri_shader.tag_realloc(); dscene->patches.tag_realloc(); diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index 29a95beaf7e..27f9b7df1dd 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -303,7 +303,8 @@ ImageManager::ImageManager(const DeviceInfo &info) animation_frame = 0; /* Set image limits */ - has_half_images = info.has_half_images; + features.has_half_float = info.has_half_images; + features.has_nanovdb = info.has_nanovdb; } ImageManager::~ImageManager() @@ -347,7 +348,7 @@ void ImageManager::load_image_metadata(Image *img) metadata = ImageMetaData(); metadata.colorspace = img->params.colorspace; - if (img->loader->load_metadata(metadata)) { + if (img->loader->load_metadata(features, metadata)) { assert(metadata.type != IMAGE_DATA_NUM_TYPES); } else { @@ -356,15 +357,10 @@ void ImageManager::load_image_metadata(Image *img) metadata.detect_colorspace(); - /* No half textures on OpenCL, use full float instead. */ - if (!has_half_images) { - if (metadata.type == IMAGE_DATA_TYPE_HALF4) { - metadata.type = IMAGE_DATA_TYPE_FLOAT4; - } - else if (metadata.type == IMAGE_DATA_TYPE_HALF) { - metadata.type = IMAGE_DATA_TYPE_FLOAT; - } - } + assert(features.has_half_float || + (metadata.type != IMAGE_DATA_TYPE_HALF4 && metadata.type != IMAGE_DATA_TYPE_HALF)); + assert(features.has_nanovdb || (metadata.type != IMAGE_DATA_TYPE_NANOVDB_FLOAT || + metadata.type != IMAGE_DATA_TYPE_NANOVDB_FLOAT3)); img->need_metadata = false; } diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h index c802521db56..dede9513d5f 100644 --- a/intern/cycles/render/image.h +++ b/intern/cycles/render/image.h @@ -97,6 +97,13 @@ class ImageMetaData { void detect_colorspace(); }; +/* Information about supported features that Image loaders can use. */ +class ImageDeviceFeatures { + public: + bool has_half_float; + bool has_nanovdb; +}; + /* Image loader base class, that can be subclassed to load image data * from custom sources (file, memory, procedurally generated, etc). */ class ImageLoader { @@ -105,7 +112,7 @@ class ImageLoader { virtual ~ImageLoader(){}; /* Load metadata without actual image yet, should be fast. */ - virtual bool load_metadata(ImageMetaData &metadata) = 0; + virtual bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) = 0; /* Load actual image contents. */ virtual bool load_pixels(const ImageMetaData &metadata, @@ -212,7 +219,8 @@ class ImageManager { private: bool need_update_; - bool has_half_images; + + ImageDeviceFeatures features; thread_mutex device_mutex; thread_mutex images_mutex; diff --git a/intern/cycles/render/image_oiio.cpp b/intern/cycles/render/image_oiio.cpp index e9c87461822..4867efe6ac0 100644 --- a/intern/cycles/render/image_oiio.cpp +++ b/intern/cycles/render/image_oiio.cpp @@ -30,7 +30,7 @@ OIIOImageLoader::~OIIOImageLoader() { } -bool OIIOImageLoader::load_metadata(ImageMetaData &metadata) +bool OIIOImageLoader::load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) { /* Perform preliminary checks, with meaningful logging. */ if (!path_exists(filepath.string())) { @@ -76,7 +76,7 @@ bool OIIOImageLoader::load_metadata(ImageMetaData &metadata) } /* check if it's half float */ - if (spec.format == TypeDesc::HALF) { + if (spec.format == TypeDesc::HALF && features.has_half_float) { is_half = true; } diff --git a/intern/cycles/render/image_oiio.h b/intern/cycles/render/image_oiio.h index a234b968557..a6dbb168b65 100644 --- a/intern/cycles/render/image_oiio.h +++ b/intern/cycles/render/image_oiio.h @@ -26,7 +26,7 @@ class OIIOImageLoader : public ImageLoader { OIIOImageLoader(const string &filepath); ~OIIOImageLoader(); - bool load_metadata(ImageMetaData &metadata) override; + bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) override; bool load_pixels(const ImageMetaData &metadata, void *pixels, diff --git a/intern/cycles/render/image_sky.cpp b/intern/cycles/render/image_sky.cpp index 0560907c63e..7f9b85836f8 100644 --- a/intern/cycles/render/image_sky.cpp +++ b/intern/cycles/render/image_sky.cpp @@ -40,7 +40,7 @@ SkyLoader::SkyLoader(float sun_elevation, SkyLoader::~SkyLoader(){}; -bool SkyLoader::load_metadata(ImageMetaData &metadata) +bool SkyLoader::load_metadata(const ImageDeviceFeatures &, ImageMetaData &metadata) { metadata.width = 512; metadata.height = 128; diff --git a/intern/cycles/render/image_sky.h b/intern/cycles/render/image_sky.h index 686f4e5b885..89ff586e7fd 100644 --- a/intern/cycles/render/image_sky.h +++ b/intern/cycles/render/image_sky.h @@ -34,7 +34,7 @@ class SkyLoader : public ImageLoader { float ozone_density); ~SkyLoader(); - bool load_metadata(ImageMetaData &metadata) override; + bool load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) override; bool load_pixels(const ImageMetaData &metadata, void *pixels, diff --git a/intern/cycles/render/image_vdb.cpp b/intern/cycles/render/image_vdb.cpp index 70b3de5a939..63e6214f1c8 100644 --- a/intern/cycles/render/image_vdb.cpp +++ b/intern/cycles/render/image_vdb.cpp @@ -34,7 +34,7 @@ VDBImageLoader::~VDBImageLoader() { } -bool VDBImageLoader::load_metadata(ImageMetaData &metadata) +bool VDBImageLoader::load_metadata(const ImageDeviceFeatures &features, ImageMetaData &metadata) { #ifdef WITH_OPENVDB if (!grid) { @@ -56,55 +56,71 @@ bool VDBImageLoader::load_metadata(ImageMetaData &metadata) if (grid->isType<openvdb::FloatGrid>()) { metadata.channels = 1; # ifdef WITH_NANOVDB - nanogrid = nanovdb::openToNanoVDB(*openvdb::gridConstPtrCast<openvdb::FloatGrid>(grid)); + if (features.has_nanovdb) { + nanogrid = nanovdb::openToNanoVDB(*openvdb::gridConstPtrCast<openvdb::FloatGrid>(grid)); + } # endif } else if (grid->isType<openvdb::Vec3fGrid>()) { metadata.channels = 3; # ifdef WITH_NANOVDB - nanogrid = nanovdb::openToNanoVDB(*openvdb::gridConstPtrCast<openvdb::Vec3fGrid>(grid)); + if (features.has_nanovdb) { + nanogrid = nanovdb::openToNanoVDB(*openvdb::gridConstPtrCast<openvdb::Vec3fGrid>(grid)); + } # endif } else if (grid->isType<openvdb::BoolGrid>()) { metadata.channels = 1; # ifdef WITH_NANOVDB - nanogrid = nanovdb::openToNanoVDB( - openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::BoolGrid>(grid))); + if (features.has_nanovdb) { + nanogrid = nanovdb::openToNanoVDB( + openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::BoolGrid>(grid))); + } # endif } else if (grid->isType<openvdb::DoubleGrid>()) { metadata.channels = 1; # ifdef WITH_NANOVDB - nanogrid = nanovdb::openToNanoVDB( - openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::DoubleGrid>(grid))); + if (features.has_nanovdb) { + nanogrid = nanovdb::openToNanoVDB( + openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::DoubleGrid>(grid))); + } # endif } else if (grid->isType<openvdb::Int32Grid>()) { metadata.channels = 1; # ifdef WITH_NANOVDB - nanogrid = nanovdb::openToNanoVDB( - openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::Int32Grid>(grid))); + if (features.has_nanovdb) { + nanogrid = nanovdb::openToNanoVDB( + openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::Int32Grid>(grid))); + } # endif } else if (grid->isType<openvdb::Int64Grid>()) { metadata.channels = 1; # ifdef WITH_NANOVDB - nanogrid = nanovdb::openToNanoVDB( - openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::Int64Grid>(grid))); + if (features.has_nanovdb) { + nanogrid = nanovdb::openToNanoVDB( + openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::Int64Grid>(grid))); + } # endif } else if (grid->isType<openvdb::Vec3IGrid>()) { metadata.channels = 3; # ifdef WITH_NANOVDB - nanogrid = nanovdb::openToNanoVDB( - openvdb::Vec3fGrid(*openvdb::gridConstPtrCast<openvdb::Vec3IGrid>(grid))); + if (features.has_nanovdb) { + nanogrid = nanovdb::openToNanoVDB( + openvdb::Vec3fGrid(*openvdb::gridConstPtrCast<openvdb::Vec3IGrid>(grid))); + } # endif } else if (grid->isType<openvdb::Vec3dGrid>()) { metadata.channels = 3; # ifdef WITH_NANOVDB - nanogrid = nanovdb::openToNanoVDB( - openvdb::Vec3fGrid(*openvdb::gridConstPtrCast<openvdb::Vec3dGrid>(grid))); + if (features.has_nanovdb) { + nanogrid = nanovdb::openToNanoVDB( + openvdb::Vec3fGrid(*openvdb::gridConstPtrCast<openvdb::Vec3dGrid>(grid))); + } # endif } else if (grid->isType<openvdb::MaskGrid>()) { @@ -118,21 +134,25 @@ bool VDBImageLoader::load_metadata(ImageMetaData &metadata) } # ifdef WITH_NANOVDB - metadata.byte_size = nanogrid.size(); - if (metadata.channels == 1) { - metadata.type = IMAGE_DATA_TYPE_NANOVDB_FLOAT; - } - else { - metadata.type = IMAGE_DATA_TYPE_NANOVDB_FLOAT3; - } -# else - if (metadata.channels == 1) { - metadata.type = IMAGE_DATA_TYPE_FLOAT; - } - else { - metadata.type = IMAGE_DATA_TYPE_FLOAT4; + if (nanogrid) { + metadata.byte_size = nanogrid.size(); + if (metadata.channels == 1) { + metadata.type = IMAGE_DATA_TYPE_NANOVDB_FLOAT; + } + else { + metadata.type = IMAGE_DATA_TYPE_NANOVDB_FLOAT3; + } } + else # endif + { + if (metadata.channels == 1) { + metadata.type = IMAGE_DATA_TYPE_FLOAT; + } + else { + metadata.type = IMAGE_DATA_TYPE_FLOAT4; + } + } /* Set transform from object space to voxel index. */ openvdb::math::Mat4f grid_matrix = grid->transform().baseMap()->getAffineMap()->getMat4(); @@ -143,13 +163,18 @@ bool VDBImageLoader::load_metadata(ImageMetaData &metadata) } } + Transform texture_to_index; # ifdef WITH_NANOVDB - Transform texture_to_index = transform_identity(); -# else - openvdb::Coord min = bbox.min(); - Transform texture_to_index = transform_translate(min.x(), min.y(), min.z()) * - transform_scale(dim.x(), dim.y(), dim.z()); + if (nanogrid) { + texture_to_index = transform_identity(); + } + else # endif + { + openvdb::Coord min = bbox.min(); + texture_to_index = transform_translate(min.x(), min.y(), min.z()) * + transform_scale(dim.x(), dim.y(), dim.z()); + } metadata.transform_3d = transform_inverse(index_to_object * texture_to_index); metadata.use_transform_3d = true; @@ -165,48 +190,52 @@ bool VDBImageLoader::load_pixels(const ImageMetaData &, void *pixels, const size { #ifdef WITH_OPENVDB # ifdef WITH_NANOVDB - memcpy(pixels, nanogrid.data(), nanogrid.size()); -# else - if (grid->isType<openvdb::FloatGrid>()) { - openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::FloatGrid>(grid), dense); - } - else if (grid->isType<openvdb::Vec3fGrid>()) { - openvdb::tools::Dense<openvdb::Vec3f, openvdb::tools::LayoutXYZ> dense( - bbox, (openvdb::Vec3f *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::Vec3fGrid>(grid), dense); - } - else if (grid->isType<openvdb::BoolGrid>()) { - openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::BoolGrid>(grid), dense); - } - else if (grid->isType<openvdb::DoubleGrid>()) { - openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::DoubleGrid>(grid), dense); - } - else if (grid->isType<openvdb::Int32Grid>()) { - openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::Int32Grid>(grid), dense); - } - else if (grid->isType<openvdb::Int64Grid>()) { - openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::Int64Grid>(grid), dense); - } - else if (grid->isType<openvdb::Vec3IGrid>()) { - openvdb::tools::Dense<openvdb::Vec3f, openvdb::tools::LayoutXYZ> dense( - bbox, (openvdb::Vec3f *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::Vec3IGrid>(grid), dense); - } - else if (grid->isType<openvdb::Vec3dGrid>()) { - openvdb::tools::Dense<openvdb::Vec3f, openvdb::tools::LayoutXYZ> dense( - bbox, (openvdb::Vec3f *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::Vec3dGrid>(grid), dense); - } - else if (grid->isType<openvdb::MaskGrid>()) { - openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::MaskGrid>(grid), dense); + if (nanogrid) { + memcpy(pixels, nanogrid.data(), nanogrid.size()); } + else # endif + { + if (grid->isType<openvdb::FloatGrid>()) { + openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); + openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::FloatGrid>(grid), dense); + } + else if (grid->isType<openvdb::Vec3fGrid>()) { + openvdb::tools::Dense<openvdb::Vec3f, openvdb::tools::LayoutXYZ> dense( + bbox, (openvdb::Vec3f *)pixels); + openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::Vec3fGrid>(grid), dense); + } + else if (grid->isType<openvdb::BoolGrid>()) { + openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); + openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::BoolGrid>(grid), dense); + } + else if (grid->isType<openvdb::DoubleGrid>()) { + openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); + openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::DoubleGrid>(grid), dense); + } + else if (grid->isType<openvdb::Int32Grid>()) { + openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); + openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::Int32Grid>(grid), dense); + } + else if (grid->isType<openvdb::Int64Grid>()) { + openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); + openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::Int64Grid>(grid), dense); + } + else if (grid->isType<openvdb::Vec3IGrid>()) { + openvdb::tools::Dense<openvdb::Vec3f, openvdb::tools::LayoutXYZ> dense( + bbox, (openvdb::Vec3f *)pixels); + openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::Vec3IGrid>(grid), dense); + } + else if (grid->isType<openvdb::Vec3dGrid>()) { + openvdb::tools::Dense<openvdb::Vec3f, openvdb::tools::LayoutXYZ> dense( + bbox, (openvdb::Vec3f *)pixels); + openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::Vec3dGrid>(grid), dense); + } + else if (grid->isType<openvdb::MaskGrid>()) { + openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels); + openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::MaskGrid>(grid), dense); + } + } return true; #else (void)pixels; diff --git a/intern/cycles/render/image_vdb.h b/intern/cycles/render/image_vdb.h index 71d10cc39f5..763196f2a15 100644 --- a/intern/cycles/render/image_vdb.h +++ b/intern/cycles/render/image_vdb.h @@ -33,7 +33,8 @@ class VDBImageLoader : public ImageLoader { VDBImageLoader(const string &grid_name); ~VDBImageLoader(); - virtual bool load_metadata(ImageMetaData &metadata) override; + virtual bool load_metadata(const ImageDeviceFeatures &features, + ImageMetaData &metadata) override; virtual bool load_pixels(const ImageMetaData &metadata, void *pixels, diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index 52f63685aeb..8b3ac31cf8b 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -153,10 +153,6 @@ void Object::update_motion() void Object::compute_bounds(bool motion_blur) { - if (!is_modified() && !geometry->is_modified()) { - return; - } - BoundBox mbounds = geometry->bounds; if (motion_blur && use_motion()) { |