[Bf-blender-cvs] [b50834bb50b] soc-2020-fluid-tools: Fluid: Improvements in Phi grid display
Sriharsha Kotcharlakot
noreply at git.blender.org
Wed Jun 24 15:34:02 CEST 2020
Commit: b50834bb50bd178497c8e28f4f2f5ea4ad4121a5
Author: Sriharsha Kotcharlakot
Date: Wed Jun 24 19:03:50 2020 +0530
Branches: soc-2020-fluid-tools
https://developer.blender.org/rBb50834bb50bd178497c8e28f4f2f5ea4ad4121a5
Fluid: Improvements in Phi grid display
* Changed field texture format from 'GPU_R8' to 'GPU_R16F' for level-set fields to avoid data normalisation.
* Fragment coloring for level-set fields is now dynamic and does not depend on transfer texture.
===================================================================
M source/blender/blenlib/BLI_math_color.h
M source/blender/blenlib/intern/math_color.c
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
M source/blender/gpu/intern/gpu_draw_smoke.c
===================================================================
diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h
index 547c17f0382..ba95da4092e 100644
--- a/source/blender/blenlib/BLI_math_color.h
+++ b/source/blender/blenlib/BLI_math_color.h
@@ -145,7 +145,6 @@ MINLINE void rgba_uchar_args_test_set(unsigned char col[4],
MINLINE void cpack_cpy_3ub(unsigned char r_col[3], const unsigned int pack);
void blackbody_temperature_to_rgb_table(float *r_table, int width, float min, float max);
-void phi_to_rgb(float *r_table, int width, float min, float max);
/********* lift/gamma/gain / ASC-CDL conversion ***********/
diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c
index 06333e1f961..625849c01df 100644
--- a/source/blender/blenlib/intern/math_color.c
+++ b/source/blender/blenlib/intern/math_color.c
@@ -714,29 +714,3 @@ void blackbody_temperature_to_rgb_table(float *r_table, int width, float min, fl
r_table[i * 4 + 3] = 0.0f;
}
}
-
-void phi_to_rgb(float *r_table, int width, float min, float max)
-{
- for (int i = 0; i < width; i++) {
- float value = min + (max - min) / (float)width * (float)i;
-
- float rgb[3];
-
- value = (value < 1.0f) ? value : 1.0f;
- value = (value >= -1.0f) ? value : -1.0f;
-
- if (value >= 0.0f) {
- rgb[0] = value;
- rgb[1] = 0.0f;
- rgb[2] = 0.5f;
- }
- else {
- rgb[0] = 0.5f;
- rgb[1] = 1.0f + value;
- rgb[2] = 0.0f;
- }
-
- copy_v3_v3(&r_table[i * 4], rgb);
- r_table[i * 4 + 3] = 0.0f;
- }
-}
\ No newline at end of file
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 f1893faf669..e61d3473f3d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -23,6 +23,8 @@ uniform vec3 activeColor;
uniform float slicePosition;
uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
+uniform bool showPhi;
+
#ifdef VOLUME_SLICE
in vec3 localPos;
#endif
@@ -115,14 +117,29 @@ void volume_properties(vec3 ls_pos, out vec3 scattering, out float extinction)
{
vec3 co = ls_pos * 0.5 + 0.5;
#ifdef USE_COBA
- float val = sample_volume_texture(densityTexture, co).r;
-# ifdef SHOW_PHI
- /* Scaling the value holding 0.5 as neutral. */
- val = 0.5 + (val - 0.5) * gridScale;
-# else
- val *= gridScale;
-# endif
- vec4 tval = texture(transferTexture, val) * densityScale;
+ float val = sample_volume_texture(densityTexture, co).r * gridScale;
+ vec4 tval;
+ if(showPhi) {
+ /* Color mapping for level-set representation */
+ val = (val * 0.2 < 1.0) ? val * 0.2 : 1.0;
+ val = (val >= -1.0) ? val : -1.0;
+
+ if (val >= 0.0) {
+ tval.r = val;
+ tval.g = 0.0;
+ tval.b = 0.5;
+ }
+ else {
+ tval.r = 0.5;
+ tval.g = 1.0 + val;
+ tval.b = 0.0;
+ }
+ tval.a = 0.06;
+ }
+ else {
+ tval = texture(transferTexture, val);
+ }
+ tval *= densityScale;
tval.rgb = pow(tval.rgb, vec3(2.2));
scattering = tval.rgb * 1500.0;
extinction = max(1e-4, tval.a * 50.0);
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index 63f613b93dd..edb2046568c 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -420,8 +420,7 @@ GPUShader *workbench_shader_outline_get(void);
GPUShader *workbench_shader_antialiasing_accumulation_get(void);
GPUShader *workbench_shader_antialiasing_get(int stage);
-GPUShader *workbench_shader_volume_get(
- bool slice, bool coba, InterpType cubic, bool smoke, bool show_phi);
+GPUShader *workbench_shader_volume_get(bool slice, bool coba, InterpType cubic, bool smoke);
void workbench_shader_depth_of_field_get(GPUShader **prepare_sh,
GPUShader **downsample_sh,
diff --git a/source/blender/draw/engines/workbench/workbench_shader.c b/source/blender/draw/engines/workbench/workbench_shader.c
index 3eac723a858..43749f2688a 100644
--- a/source/blender/draw/engines/workbench/workbench_shader.c
+++ b/source/blender/draw/engines/workbench/workbench_shader.c
@@ -441,8 +441,7 @@ GPUShader *workbench_shader_antialiasing_get(int stage)
return e_data.smaa_sh[stage];
}
-GPUShader *workbench_shader_volume_get(
- bool slice, bool coba, InterpType cubic, bool smoke, bool show_phi)
+GPUShader *workbench_shader_volume_get(bool slice, bool coba, InterpType cubic, bool smoke)
{
GPUShader **shader = &e_data.volume_sh[slice][coba][cubic][smoke];
@@ -466,9 +465,6 @@ GPUShader *workbench_shader_volume_get(
if (smoke) {
BLI_dynstr_append(ds, "#define VOLUME_SMOKE\n");
}
- if (show_phi) {
- BLI_dynstr_append(ds, "#define SHOW_PHI\n");
- }
char *defines = BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c
index 84c796dfc46..499249e62b2 100644
--- a/source/blender/draw/engines/workbench/workbench_volume.c
+++ b/source/blender/draw/engines/workbench/workbench_volume.c
@@ -99,8 +99,7 @@ static void workbench_volume_modifier_cache_populate(WORKBENCH_Data *vedata,
mds->coba_field == FLUID_DOMAIN_FIELD_PHI_IN ||
mds->coba_field == FLUID_DOMAIN_FIELD_PHI_OUT ||
mds->coba_field == FLUID_DOMAIN_FIELD_PHI_OBSTACLE);
- GPUShader *sh = workbench_shader_volume_get(
- use_slice, mds->use_coba, cubic_interp, true, show_phi);
+ GPUShader *sh = workbench_shader_volume_get(use_slice, mds->use_coba, cubic_interp, true);
if (use_slice) {
float invviewmat[4][4];
@@ -142,8 +141,11 @@ static void workbench_volume_modifier_cache_populate(WORKBENCH_Data *vedata,
if (mds->use_coba) {
DRW_shgroup_uniform_texture(grp, "densityTexture", mds->tex_field);
- DRW_shgroup_uniform_texture(grp, "transferTexture", mds->tex_coba);
+ if (!show_phi) {
+ DRW_shgroup_uniform_texture(grp, "transferTexture", mds->tex_coba);
+ }
DRW_shgroup_uniform_float_copy(grp, "gridScale", mds->grid_scale);
+ DRW_shgroup_uniform_bool_copy(grp, "showPhi", show_phi);
}
else {
static float white[3] = {1.0f, 1.0f, 1.0f};
@@ -206,7 +208,7 @@ static void workbench_volume_object_cache_populate(WORKBENCH_Data *vedata,
wpd->volumes_do = true;
/* Create shader. */
- GPUShader *sh = workbench_shader_volume_get(false, false, false, false, false);
+ GPUShader *sh = workbench_shader_volume_get(false, false, false, false);
/* Compute color. */
float color[3];
diff --git a/source/blender/gpu/intern/gpu_draw_smoke.c b/source/blender/gpu/intern/gpu_draw_smoke.c
index d9b55dede0f..b5618a4954b 100644
--- a/source/blender/gpu/intern/gpu_draw_smoke.c
+++ b/source/blender/gpu/intern/gpu_draw_smoke.c
@@ -52,7 +52,6 @@
enum {
TFUNC_FLAME_SPECTRUM = 0,
TFUNC_COLOR_RAMP = 1,
- TFUNC_PHI_SPECTRUM = 2,
};
# define TFUNC_WIDTH 256
@@ -103,35 +102,6 @@ static void create_color_ramp(const struct ColorBand *coba, float *data)
}
}
-static void create_phi_spectrum_texture(float *data)
-{
-# define MAX_PHI_VALUE 1.0f
-# define MIN_PHI_VALUE -1.0f
-
- float *spec_pixels = MEM_mallocN(TFUNC_WIDTH * 4 * 16 * 16 * sizeof(float), "spec_pixels");
-
- phi_to_rgb(data, TFUNC_WIDTH, MIN_PHI_VALUE, MAX_PHI_VALUE);
-
- for (int i = 0; i < 16; i++) {
- for (int j = 0; j < 16; j++) {
- for (int k = 0; k < TFUNC_WIDTH; k++) {
- int index = (j * TFUNC_WIDTH * 16 + i * TFUNC_WIDTH + k) * 4;
- spec_pixels[index] = (data[k * 4]);
- spec_pixels[index + 1] = (data[k * 4 + 1]);
- spec_pixels[index + 2] = (data[k * 4 + 2]);
- spec_pixels[index + 3] = 0.06f;
- }
- }
- }
-
- memcpy(data, spec_pixels, sizeof(float) * 4 * TFUNC_WIDTH);
-
- MEM_freeN(spec_pixels);
-
-# undef MAX_PHI_VALUE
-# undef MIN_PHI_VALUE
-}
-
static GPUTexture *create_transfer_function(int type, const struct ColorBand *coba)
{
float *data = MEM_mallocN(sizeof(float) * 4 * TFUNC_WIDTH, __func__);
@@ -143,9 +113,6 @@ static GPUTexture *create_transfer_function(int type, const struct ColorBand *co
case TFUNC_COLOR_RAMP:
create_color_ramp(coba, data);
break;
- case TFUNC_PHI_SPECTRUM:
- create_phi_spectrum_texture(data);
- break;
}
GPUTexture *tex = GPU_texture_create_1d(TFUNC_WIDTH, GPU_RGBA8, data, NULL);
@@ -167,6 +134,7 @@ static void swizzle_texture_channel_single(GPUTexture *tex)
static GPUTexture *create_field_texture(FluidDomainSettings *mds)
{
float *field = NULL;
+ eGPUTextureFormat texture_format = GPU_R8;
switch (mds->coba_field) {
case FLUID_DOMAIN_FIELD_DENSITY:
@@ -213,22 +181,34 @@ static GPUTexture *create_field_texture(FluidDomainSettings *mds)
break;
case FLUID_DOMAIN_FIELD_PHI:
field = manta_get_phi(mds->fluid);
+ texture_format = GPU_R16F;
break;
case FLUID_DOMAIN_FIELD_PHI_IN:
field = manta_get_phi_in(mds->fluid);
+ texture_format = GPU_R16F;
break;
case FLUID_DOMAIN_FIELD_PHI_OUT:
field = manta_get_phiout_in(mds->fluid);
+ texture_format = GPU_R16F;
break;
case FLUID_DOMAIN_FIELD_PHI_OBSTACLE:
field = manta_get_phiobs_in(mds->fluid);
+ texture_format = GPU_R16F;
break;
default:
return NULL;
}
- GPUTexture *tex = GPU_texture_create_nD(
- mds->res[0], mds->res[1], mds->res[2], 3, field, GPU_R8, GPU_DATA_FLOAT, 0, true, NULL);
+ GPUTexture *tex = GPU_texture_create_nD(mds->res[0],
+ mds->res[1],
+ mds->res[2],
+ 3,
+ field,
+ texture_format,
+ GPU_DATA_FLOAT,
+ 0,
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list