diff options
Diffstat (limited to 'source/blender/draw/intern/shaders/common_pointcloud_lib.glsl')
-rw-r--r-- | source/blender/draw/intern/shaders/common_pointcloud_lib.glsl | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/source/blender/draw/intern/shaders/common_pointcloud_lib.glsl b/source/blender/draw/intern/shaders/common_pointcloud_lib.glsl index 7545d7c89f3..76b69c12d26 100644 --- a/source/blender/draw/intern/shaders/common_pointcloud_lib.glsl +++ b/source/blender/draw/intern/shaders/common_pointcloud_lib.glsl @@ -9,14 +9,29 @@ in vec4 pos; /* Position and radius. */ in vec3 pos_inst; in vec3 nor; -/* Return object position. */ -vec3 pointcloud_get_pos(void) +mat3 pointcloud_get_facing_matrix(vec3 p) { - return pos.xyz + pos_inst * pos.w; + mat3 facing_mat; + facing_mat[2] = normalize(ViewMatrixInverse[3].xyz - p); + facing_mat[1] = normalize(cross(ViewMatrixInverse[0].xyz, facing_mat[2])); + facing_mat[0] = cross(facing_mat[1], facing_mat[2]); + return facing_mat; } -/* Return object Normal. */ -vec3 pointcloud_get_nor(void) +/* Return world position and normal. */ +void pointcloud_get_pos_and_nor(out vec3 outpos, out vec3 outnor) { - return nor; + vec3 p = point_object_to_world(pos.xyz); + mat3 facing_mat = pointcloud_get_facing_matrix(p); + + float radius = dot(abs(mat3(ModelMatrix) * pos.www), vec3(1.0 / 3.0)); + outpos = p + (facing_mat * pos_inst) * radius; + outnor = facing_mat * nor; } + +vec3 pointcloud_get_pos(void) +{ + vec3 outpos, outnor; + pointcloud_get_pos_and_nor(outpos, outnor); + return outpos; +}
\ No newline at end of file |