[Bf-blender-cvs] [4a9386b6b11] new-object-types: Volumes: use VDB transform matrix for Eevee

Brecht Van Lommel noreply at git.blender.org
Sat Feb 15 22:27:37 CET 2020


Commit: 4a9386b6b116846f69b9840c6291f95f95bbb712
Author: Brecht Van Lommel
Date:   Thu Feb 13 16:34:18 2020 +0100
Branches: new-object-types
https://developer.blender.org/rB4a9386b6b116846f69b9840c6291f95f95bbb712

Volumes: use VDB transform matrix for Eevee

Still only from the first grid, not multiple transforms.

===================================================================

M	source/blender/draw/engines/eevee/eevee_volumes.c
M	source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl_volume.c
M	source/blender/makesdna/DNA_fluid_types.h

===================================================================

diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c
index 25b8a0ad7c1..56699f1c562 100644
--- a/source/blender/draw/engines/eevee/eevee_volumes.c
+++ b/source/blender/draw/engines/eevee/eevee_volumes.c
@@ -387,11 +387,6 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
   }
 }
 
-typedef struct EEVEE_InstanceVolumeMatrix {
-  DrawData dd;
-  float volume_mat[4][4];
-} EEVEE_InstanceVolumeMatrix;
-
 void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
                                     EEVEE_Data *vedata,
                                     Scene *scene,
@@ -441,6 +436,8 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
 
   DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
 
+  static const float zero_transform[4][4] = {{0.0f, 0.0f}};
+
   /* Volume Object */
   if (ob->type == OB_VOLUME) {
     // TODO: check what the BASE_FROM_DUPLI test is for, do we need it too?
@@ -473,9 +470,8 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
     const float flame_ignition = 1.5f;  // TODO: user setting?
     DRW_shgroup_uniform_vec2(grp, "unftemperature", &flame_ignition, 1);
 
-    /* Volume dimensions for texture sampling. */
-    DRW_shgroup_uniform_vec3(grp, "volumeOrcoLoc", density->mid, 1);
-    DRW_shgroup_uniform_vec3(grp, "volumeOrcoSize", density->halfsize, 1);
+    /* Compute transform. */
+    DRW_shgroup_uniform_mat4(grp, "volumeObjectToLocal", density->object_to_texture);
   }
   /* Smoke Simulation */
   else if (((ob->base_flag & BASE_FROM_DUPLI) == 0) &&
@@ -525,11 +521,19 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
     /* Output is such that 0..1 maps to 0..1000K */
     DRW_shgroup_uniform_vec2(grp, "unftemperature", &mds->flame_ignition, 1);
 
-    /* Volume dimensions for texture sampling. */
-    float *texcoloc, *texcosize;
-    BKE_mesh_texspace_get_reference((struct Mesh *)ob->data, NULL, &texcoloc, &texcosize);
-    DRW_shgroup_uniform_vec3(grp, "volumeOrcoLoc", texcoloc, 1);
-    DRW_shgroup_uniform_vec3(grp, "volumeOrcoSize", texcosize, 1);
+    /* Compute transform matrix from object to texture space. */
+    float *texco_mid, *texco_halfsize;
+    BKE_mesh_texspace_get_reference((struct Mesh *)ob->data, NULL, &texco_mid, &texco_halfsize);
+
+    float texco_loc[3], texco_size[3];
+    sub_v3_v3v3(texco_loc, texco_mid, texco_halfsize);
+    mul_v3_v3fl(texco_size, texco_halfsize, 2.0f);
+
+    size_to_mat4(mds->tex_transform, texco_size);
+    copy_v3_v3(mds->tex_transform[3], texco_loc);
+    invert_m4(mds->tex_transform);
+
+    DRW_shgroup_uniform_mat4(grp, "volumeObjectToLocal", mds->tex_transform);
   }
   else {
     DRW_shgroup_uniform_texture(grp, "sampdensity", e_data.dummy_density);
@@ -537,8 +541,7 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
     DRW_shgroup_uniform_texture(grp, "sampflame", e_data.dummy_flame);
     DRW_shgroup_uniform_vec3(grp, "volumeColor", white, 1);
     DRW_shgroup_uniform_vec2(grp, "unftemperature", (float[2]){0.0f, 1.0f}, 1);
-    DRW_shgroup_uniform_vec3(grp, "volumeOrcoLoc", (float[3]){0.0f, 0.0f, 0.0f}, 1);
-    DRW_shgroup_uniform_vec3(grp, "volumeOrcoSize", (float[3]){1.0f, 1.0f, 1.0f}, 1);
+    DRW_shgroup_uniform_mat4(grp, "volumeObjectToLocal", zero_transform);
   }
 
   /* TODO Reduce to number of slices intersecting. */
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
index 2b1ae60654e..182b0864f8d 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
@@ -5,8 +5,7 @@
 #define NODETREE_EXEC
 
 #ifdef MESH_SHADER
