[Bf-blender-cvs] [ee701baff8c] master: Workbench: Support Active Vertex Color

Jeroen Bakker noreply at git.blender.org
Tue Apr 23 12:07:34 CEST 2019


Commit: ee701baff8caf6d184fa245e170c1e67981e2608
Author: Jeroen Bakker
Date:   Tue Apr 16 14:00:16 2019 +0200
Branches: master
https://developer.blender.org/rBee701baff8caf6d184fa245e170c1e67981e2608

Workbench: Support Active Vertex Color

Currently it is not possible to view the vertex colors of an object. To
optimize the workflow, workbench will need to support Vertex Colors.

The Vertex Colors is a new option in `shading->color_type`. When objects
do not have vertex color, the objects will be rendered with the
`V3D_SHADING_OBJECT_COLOR`.

In order to support vertex colors in workbench the current texture/solid
shading structure is migrated to a primary shaders and fallback shaders.

Fix: T57000

Reviewers: brecht, fclem

Differential Revision: https://developer.blender.org/D4694

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

M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/blenkernel/intern/paint.c
M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenkernel/intern/pbvh_intern.h
M	source/blender/blenkernel/intern/subsurf_ccg.c
M	source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/modes/sculpt_mode.c
M	source/blender/gpu/GPU_buffers.h
M	source/blender/gpu/intern/gpu_buffers.c
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 049fc585b56..6df6d36aceb 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -67,6 +67,7 @@ void BKE_pbvh_build_mesh(PBVH *bvh,
                          struct MVert *verts,
                          int totvert,
                          struct CustomData *vdata,
+                         struct CustomData *ldata,
                          const struct MLoopTri *looptri,
                          int looptri_num);
 void BKE_pbvh_build_grids(PBVH *bvh,
@@ -153,6 +154,7 @@ void BKE_pbvh_draw_cb(PBVH *bvh,
                       bool fast,
                       bool wires,
                       bool only_mask,
+                      bool show_vcol,
                       void (*draw_fn)(void *user_data, struct GPUBatch *batch),
                       void *user_data);
 
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index e41f7335afb..ea3834be68a 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -296,6 +296,7 @@ static PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
                         me->mvert,
                         me->totvert,
                         &me->vdata,
+                        &me->ldata,
                         looptri,
                         looptris_num);
 
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 00b3c86e144..7e8e724cfcc 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -1379,8 +1379,15 @@ static PBVH *build_pbvh_from_regular_mesh(Object *ob, Mesh *me_eval_deform)
 
   BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, looptri);
 
