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-05-19 19:53:53 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-05-20 20:14:22 +0300
commit2c6106247bfde4d649fc788a6b933d48221dc7b3 (patch)
treebdd8d2ff95288146b33b65b5e206911035a0a6c0 /source/blender/draw
parentef90d467008bbb471021e376b8d36554543544a4 (diff)
Workbench: Precompute light direction in object space.
Avoid 2 matrix multiplication in the shader.
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl9
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl7
-rw-r--r--source/blender/draw/engines/workbench/workbench_materials.c16
-rw-r--r--source/blender/draw/engines/workbench/workbench_private.h2
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;