diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-07-15 14:23:22 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-07-15 14:23:22 +0300 |
commit | 38655c43fb37dba2b90395078f47f4d4cc66d930 (patch) | |
tree | 515a5ec35db7cfcac92f7c540eee7b38951f7043 | |
parent | 102f66c0a4b1f1013aa6bb061c9a2627f4252031 (diff) |
PointCloud: Make geometry follow camera
A bit like billboards. This will allow to use less geometry
in the future.
4 files changed, 26 insertions, 9 deletions
diff --git a/source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl b/source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl index e458b34b4ff..582a7c6cae2 100644 --- a/source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl @@ -57,7 +57,7 @@ void main() #else # ifdef POINTCLOUD - vec3 world_pos = point_object_to_world(pointcloud_get_pos()); + vec3 world_pos = pointcloud_get_pos(); # else vec3 world_pos = point_object_to_world(pos); # endif diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_pointcloud_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_pointcloud_vert.glsl index b9e2aef6758..8e5c8a1b21f 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_pointcloud_vert.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_pointcloud_vert.glsl @@ -8,9 +8,10 @@ void main() { - vec3 world_pos = point_object_to_world(pointcloud_get_pos()); + vec3 world_pos; + pointcloud_get_pos_and_nor(world_pos, normal_interp); - normal_interp = normalize(normal_world_to_view(pointcloud_get_nor())); + normal_interp = normalize(normal_world_to_view(normal_interp)); gl_Position = point_world_to_ndc(world_pos); 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 diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index 1054f4d11c9..6dd6b0400ca 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -171,6 +171,7 @@ uniform mat4 ModelMatrixInverse; #define normal_object_to_world(n) (transpose(mat3(ModelMatrixInverse)) * n) #define normal_world_to_object(n) (transpose(mat3(ModelMatrix)) * n) #define normal_world_to_view(n) (mat3(ViewMatrix) * n) +#define normal_view_to_world(n) (mat3(ViewMatrixInverse) * n) #define point_object_to_ndc(p) (ViewProjectionMatrix * vec4((ModelMatrix * vec4(p, 1.0)).xyz, 1.0)) #define point_object_to_view(p) ((ViewMatrix * vec4((ModelMatrix * vec4(p, 1.0)).xyz, 1.0)).xyz) |