diff options
Diffstat (limited to 'source/blender/draw/engines/overlay/shaders/motion_path_point_vert.glsl')
-rw-r--r-- | source/blender/draw/engines/overlay/shaders/motion_path_point_vert.glsl | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/source/blender/draw/engines/overlay/shaders/motion_path_point_vert.glsl b/source/blender/draw/engines/overlay/shaders/motion_path_point_vert.glsl new file mode 100644 index 00000000000..14335eb1b99 --- /dev/null +++ b/source/blender/draw/engines/overlay/shaders/motion_path_point_vert.glsl @@ -0,0 +1,58 @@ + +uniform ivec4 mpathPointSettings; +uniform bool showKeyFrames = true; +uniform vec3 customColor; + +#define pointSize mpathPointSettings.x +#define frameCurrent mpathPointSettings.y +#define cacheStart mpathPointSettings.z +#define stepSize mpathPointSettings.w + +in vec3 pos; +in int flag; + +#define MOTIONPATH_VERT_SEL (1 << 0) +#define MOTIONPATH_VERT_KEY (1 << 1) + +out vec4 finalColor; + +void main() +{ + gl_Position = ViewProjectionMatrix * vec4(pos, 1.0); + gl_PointSize = float(pointSize + 2); + + int frame = gl_VertexID + cacheStart; + bool use_custom_color = customColor.x >= 0.0; + finalColor = (use_custom_color) ? vec4(customColor, 1.0) : vec4(1.0); + + /* Bias to reduce z fighting with the path */ + gl_Position.z -= 1e-4; + + if (gl_VertexID % stepSize == 0) { + gl_PointSize = float(pointSize) + 4; + } + + if (showKeyFrames) { + if ((flag & MOTIONPATH_VERT_KEY) != 0) { + gl_PointSize = float(pointSize + 5); + finalColor = colorVertexSelect; + /* Bias more to get these on top of regular points */ + gl_Position.z -= 1e-4; + } + /* Draw big green dot where the current frame is. + * NOTE: this is only done when keyframes are shown, since this adds similar types of clutter + */ + if (frame == frameCurrent) { + gl_PointSize = float(pointSize + 8); + finalColor = colorCurrentFrame; + /* Bias more to get these on top of keyframes */ + gl_Position.z -= 1e-4; + } + } + + gl_PointSize *= sizePixel; + +#ifdef USE_WORLD_CLIP_PLANES + world_clip_planes_calc_clip_distance(pos); +#endif +} |