Cleanup: DRW: Move ModelMatrix declaration to common_view_lib
[blender.git] / source / blender / draw / modes / shaders / common_view_lib.glsl
1 /* keep in sync with DRWManager.view_data */
2 layout(std140) uniform viewBlock
3 {
4   /* Same order as DRWViewportMatrixType */
5   mat4 ViewProjectionMatrix;
6   mat4 ViewProjectionMatrixInverse;
7   mat4 ViewMatrix;
8   mat4 ViewMatrixInverse;
9   mat4 ProjectionMatrix;
10   mat4 ProjectionMatrixInverse;
11
12   vec4 CameraTexCoFactors;
13
14   vec4 clipPlanes[2];
15 };
16
17 uniform mat4 ModelMatrix;
18 uniform mat4 ModelMatrixInverse;
19
20 /** Transform shortcuts. */
21 /* Rule of thumb: Try to reuse world positions and normals because converting though viewspace
22  * will always be decomposed in at least 2 matrix operation. */
23
24 /**
25  * Some clarification:
26  * Usually Normal matrix is transpose(inverse(ViewMatrix * ModelMatrix))
27  *
28  * But since it is slow to multiply matrices we decompose it. Decomposing
29  * inversion and transposition both invert the product order leaving us with
30  * the same original order:
31  * transpose(ViewMatrixInverse) * transpose(ModelMatrixInverse)
32  *
33  * Knowing that the view matrix is orthogonal, the transpose is also the inverse.
34  * Note: This is only valid because we are only using the mat3 of the ViewMatrixInverse.
35  * ViewMatrix * transpose(ModelMatrixInverse)
36  **/
37 #define normal_object_to_view(n) (mat3(ViewMatrix) * (transpose(mat3(ModelMatrixInverse)) * n))
38 #define normal_object_to_world(n) (transpose(mat3(ModelMatrixInverse)) * n)
39 #define normal_world_to_object(n) (transpose(mat3(ModelMatrix)) * n)
40 #define normal_world_to_view(n) (mat3(ViewMatrix) * n)
41
42 #define point_object_to_ndc(p) (ViewProjectionMatrix * (ModelMatrix * vec4(p, 1.0)))
43 #define point_object_to_view(p) ((ViewMatrix * (ModelMatrix * vec4(p, 1.0))).xyz)
44 #define point_object_to_world(p) ((ModelMatrix * vec4(p, 1.0)).xyz)
45 #define point_view_to_ndc(p) (ProjectionMatrix * vec4(p, 1.0))
46 #define point_view_to_object(p) ((ModelMatrixInverse * (ViewMatrixInverse * vec4(p, 1.0))).xyz)
47 #define point_view_to_world(p) ((ViewMatrixInverse * vec4(p, 1.0)).xyz)
48 #define point_world_to_ndc(p) (ViewProjectionMatrix * vec4(p, 1.0))
49 #define point_world_to_object(p) ((ModelMatrixInverse * vec4(p, 1.0)).xyz)
50 #define point_world_to_view(p) ((ViewMatrix * vec4(p, 1.0)).xyz)