[Bf-blender-cvs] [38655c43fb3] tmp-pointcloud-render: PointCloud: Make geometry follow camera

Clément Foucault noreply at git.blender.org
Wed Jul 15 13:42:33 CEST 2020


Commit: 38655c43fb37dba2b90395078f47f4d4cc66d930
Author: Clément Foucault
Date:   Wed Jul 15 13:23:22 2020 +0200
Branches: tmp-pointcloud-render
https://developer.blender.org/rB38655c43fb37dba2b90395078f47f4d4cc66d930

PointCloud: Make geometry follow camera

A bit like billboards. This will allow to use less geometry
in the future.

===================================================================

M	source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_pointcloud_vert.glsl
M	source/blender/draw/intern/shaders/common_pointcloud_lib.glsl
M	source/blender/draw/intern/shaders/common_view_lib.glsl

===================================================================

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)



More information about the Bf-blender-cvs mailing list