[Bf-blender-cvs] [5e121236851] tmp-pointcloud-render: DRW: Add common point cloud rendering functions

Clément Foucault noreply at git.blender.org
Mon Jul 13 18:13:43 CEST 2020


Commit: 5e1212368510e97e519d151ce19d77ed56f1a565
Author: Clément Foucault
Date:   Sat Jul 11 14:46:02 2020 +0200
Branches: tmp-pointcloud-render
https://developer.blender.org/rB5e1212368510e97e519d151ce19d77ed56f1a565

DRW: Add common point cloud rendering functions

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

M	source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl
M	source/blender/draw/engines/overlay/shaders/pointcloud_vert.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_opaque.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_shader.c
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl.h
M	source/blender/draw/intern/draw_cache_impl_pointcloud.c
A	source/blender/draw/intern/shaders/common_pointcloud_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 a2021759196..de63d2005f8 100644
--- a/source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl
@@ -2,6 +2,7 @@
 uniform bool isTransform;
 
 #ifndef USE_GPENCIL
+in vec4 ptcloud;
 in vec3 pos;
 #endif
 
@@ -56,7 +57,7 @@ void main()
 #  endif
 
 #else
-  vec3 world_pos = point_object_to_world(pos);
+  vec3 world_pos = point_object_to_world(pos * ptcloud.w + ptcloud.xyz);
   gl_Position = point_world_to_ndc(world_pos);
 #  ifdef USE_GEOM
   vPos = point_world_to_view(world_pos);
diff --git a/source/blender/draw/engines/overlay/shaders/pointcloud_vert.glsl b/source/blender/draw/engines/overlay/shaders/pointcloud_vert.glsl
index d71ccee5159..b7886c3f681 100644
--- a/source/blender/draw/engines/overlay/shaders/pointcloud_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/pointcloud_vert.glsl
@@ -2,16 +2,15 @@
 uniform vec4 color;
 
 /* ---- Per instance Attrs ---- */
