[Bf-blender-cvs] [ecd57e81844] tmp-overlay-engine: Overlay Engine: Volume Velocity
Clément Foucault
noreply at git.blender.org
Fri Nov 15 01:35:21 CET 2019
Commit: ecd57e81844cf650cedf460a768bcd83907d160d
Author: Clément Foucault
Date: Sun Nov 10 00:53:01 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rBecd57e81844cf650cedf460a768bcd83907d160d
Overlay Engine: Volume Velocity
===================================================================
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_velocity_vert.glsl
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 7f370219b0f..6d33d237123 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -413,6 +413,7 @@ data_to_c_simple(engines/overlay/shaders/outline_lightprobe_grid_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/outline_resolve_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/paint_weight_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/paint_weight_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/volume_velocity_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/wireframe_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/wireframe_geom.glsl SRC)
data_to_c_simple(engines/overlay/shaders/wireframe_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 4d983ba9c7f..6afa7d29b56 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -31,6 +31,7 @@
#include "BKE_mball.h"
#include "BKE_mesh.h"
#include "BKE_movieclip.h"
+#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_tracking.h"
@@ -40,13 +41,17 @@
#include "DNA_lightprobe_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meta_types.h"
+#include "DNA_modifier_types.h"
#include "DNA_object_force_types.h"
#include "DNA_rigidbody_types.h"
+#include "DNA_smoke_types.h"
#include "DEG_depsgraph_query.h"
#include "ED_view3d.h"
+#include "GPU_draw.h"
+
#include "overlay_private.h"
#include "draw_common.h"
@@ -1471,6 +1476,99 @@ void OVERLAY_gpencil_cache_populate(OVERLAY_Data *UNUSED(vedata), Object *ob)
/** \} */
+/* -------------------------------------------------------------------- */
+/** \name Volumetric / Smoke sim
+ * \{ */
+
+static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
+ OVERLAY_Data *data,
+ Object *ob,
+ ModifierData *md,
+ Scene *scene,
+ float *color)
+{
+ SmokeModifierData *smd = (SmokeModifierData *)md;
+ SmokeDomainSettings *sds = smd->domain;
+
+ /* Don't show smoke before simulation starts, this could be made an option in the future. */
+ const bool draw_velocity = (sds->draw_velocity && sds->fluid &&
+ CFRA >= sds->point_cache[0]->startframe);
+
+ /* Small cube showing voxel size. */
+ {
+ float min[3];
+ madd_v3fl_v3fl_v3fl_v3i(min, sds->p0, sds->cell_size, sds->res_min);
+ float voxel_cubemat[4][4] = {{0.0f}};
+ /* scale small cube to voxel size */
+ voxel_cubemat[0][0] = 1.0f / (float)sds->base_res[0];
+ voxel_cubemat[1][1] = 1.0f / (float)sds->base_res[1];
+ voxel_cubemat[2][2] = 1.0f / (float)sds->base_res[2];
+ voxel_cubemat[3][3] = 1.0f;
+ /* translate small cube to corner */
+ copy_v3_v3(voxel_cubemat[3], min);
+ /* move small cube into the domain (otherwise its centered on vertex of domain object) */
+ translate_m4(voxel_cubemat, 1.0f, 1.0f, 1.0f);
+ mul_m4_m4m4(voxel_cubemat, ob->obmat, voxel_cubemat);
+
+ DRW_buffer_add_entry(cb->empty_cube, color, voxel_cubemat);
+ }
+
+ if (draw_velocity) {
+ const bool use_needle = (sds->vector_draw_type == VECTOR_DRAW_NEEDLE);
+ int line_count = (use_needle) ? 6 : 1;
+ int slice_axis = -1;
+ line_count *= sds->res[0] * sds->res[1] * sds->res[2];
+
+ if (sds->slice_method == MOD_SMOKE_SLICE_AXIS_ALIGNED &&
+ sds->axis_slice_method == AXIS_SLICE_SINGLE) {
+ float viewinv[4][4];
+ DRW_view_viewmat_get(NULL, viewinv, true);
+
+ const int axis = (sds->slice_axis == SLICE_AXIS_AUTO) ? axis_dominant_v3_single(viewinv[2]) :
+ sds->slice_axis - 1;
+ slice_axis = axis;
+ line_count /= sds->res[axis];
+ }
+
+ GPU_create_smoke_velocity(smd);
+
+ GPUShader *sh = OVERLAY_shader_volume_velocity(use_needle);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, data->psl->extra_ps[0]);
+ DRW_shgroup_uniform_texture(grp, "velocityX", sds->tex_velocity_x);
+ DRW_shgroup_uniform_texture(grp, "velocityY", sds->tex_velocity_y);
+ DRW_shgroup_uniform_texture(grp, "velocityZ", sds->tex_velocity_z);
+ DRW_shgroup_uniform_float_copy(grp, "displaySize", sds->vector_scale);
+ DRW_shgroup_uniform_float_copy(grp, "slicePosition", sds->slice_depth);
+ DRW_shgroup_uniform_vec3_copy(grp, "cellSize", sds->cell_size);
+ DRW_shgroup_uniform_vec3_copy(grp, "domainOriginOffset", sds->p0);
+ DRW_shgroup_uniform_ivec3_copy(grp, "adaptiveCellOffset", sds->res_min);
+ DRW_shgroup_uniform_int_copy(grp, "sliceAxis", slice_axis);
+ DRW_shgroup_call_procedural_lines(grp, ob, line_count);
+
+ BLI_addtail(&data->stl->pd->smoke_domains, BLI_genericNodeN(smd));
+ }
+}
+
+static void OVERLAY_volume_free_smoke_textures(OVERLAY_Data *data)
+{
+ /* 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
+ * modifier we don't want them to take precious VRAM if the
+ * modifier is not used for display. We should share them for
+ * all viewport in a redraw at least. */
+ LinkData *link;
+ while ((link = BLI_pophead(&data->stl->pd->smoke_domains))) {
+ SmokeModifierData *smd = (SmokeModifierData *)link->data;
+ GPU_free_smoke_velocity(smd);
+ MEM_freeN(link);
+ }
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+
static void OVERLAY_object_center(OVERLAY_ExtraCallBuffers *cb,
Object *ob,
OVERLAY_PrivateData *pd,
@@ -1514,6 +1612,7 @@ void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata, Object *ob)
const DRWContextState *draw_ctx = DRW_context_state_get();
ViewLayer *view_layer = draw_ctx->view_layer;
Scene *scene = draw_ctx->scene;
+ ModifierData *md = NULL;
const bool is_select_mode = DRW_state_is_select();
const bool is_paint_mode = (draw_ctx->object_mode &
@@ -1533,6 +1632,9 @@ void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata, Object *ob)
const bool draw_xform = draw_ctx->object_mode == OB_MODE_OBJECT &&
(scene->toolsettings->transform_flag & SCE_XFORM_DATA_ORIGIN) &&
(ob->base_flag & BASE_SELECTED) && !is_select_mode;
+ const bool draw_volume = !from_dupli && (md = modifiers_findByType(ob, eModifierType_Smoke)) &&
+ (modifier_isEnabled(scene, md, eModifierMode_Realtime)) &&
+ (((SmokeModifierData *)md)->domain != NULL);
float *color;
int theme_id = DRW_object_wire_theme_get(ob, view_layer, &color);
@@ -1569,11 +1671,9 @@ void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata, Object *ob)
if (ob->dtx & OB_AXIS) {
DRW_buffer_add_entry(cb->empty_axes, color, ob->obmat);
}
- // if ((md = modifiers_findByType(ob, eModifierType_Smoke)) &&
- // (modifier_isEnabled(scene, md, eModifierMode_Realtime)) &&
- // (((SmokeModifierData *)md)->domain != NULL)) {
- // DRW_shgroup_volume_extra(cb, ob, view_layer, scene, md);
- // }
+ if (draw_volume) {
+ OVERLAY_volume_extra(cb, vedata, ob, md, scene, color);
+ }
}
}
@@ -1585,4 +1685,6 @@ void OVERLAY_extra_draw(OVERLAY_Data *vedata)
DRW_draw_pass(psl->extra_ps[0]);
DRW_draw_pass(psl->extra_ps[1]);
DRW_draw_pass(psl->extra_centers_ps);
+
+ OVERLAY_volume_free_smoke_textures(vedata);
}
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 54f35d04732..9a22dccd8e0 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -172,6 +172,9 @@ typedef struct OVERLAY_PrivateData {
DRWView *view_edit_edges;
DRWView *view_edit_verts;
+ /** TODO get rid of this. */
+ ListBase smoke_domains;
+
/** Two instances for in_front option and without. */
OVERLAY_ExtraCallBuffers extra_call_buffers[2];
@@ -310,6 +313,7 @@ GPUShader *OVERLAY_shader_outline_resolve(void);
GPUShader *OVERLAY_shader_outline_expand(bool high_dpi);
GPUShader *OVERLAY_shader_outline_detect(bool use_wire);
GPUShader *OVERLAY_shader_paint_weight(void);
+GPUShader *OVERLAY_shader_volume_velocity(bool use_needle);
GPUShader *OVERLAY_shader_wireframe(void);
GPUShader *OVERLAY_shader_wireframe_select(void);
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index f523230c90b..ae57a69bae5 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -57,6 +57,7 @@ extern char datatoc_outline_lightprobe_grid_vert_glsl[];
extern char datatoc_outline_resolve_frag_glsl[];
extern char datatoc_paint_weight_frag_glsl[];
extern char datatoc_paint_weight_vert_glsl[];
+extern char datatoc_volume_velocity_vert_glsl[];
extern char datatoc_wireframe_vert_glsl[];
extern char datatoc_wireframe_geom_glsl[];
extern char datatoc_wireframe_frag_glsl[];
@@ -101,6 +102,8 @@ typedef struct OVERLAY_Shaders {
GPUShader *outline_detect;
GPUShader *outline_detect_wire;
GPUShader *paint_weight;
+ GPUShader *volume_velocity_needle_sh;
+ GPUShader *volume_velocity_sh;
GPUShader *wireframe_select;
GPUShader *wireframe;
} OVERLAY_Shaders;
@@ -605,6 +608,28 @@ GPUShader *OVERLAY_shader_paint_weight(void)
return sh_data->paint_weight;
}
+struct GPUShader *OVERLAY_shader_volume_velocity(bool use_needle)
+{
+ OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
+ if (use_needle && !sh_data->volume_velocity_needle_sh) {
+ sh_data->volume_velocity_needle_sh = DRW_shader_create_with_lib(
+ datatoc_volume_velocity_vert_glsl,
+ NULL,
+ datatoc_gpu_shader_flat_color_frag_glsl,
+ datatoc_common_view_lib_glsl,
+ "#define USE_NEEDLE\n");
+ }
+ else if (!sh_dat
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list