diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-09-30 20:34:23 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-09-30 20:37:40 +0300 |
commit | 1054f65a29b0b9ee9cf7db8a4036e4a55506ce03 (patch) | |
tree | a3976079acd1863d7889ffd02ea3cdad8ec45f27 /source/blender/draw/engines | |
parent | 8249e1ce5e279b97e60cc847fe715a0e1a58a9f1 (diff) |
Object Mode : Add probes data outlines and selectability
This required some small changes to the data display shaders so that they match the way the object mode renders them.
Strangely enough, I had to remove the normal attribute from the display code because it was being not bound as soon as I created another rendering call in object mode. The problem may be deeper but I did not have time for this so I derive the normal from the sphere pos.
Diffstat (limited to 'source/blender/draw/engines')
6 files changed, 36 insertions, 46 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index fad1b58f34b..bbd82f1c3a0 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -253,19 +253,9 @@ void EEVEE_lightprobes_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *UNUSED(ved MEM_freeN(shader_str); - ds_frag = BLI_dynstr_new(); - BLI_dynstr_append(ds_frag, datatoc_octahedron_lib_glsl); - BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl); - BLI_dynstr_append(ds_frag, datatoc_lightprobe_lib_glsl); - BLI_dynstr_append(ds_frag, datatoc_lightprobe_planar_display_frag_glsl); - shader_str = BLI_dynstr_get_cstring(ds_frag); - BLI_dynstr_free(ds_frag); - e_data.probe_planar_display_sh = DRW_shader_create( - datatoc_lightprobe_planar_display_vert_glsl, NULL, shader_str, - "#define MAX_PLANAR " STRINGIFY(MAX_PLANAR) "\n"); - - MEM_freeN(shader_str); + datatoc_lightprobe_planar_display_vert_glsl, NULL, + datatoc_lightprobe_planar_display_frag_glsl, NULL); e_data.probe_planar_downsample_sh = DRW_shader_create( datatoc_lightprobe_planar_downsample_vert_glsl, @@ -440,6 +430,12 @@ void EEVEE_lightprobes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *veda DRW_shgroup_attrib_float(grp, "sphere_size", 1); DRW_shgroup_uniform_float(grp, "lodCubeMax", &sldata->probes->lod_cube_max, 1); DRW_shgroup_uniform_buffer(grp, "probeCubes", &sldata->probe_pool); + + geom = DRW_cache_quad_get(); + grp = stl->g_data->planar_display_shgrp = DRW_shgroup_instance_create(e_data.probe_planar_display_sh, psl->probe_display, geom); + DRW_shgroup_attrib_float(grp, "probe_id", 1); /* XXX this works because we are still uploading 4bytes and using the right stride */ + DRW_shgroup_attrib_float(grp, "probe_mat", 16); + DRW_shgroup_uniform_buffer(grp, "probePlanars", &txl->planar_pool); } { @@ -512,7 +508,7 @@ static void scale_m4_v3(float R[4][4], float v[3]) mul_v3_v3(R[i], v); } -static void EEVEE_planar_reflections_updates(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl, EEVEE_TextureList *txl) +static void EEVEE_planar_reflections_updates(EEVEE_SceneLayerData *sldata, EEVEE_StorageList *stl) { EEVEE_LightProbesInfo *pinfo = sldata->probes; Object *ob; @@ -612,14 +608,7 @@ static void EEVEE_planar_reflections_updates(EEVEE_SceneLayerData *sldata, EEVEE DRW_state_draw_support() && (probe->flag & LIGHTPROBE_FLAG_SHOW_DATA)) { - DRWShadingGroup *grp = DRW_shgroup_create(e_data.probe_planar_display_sh, psl->probe_display); - - DRW_shgroup_uniform_int(grp, "probeIdx", &ped->probe_id, 1); - DRW_shgroup_uniform_buffer(grp, "probePlanars", &txl->planar_pool); - DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); - - struct Gwn_Batch *geom = DRW_cache_fullscreen_quad_get(); - DRW_shgroup_call_add(grp, geom, ob->obmat); + DRW_shgroup_call_dynamic_add(stl->g_data->planar_display_shgrp, &ped->probe_id, ob->obmat); } } } @@ -668,8 +657,9 @@ static void EEVEE_lightprobes_updates(EEVEE_SceneLayerData *sldata, EEVEE_PassLi DRW_state_draw_support() && (probe->flag & LIGHTPROBE_FLAG_SHOW_DATA)) { + ped->probe_size = probe->data_draw_size * 0.1f; DRW_shgroup_call_dynamic_add( - stl->g_data->cube_display_shgrp, &ped->probe_id, ob->obmat[3], &probe->data_draw_size); + stl->g_data->cube_display_shgrp, &ped->probe_id, ob->obmat[3], &ped->probe_size); } } @@ -836,7 +826,7 @@ void EEVEE_lightprobes_cache_finish(EEVEE_SceneLayerData *sldata, EEVEE_Data *ve } EEVEE_lightprobes_updates(sldata, vedata->psl, vedata->stl); - EEVEE_planar_reflections_updates(sldata, vedata->psl, vedata->txl); + EEVEE_planar_reflections_updates(sldata, vedata->stl); DRW_uniformbuffer_update(sldata->probe_ubo, &sldata->probes->probe_data); DRW_uniformbuffer_update(sldata->grid_ubo, &sldata->probes->grid_data); diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 480ff81f3a0..85838898b9b 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -486,6 +486,7 @@ typedef struct EEVEE_LightProbeEngineData { int num_cell; int max_lvl; int probe_id; /* Only used for display data */ + float probe_size; /* Only used for display data */ /* For planar reflection rendering */ float viewmat[4][4]; float persmat[4][4]; @@ -518,6 +519,7 @@ typedef struct EEVEE_PrivateData { struct DRWShadingGroup *refract_depth_shgrp_clip; struct DRWShadingGroup *refract_depth_shgrp_clip_cull; struct DRWShadingGroup *cube_display_shgrp; + struct DRWShadingGroup *planar_display_shgrp; struct DRWShadingGroup *planar_downsample; struct GHash *material_hash; struct GHash *hair_material_hash; diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_cube_display_vert.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_cube_display_vert.glsl index b943a59feeb..893647d8ecc 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_cube_display_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_cube_display_vert.glsl @@ -1,6 +1,5 @@ in vec3 pos; -in vec3 nor; /* Instance attrib */ in int probe_id; @@ -16,7 +15,13 @@ out vec3 worldPosition; void main() { pid = probe_id; - worldPosition = pos * 0.1 * sphere_size + probe_location; - gl_Position = ViewProjectionMatrix * vec4(worldPosition, 1.0); - worldNormal = normalize(nor); + + /* While this is not performant, we do this to + * match the object mode engine instancing shader. */ + mat4 offsetmat = mat4(1.0); /* Identity */ + offsetmat[3].xyz = probe_location; + + worldPosition = pos * sphere_size; + gl_Position = ViewProjectionMatrix * offsetmat * vec4(worldPosition, 1.0); + worldNormal = normalize(pos); }
\ No newline at end of file diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_grid_display_vert.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_grid_display_vert.glsl index 121859c98f1..fd200ec5984 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_grid_display_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_grid_display_vert.glsl @@ -1,6 +1,5 @@ in vec3 pos; -in vec3 nor; uniform mat4 ViewProjectionMatrix; @@ -31,5 +30,5 @@ void main() increment_z * ls_cell_location.z); gl_Position = ViewProjectionMatrix * vec4(pos * 0.02 * sphere_size + ws_cell_location, 1.0); - worldNormal = normalize(nor); + worldNormal = normalize(pos); }
\ No newline at end of file diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_planar_display_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_planar_display_frag.glsl index 676f7e49ebf..655cc626bba 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_planar_display_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_planar_display_frag.glsl @@ -1,24 +1,14 @@ -uniform int probeIdx; +uniform mat4 ViewProjectionMatrix; +uniform sampler2DArray probePlanars; in vec3 worldPosition; +flat in int probeIdx; out vec4 FragColor; void main() { - PlanarData pd = planars_data[probeIdx]; - - /* Fancy fast clipping calculation */ - vec2 dist_to_clip; - dist_to_clip.x = dot(pd.pl_clip_pos_x, worldPosition); - dist_to_clip.y = dot(pd.pl_clip_pos_y, worldPosition); - float fac = dot(step(pd.pl_clip_edges, dist_to_clip.xxyy), vec2(-1.0, 1.0).xyxy); /* compare and add all tests */ - - if (fac != 2.0) { - discard; - } - vec4 refco = ViewProjectionMatrix * vec4(worldPosition, 1.0); refco.xy /= refco.w; FragColor = vec4(textureLod(probePlanars, vec3(refco.xy * 0.5 + 0.5, float(probeIdx)), 0.0).rgb, 1.0); diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_planar_display_vert.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_planar_display_vert.glsl index 3c620982273..a9716332eb5 100644 --- a/source/blender/draw/engines/eevee/shaders/lightprobe_planar_display_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/lightprobe_planar_display_vert.glsl @@ -1,13 +1,17 @@ in vec3 pos; -uniform mat4 ModelViewProjectionMatrix; -uniform mat4 ModelMatrix; +in int probe_id; +in mat4 probe_mat; + +uniform mat4 ViewProjectionMatrix; out vec3 worldPosition; +flat out int probeIdx; void main() { - gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); - worldPosition = (ModelMatrix * vec4(pos, 1.0)).xyz; + gl_Position = ViewProjectionMatrix * probe_mat * vec4(pos, 1.0); + worldPosition = (probe_mat * vec4(pos, 1.0)).xyz; + probeIdx = probe_id; }
\ No newline at end of file |