f1107de806862edf8b7d0e0060e82fb2e676cdf9
[blender.git] / source / blender / draw / modes / shaders / object_particle_prim_vert.glsl
1
2 uniform mat4 ModelMatrix;
3
4 uniform bool screen_space;
5 uniform float draw_size;
6 uniform vec3 color;
7 uniform sampler1D ramp;
8
9 /* ---- Instantiated Attrs ---- */
10 in vec3 inst_pos;
11 in int axis;
12
13 /* ---- Per instance Attrs ---- */
14 in vec3 pos;
15 in vec4 rot;
16 in float val;
17
18 flat out vec4 finalColor;
19
20 vec3 rotate(vec3 vec, vec4 quat)
21 {
22   /* The quaternion representation here stores the w component in the first index */
23   return vec + 2.0 * cross(quat.yzw, cross(quat.yzw, vec) + quat.x * vec);
24 }
25
26 void main()
27 {
28   if (screen_space) {
29     gl_Position = ViewMatrix * (ModelMatrix * vec4(pos, 1.0));
30     gl_Position.xyz += inst_pos * draw_size;
31     gl_Position = ProjectionMatrix * gl_Position;
32   }
33   else {
34     float size = draw_size;
35
36     if (axis > -1) {
37       size *= 2;
38     }
39
40     vec3 pos_rot = pos + rotate(inst_pos * size, rot);
41     gl_Position = point_object_to_ndc(pos_rot);
42   }
43
44 #ifdef USE_AXIS
45   if (axis == 0) {
46     finalColor = vec4(1.0, 0.0, 0.0, 1.0);
47   }
48   else if (axis == 1) {
49     finalColor = vec4(0.0, 1.0, 0.0, 1.0);
50   }
51   else {
52     finalColor = vec4(0.0, 0.0, 1.0, 1.0);
53   }
54 #else
55   if (val < 0.0) {
56     finalColor = vec4(color, 1.0);
57   }
58   else {
59     finalColor = vec4(texture(ramp, val).rgb, 1.0);
60   }
61 #endif
62 }