Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-07-15 14:23:22 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-07-15 14:23:22 +0300
commit38655c43fb37dba2b90395078f47f4d4cc66d930 (patch)
tree515a5ec35db7cfcac92f7c540eee7b38951f7043
parent102f66c0a4b1f1013aa6bb061c9a2627f4252031 (diff)
PointCloud: Make geometry follow camera
A bit like billboards. This will allow to use less geometry in the future.
-rw-r--r--source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl2
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_prepass_pointcloud_vert.glsl5
-rw-r--r--source/blender/draw/intern/shaders/common_pointcloud_lib.glsl27
-rw-r--r--source/blender/draw/intern/shaders/common_view_lib.glsl1
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)