[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