Implement particle velocity and acceleration visualization
[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 float val;
13 in vec3 inst_pos;
14 in int axis;
15
16 flat out int finalAxis;
17 flat out float finalVal;
18
19 vec3 rotate(vec3 vec, vec4 quat)
20 {
21         /* The quaternion representation here stores the w component in the first index */
22         return vec + 2.0 * cross(quat.yzw, cross(quat.yzw, vec) + quat.x * vec);
23 }
24
25 float mul_project_m4_v3_zfac(in vec3 co)
26 {
27         return (ViewProjectionMatrix[0][3] * co.x) +
28                (ViewProjectionMatrix[1][3] * co.y) +
29                (ViewProjectionMatrix[2][3] * co.z) + ViewProjectionMatrix[3][3];
30 }
31
32 void main()
33 {
34         float pix_size = mul_project_m4_v3_zfac(pos) * pixel_size;
35
36         if (screen_space == 1) {
37                 gl_Position = ModelViewMatrix * vec4(pos, 1.0) + vec4(inst_pos * pix_size * draw_size, 0.0);
38                 gl_Position = ProjectionMatrix * gl_Position;
39         }
40         else {
41                 int size = draw_size;
42
43                 if (axis > -1) {
44                         size *= 2;
45                 }
46
47                 gl_Position = ModelViewProjectionMatrix * vec4(pos + rotate(inst_pos * pix_size * size, rot), 1.0);
48         }
49
50         finalAxis = axis;
51         finalVal = val;
52 }