diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-05-19 19:53:53 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-05-20 20:14:22 +0300 |
commit | 2c6106247bfde4d649fc788a6b933d48221dc7b3 (patch) | |
tree | bdd8d2ff95288146b33b65b5e206911035a0a6c0 /source/blender/draw | |
parent | ef90d467008bbb471021e376b8d36554543544a4 (diff) |
Workbench: Precompute light direction in object space.
Avoid 2 matrix multiplication in the shader.
Diffstat (limited to 'source/blender/draw')
4 files changed, 17 insertions, 17 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl index bee49c41870..881cc901ffb 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl @@ -8,8 +8,6 @@ layout(lines_adjacency) in; layout(triangle_strip, max_vertices = 8) out; #endif -uniform mat4 ModelMatrixInverse; - uniform vec3 lightDirection = vec3(0.57, 0.57, -0.57); in VertexData { @@ -34,9 +32,6 @@ void extrude_edge(bool invert) void main() { - /* TODO precompute light_direction */ - vec3 light_dir = mat3(ModelMatrixInverse) * lightDirection; - vec3 v10 = vData[0].pos - vData[1].pos; vec3 v12 = vData[2].pos - vData[1].pos; vec3 v13 = vData[3].pos - vData[1].pos; @@ -55,8 +50,8 @@ void main() vec3 n1 = cross(v12, v10); vec3 n2 = cross(v13, v12); - vec2 facing = vec2(dot(n1, light_dir), - dot(n2, light_dir)); + vec2 facing = vec2(dot(n1, lightDirection), + dot(n2, lightDirection)); /* WATCH: maybe unpredictable in some cases. */ bool is_manifold = any(notEqual(vData[0].pos, vData[3].pos)); diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl index 8f02ce26626..4a06d325db6 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl @@ -1,7 +1,6 @@ #define EPSILON 0.0001 -#define INFINITE 10000.0 +#define INFINITE 1000000.0 -uniform mat4 ModelMatrixInverse; uniform mat4 ModelViewProjectionMatrix; uniform mat4 ViewProjectionMatrix; uniform vec3 lightDirection = vec3(0.57, 0.57, -0.57); @@ -16,9 +15,7 @@ out VertexData { void main() { - /* TODO precompute light_direction */ - vec3 light_direction = mat3(ModelMatrixInverse) * lightDirection; vData.pos = pos; vData.frontPosition = ModelViewProjectionMatrix * vec4(pos, 1.0); - vData.backPosition = ModelViewProjectionMatrix * vec4(pos + light_direction * INFINITE, 1.0); + vData.backPosition = ModelViewProjectionMatrix * vec4(pos + lightDirection * INFINITE, 1.0); } diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index 944572729c1..959186cd1d2 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -449,10 +449,6 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata) wpd->shadow_shgrp = grp; #else psl->shadow_pass = DRW_pass_create("Shadow", DRW_STATE_DEPTH_GREATER | DRW_STATE_WRITE_STENCIL_SHADOW); - grp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass); - DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.display.light_direction, 1); - DRW_shgroup_stencil_mask(grp, 0xFF); - wpd->shadow_shgrp = grp; psl->composite_shadow_pass = DRW_pass_create("Composite Shadow", DRW_STATE_WRITE_COLOR | DRW_STATE_STENCIL_NEQUAL); grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_shadow_pass); @@ -546,6 +542,7 @@ static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) { + WORKBENCH_PassList *psl = vedata->psl; WORKBENCH_StorageList *stl = vedata->stl; WORKBENCH_PrivateData *wpd = stl->g_data; @@ -629,7 +626,16 @@ void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob // DRW_shgroup_call_sculpt_add(wpd->shadow_shgrp, ob, ob->obmat); } else { - DRW_shgroup_call_object_add(wpd->shadow_shgrp, geom_shadow, ob); + WORKBENCH_ObjectData *engine_object_data = (WORKBENCH_ObjectData *)DRW_object_engine_data_ensure( + ob, &draw_engine_workbench_solid, sizeof(WORKBENCH_ObjectData), &workbench_init_object_data, NULL); + + invert_m4_m4(ob->imat, ob->obmat); + mul_v3_mat3_m4v3(engine_object_data->shadow_dir, ob->imat, e_data.display.light_direction); + + DRWShadingGroup *grp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass); + DRW_shgroup_uniform_vec3(grp, "lightDirection", engine_object_data->shadow_dir, 1); + DRW_shgroup_stencil_mask(grp, 0xFF); + DRW_shgroup_call_object_add(grp, geom_shadow, ob); } } } diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index 7b0aa157e07..1be1c475d19 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -108,6 +108,8 @@ typedef struct WORKBENCH_ObjectData { ObjectEngineDataFreeCb free; /* Accumulated recalc flags, which corresponds to ID->recalc flags. */ int recalc; + /* Shadow direction in local object space. */ + float shadow_dir[3]; int object_id; } WORKBENCH_ObjectData; |