ff16f61b88479fb125f19559e3f81aeb73aaa37c
[blender.git] / source / blender / draw / modes / shaders / object_particle_prim_vert.glsl
1
2 uniform mat4 ModelViewProjectionMatrix;
3 uniform mat4 ViewProjectionMatrix;
4 uniform mat4 ModelViewMatrix;
5 uniform mat4 ProjectionMatrix;
6 uniform int screen_space;
7 uniform float pixel_size;
8 uniform int draw_size;
9
10 in vec3 pos;
11 in vec4 rot;
12 in vec3 inst_pos;
13 in int axis;
14
15 flat out int finalAxis;
16
17 vec3 rotate(vec3 vec, vec4 quat)
18 {
19         /* The quaternion representation here stores the w component in the first index */
20         return vec + 2.0 * cross(quat.yzw, cross(quat.yzw, vec) + quat.x * vec);
21 }
22
23 float mul_project_m4_v3_zfac(in vec3 co)
24 {
25         return (ViewProjectionMatrix[0][3] * co.x) +
26                (ViewProjectionMatrix[1][3] * co.y) +
27                (ViewProjectionMatrix[2][3] * co.z) + ViewProjectionMatrix[3][3];
28 }
29
30 void main()
31 {
32         float pix_size = mul_project_m4_v3_zfac(pos) * pixel_size;
33
34         if (screen_space == 1) {
35                 gl_Position = ModelViewMatrix * vec4(pos, 1.0) + vec4(inst_pos * pix_size * draw_size, 0.0);
36                 gl_Position = ProjectionMatrix * gl_Position;
37         }
38         else {
39                 int size = draw_size;
40
41                 if (axis > -1) {
42                         size *= 2;
43                 }
44
45                 gl_Position = ModelViewProjectionMatrix * vec4(pos + rotate(inst_pos * pix_size * size, rot), 1.0);
46         }
47
48         finalAxis = axis;
49 }