-  BKE_pbvh_build_mesh(
-      pbvh, me->mpoly, me->mloop, me->mvert, me->totvert, &me->vdata, looptri, looptris_num);
+  BKE_pbvh_build_mesh(pbvh,
+                      me->mpoly,
+                      me->mloop,
+                      me->mvert,
+                      me->totvert,
+                      &me->vdata,
+                      &me->ldata,
+                      looptri,
+                      looptris_num);
 
   pbvh_show_diffuse_color_set(pbvh, ob->sculpt->show_diffuse_color);
   pbvh_show_mask_set(pbvh, ob->sculpt->show_mask);
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index d0591b3c7e4..0a82d086862 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -542,6 +542,7 @@ void BKE_pbvh_build_mesh(PBVH *bvh,
                          MVert *verts,
                          int totvert,
                          struct CustomData *vdata,
+                         struct CustomData *ldata,
                          const MLoopTri *looptri,
                          int looptri_num)
 {
@@ -557,6 +558,7 @@ void BKE_pbvh_build_mesh(PBVH *bvh,
   bvh->totvert = totvert;
   bvh->leaf_limit = LEAF_LIMIT;
   bvh->vdata = vdata;
+  bvh->ldata = ldata;
 
   BB_reset(&cb);
 
@@ -1162,14 +1164,15 @@ void pbvh_update_BB_redraw(PBVH *bvh, PBVHNode **nodes, int totnode, int flag)
   BLI_task_parallel_range(0, totnode, &data, pbvh_update_BB_redraw_task_cb, &settings);
 }
 
-static int pbvh_get_buffers_update_flags(PBVH *bvh)
+static int pbvh_get_buffers_update_flags(PBVH *bvh, bool show_vcol)
 {
   int update_flags = 0;
   update_flags |= bvh->show_mask ? GPU_PBVH_BUFFERS_SHOW_MASK : 0;
+  update_flags |= show_vcol ? GPU_PBVH_BUFFERS_SHOW_VCOL : 0;
   return update_flags;
 }
 
-static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode)
+static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode, bool show_vcol)
 {
   /* can't be done in parallel with OpenGL */
   for (int n = 0; n < totnode; n++) {
@@ -1200,7 +1203,7 @@ static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode)
     }
 
     if (node->flag & PBVH_UpdateDrawBuffers) {
-      const int update_flags = pbvh_get_buffers_update_flags(bvh);
+      const int update_flags = pbvh_get_buffers_update_flags(bvh, show_vcol);
       switch (bvh->type) {
         case PBVH_GRIDS:
           GPU_pbvh_grid_buffers_update(node->draw_buffers,
@@ -1217,6 +1220,7 @@ static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode)
                                        node->vert_indices,
                                        node->uniq_verts + node->face_verts,
                                        CustomData_get_layer(bvh->vdata, CD_PAINT_MASK),
+                                       CustomData_get_layer(bvh->ldata, CD_MLOOPCOL),
                                        node->face_vert_indices,
                                        update_flags);
           break;
@@ -2229,6 +2233,7 @@ void BKE_pbvh_draw_cb(PBVH *bvh,
                       bool fast,
                       bool wires,
                       bool only_mask,
+                      bool show_vcol,
                       void (*draw_fn)(void *user_data, GPUBatch *batch),
                       void *user_data)
 {
@@ -2249,7 +2254,7 @@ void BKE_pbvh_draw_cb(PBVH *bvh,
                          &totnode);
 
   pbvh_update_normals(bvh, nodes, totnode, fnors);
-  pbvh_update_draw_buffers(bvh, nodes, totnode);
+  pbvh_update_draw_buffers(bvh, nodes, totnode, show_vcol);
 
   if (nodes) {
     MEM_freeN(nodes);
diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h
index 5fc41c560b2..74d7312e6a7 100644
--- a/source/blender/blenkernel/intern/pbvh_intern.h
+++ b/source/blender/blenkernel/intern/pbvh_intern.h
@@ -132,6 +132,7 @@ struct PBVH {
   const MLoop *mloop;
   const MLoopTri *looptri;
   CustomData *vdata;
+  CustomData *ldata;
 
   /* Grid Data */
   CCGKey gridkey;
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 35acbbfda3d..a58d1eaff3e 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2361,6 +2361,7 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
                         me->mvert,
                         me->totvert,
                         &me->vdata,
+                        &me->ldata,
                         looptri,
                         looptris_num);
 
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
index e654141df5c..5eff0b41e20 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
@@ -25,6 +25,9 @@ in vec3 normal_viewport;
 #ifdef V3D_SHADING_TEXTURE_COLOR
 in vec2 uv_interp;
 #endif
+#ifdef V3D_SHADING_VERTEX_COLOR
+in vec3 vertexColor;
+#endif
 #ifdef V3D_LIGHTING_MATCAP
 uniform sampler2D matcapImage;
 #endif
@@ -42,11 +45,13 @@ void main()
 {
   vec4 diffuse_color;
 
-#ifdef V3D_SHADING_TEXTURE_COLOR
+#if defined(V3D_SHADING_TEXTURE_COLOR)
   diffuse_color = workbench_sample_texture(image, uv_interp, imageSrgb, imageNearest);
   if (diffuse_color.a < ImageTransparencyCutoff) {
     discard;
   }
+#elif defined(V3D_SHADING_VERTEX_COLOR)
+  diffuse_color = vec4(vertexColor, 1.0);
 #else
   diffuse_color = vec4(materialDiffuseColor, 1.0);
 #endif /* V3D_SHADING_TEXTURE_COLOR */
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index 6b2962a66da..2596fc4cf88 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -16,6 +16,9 @@ in vec3 normal_viewport;
 #ifdef V3D_SHADING_TEXTURE_COLOR
 in vec2 uv_interp;
 #endif
+#ifdef V3D_SHADING_VERTEX_COLOR
+in vec3 vertexColor;
+#endif
 
 #ifdef HAIR_SHADER
 flat in float hair_rand;
@@ -37,11 +40,13 @@ void main()
   float metallic, roughness;
   vec4 color;
 
-#  ifdef V3D_SHADING_TEXTURE_COLOR
+#  if defined(V3D_SHADING_TEXTURE_COLOR)
   color = workbench_sample_texture(image, uv_interp, imageSrgb, imageNearest);
   if (color.a < ImageTransparencyCutoff) {
     discard;
   }
+#  elif defined(V3D_SHADING_VERTEX_COLOR)
+  color.rgb = vertexColor;
 #  else
   color.rgb = materialDiffuseColor;
 #  endif
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 dd737063f61..f2c684cdb6a 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -10,6 +10,9 @@ uniform mat3 NormalMatrix;
 in vec3 pos;
 in vec3 nor;
 in vec2 u; /* active texture layer */
+#  ifdef V3D_SHADING_VERTEX_COLOR
+in vec3 c; /* active color */
+#  endif
 #  define uv u
 #else /* HAIR_SHADER */
 #  ifdef V3D_SHADING_TEXTURE_COLOR
@@ -25,6 +28,9 @@ out vec3 normal_viewport;
 #ifdef V3D_SHADING_TEXTURE_COLOR
 out vec2 uv_interp;
 #endif
+#ifdef V3D_SHADING_VERTEX_COLOR
+out vec3 vertexColor;
+#endif
 
 /* From http://libnoise.sourceforge.net/noisegen/index.html */
 float integer_noise(int n)
@@ -34,6 +40,16 @@ float integer_noise(int n)
   return (float(nn) / 1073741824.0);
 }
 
+#ifdef V3D_SHADING_VERTEX_COLOR
+vec3 srgb_to_linear_attr(vec3 c)
+{
+  c = max(c, vec3(0.0));
+  vec3 c1 = c * (1.0 / 12.92);
+  vec3 c2 = pow((c + 0.055) * (1.0 / 1.055), vec3(2.4));
+  return mix(c1, c2, step(vec3(0.04045), c));
+}
+#endif
+
 void main()
 {
 #ifdef HAIR_SHADER
@@ -68,6 +84,12 @@ void main()
   uv_interp = uv;
 #endif
 
+#ifdef V3D_SHADING_VERTEX_COLOR
+#  ifndef HAIR_SHADER
+  vertexColor = srgb_to_linear_attr(c);
+#  endif
+#endif
+
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
   normal_viewport = NormalMatrix * nor;
 #  ifndef HAIR_SHADER
dif

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list