diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2020-03-17 18:48:00 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2020-03-18 13:23:05 +0300 |
commit | 006025ead0b89de671363816cd0e962f10d21c50 (patch) | |
tree | 7126736cb18cbfef6239cdaff1894171252a5d44 /intern/cycles/render | |
parent | fd53b72871e045dfebfb9ddbe2b3c491491aa913 (diff) |
Cycles: support for different 3D transform per volume grid
This is not yet fully supported by automatic volume bounds but works fine in
most cases that will have mostly matching bounds.
Ref T73201
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/image.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/render/image.h | 5 | ||||
-rw-r--r-- | intern/cycles/render/mesh_volume.cpp | 25 |
3 files changed, 26 insertions, 12 deletions
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index df8226fb79f..23f97ba5aa3 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -183,6 +183,7 @@ ImageMetaData::ImageMetaData() type(IMAGE_DATA_NUM_TYPES), colorspace(u_colorspace_raw), colorspace_file_format(""), + use_transform_3d(false), compress_as_srgb(false) { } @@ -190,8 +191,9 @@ ImageMetaData::ImageMetaData() bool ImageMetaData::operator==(const ImageMetaData &other) const { return channels == other.channels && width == other.width && height == other.height && - depth == other.depth && type == other.type && colorspace == other.colorspace && - compress_as_srgb == other.compress_as_srgb; + depth == other.depth && use_transform_3d == other.use_transform_3d && + (!use_transform_3d || transform_3d == other.transform_3d) && type == other.type && + colorspace == other.colorspace && compress_as_srgb == other.compress_as_srgb; } bool ImageMetaData::is_float() const @@ -626,6 +628,8 @@ void ImageManager::device_load_image(Device *device, Scene *scene, int slot, Pro img->mem = new device_texture( device, img->mem_name.c_str(), slot, type, img->params.interpolation, img->params.extension); + img->mem->info.use_transform_3d = img->metadata.use_transform_3d; + img->mem->info.transform_3d = img->metadata.transform_3d; /* Create new texture. */ if (type == IMAGE_DATA_TYPE_FLOAT4) { diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h index 734bb83f774..00ab12afd7a 100644 --- a/intern/cycles/render/image.h +++ b/intern/cycles/render/image.h @@ -24,6 +24,7 @@ #include "util/util_string.h" #include "util/util_thread.h" +#include "util/util_transform.h" #include "util/util_unique_ptr.h" #include "util/util_vector.h" @@ -81,6 +82,10 @@ class ImageMetaData { ustring colorspace; const char *colorspace_file_format; + /* Optional transform for 3D images. */ + bool use_transform_3d; + Transform transform_3d; + /* Automatically set. */ bool compress_as_srgb; diff --git a/intern/cycles/render/mesh_volume.cpp b/intern/cycles/render/mesh_volume.cpp index 3c91aba511d..6087fba7a98 100644 --- a/intern/cycles/render/mesh_volume.cpp +++ b/intern/cycles/render/mesh_volume.cpp @@ -373,13 +373,15 @@ void GeometryManager::create_volume_mesh(Mesh *mesh, Progress &progress) VolumeParams volume_params; volume_params.resolution = make_int3(0, 0, 0); + Transform transform = transform_identity(); + foreach (Attribute &attr, mesh->attributes.attributes) { if (attr.element != ATTR_ELEMENT_VOXEL) { continue; } ImageHandle &handle = attr.data_voxel(); - device_memory *image_memory = handle.image_memory(); + device_texture *image_memory = handle.image_memory(); int3 resolution = make_int3( image_memory->data_width, image_memory->data_height, image_memory->data_depth); @@ -387,14 +389,20 @@ void GeometryManager::create_volume_mesh(Mesh *mesh, Progress &progress) volume_params.resolution = resolution; } else if (volume_params.resolution != resolution) { - VLOG(1) << "Can't create volume mesh, all voxel grid resolutions must be equal\n"; - return; + /* TODO: support this as it's common for OpenVDB. */ + VLOG(1) << "Can't create accurate volume mesh, all voxel grid resolutions must be equal\n"; + continue; } VoxelAttributeGrid voxel_grid; voxel_grid.data = static_cast<float *>(image_memory->host_pointer); voxel_grid.channels = image_memory->data_elements; voxel_grids.push_back(voxel_grid); + + /* TODO: support multiple transforms. */ + if (image_memory->info.use_transform_3d) { + transform = image_memory->info.transform_3d; + } } if (voxel_grids.empty()) { @@ -427,17 +435,14 @@ void GeometryManager::create_volume_mesh(Mesh *mesh, Progress &progress) } /* Compute start point and cell size from transform. */ - Attribute *attr = mesh->attributes.find(ATTR_STD_GENERATED_TRANSFORM); const int3 resolution = volume_params.resolution; float3 start_point = make_float3(0.0f, 0.0f, 0.0f); float3 cell_size = make_float3(1.0f / resolution.x, 1.0f / resolution.y, 1.0f / resolution.z); - if (attr) { - const Transform *tfm = attr->data_transform(); - const Transform itfm = transform_inverse(*tfm); - start_point = transform_point(&itfm, start_point); - cell_size = transform_direction(&itfm, cell_size); - } + /* TODO: support arbitrary transforms, not just scale + translate. */ + const Transform itfm = transform_inverse(transform); + start_point = transform_point(&itfm, start_point); + cell_size = transform_direction(&itfm, cell_size); volume_params.start_point = start_point; volume_params.cell_size = cell_size; |