-uniform vec3 volumeOrcoLoc;
-uniform vec3 volumeOrcoSize;
+uniform mat4 volumeObjectToLocal;
 #endif
 
 flat in int slice;
@@ -35,8 +34,7 @@ void main()
   worldPosition = point_view_to_world(viewPosition);
 #ifdef MESH_SHADER
   volumeObjectLocalCoord = point_world_to_object(worldPosition);
-  volumeObjectLocalCoord = (volumeObjectLocalCoord - volumeOrcoLoc + volumeOrcoSize) /
-                           (volumeOrcoSize * 2.0);
+  volumeObjectLocalCoord = (volumeObjectToLocal * vec4(volumeObjectLocalCoord, 1.0)).xyz;
 
   if (any(lessThan(volumeObjectLocalCoord, vec3(0.0))) ||
       any(greaterThan(volumeObjectLocalCoord, vec3(1.0))))
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index f358a8d5328..0ee3d6b4d66 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -223,10 +223,7 @@ typedef struct DRWVolumeGrid {
 
   /* Transform from 0..1 texture space to object space. */
   float texture_to_object[4][4];
-
-  /* Grid bounding box to fit 3D texture to. */
-  float mid[3];
-  float halfsize[3];
+  float object_to_texture[4][4];
 } DRWVolumeGrid;
 
 DRWVolumeGrid *DRW_volume_batch_cache_get_grid(struct Volume *volume, struct VolumeGrid *grid);
diff --git a/source/blender/draw/intern/draw_cache_impl_volume.c b/source/blender/draw/intern/draw_cache_impl_volume.c
index 59fcef37518..4b0263e1f63 100644
--- a/source/blender/draw/intern/draw_cache_impl_volume.c
+++ b/source/blender/draw/intern/draw_cache_impl_volume.c
@@ -194,14 +194,7 @@ static DRWVolumeGrid *volume_grid_cache_get(Volume *volume,
     /* Compute transform matrix. */
     BKE_volume_grid_dense_transform_matrix(
         grid, dense_min, dense_max, cache_grid->texture_to_object);
-
-    /* TODO: support transform matrix in Eevee and remove this code. */
-    float min[3], max[3];
-    BKE_volume_grid_bounds(grid, min, max);
-    mid_v3_v3v3(cache_grid->mid, min, max);
-    cache_grid->halfsize[0] = (max[0] - min[0]) / 2.0f;
-    cache_grid->halfsize[1] = (max[1] - min[1]) / 2.0f;
-    cache_grid->halfsize[2] = (max[2] - min[2]) / 2.0f;
+    invert_m4_m4(cache_grid->object_to_texture, cache_grid->texture_to_object);
   }
 
   /* Free grid from memory if it wasn't previously loaded. */
diff --git a/source/blender/makesdna/DNA_fluid_types.h b/source/blender/makesdna/DNA_fluid_types.h
index b95588578d0..d73b025b50e 100644
--- a/source/blender/makesdna/DNA_fluid_types.h
+++ b/source/blender/makesdna/DNA_fluid_types.h
@@ -263,6 +263,7 @@ typedef struct FluidDomainSettings {
   struct GPUTexture *tex_velocity_x;
   struct GPUTexture *tex_velocity_y;
   struct GPUTexture *tex_velocity_z;
+  float tex_transform[4][4];
   struct Object *guide_parent;
   /** Vertex velocities of simulated fluid mesh. */
   struct FluidDomainVertexVelocity *mesh_velocities;



More information about the Bf-blender-cvs mailing list