[Bf-blender-cvs] [be2874f9c36] new-object-types: Volumes: step towards support per-grid transform for Cycles
Brecht Van Lommel
noreply at git.blender.org
Thu Feb 20 13:27:03 CET 2020
Commit: be2874f9c3614995e647919e6b548b36c295dfa8
Author: Brecht Van Lommel
Date: Wed Feb 19 23:56:06 2020 +0100
Branches: new-object-types
https://developer.blender.org/rBbe2874f9c3614995e647919e6b548b36c295dfa8
Volumes: step towards support per-grid transform for Cycles
The transform is used for texture lookup, but not bounds yet.
===================================================================
M intern/cycles/blender/blender_image.cpp
M intern/cycles/blender/blender_volume.cpp
M intern/cycles/device/cuda/device_cuda_impl.cpp
M intern/cycles/device/device_cpu.cpp
M intern/cycles/device/device_memory.cpp
M intern/cycles/device/device_memory.h
M intern/cycles/device/opencl/device_opencl_impl.cpp
M intern/cycles/kernel/geom/geom_volume.h
M intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
M intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
M intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
M intern/cycles/kernel/osl/osl_services.cpp
M intern/cycles/kernel/svm/svm_voxel.h
M intern/cycles/render/image.cpp
M intern/cycles/render/image.h
M intern/cycles/render/mesh_volume.cpp
M intern/cycles/util/util_texture.h
M release/datafiles/locale
M release/scripts/addons
===================================================================
diff --git a/intern/cycles/blender/blender_image.cpp b/intern/cycles/blender/blender_image.cpp
index 69de40bf572..87022ea9b57 100644
--- a/intern/cycles/blender/blender_image.cpp
+++ b/intern/cycles/blender/blender_image.cpp
@@ -99,6 +99,11 @@ void BlenderSession::builtin_image_info(const string &builtin_name,
metadata.depth = max[2] - min[2];
metadata.is_float = true;
metadata.channels = b_grid.channels();
+
+ 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;
}
}
@@ -139,6 +144,15 @@ void BlenderSession::builtin_image_info(const string &builtin_name,
metadata.width = resolution.x * amplify;
metadata.height = resolution.y * amplify;
metadata.depth = resolution.z * amplify;
+
+ /* Create a matrix to transform from object space to mesh texture space.
+ * This does not work with deformations but that can probably only be done
+ * well with a volume grid mapping of coordinates. */
+ BL::Mesh b_mesh(b_ob.data());
+ float3 loc, size;
+ mesh_texture_space(b_mesh, loc, size);
+ metadata.transform_3d = transform_translate(-loc) * transform_scale(size);
+ metadata.use_transform_3d = true;
}
else {
/* TODO(sergey): Check we're indeed in shader node tree. */
diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp
index c296ce187a3..1f167217063 100644
--- a/intern/cycles/blender/blender_volume.cpp
+++ b/intern/cycles/blender/blender_volume.cpp
@@ -59,20 +59,6 @@ static void sync_smoke_volume(Scene *scene, BL::Object &b_ob, Mesh *mesh, float
volume_data->manager = image_manager;
volume_data->slot = image_manager->add_image(key, frame, metadata);
}
-
- /* Create a matrix to transform from object space to mesh texture space.
- * This does not work with deformations but that can probably only be done
- * well with a volume grid mapping of coordinates. */
- if (mesh->need_attribute(scene, ATTR_STD_GENERATED_TRANSFORM)) {
- Attribute *attr = mesh->attributes.add(ATTR_STD_GENERATED_TRANSFORM);
- Transform *tfm = attr->data_transform();
-
- BL::Mesh b_mesh(b_ob.data());
- float3 loc, size;
- mesh_texture_space(b_mesh, loc, size);
-
- *tfm = transform_translate(-loc) * transform_scale(size);
- }
}
static void sync_volume_object(BL::BlendData &b_data, BL::Object &b_ob, Scene *scene, Mesh *mesh)
@@ -80,8 +66,6 @@ static void sync_volume_object(BL::BlendData &b_data, BL::Object &b_ob, Scene *s
BL::Volume b_volume(b_ob.data());
b_volume.grids.load(b_data.ptr.data);
- bool transform_added = false;
-
mesh->volume_isovalue = 1e-3f; /* TODO: make user setting. */
/* Find grid with matching name. */
@@ -91,7 +75,6 @@ static void sync_volume_object(BL::BlendData &b_data, BL::Object &b_ob, Scene *s
ustring name = ustring(b_grid.name());
AttributeStandard std = ATTR_STD_NONE;
- /* TODO: find nicer solution to detect standard attribute. */
if (name == Attribute::standard_name(ATTR_STD_VOLUME_DENSITY)) {
std = ATTR_STD_VOLUME_DENSITY;
}
@@ -126,29 +109,6 @@ static void sync_volume_object(BL::BlendData &b_data, BL::Object &b_ob, Scene *s
volume_data->manager = scene->image_manager;
volume_data->slot = scene->image_manager->add_image(key, frame, metadata);
-
- /* TODO: support each grid having own transform. */
- /* TODO: support full transform instead of only using boundbox. */
- /* TODO: avoid computing bounds multiple times, perhaps by postponing
- * setting this transform until voxels are loaded. */
- if (!transform_added && mesh->need_attribute(scene, ATTR_STD_GENERATED_TRANSFORM)) {
- Attribute *attr = mesh->attributes.add(ATTR_STD_GENERATED_TRANSFORM);
- Transform *tfm = attr->data_transform();
-
- Volume *volume = (Volume *)b_volume.ptr.data;
- VolumeGrid *volume_grid = (VolumeGrid *)b_grid.ptr.data;
- size_t min[3], max[3];
- if (BKE_volume_grid_dense_bounds(volume, volume_grid, min, max)) {
- float mat[4][4];
- BKE_volume_grid_dense_transform_matrix(volume_grid, min, max, mat);
- *tfm = transform_inverse(get_transform(mat));
- }
- else {
- *tfm = transform_identity();
- }
-
- transform_added = true;
- }
}
}
}
diff --git a/intern/cycles/device/cuda/device_cuda_impl.cpp b/intern/cycles/device/cuda/device_cuda_impl.cpp
index a4e1c026263..8ba95851372 100644
--- a/intern/cycles/device/cuda/device_cuda_impl.cpp
+++ b/intern/cycles/device/cuda/device_cuda_impl.cpp
@@ -1204,6 +1204,8 @@ void CUDADevice::tex_alloc(device_memory &mem)
info.cl_buffer = 0;
info.interpolation = mem.interpolation;
info.extension = mem.extension;
+ info.use_transform_3d = mem.use_transform_3d;
+ info.transform_3d = mem.transform_3d;
info.width = mem.data_width;
info.height = mem.data_height;
info.depth = mem.data_depth;
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 795781ee072..9348c270867 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -478,6 +478,8 @@ class CPUDevice : public Device {
info.cl_buffer = 0;
info.interpolation = mem.interpolation;
info.extension = mem.extension;
+ info.use_transform_3d = mem.use_transform_3d;
+ info.transform_3d = mem.transform_3d;
info.width = mem.data_width;
info.height = mem.data_height;
info.depth = mem.data_depth;
diff --git a/intern/cycles/device/device_memory.cpp b/intern/cycles/device/device_memory.cpp
index 3a99a49dffc..25a205f1c99 100644
--- a/intern/cycles/device/device_memory.cpp
+++ b/intern/cycles/device/device_memory.cpp
@@ -33,6 +33,7 @@ device_memory::device_memory(Device *device, const char *name, MemoryType type)
name(name),
interpolation(INTERPOLATION_NONE),
extension(EXTENSION_REPEAT),
+ use_transform_3d(false),
device(device),
device_pointer(0),
host_pointer(0),
diff --git a/intern/cycles/device/device_memory.h b/intern/cycles/device/device_memory.h
index 2949773ef0c..0dbc248e6ab 100644
--- a/intern/cycles/device/device_memory.h
+++ b/intern/cycles/device/device_memory.h
@@ -210,6 +210,8 @@ class device_memory {
const char *name;
InterpolationType interpolation;
ExtensionType extension;
+ bool use_transform_3d;
+ Transform transform_3d;
/* Pointers. */
Device *device;
diff --git a/intern/cycles/device/opencl/device_opencl_impl.cpp b/intern/cycles/device/opencl/device_opencl_impl.cpp
index 012f6dbe114..17ff56c055e 100644
--- a/intern/cycles/device/opencl/device_opencl_impl.cpp
+++ b/intern/cycles/device/opencl/device_opencl_impl.cpp
@@ -1296,6 +1296,8 @@ void OpenCLDevice::flush_texture_buffers()
info.interpolation = mem->interpolation;
info.extension = mem->extension;
+ info.use_transform_3d = mem->use_transform_3d;
+ info.transform_3d = mem->transform_3d;
}
}
diff --git a/intern/cycles/kernel/geom/geom_volume.h b/intern/cycles/kernel/geom/geom_volume.h
index 96cf35a40dc..f43a7841b46 100644
--- a/intern/cycles/kernel/geom/geom_volume.h
+++ b/intern/cycles/kernel/geom/geom_volume.h
@@ -51,10 +51,14 @@ ccl_device float volume_attribute_float(KernelGlobals *kg,
const ShaderData *sd,
const AttributeDescriptor desc)
{
- float3 P = volume_normalized_position(kg, sd, sd->P);
+ /* todo: optimize this so we don't have to transform both here and in
+ * kernel_tex_image_interp_3d when possible. Also could optimize for the
+ * common case where transform is translation/scale only. */
+ float3 P = sd->P;
+ object_inverse_position_transform(kg, sd, &P);
InterpolationType interp = (sd->flag & SD_VOLUME_CUBIC) ? INTERPOLATION_CUBIC :
INTERPOLATION_NONE;
- float4 r = kernel_tex_image_interp_3d(kg, desc.offset, P.x, P.y, P.z, interp);
+ float4 r = kernel_tex_image_interp_3d(kg, desc.offset, P, interp);
return average(float4_to_float3(r));
}
@@ -62,10 +66,11 @@ ccl_device float3 volume_attribute_float3(KernelGlobals *kg,
const ShaderData *sd,
const AttributeDescriptor desc)
{
- float3 P = volume_normalized_position(kg, sd, sd->P);
+ float3 P = sd->P;
+ object_inverse_position_transform(kg, sd, &P);
InterpolationType interp = (sd->flag & SD_VOLUME_CUBIC) ? INTERPOLATION_CUBIC :
INTERPOLATION_NONE;
- float4 r = kernel_tex_image_interp_3d(kg, desc.offset, P.x, P.y, P.z, interp);
+ float4 r = kernel_tex_image_interp_3d(kg, desc.offset, P, interp);
if (r.w > 1e-6f && r.w != 1.0f) {
/* For RGBA colors, unpremultiply after interpolation. */
diff --git a/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h b/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
index 8f311baf010..f544dc43ab2 100644
--- a/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
+++ b/intern/cycles/kernel/kernels/cpu/kernel_cpu_image.h
@@ -498,28 +498,34 @@ ccl_device float4 kernel_tex_image_interp(KernelGlobals *kg, int id, float x, fl
}
}
-ccl_device float4 kernel_tex_image_interp_3d(
- KernelGlobals *kg, int id, float x, float y, float z, InterpolationType interp)
+ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals *kg,
+ int id,
+ float3 P,
+ InterpolationType interp)
{
const TextureInfo &info = kernel_tex_fetch(__texture_info, id);
+ if (info.use_transform_3d) {
+ P = transform_point(&info.transform_3d, P);
+ }
+
switch (kernel_tex_type(id)) {
case IMAGE_DATA_TYPE_HALF:
- return TextureInterpolator<half>::interp_3d(info, x, y, z, interp);
+ return TextureInterpolator<half>::interp_3
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list