[Bf-blender-cvs] [06bbcb8ffa1] tmp-overlay-engine: Cleanup: DRW: Remove Hack of skinroot rendering

Clément Foucault noreply at git.blender.org
Sun Nov 24 02:02:53 CET 2019


Commit: 06bbcb8ffa163cda6bf5e2219ad8d71c6936696f
Author: Clément Foucault
Date:   Thu Nov 21 17:26:52 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB06bbcb8ffa163cda6bf5e2219ad8d71c6936696f

Cleanup: DRW: Remove Hack of skinroot rendering

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

M	source/blender/draw/engines/overlay/overlay_edit_mesh.c
M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/engines/overlay/shaders/edit_mesh_skin_root_vert.glsl
M	source/blender/draw/intern/draw_cache_impl_mesh.c

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

diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.c b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
index dbc3dcbbe3d..7955017732b 100644
--- a/source/blender/draw/engines/overlay/overlay_edit_mesh.c
+++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
@@ -247,7 +247,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata)
 
 static void overlay_edit_mesh_add_ob_to_pass(OVERLAY_PrivateData *pd, Object *ob, bool in_front)
 {
-  struct GPUBatch *geom_tris, *geom_verts, *geom_edges, *geom_fcenter, *skin_roots;
+  struct GPUBatch *geom_tris, *geom_verts, *geom_edges, *geom_fcenter, *skin_roots, *circle;
   DRWShadingGroup *vert_shgrp, *edge_shgrp, *fdot_shgrp, *face_shgrp, *skin_roots_shgrp;
 
   bool has_edit_mesh_cage = false;
@@ -277,18 +277,9 @@ static void overlay_edit_mesh_add_ob_to_pass(OVERLAY_PrivateData *pd, Object *ob
     DRW_shgroup_call_no_cull(vert_shgrp, geom_verts, ob);
 
     if (has_skin_roots) {
-      DRWShadingGroup *grp = DRW_shgroup_create_sub(skin_roots_shgrp);
-      /* We need to upload the matrix. But the ob can be temporary allocated so we cannot
-       * use direct reference to ob->obmat. */
-      DRW_shgroup_uniform_vec4_copy(grp, "editModelMat[0]", ob->obmat[0]);
-      DRW_shgroup_uniform_vec4_copy(grp, "editModelMat[1]", ob->obmat[1]);
-      DRW_shgroup_uniform_vec4_copy(grp, "editModelMat[2]", ob->obmat[2]);
-      DRW_shgroup_uniform_vec4_copy(grp, "editModelMat[3]", ob->obmat[3]);
-
+      circle = DRW_cache_circle_get();
       skin_roots = DRW_mesh_batch_cache_get_edit_skin_roots(ob->data);
-      /* NOTE(fclem) We cannot use ob here since it would offset the instance attribs with
-       * base instance offset. */
-      DRW_shgroup_call(grp, skin_roots, NULL);
+      DRW_shgroup_call_instances_with_attribs(skin_roots_shgrp, ob, circle, skin_roots);
     }
   }
 
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index d9ef9f3a2c8..5bd7c8e4fae 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -606,11 +606,10 @@ GPUShader *OVERLAY_shader_edit_mesh_skin_root(void)
         .vert = (const char *[]){sh_cfg->lib,
                                  datatoc_common_globals_lib_glsl,
                                  datatoc_common_view_lib_glsl,
-                                 datatoc_edit_mesh_common_lib_glsl,
                                  datatoc_edit_mesh_skin_root_vert_glsl,
                                  NULL},
         .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
-        .defs = (const char *[]){sh_cfg->def, NULL},
+        .defs = (const char *[]){sh_cfg->def, "#define INSTANCED_ATTRIB\n", NULL},
     });
   }
   return sh_data->edit_mesh_skin_root;
diff --git a/source/blender/draw/engines/overlay/shaders/edit_mesh_skin_root_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_mesh_skin_root_vert.glsl
index b5617463c24..944eb41058e 100644
--- a/source/blender/draw/engines/overlay/shaders/edit_mesh_skin_root_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/edit_mesh_skin_root_vert.glsl
@@ -1,9 +1,6 @@
-/* Need dedicated obmat since we use instancing attribs
- * (we cannot let have baseinstance mess them). */
-uniform vec4 editModelMat[4];
 
 /* ---- Instantiated Attrs ---- */
-in vec2 pos;
+in vec3 pos;
 
 /* ---- Per instance Attrs ---- */
 in float size;
@@ -13,15 +10,14 @@ flat out vec4 finalColor;
 
 void main()
 {
-  mat4 obmat = mat4(editModelMat[0], editModelMat[1], editModelMat[2], editModelMat[3]);
-  /* Could be optimized... but it is only for a handful of verts so not a priority. */
-  mat3 imat = inverse(mat3(obmat));
+  mat3 imat = mat3(ModelMatrixInverse);
   vec3 right = normalize(imat * screenVecs[0].xyz);
   vec3 up = normalize(imat * screenVecs[1].xyz);
-  vec3 screen_pos = (right * pos.x + up * pos.y) * size;
-  vec4 pos_4d = obmat * vec4(local_pos + screen_pos, 1.0);
+  vec3 screen_pos = (right * pos.x + up * pos.z) * size;
+  vec4 pos_4d = ModelMatrix * vec4(local_pos + screen_pos, 1.0);
   gl_Position = ViewProjectionMatrix * pos_4d;
-  finalColor = colorSkinRoot;
+  /* Manual stipple: one segment out of 2 is transparent. */
+  finalColor = ((gl_VertexID & 1) == 0) ? colorSkinRoot : vec4(0.0);
 
 #ifdef USE_WORLD_CLIP_PLANES
   world_clip_planes_calc_clip_distance(pos_4d.xyz);
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 4099ba7228a..dd6749638a7 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -1326,17 +1326,8 @@ void DRW_mesh_batch_cache_create_requested(
     DRW_vbo_request(cache->batch.edit_fdots, &mbufcache->vbo.fdots_pos);
     DRW_vbo_request(cache->batch.edit_fdots, &mbufcache->vbo.fdots_nor);
   }
-  if (DRW_batch_requested(cache->batch.edit_skin_roots, GPU_PRIM_LINES)) {
+  if (DRW_batch_requested(cache->batch.edit_skin_roots, GPU_PRIM_POINTS)) {
     DRW_vbo_request(cache->batch.edit_skin_roots, &mbufcache->vbo.skin_roots);
-    /* HACK(fclem): This is to workaround the deferred batch init
-     * that prevent drawing using DRW_shgroup_call_instances_with_attribs.
-     * So we instead create the whole instancing batch here.
-     * Note that we use GPU_PRIM_LINES instead of expected GPU_PRIM_LINE_STRIP
-     * in order to mimic the old stipple pattern. */
-    cache->batch.edit_skin_roots->inst[0] = cache->batch.edit_skin_roots->verts[0];
-    cache->batch.edit_skin_roots->verts[0] = NULL;
-    GPUBatch *circle = DRW_cache_screenspace_circle_get();
-    GPU_batch_vertbuf_add(cache->batch.edit_skin_roots, circle->verts[0]);
   }
 
   /* Selection */



More information about the Bf-blender-cvs mailing list