diff options
author | Julian Eisel <julian@blender.org> | 2020-03-12 17:58:03 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2020-03-12 17:58:03 +0300 |
commit | b86be9b2145458037fd0b17433b7af0efa7b6472 (patch) | |
tree | f333625555402992ebb35d258f93eda1130389e6 /source/blender/draw/engines/workbench/workbench_volume.c | |
parent | 00f83ec125207e90bf180b3eb7752d8cb6482a86 (diff) | |
parent | cb6cec904fa14ce0ab10a2a53af5c936d56376cf (diff) |
Merge branch 'temp-openxr-ghostxr' into temp-openxr-blenderside
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_volume.c')
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_volume.c | 123 |
1 files changed, 38 insertions, 85 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c index 2f7296fb40f..a3072b834bd 100644 --- a/source/blender/draw/engines/workbench/workbench_volume.c +++ b/source/blender/draw/engines/workbench/workbench_volume.c @@ -35,87 +35,23 @@ #include "GPU_draw.h" -enum { - VOLUME_SH_SLICE = 0, - VOLUME_SH_COBA, - VOLUME_SH_CUBIC, -}; - -#define VOLUME_SH_MAX (1 << (VOLUME_SH_CUBIC + 1)) - -static struct { - struct GPUShader *volume_sh[VOLUME_SH_MAX]; - struct GPUShader *volume_coba_sh; - struct GPUTexture *dummy_tex; - struct GPUTexture *dummy_coba_tex; -} e_data = {{NULL}}; - -extern char datatoc_workbench_volume_vert_glsl[]; -extern char datatoc_workbench_volume_frag_glsl[]; -extern char datatoc_common_view_lib_glsl[]; -extern char datatoc_gpu_shader_common_obinfos_lib_glsl[]; - -static GPUShader *volume_shader_get(bool slice, bool coba, bool cubic) +void workbench_volume_engine_init(WORKBENCH_Data *vedata) { - int id = 0; - id += (slice) ? (1 << VOLUME_SH_SLICE) : 0; - id += (coba) ? (1 << VOLUME_SH_COBA) : 0; - id += (cubic) ? (1 << VOLUME_SH_CUBIC) : 0; - - if (!e_data.volume_sh[id]) { - DynStr *ds = BLI_dynstr_new(); - - if (slice) { - BLI_dynstr_append(ds, "#define VOLUME_SLICE\n"); - } - if (coba) { - BLI_dynstr_append(ds, "#define USE_COBA\n"); - } - if (cubic) { - BLI_dynstr_append(ds, "#define USE_TRICUBIC\n"); - } - - char *defines = BLI_dynstr_get_cstring(ds); - BLI_dynstr_free(ds); - - char *libs = BLI_string_joinN(datatoc_common_view_lib_glsl, - datatoc_gpu_shader_common_obinfos_lib_glsl); - - e_data.volume_sh[id] = DRW_shader_create_with_lib(datatoc_workbench_volume_vert_glsl, - NULL, - datatoc_workbench_volume_frag_glsl, - libs, - defines); - - MEM_freeN(libs); - MEM_freeN(defines); - } - - return e_data.volume_sh[id]; -} + WORKBENCH_TextureList *txl = vedata->txl; -void workbench_volume_engine_init(void) -{ - if (!e_data.dummy_tex) { + if (txl->dummy_volume_tx == NULL) { float pixel[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - e_data.dummy_tex = GPU_texture_create_3d(1, 1, 1, GPU_RGBA8, pixel, NULL); - e_data.dummy_coba_tex = GPU_texture_create_1d(1, GPU_RGBA8, pixel, NULL); + txl->dummy_volume_tx = GPU_texture_create_3d(1, 1, 1, GPU_RGBA8, pixel, NULL); + txl->dummy_coba_tx = GPU_texture_create_1d(1, GPU_RGBA8, pixel, NULL); } } -void workbench_volume_engine_free(void) -{ - for (int i = 0; i < VOLUME_SH_MAX; i++) { - DRW_SHADER_FREE_SAFE(e_data.volume_sh[i]); - } - DRW_TEXTURE_FREE_SAFE(e_data.dummy_tex); - DRW_TEXTURE_FREE_SAFE(e_data.dummy_coba_tex); -} - void workbench_volume_cache_init(WORKBENCH_Data *vedata) { - vedata->psl->volume_pass = DRW_pass_create( + vedata->psl->volume_ps = DRW_pass_create( "Volumes", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL | DRW_STATE_CULL_FRONT); + + vedata->stl->wpd->volumes_do = false; } void workbench_volume_cache_populate(WORKBENCH_Data *vedata, @@ -125,8 +61,8 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, { FluidModifierData *mmd = (FluidModifierData *)md; FluidDomainSettings *mds = mmd->domain; - WORKBENCH_PrivateData *wpd = vedata->stl->g_data; - WORKBENCH_EffectInfo *effect_info = vedata->stl->effects; + WORKBENCH_PrivateData *wpd = vedata->stl->wpd; + WORKBENCH_TextureList *txl = vedata->txl; DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); DRWShadingGroup *grp = NULL; @@ -146,14 +82,16 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, GPU_create_smoke(mmd, 1); } - if ((!mds->use_coba && mds->tex == NULL) || (mds->use_coba && mds->tex_field == NULL)) { + if ((!mds->use_coba && (mds->tex_density == NULL && mds->tex_color == NULL)) || + (mds->use_coba && mds->tex_field == NULL)) { return; } const bool use_slice = (mds->slice_method == FLUID_DOMAIN_SLICE_AXIS_ALIGNED && mds->axis_slice_method == AXIS_SLICE_SINGLE); const bool cubic_interp = (mds->interp_method == VOLUME_INTERP_CUBIC); - GPUShader *sh = volume_shader_get(use_slice, mds->use_coba, cubic_interp); + + GPUShader *sh = workbench_shader_volume_get(use_slice, mds->use_coba, cubic_interp); if (use_slice) { float invviewmat[4][4]; @@ -167,7 +105,7 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, /* 0.05f to achieve somewhat the same opacity as the full view. */ float step_length = max_ff(1e-16f, dim[axis] * 0.05f); - grp = DRW_shgroup_create(sh, vedata->psl->volume_pass); + grp = DRW_shgroup_create(sh, vedata->psl->volume_ps); DRW_shgroup_uniform_float_copy(grp, "slicePosition", mds->slice_depth); DRW_shgroup_uniform_int_copy(grp, "sliceAxis", axis); DRW_shgroup_uniform_float_copy(grp, "stepLength", step_length); @@ -175,7 +113,7 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, } else { double noise_ofs; - BLI_halton_1d(3, 0.0, effect_info->jitter_index, &noise_ofs); + BLI_halton_1d(3, 0.0, wpd->taa_sample, &noise_ofs); float dim[3], step_length, max_slice; float slice_ct[3] = {mds->res[0], mds->res[1], mds->res[2]}; mul_v3_fl(slice_ct, max_ff(0.001f, mds->slice_per_voxel)); @@ -185,8 +123,8 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, mul_v3_v3(dim, slice_ct); step_length = len_v3(dim); - grp = DRW_shgroup_create(sh, vedata->psl->volume_pass); - DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)wpd->viewvecs, 3); + grp = DRW_shgroup_create(sh, vedata->psl->volume_ps); + DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo); DRW_shgroup_uniform_int_copy(grp, "samplesLen", max_slice); DRW_shgroup_uniform_float_copy(grp, "stepLength", step_length); DRW_shgroup_uniform_float_copy(grp, "noiseOfs", noise_ofs); @@ -201,12 +139,13 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, static float white[3] = {1.0f, 1.0f, 1.0f}; bool use_constant_color = ((mds->active_fields & FLUID_DOMAIN_ACTIVE_COLORS) == 0 && (mds->active_fields & FLUID_DOMAIN_ACTIVE_COLOR_SET) != 0); - DRW_shgroup_uniform_texture(grp, "densityTexture", mds->tex); + DRW_shgroup_uniform_texture( + grp, "densityTexture", (mds->tex_color) ? mds->tex_color : mds->tex_density); DRW_shgroup_uniform_texture(grp, "shadowTexture", mds->tex_shadow); DRW_shgroup_uniform_texture( - grp, "flameTexture", (mds->tex_flame) ? mds->tex_flame : e_data.dummy_tex); + grp, "flameTexture", (mds->tex_flame) ? mds->tex_flame : txl->dummy_volume_tx); DRW_shgroup_uniform_texture( - grp, "flameColorTexture", (mds->tex_flame) ? mds->tex_flame_coba : e_data.dummy_coba_tex); + grp, "flameColorTexture", (mds->tex_flame) ? mds->tex_flame_coba : txl->dummy_coba_tx); DRW_shgroup_uniform_vec3( grp, "activeColor", (use_constant_color) ? mds->active_color : white, 1); } @@ -223,8 +162,22 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(mmd)); } -void workbench_volume_smoke_textures_free(WORKBENCH_PrivateData *wpd) +void workbench_volume_draw_pass(WORKBENCH_Data *vedata) { + WORKBENCH_PassList *psl = vedata->psl; + WORKBENCH_PrivateData *wpd = vedata->stl->wpd; + DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); + + if (wpd->volumes_do) { + GPU_framebuffer_bind(dfbl->color_only_fb); + DRW_draw_pass(psl->volume_ps); + } +} + +void workbench_volume_draw_finish(WORKBENCH_Data *vedata) +{ + WORKBENCH_PrivateData *wpd = vedata->stl->wpd; + /* Free Smoke Textures after rendering */ /* XXX This is a waste of processing and GPU bandwidth if nothing * is updated. But the problem is since Textures are stored in the @@ -236,4 +189,4 @@ void workbench_volume_smoke_textures_free(WORKBENCH_PrivateData *wpd) GPU_free_smoke(mmd); } BLI_freelistN(&wpd->smoke_domains); -} +}
\ No newline at end of file |