From fdddea676d4fa40668ca82f8ccc5106437d113f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 9 May 2019 15:31:54 +0200 Subject: Cleanup: DRW: Renaming of glsl utility macros --- .../engines/eevee/shaders/lit_surface_vert.glsl | 8 ++--- .../draw/engines/eevee/shaders/shadow_vert.glsl | 4 +-- .../workbench/shaders/workbench_prepass_vert.glsl | 2 +- .../modes/shaders/armature_shape_outline_vert.glsl | 2 +- .../modes/shaders/armature_shape_solid_vert.glsl | 2 +- .../draw/modes/shaders/common_view_lib.glsl | 39 +++++++++++++++++----- .../draw/modes/shaders/edit_mesh_overlay_vert.glsl | 2 +- .../draw/modes/shaders/edit_normals_vert.glsl | 2 +- .../modes/shaders/overlay_face_wireframe_vert.glsl | 2 +- .../blender/gpu/shaders/gpu_shader_material.glsl | 2 +- .../nodes/shader/nodes/node_shader_tex_image.c | 2 +- 11 files changed, 45 insertions(+), 22 deletions(-) (limited to 'source') diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl index cddc8e87a1e..68e11f7414c 100644 --- a/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/lit_surface_vert.glsl @@ -63,12 +63,12 @@ void main() viewNormal = mat3(ViewMatrix) * worldNormal; #else gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); - viewPosition = (ModelViewMatrix * vec4(pos, 1.0)).xyz; - worldPosition = (ModelMatrix * vec4(pos, 1.0)).xyz; + worldPosition = point_object_to_world(pos); + viewPosition = point_world_to_view(worldPosition); - worldNormal = normalize(transform_normal_object_to_world(nor)); + worldNormal = normalize(normal_object_to_world(nor)); /* No need to normalize since this is just a rotation. */ - viewNormal = transform_normal_world_to_view(worldNormal); + viewNormal = normal_world_to_view(worldNormal); #endif /* Used for planar reflections */ diff --git a/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl b/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl index f8850300dc4..baaa43d84b8 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_vert.glsl @@ -24,9 +24,9 @@ void main() viewPosition = (ModelViewMatrix * vec4(pos, 1.0)).xyz; worldPosition = (ModelMatrix * vec4(pos, 1.0)).xyz; - worldNormal = normalize(transform_normal_object_to_world(nor)); + worldNormal = normalize(normal_object_to_world(nor)); /* No need to normalize since this is just a rotation. */ - viewNormal = transform_normal_world_to_view(worldNormal); + viewNormal = normal_world_to_view(worldNormal); # ifdef USE_ATTR pass_attr(pos); # endif diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl index 1de6121bb5c..bb4c4fe4177 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl @@ -88,7 +88,7 @@ void main() #endif #ifdef NORMAL_VIEWPORT_PASS_ENABLED - normal_viewport = transform_normal_object_to_view(nor); + normal_viewport = normal_object_to_view(nor); # ifndef HAIR_SHADER normal_viewport = normalize(normal_viewport); # endif diff --git a/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl b/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl index 365f2004e37..fb2735c196c 100644 --- a/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl +++ b/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl @@ -35,7 +35,7 @@ void main() /* TODO FIX: there is still a problem with this vector * when the bone is scaled or in persp mode. But it's * barelly visible at the outline corners. */ - ssNor = normalize(transform_normal_world_to_view(normal_mat * snor).xy); + ssNor = normalize(normal_world_to_view(normal_mat * snor).xy); ssPos = proj(pPos); diff --git a/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl b/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl index 4107aab03ff..df6a9ce2d76 100644 --- a/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl +++ b/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl @@ -15,7 +15,7 @@ void main() /* This is slow and run per vertex, but it's still faster than * doing it per instance on CPU and sending it on via instance attribute. */ mat3 normal_mat = transpose(inverse(mat3(InstanceModelMatrix))); - vec3 normal = normalize(transform_normal_world_to_view(normal_mat * nor)); + vec3 normal = normalize(normal_world_to_view(normal_mat * nor)); /* Do lighting at an angle to avoid flat shading on front facing bone. */ const vec3 light = vec3(0.1, 0.1, 0.8); diff --git a/source/blender/draw/modes/shaders/common_view_lib.glsl b/source/blender/draw/modes/shaders/common_view_lib.glsl index 50d6760cafa..40c43856b43 100644 --- a/source/blender/draw/modes/shaders/common_view_lib.glsl +++ b/source/blender/draw/modes/shaders/common_view_lib.glsl @@ -14,11 +14,34 @@ layout(std140) uniform viewBlock vec4 clipPlanes[2]; }; -/* Transform shortcuts. */ -#define transform_normal_object_to_world(nor) (transpose(mat3(ModelMatrixInverse)) * nor) -#define transform_normal_world_to_object(nor) (transpose(mat3(ModelMatrix)) * nor) -#define transform_normal_world_to_view(nor) (transpose(mat3(ViewMatrixInverse)) * nor) -#define transform_normal_object_to_view(nor) \ - (transpose(mat3(ViewMatrixInverse)) * (transpose(mat3(ModelMatrixInverse)) * nor)) -#define transform_point_view_to_object(point) \ - ((ModelMatrixInverse * (ViewMatrixInverse * vec4(point, 1.0))).xyz) + /** Transform shortcuts. */ + /* Rule of thumb: Try to reuse world positions and normals because converting though viewspace + * will always be decomposed in at least 2 matrix operation. */ + + /** + * Some clarification: + * Usually Normal matrix is transpose(inverse(ViewMatrix * ModelMatrix)) + * + * But since it is slow to multiply matrices we decompose it. Decomposing + * inversion and transposition both invert the product order leaving us with + * the same original order: + * transpose(ViewMatrixInverse) * transpose(ModelMatrixInverse) + * + * Knowing that the view matrix is orthogonal, the transpose is also the inverse. + * Note: This is only valid because we are only using the mat3 of the ViewMatrixInverse. + * ViewMatrix * transpose(ModelMatrixInverse) + **/ +#define normal_object_to_view(nor) (mat3(ViewMatrix) * normal_object_to_world(nor)) +#define normal_object_to_world(nor) (transpose(mat3(ModelMatrixInverse)) * nor) +#define normal_world_to_object(nor) (transpose(mat3(ModelMatrix)) * nor) +#define normal_world_to_view(nor) (mat3(ViewMatrix) * nor) + +#define point_object_to_ndc(point) (ViewProjectionMatrix * (ModelMatrix * vec4(pt, 1.0))) +#define point_object_to_view(point) ((ViewMatrix * (ModelMatrix * vec4(pt, 1.0))).xyz) +#define point_object_to_world(point) ((ModelMatrix * vec4(point, 1.0)).xyz) +#define point_view_to_ndc(point) (ProjectionMatrix * vec4(point, 1.0)) +#define point_view_to_object(point) ((ModelMatrixInverse * (ViewMatrixInverse * vec4(pt, 1.))).xyz) +#define point_view_to_world(point) ((ViewMatrixInverse * vec4(point, 1.0)).xyz) +#define point_world_to_ndc(point) (ViewProjectionMatrix * vec4(point, 1.0)) +#define point_world_to_object(point) ((ModelMatrixInverse * vec4(point, 1.0)).xyz) +#define point_world_to_view(point) ((ViewMatrix * vec4(point, 1.0)).xyz) diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl index 5466e4b1950..d5befc02764 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl @@ -77,7 +77,7 @@ void main() #if !defined(FACE) /* Facing based color blend */ vec4 vpos = ModelViewMatrix * vec4(pos, 1.0); - vec3 view_normal = normalize(transform_normal_object_to_view(vnor) + 1e-4); + vec3 view_normal = normalize(normal_object_to_view(vnor) + 1e-4); vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) ? normalize(vpos.xyz) : vec3(0.0, 0.0, 1.0); float facing = dot(view_vec, view_normal); facing = 1.0 - abs(facing) * 0.2; diff --git a/source/blender/draw/modes/shaders/edit_normals_vert.glsl b/source/blender/draw/modes/shaders/edit_normals_vert.glsl index 59b8430dcc0..648577cc080 100644 --- a/source/blender/draw/modes/shaders/edit_normals_vert.glsl +++ b/source/blender/draw/modes/shaders/edit_normals_vert.glsl @@ -26,7 +26,7 @@ flat out vec4 v2; void main() { v1 = ModelViewProjectionMatrix * vec4(pos, 1.0); - vec3 n = normalize(transform_normal_object_to_view(nor)); + vec3 n = normalize(normal_object_to_view(nor)); v2 = v1 + ProjectionMatrix * vec4(n * normalSize, 0.0); #ifdef USE_WORLD_CLIP_PLANES world_clip_planes_calc_clip_distance((ModelMatrix * vec4(pos, 1.0)).xyz); diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl index 0d5b4390402..dd64ff10a34 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl @@ -39,7 +39,7 @@ void main() vec4 wpos = ModelMatrix * vec4(pos, 1.0); gl_Position = projmat * (ViewMatrix * wpos); - vec3 wnor = normalize(transform_normal_object_to_world(nor)); + vec3 wnor = normalize(normal_object_to_world(nor)); facing_g = dot(wnor, ViewMatrixInverse[2].xyz); edgeSharpness_g = get_edge_sharpness(wd); diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index 37e03be7be3..2f80bc95a0c 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -2099,7 +2099,7 @@ void node_tex_coord(vec3 I, out vec3 reflection) { generated = attr_orco; - normal = normalize(transform_normal_world_to_object(wN)); + normal = normalize(normal_world_to_object(wN)); uv = attr_uv; object = (obmatinv * (ViewMatrixInverse * vec4(I, 1.0))).xyz; camera = vec3(I.xy, -I.z); diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_image.c b/source/blender/nodes/shader/nodes/node_shader_tex_image.c index 109690cf423..722434ce783 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_image.c +++ b/source/blender/nodes/shader/nodes/node_shader_tex_image.c @@ -151,7 +151,7 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, blend = GPU_uniform(&tex->projection_blend); gpu_image = GPU_image(ima, iuser, isdata); - /* equivalent to transform_normal_world_to_object */ + /* equivalent to normal_world_to_object */ GPU_link(mat, "normal_transform_transposed_m4v3", vnor, ob_mat, &norm); GPU_link( mat, gpu_node_name, *texco, norm, GPU_image(ima, iuser, isdata), &col1, &col2, &col3); -- cgit v1.2.3