[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