diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-10-08 18:20:02 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-10-08 18:20:09 +0300 |
commit | e5c7c21630f9d67425bb3916cbc51deef185d2be (patch) | |
tree | 941be7912e9f31670e29c448e04d17178ed8cb51 /source/blender/draw/engines/workbench/workbench_volume.c | |
parent | 8c4a7593f2189a57d348f4c3caf9fc1e3d552059 (diff) |
Workbench: Smoke: Port back Flame display
The appearance is a bit different than 2.79 where the flame was just added
on top of the smoke without correct blending.
Now it's much more realistic and using volumetric integration. You can see
the smoke actually masking the flame.
The other difference is that the flame color was not using proper color
managed blending. Now with the use of filmic it shows bright yellow.
This could be adjusted and displayed as a user parameter in the future.
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_volume.c')
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_volume.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c index e6563b3113b..ba1d3d9ff5c 100644 --- a/source/blender/draw/engines/workbench/workbench_volume.c +++ b/source/blender/draw/engines/workbench/workbench_volume.c @@ -36,6 +36,8 @@ static struct { struct GPUShader *volume_sh; struct GPUShader *volume_slice_sh; + struct GPUTexture *dummy_tex; + struct GPUTexture *dummy_coba_tex; } e_data = {NULL}; extern char datatoc_workbench_volume_vert_glsl[]; @@ -50,6 +52,10 @@ void workbench_volume_engine_init(void) e_data.volume_slice_sh = DRW_shader_create( datatoc_workbench_volume_vert_glsl, NULL, datatoc_workbench_volume_frag_glsl, "#define VOLUME_SLICE"); + + 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); } } @@ -57,6 +63,8 @@ void workbench_volume_engine_free(void) { DRW_SHADER_FREE_SAFE(e_data.volume_sh); DRW_SHADER_FREE_SAFE(e_data.volume_slice_sh); + 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) @@ -102,6 +110,8 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec DRWShadingGroup *grp = DRW_shgroup_create(e_data.volume_slice_sh, vedata->psl->volume_pass); DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex); DRW_shgroup_uniform_texture(grp, "shadowTexture", sds->tex_shadow); + DRW_shgroup_uniform_texture(grp, "flameTexture", (sds->tex_flame) ? sds->tex_flame : e_data.dummy_tex); + DRW_shgroup_uniform_texture(grp, "flameColorTexture", (sds->tex_flame) ? sds->tex_flame_coba : e_data.dummy_coba_tex); DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness); DRW_shgroup_uniform_float_copy(grp, "slicePosition", sds->slice_depth); @@ -109,7 +119,6 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec DRW_shgroup_state_disable(grp, DRW_STATE_CULL_FRONT); BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd)); - /* TODO Flame rendering */ /* TODO COBA Rendering */ DRW_shgroup_call_object_add(grp, DRW_cache_quad_get(), ob); @@ -122,6 +131,8 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex); DRW_shgroup_uniform_texture(grp, "shadowTexture", sds->tex_shadow); + DRW_shgroup_uniform_texture(grp, "flameTexture", (sds->tex_flame) ? sds->tex_flame : e_data.dummy_tex); + DRW_shgroup_uniform_texture(grp, "flameColorTexture", (sds->tex_flame) ? sds->tex_flame_coba : e_data.dummy_coba_tex); DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness); DRW_shgroup_uniform_int_copy(grp, "samplesLen", max_slices); /* TODO FIXME : This step size is in object space but the ray itself @@ -131,7 +142,6 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec DRW_shgroup_state_enable(grp, DRW_STATE_CULL_FRONT); BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd)); - /* TODO Flame rendering */ /* TODO COBA Rendering */ DRW_shgroup_call_object_add(grp, DRW_cache_cube_get(), ob); |