-in vec3 pointcloud_pos;
-in vec3 pointcloud_radius;
+in vec4 ptcloud; /* Position and radius. */
 
 out vec4 finalColor;
 
 void main()
 {
-  vec3 world_pos = point_object_to_world(pointcloud_pos);
+  vec3 world_pos = point_object_to_world(ptcloud.xyz);
 
-  vec3 world_size = abs(mat3(ModelMatrix) * vec3(pointcloud_radius));
+  vec3 world_size = abs(mat3(ModelMatrix) * vec3(ptcloud.w));
   float world_radius = (world_size.x + world_size.y + world_size.z) / 3.0;
 
   gl_Position = point_world_to_ndc(world_pos);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 31e298d1540..7200645f8e3 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -5,6 +5,8 @@
 #pragma BLENDER_REQUIRE(workbench_material_lib.glsl)
 #pragma BLENDER_REQUIRE(workbench_image_lib.glsl)
 
+in vec4 ptcloud; /* Point cloud position and radius. Default to {0.0, 0.0, 0.0, 1.0}. */
+
 in vec3 pos;
 in vec3 nor;
 in vec4 ac; /* active color */
@@ -12,7 +14,7 @@ in vec2 au; /* active texture layer */
 
 void main()
 {
-  vec3 world_pos = point_object_to_world(pos);
+  vec3 world_pos = point_object_to_world(pos * ptcloud.w + ptcloud.xyz);
   gl_Position = point_world_to_ndc(world_pos);
 
 #ifdef USE_WORLD_CLIP_PLANES
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index c8dde4d513b..0ceb8f9f14b 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -438,7 +438,7 @@ void workbench_cache_finish(void *ved)
   /* TODO don't free reuse next redraw. */
   for (int i = 0; i < 2; i++) {
     for (int j = 0; j < 2; j++) {
-      for (int k = 0; k < 2; k++) {
+      for (int k = 0; k < WORKBENCH_DATATYPE_MAX; k++) {
         if (wpd->prepass[i][j][k].material_hash) {
           BLI_ghash_free(wpd->prepass[i][j][k].material_hash, NULL, NULL);
           wpd->prepass[i][j][k].material_hash = NULL;
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index d6d3ff8610b..35de02ff3fd 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -162,7 +162,7 @@ DRWShadingGroup *workbench_material_setup_ex(WORKBENCH_PrivateData *wpd,
                                              Object *ob,
                                              int mat_nr,
                                              eV3DShadingColorType color_type,
-                                             bool hair,
+                                             eWORKBENCH_DataType datatype,
                                              bool *r_transp)
 {
   Image *ima = NULL;
@@ -180,7 +180,7 @@ DRWShadingGroup *workbench_material_setup_ex(WORKBENCH_PrivateData *wpd,
 
   switch (color_type) {
     case V3D_SHADING_TEXTURE_COLOR: {
-      return workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, sampler, hair);
+      return workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, sampler, datatype);
     }
     case V3D_SHADING_MATERIAL_COLOR: {
       /* For now, we use the same ubo for material and object coloring but with different indices.
@@ -191,7 +191,7 @@ DRWShadingGroup *workbench_material_setup_ex(WORKBENCH_PrivateData *wpd,
       Material *ma = workbench_object_material_get(ob, mat_nr);
 
       const bool transp = wpd->shading.xray_alpha < 1.0f || ma->a < 1.0f;
-      WORKBENCH_Prepass *prepass = &wpd->prepass[transp][infront][hair];
+      WORKBENCH_Prepass *prepass = &wpd->prepass[transp][infront][datatype];
 
       if (r_transp && transp) {
         *r_transp = true;
@@ -216,7 +216,7 @@ DRWShadingGroup *workbench_material_setup_ex(WORKBENCH_PrivateData *wpd,
     }
     case V3D_SHADING_VERTEX_COLOR: {
       const bool transp = wpd->shading.xray_alpha < 1.0f;
-      DRWShadingGroup *grp = wpd->prepass[transp][infront][hair].vcol_shgrp;
+      DRWShadingGroup *grp = wpd->prepass[transp][infront][datatype].vcol_shgrp;
       return grp;
     }
     default: {
diff --git a/source/blender/draw/engines/workbench/workbench_opaque.c b/source/blender/draw/engines/workbench/workbench_opaque.c
index 27d5b71f35c..df77a6072b2 100644
--- a/source/blender/draw/engines/workbench/workbench_opaque.c
+++ b/source/blender/draw/engines/workbench/workbench_opaque.c
@@ -84,31 +84,31 @@ void workbench_opaque_cache_init(WORKBENCH_Data *data)
         pass = psl->opaque_ps;
       }
 
-      for (int hair = 0; hair < 2; hair++) {
-        wpd->prepass[opaque][infront][hair].material_hash = BLI_ghash_ptr_new(__func__);
+      for (int data = 0; data < WORKBENCH_DATATYPE_MAX; data++) {
+        wpd->prepass[opaque][infront][data].material_hash = BLI_ghash_ptr_new(__func__);
 
-        sh = workbench_shader_opaque_get(wpd, hair);
+        sh = workbench_shader_opaque_get(wpd, data);
 
-        wpd->prepass[opaque][infront][hair].common_shgrp = grp = DRW_shgroup_create(sh, pass);
+        wpd->prepass[opaque][infront][data].common_shgrp = grp = DRW_shgroup_create(sh, pass);
         DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
         DRW_shgroup_uniform_int_copy(grp, "materialIndex", -1);
         DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
 
-        wpd->prepass[opaque][infront][hair].vcol_shgrp = grp = DRW_shgroup_create(sh, pass);
+        wpd->prepass[opaque][infront][data].vcol_shgrp = grp = DRW_shgroup_create(sh, pass);
         DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
         DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. (uses vcol) */
         DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
 
-        sh = workbench_shader_opaque_image_get(wpd, hair, false);
+        sh = workbench_shader_opaque_image_get(wpd, data, false);
 
-        wpd->prepass[opaque][infront][hair].image_shgrp = grp = DRW_shgroup_create(sh, pass);
+        wpd->prepass[opaque][infront][data].image_shgrp = grp = DRW_shgroup_create(sh, pass);
         DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
         DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. */
         DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
 
-        sh = workbench_shader_opaque_image_get(wpd, hair, true);
+        sh = workbench_shader_opaque_image_get(wpd, data, true);
 
-        wpd->prepass[opaque][infront][hair].image_tiled_shgrp = grp = DRW_shgroup_create(sh, pass);
+        wpd->prepass[opaque][infront][data].image_tiled_shgrp = grp = DRW_shgroup_create(sh, pass);
         DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
         DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. */
         DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index ee9960ea0ef..c9b01fdead2 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -71,6 +71,14 @@ struct RenderEngine;
 struct RenderLayer;
 struct rcti;
 
+typedef enum eWORKBENCH_DataType {
+  WORKBENCH_DATATYPE_MESH = 0,
+  WORKBENCH_DATATYPE_HAIR,
+  WORKBENCH_DATATYPE_POINTCLOUD,
+
+  WORKBENCH_DATATYPE_MAX,
+} eWORKBENCH_DataType;
+
 typedef struct WORKBENCH_FramebufferList {
   struct GPUFrameBuffer *opaque_fb;
   struct GPUFrameBuffer *opaque_infront_fb;
@@ -293,8 +301,8 @@ typedef struct WORKBENCH_PrivateData {
   /** Object IDs buffer for curvature & outline. */
   struct GPUTexture *object_id_tx;
 
-  /** Pre-pass information for each draw types [transparent][infront][hair]. */
-  WORKBENCH_Prepass prepass[2][2][2];
+  /** Pre-pass information for each draw types [transparent][infront][datatype]. */
+  WORKBENCH_Prepass prepass[2][2][WORKBENCH_DATATYPE_MAX];
 
   /* Materials */
   /** Copy of vldata->material_ubo for faster access. */
@@ -393,14 +401,16 @@ void workbench_shadow_cache_init(WORKBENCH_Data *data);
 void workbench_shadow_cache_populate(WORKBENCH_Data *data, Object *ob, const bool has_transp_mat);
 
 /* workbench_shader.c */
-GPUShader *workbench_shader_opaque_get(WORKBENCH_PrivateData *wpd, bool hair);
-GPUShader *workbench_shader_opaque_image_get(WORKBENCH_PrivateData *wpd, bool hair, bool tiled);
+GPUShader *workbench_shader_opaque_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType data);
+GPUShader *workbench_shader_opaque_image_get(WORKBENCH_PrivateData *wpd,
+                                             eWORKBENCH_DataType data,
+                                             bool tiled);
 GPUShader *workbench_shader_composite_get(WORKBENCH_PrivateData *wpd);
 GPUShader *workbench_shader_merge_infront

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list