diff options
Diffstat (limited to 'source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl')
-rw-r--r-- | source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl b/source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl new file mode 100644 index 00000000000..cd9368a997a --- /dev/null +++ b/source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl @@ -0,0 +1,48 @@ + +/* ---- Instantiated Attrs ---- */ +in vec3 pos; +in vec3 snor; + +/* ---- Per instance Attrs ---- */ +in vec4 color; +in mat4 inst_obmat; + +out vec4 pPos; +out vec3 vPos; +out vec2 ssPos; +out vec2 ssNor; +out vec4 vColSize; + +/* project to screen space */ +vec2 proj(vec4 pos) +{ + return (0.5 * (pos.xy / pos.w) + 0.5) * sizeViewport.xy; +} + +void main() +{ + vec4 bone_color, state_color; + mat4 model_mat = extract_matrix_packed_data(inst_obmat, state_color, bone_color); + + vec4 worldPosition = model_mat * vec4(pos, 1.0); + vec4 viewpos = ViewMatrix * worldPosition; + + vPos = viewpos.xyz; + pPos = ProjectionMatrix * viewpos; + + /* This is slow and run per vertex, but it's still faster than + * doing it per instance on CPU and sending it on via instance attribute. */ + mat3 normal_mat = transpose(inverse(mat3(model_mat))); + /* TODO FIX: there is still a problem with this vector + * when the bone is scaled or in persp mode. But it's + * barelly visible at the outline corners. */ + ssNor = normalize(normal_world_to_view(normal_mat * snor).xy); + + ssPos = proj(pPos); + + vColSize = bone_color; + +#ifdef USE_WORLD_CLIP_PLANES + world_clip_planes_calc_clip_distance(worldPosition.xyz); +#endif +} |