Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-10-08 18:20:02 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-10-08 18:20:09 +0300
commite5c7c21630f9d67425bb3916cbc51deef185d2be (patch)
tree941be7912e9f31670e29c448e04d17178ed8cb51 /source/blender/draw/engines/workbench/workbench_volume.c
parent8c4a7593f2189a57d348f4c3caf9fc1e3d552059 (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.c14
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);