[Bf-blender-cvs] [59acd1ff3e4] new-object-types: Volumes: more fiddling with transforms in Eevee and workbench

Brecht Van Lommel noreply at git.blender.org
Sun Feb 16 19:28:14 CET 2020


Commit: 59acd1ff3e4e6bd9aec825126d8108d742d10190
Author: Brecht Van Lommel
Date:   Sun Feb 16 12:25:19 2020 +0100
Branches: new-object-types
https://developer.blender.org/rB59acd1ff3e4e6bd9aec825126d8108d742d10190

Volumes: more fiddling with transforms in Eevee and workbench

Still not quite right, but needed for wireframes to work.

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

M	source/blender/draw/engines/eevee/eevee_volumes.c
M	source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
M	source/blender/draw/engines/workbench/workbench_volume.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl_volume.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c
index ab0001b41e6..3631ef69969 100644
--- a/source/blender/draw/engines/eevee/eevee_volumes.c
+++ b/source/blender/draw/engines/eevee/eevee_volumes.c
@@ -438,8 +438,6 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
   DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
 
   ListBase textures = GPU_material_textures(mat);
-
-  float texture_to_object[4][4];
   bool have_transform = false;
 
   /* Volume Object */
@@ -463,7 +461,11 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
       /* Volume dimensions for texture sampling. */
       if (!have_transform && drw_grid) {
         /* TODO: support different transform per grid. */
-        copy_m4_m4(texture_to_object, drw_grid->texture_to_object);
+        static const float texco_loc[3] = {0.5f, 0.5f, 0.5f};
+        static const float texco_size[3] = {0.5f, 0.5f, 0.5f};
+        DRW_shgroup_uniform_mat4(grp, "volumeObjectToTexture", drw_grid->object_to_texture);
+        DRW_shgroup_uniform_vec3(grp, "volumeOrcoLoc", texco_loc, 1);
+        DRW_shgroup_uniform_vec3(grp, "volumeOrcoSize", texco_size, 1);
         have_transform = true;
       }
     }
@@ -547,33 +549,23 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata,
   }
 
   if (!have_transform) {
-    /* 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(texture_to_object, texco_size);
-    copy_v3_v3(texture_to_object[3], texco_loc);
+    /* Texture space transform for smoke and meshes. */
+    static const float unit_mat[4][4] = {{1.0f, 0.0f, 0.0f, 0.0f},
+                                         {0.0f, 1.0f, 0.0f, 0.0f},
+                                         {0.0f, 0.0f, 1.0f, 0.0f},
+                                         {0.0f, 0.0f, 0.0f, 1.0f}};
+    float *texco_loc, *texco_size;
+    BKE_mesh_texspace_get_reference((struct Mesh *)ob->data, NULL, &texco_loc, &texco_size);
+
+    DRW_shgroup_uniform_mat4(grp, "volumeObjectToTexture", unit_mat);
+    DRW_shgroup_uniform_vec3(grp, "volumeOrcoLoc", texco_loc, 1);
+    DRW_shgroup_uniform_vec3(grp, "volumeOrcoSize", texco_size, 1);
   }
 
-  /* Hack to add additional transform. */
-  /* TODO: add proper way to pass custom matrix overriding object. */
-  float backup_obmat[4][4], backup_imat[4][4];
-  copy_m4_m4(backup_obmat, ob->obmat);
-  copy_m4_m4(backup_imat, ob->imat);
-  mul_m4_m4m4(ob->obmat, ob->obmat, texture_to_object);
-  invert_m4_m4(ob->imat, ob->obmat);
-
   /* TODO Reduce to number of slices intersecting. */
   /* TODO Preemptive culling. */
   DRW_shgroup_call_procedural_triangles(grp, ob, sldata->common_data.vol_tex_size[2]);
 
-  copy_m4_m4(ob->obmat, backup_obmat);
-  copy_m4_m4(ob->imat, backup_imat);
-
   vedata->stl->effects->enabled_effects |= (EFFECT_VOLUMETRIC | EFFECT_POST_BUFFER);
 }
 
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
index 327e25ab7c1..f5e92cd7495 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
@@ -4,6 +4,12 @@
 
 #define NODETREE_EXEC
 
+#ifdef MESH_SHADER
+uniform vec3 volumeOrcoLoc;
+uniform vec3 volumeOrcoSize;
+uniform mat4 volumeObjectToTexture;
+#endif
+
 flat in int slice;
 
 /* Warning: these are not attributes, these are global vars. */
@@ -30,6 +36,10 @@ void main()
   worldPosition = point_view_to_world(viewPosition);
 #ifdef MESH_SHADER
   volumeObjectLocalCoord = point_world_to_object(worldPosition);
