From 78f8270ad3f3ffe2e040b2ab342a7234fa339ea6 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Wed, 16 Oct 2019 11:02:01 +0200 Subject: Volumetric: Debug Voxel Size and Location When displaying the voxel size for an adaptive domain the resolution of the adaptive domain was used to calculate the world size of the voxel. This patch changes this to use the initial size of the domain. When using adaptive domain the overlay was not rendered in the right place. Thanks to sebbas for part of the patch! Reviewed By: sebbas, fclem Differential Revision: https://developer.blender.org/D6076 --- source/blender/draw/modes/object_mode.c | 18 +++++++++++++++--- .../draw/modes/shaders/volume_velocity_vert.glsl | 15 ++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 11cef92c63c..70bccb4849c 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -2668,12 +2668,21 @@ static void DRW_shgroup_volume_extra(OBJECT_ShadingGroupList *sgl, DRW_object_wire_theme_get(ob, view_layer, &color); /* 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}}; - voxel_cubemat[0][0] = 1.0f / (float)sds->res[0]; - voxel_cubemat[1][1] = 1.0f / (float)sds->res[1]; - voxel_cubemat[2][2] = 1.0f / (float)sds->res[2]; + /* 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][0] = voxel_cubemat[3][1] = voxel_cubemat[3][2] = -1.0f; voxel_cubemat[3][3] = 1.0f; + /* translate small cube to corner */ + voxel_cubemat[3][0] = min[0]; + voxel_cubemat[3][1] = min[1]; + voxel_cubemat[3][2] = min[2]; + voxel_cubemat[3][3] = 1.0f; + /* 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); @@ -2709,6 +2718,9 @@ static void DRW_shgroup_volume_extra(OBJECT_ShadingGroupList *sgl, 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); diff --git a/source/blender/draw/modes/shaders/volume_velocity_vert.glsl b/source/blender/draw/modes/shaders/volume_velocity_vert.glsl index e96a789b8b1..64f88bd74fa 100644 --- a/source/blender/draw/modes/shaders/volume_velocity_vert.glsl +++ b/source/blender/draw/modes/shaders/volume_velocity_vert.glsl @@ -6,6 +6,13 @@ uniform float displaySize = 1.0; uniform float slicePosition; uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */ +/* SmokeDomainSettings.cell_size */ +uniform vec3 cellSize; +/* SmokeDomainSettings.p0 */ +uniform vec3 domainOriginOffset; +/* SmokeDomainSettings.res_min */ +uniform ivec3 adaptiveCellOffset; + flat out vec4 finalColor; const vec3 corners[4] = vec3[4](vec3(0.0, 0.2, -0.5), @@ -66,7 +73,6 @@ void main() #endif ivec3 volume_size = textureSize(velocityX, 0); - float voxel_size = 1.0 / float(max(max(volume_size.x, volume_size.y), volume_size.z)); ivec3 cell_ofs = ivec3(0); ivec3 cell_div = volume_size; @@ -89,8 +95,7 @@ void main() cell_co.z = cell / (cell_div.x * cell_div.y); cell_co += cell_ofs; - vec3 pos = (vec3(cell_co) + 0.5) / vec3(volume_size); - pos = pos * 2.0 - 1.0; + vec3 pos = domainOriginOffset + cellSize * (vec3(cell_co + adaptiveCellOffset) + 0.5); vec3 velocity; velocity.x = texelFetch(velocityX, cell_co, 0).r; @@ -102,9 +107,9 @@ void main() #ifdef USE_NEEDLE mat3 rot_mat = rotation_from_vector(velocity); vec3 rotated_pos = rot_mat * corners[indices[gl_VertexID % 12]]; - pos += rotated_pos * length(velocity) * displaySize * voxel_size; + pos += rotated_pos * length(velocity) * displaySize * cellSize; #else - pos += (((gl_VertexID % 2) == 1) ? velocity : vec3(0.0)) * displaySize * voxel_size; + pos += ((gl_VertexID % 2) == 1) ? velocity * displaySize * cellSize : vec3(0.0); #endif vec3 world_pos = point_object_to_world(pos); -- cgit v1.2.3 From 9054b834028fc5c0e67f5225ad09dd7107484951 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Tue, 15 Oct 2019 12:22:43 +0200 Subject: Cleanup depsgraph access in particle_edit.c 'PE_set_data' / 'PE_set_view3d_data' would give us a depsgraph already, so use it. Also fix access to PEData->depsgraph without calling 'PE_set_data' prior. Addresses concern raised in rBcf2c09002fae. Reviewed By: sergey Differential Revision: https://developer.blender.org/D6067 --- source/blender/editors/physics/particle_edit.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index 3978f7ba3b5..f16a372cb3c 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -470,8 +470,7 @@ static void PE_set_view3d_data(bContext *C, PEData *data) { PE_set_data(C, data); - Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - ED_view3d_viewcontext_init(C, &data->vc, depsgraph); + ED_view3d_viewcontext_init(C, &data->vc, data->depsgraph); if (!XRAY_ENABLED(data->vc.v3d)) { if (data->vc.v3d->flag & V3D_INVALID_BACKBUF) { @@ -1811,10 +1810,13 @@ bool PE_mouse_particles(bContext *C, const int mval[2], bool extend, bool desele PEData data; Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_active_object(C); - PTCacheEdit *edit = PE_get_current(data.depsgraph, scene, ob); POINT_P; KEY_K; + PE_set_view3d_data(C, &data); + + PTCacheEdit *edit = PE_get_current(data.depsgraph, scene, ob); + if (!PE_start_edit(edit)) { return false; } @@ -1828,7 +1830,6 @@ bool PE_mouse_particles(bContext *C, const int mval[2], bool extend, bool desele } } - PE_set_view3d_data(C, &data); data.mval = mval; data.rad = ED_view3d_select_dist_px(); @@ -1997,7 +1998,6 @@ static const EnumPropertyItem select_random_type_items[] = { static int select_random_exec(bContext *C, wmOperator *op) { - Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); PEData data; int type; @@ -2017,7 +2017,7 @@ static int select_random_exec(bContext *C, wmOperator *op) PE_set_data(C, &data); data.select_action = SEL_SELECT; - edit = PE_get_current(depsgraph, data.scene, data.ob); + edit = PE_get_current(data.depsgraph, data.scene, data.ob); rng = BLI_rng_new_srandom(seed); @@ -4940,7 +4940,7 @@ static void shape_cut(PEData *data, int pa_index) static int shape_cut_exec(bContext *C, wmOperator *UNUSED(op)) { - Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_active_object(C); ParticleEditSettings *pset = PE_settings(scene); -- cgit v1.2.3