[Bf-blender-cvs] [c0fbc4cfec1] soc-2020-fluid-tools: Fluid: Used procedural lines to draw gridlines
Sriharsha Kotcharlakot
noreply at git.blender.org
Fri Jul 3 08:31:38 CEST 2020
Commit: c0fbc4cfec13e0d713bebab6d5e5c8d941b1f965
Author: Sriharsha Kotcharlakot
Date: Fri Jul 3 12:01:06 2020 +0530
Branches: soc-2020-fluid-tools
https://developer.blender.org/rBc0fbc4cfec13e0d713bebab6d5e5c8d941b1f965
Fluid: Used procedural lines to draw gridlines
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/overlay/overlay_extra.c
M source/blender/draw/engines/overlay/overlay_private.h
M source/blender/draw/engines/overlay/overlay_shader.c
A source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
M source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/engines/workbench/workbench_shader.c
M source/blender/draw/engines/workbench/workbench_volume.c
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 1ddae11999b..6ec87d58569 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -391,6 +391,7 @@ data_to_c_simple(engines/overlay/shaders/pointcloud_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/sculpt_mask_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/sculpt_mask_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/volume_velocity_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/volume_gridlines_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/wireframe_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/wireframe_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/xray_fade_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 895adcf6a88..13d4754ed2a 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -1365,6 +1365,12 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
const bool draw_velocity = (mds->draw_velocity && mds->fluid &&
CFRA >= mds->point_cache[0]->startframe);
+ /* Show gridlines only for slices without interpolation */
+ const bool show_gridlines = (mds->show_gridlines &&
+ (mds->axis_slice_method == AXIS_SLICE_SINGLE) &&
+ (mds->interp_method == VOLUME_INTERP_RAW ||
+ mds->coba_field == FLUID_DOMAIN_FIELD_FLAGS));
+
/* Small cube showing voxel size. */
{
float min[3];
@@ -1384,20 +1390,24 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
DRW_buffer_add_entry(cb->empty_cube, color, voxel_cubemat);
}
+ int slice_axis = -1;
+
+ if (mds->axis_slice_method == AXIS_SLICE_SINGLE) {
+ float viewinv[4][4];
+ DRW_view_viewmat_get(NULL, viewinv, true);
+
+ const int axis = (mds->slice_axis == SLICE_AXIS_AUTO) ? axis_dominant_v3_single(viewinv[2]) :
+ mds->slice_axis - 1;
+ slice_axis = axis;
+ }
+
if (draw_velocity) {
const bool use_needle = (mds->vector_draw_type == VECTOR_DRAW_NEEDLE);
int line_count = (use_needle) ? 6 : 1;
- int slice_axis = -1;
line_count *= mds->res[0] * mds->res[1] * mds->res[2];
if (mds->axis_slice_method == AXIS_SLICE_SINGLE) {
- float viewinv[4][4];
- DRW_view_viewmat_get(NULL, viewinv, true);
-
- const int axis = (mds->slice_axis == SLICE_AXIS_AUTO) ? axis_dominant_v3_single(viewinv[2]) :
- mds->slice_axis - 1;
- slice_axis = axis;
- line_count /= mds->res[axis];
+ line_count /= mds->res[slice_axis];
}
GPU_create_smoke_velocity(mmd);
@@ -1417,6 +1427,20 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
BLI_addtail(&data->stl->pd->smoke_domains, BLI_genericNodeN(mmd));
}
+
+ if (show_gridlines) {
+ int line_count = 4 * mds->res[0] * mds->res[1] * mds->res[2] / mds->res[slice_axis];
+
+ GPUShader *sh = OVERLAY_shader_volume_gridlines();
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, data->psl->extra_ps[0]);
+ DRW_shgroup_uniform_ivec3_copy(grp, "volumeSize", mds->res);
+ DRW_shgroup_uniform_float_copy(grp, "slicePosition", mds->slice_depth);
+ DRW_shgroup_uniform_vec3_copy(grp, "cellSize", mds->cell_size);
+ DRW_shgroup_uniform_vec3_copy(grp, "domainOriginOffset", mds->p0);
+ DRW_shgroup_uniform_ivec3_copy(grp, "adaptiveCellOffset", mds->res_min);
+ DRW_shgroup_uniform_int_copy(grp, "sliceAxis", slice_axis);
+ DRW_shgroup_call_procedural_lines(grp, ob, line_count);
+ }
}
static void OVERLAY_volume_free_smoke_textures(OVERLAY_Data *data)
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index b643b8f535f..452e1ae5137 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -618,6 +618,7 @@ GPUShader *OVERLAY_shader_particle_shape(void);
GPUShader *OVERLAY_shader_pointcloud_dot(void);
GPUShader *OVERLAY_shader_sculpt_mask(void);
GPUShader *OVERLAY_shader_volume_velocity(bool use_needle);
+GPUShader *OVERLAY_shader_volume_gridlines(void);
GPUShader *OVERLAY_shader_wireframe(bool custom_bias);
GPUShader *OVERLAY_shader_wireframe_select(void);
GPUShader *OVERLAY_shader_xray_fade(void);
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index edf91c99531..6879f5dde96 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -108,6 +108,7 @@ extern char datatoc_pointcloud_frag_glsl[];
extern char datatoc_sculpt_mask_vert_glsl[];
extern char datatoc_sculpt_mask_frag_glsl[];
extern char datatoc_volume_velocity_vert_glsl[];
+extern char datatoc_volume_gridlines_vert_glsl[];
extern char datatoc_wireframe_vert_glsl[];
extern char datatoc_wireframe_frag_glsl[];
extern char datatoc_xray_fade_frag_glsl[];
@@ -196,6 +197,7 @@ typedef struct OVERLAY_Shaders {
GPUShader *uniform_color;
GPUShader *volume_velocity_needle_sh;
GPUShader *volume_velocity_sh;
+ GPUShader *volume_gridlines_sh;
GPUShader *wireframe_select;
GPUShader *wireframe[2];
GPUShader *xray_fade;
@@ -1384,6 +1386,20 @@ struct GPUShader *OVERLAY_shader_volume_velocity(bool use_needle)
return (use_needle) ? sh_data->volume_velocity_needle_sh : sh_data->volume_velocity_sh;
}
+struct GPUShader *OVERLAY_shader_volume_gridlines(void)
+{
+ OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
+ if (!sh_data->volume_gridlines_sh) {
+ sh_data->volume_gridlines_sh = DRW_shader_create_with_lib(
+ datatoc_volume_gridlines_vert_glsl,
+ NULL,
+ datatoc_gpu_shader_flat_color_frag_glsl,
+ datatoc_common_view_lib_glsl,
+ "#define blender_srgb_to_framebuffer_space(a) a\n");
+ }
+ return sh_data->volume_gridlines_sh;
+}
+
GPUShader *OVERLAY_shader_wireframe_select(void)
{
const DRWContextState *draw_ctx = DRW_context_state_get();
diff --git a/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl b/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
new file mode 100644
index 00000000000..dcf147cf029
--- /dev/null
+++ b/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
@@ -0,0 +1,65 @@
+uniform float slicePosition;
+uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
+
+/* FluidDomainSettings.res */
+uniform ivec3 volumeSize;
+/* FluidDomainSettings.cell_size */
+uniform vec3 cellSize;
+/* FluidDomainSettings.p0 */
+uniform vec3 domainOriginOffset;
+/* FluidDomainSettings.res_min */
+uniform ivec3 adaptiveCellOffset;
+
+flat out vec4 finalColor;
+
+const vec3 corners[4] = vec3[4](vec3(-0.5, 0.5, 0.0),
+ vec3(0.5, 0.5, 0.0),
+ vec3(0.5, -0.5, 0.0),
+ vec3(-0.5, -0.5, 0.0));
+
+const int indices[8] = int[8](0, 1, 1, 2, 2, 3, 3, 0);
+
+void main()
+{
+ int cell = gl_VertexID / 8;
+ mat3 rot_mat = mat3(0.0);
+
+ vec3 cell_offset = vec3(0.5);
+ ivec3 cell_div = volumeSize;
+ if (sliceAxis == 0) {
+ cell_offset.x = slicePosition * float(volumeSize.x);
+ cell_div.x = 1;
+ rot_mat[2].x = 1.0;
+ rot_mat[0].y = 1.0;
+ rot_mat[1].z = 1.0;
+ }
+ else if (sliceAxis == 1) {
+ cell_offset.y = slicePosition * float(volumeSize.y);
+ cell_div.y = 1;
+ rot_mat[1].x = 1.0;
+ rot_mat[2].y = 1.0;
+ rot_mat[0].z = 1.0;
+ }
+ else if (sliceAxis == 2) {
+ cell_offset.z = slicePosition * float(volumeSize.z);
+ cell_div.z = 1;
+ rot_mat[0].x = 1.0;
+ rot_mat[1].y = 1.0;
+ rot_mat[2].z = 1.0;
+ }
+
+ vec3 cell_co;
+ cell_co.x = float(cell % cell_div.x);
+ cell_co.y = float((cell / cell_div.x) % cell_div.y);
+ cell_co.z = float(cell / (cell_div.x * cell_div.y));
+ cell_co += cell_offset;
+
+ vec3 pos = domainOriginOffset + cellSize * (cell_co + vec3(adaptiveCellOffset));
+ vec3 rotated_pos = rot_mat * corners[indices[gl_VertexID % 8]];
+ pos += rotated_pos * cellSize;
+
+ finalColor = vec4(0.0, 0.0, 0.0, 1.0);
+
+ vec3 world_pos = point_object_to_world(pos);
+ gl_Position = point_world_to_ndc(world_pos);
+}
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 4f4544488c8..ff194524d76 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -26,7 +26,6 @@ uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
uniform bool showPhi = false;
uniform bool showFlags = false;
-uniform bool showGridlines = false;
#ifdef VOLUME_SLICE
in vec3 localPos;
@@ -54,25 +53,6 @@ float line_unit_box_intersect_dist(vec3 lineorigin, vec3 linedirection)
return max_v3(furthestplane);
}
-bool on_gridline(vec3 texture_size, vec3 co)
-{
- if (!showGridlines) {
- return false;
- }
- vec3 texel_size = 1.0 / texture_size;
- vec3 offset = mod(co, texel_size);
- offset = min(offset, texel_size - offset);
- vec3 gridline_thickness = 0.025 * texel_size;
- if (((sliceAxis == 0) && (offset.y < gridline_thickness.y || offset.z < gridline_thickness.z)) ||
- ((sliceAxis == 1) && (offset.x < gridline_thickness.x || offset.z < gridline_thickness.z)) ||
- ((sliceAxis == 2) && (offset.x < gridline_thickness.x || offset.y < gridline_thickness.y))) {
- return true;
- }
- else {
- return false;
- }
-}
-
#define sample_trilinear(ima, co) texture(ima, co)
vec4 sample_tricubic(sampler3D ima, vec3 co)
@@ -138,15 +118,6 @@ vec4 sample_raw(sampler3D ima, vec3 co)
void volume_properties(vec3 ls_pos, out vec3 scattering, out float extinction)
{
vec3 co = ls_pos * 0.5 + 0.5;
-#if defined(VOLUME_SLICE) && (defined(USE_RAW) ||
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list