+  /* TODO: redundant transform */
+  volumeObjectLocalCoord = (volumeObjectLocalCoord - volumeOrcoLoc + volumeOrcoSize) /
+                           (volumeOrcoSize * 2.0);
+  volumeObjectLocalCoord = (volumeObjectToTexture * vec4(volumeObjectLocalCoord, 1.0)).xyz;
 
   if (any(lessThan(volumeObjectLocalCoord, vec3(0.0))) ||
       any(greaterThan(volumeObjectLocalCoord, vec3(1.0))))
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
index 7483ccbad7c..8e6e1a427b0 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -7,6 +7,8 @@ uniform sampler3D shadowTexture;
 uniform sampler3D flameTexture;
 uniform sampler1D flameColorTexture;
 uniform sampler1D transferTexture;
+#else
+uniform mat4 volumeObjectToTexture;
 #endif
 
 uniform int samplesLen = 256;
@@ -234,9 +236,16 @@ void main()
   vec3 ls_ray_ori = point_view_to_object(vs_ray_ori);
   vec3 ls_ray_end = point_view_to_object(vs_ray_end);
 
+#  ifdef VOLUME_SMOKE
   ls_ray_dir = (OrcoTexCoFactors[0].xyz + ls_ray_dir * OrcoTexCoFactors[1].xyz) * 2.0 - 1.0;
   ls_ray_ori = (OrcoTexCoFactors[0].xyz + ls_ray_ori * OrcoTexCoFactors[1].xyz) * 2.0 - 1.0;
   ls_ray_end = (OrcoTexCoFactors[0].xyz + ls_ray_end * OrcoTexCoFactors[1].xyz) * 2.0 - 1.0;
+#  else
+  ls_ray_dir = (volumeObjectToTexture * vec4(ls_ray_dir, 1.0)).xyz * 2.0f - 1.0;
+  ls_ray_ori = (volumeObjectToTexture * vec4(ls_ray_ori, 1.0)).xyz * 2.0f - 1.0;
+  ls_ray_end = (volumeObjectToTexture * vec4(ls_ray_end, 1.0)).xyz * 2.0f - 1.0;
+#  endif
+
   ls_ray_dir -= ls_ray_ori;
 
   /* TODO: Align rays to volume center so that it mimics old behaviour of slicing the volume. */
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
index ed37ccfea54..304b5e23c68 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
@@ -4,6 +4,10 @@ uniform float slicePosition;
 uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
 #endif
 
+#ifndef VOLUME_SMOKE
+uniform mat4 volumeTextureToObject;
+#endif
+
 in vec3 pos;
 
 RESOURCE_ID_VARYING
@@ -30,7 +34,12 @@ void main()
 #else
   vec3 final_pos = pos;
 #endif
+
+#ifdef VOLUME_SMOKE
   final_pos = ((final_pos * 0.5 + 0.5) - OrcoTexCoFactors[0].xyz) / OrcoTexCoFactors[1].xyz;
+#else
+  final_pos = (volumeTextureToObject * vec4(final_pos * 0.5 + 0.5, 1.0)).xyz;
+#endif
   gl_Position = point_object_to_ndc(final_pos);
 
   PASS_RESOURCE_ID
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c
index 581f9a65995..eeac0fa096f 100644
--- a/source/blender/draw/engines/workbench/workbench_volume.c
+++ b/source/blender/draw/engines/workbench/workbench_volume.c
@@ -308,16 +308,11 @@ static void workbench_volume_object_cache_populate(WORKBENCH_Data *vedata, Objec
   DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
   DRW_shgroup_uniform_float_copy(grp, "densityScale", volume->display.density_scale);
 
-  /* DRW_shgroup_call_obmat is not working here, and also does not
-   * support culling, so we hack around it like this. */
-  float backup_obmat[4][4], backup_imat[4][4];
-  copy_m4_m4(backup_obmat, ob->obmat);
-  copy_m4_m4(backup_imat, ob->imat);
-  copy_m4_m4(ob->obmat, texture_to_world);
-  invert_m4_m4(ob->imat, texture_to_world);
+  DRW_shgroup_uniform_mat4(grp, "volumeObjectToTexture", grid->object_to_texture);
+  DRW_shgroup_uniform_mat4(grp, "volumeTextureToObject", grid->texture_to_object);
+
+  /* TODO: make culling work? */
   DRW_shgroup_call(grp, DRW_cache_cube_get(), ob);
-  copy_m4_m4(ob->obmat, backup_obmat);
-  copy_m4_m4(ob->imat, backup_imat);
 }
 
 void workbench_volume_cache_populate(WORKBENCH_Data *vedata,
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 3bbcd826b18..c52f194d23c 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -221,8 +221,9 @@ typedef struct DRWVolumeGrid {
   struct GPUTexture *texture;
   size_t resolution[3];
 
-  /* Transform from 0..1 texture space to object space. */
+  /* Transform between 0..1 texture space and object space. */
   float texture_to_object[4][4];
+  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 724a3839870..34d402c2ea4 100644
--- a/source/blender/draw/intern/draw_cache_impl_volume.c
+++ b/source/blender/draw/intern/draw_cache_impl_volume.c
@@ -195,6 +195,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);
+    invert_m4_m4(cache_grid->object_to_texture, cache_grid->texture_to_object);
   }
 
   /* Free grid from memory if it wasn't previously loaded. */



More information about the Bf-blender-cvs mailing list