[Bf-blender-cvs] [cfcbb1daeef] tmp-overlay-engine: Overlay Engine: Wireframe: Put color evaluation in the shader

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


Commit: cfcbb1daeef0803d6f766201a1142eeeb0ad0215
Author: Clément Foucault
Date:   Fri Nov 22 01:30:26 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rBcfcbb1daeef0803d6f766201a1142eeeb0ad0215

Overlay Engine: Wireframe: Put color evaluation in the shader

There are no more subgroups per color. Thus wireframes leveraging the
batching capabilities of DRWmanager.

The color mixing is also now done per vertex and interpolated instead of
per pixel. This might change the rendering a little bit.

This also fixes the xray rendering for wireframes and osx workaround shader.

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

M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/engines/overlay/overlay_wireframe.c
M	source/blender/draw/engines/overlay/shaders/wireframe_frag.glsl
M	source/blender/draw/engines/overlay/shaders/wireframe_geom.glsl
M	source/blender/draw/engines/overlay/shaders/wireframe_vert.glsl
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/gpu/shaders/material/gpu_shader_material_normal_map.glsl

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

diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 39a8a24e37d..7663193d3b8 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -218,8 +218,6 @@ typedef struct OVERLAY_PrivateData {
   DRWShadingGroup *edit_text_overlay_grp;
   DRWShadingGroup *edit_text_wire_grp[2];
   DRWShadingGroup *facing_grp;
-  DRWShadingGroup *wires_grp;
-  DRWShadingGroup *wires_xray_grp;
   DRWShadingGroup *motion_path_lines_grp;
   DRWShadingGroup *motion_path_points_grp;
   DRWShadingGroup *outlines_active_grp;
@@ -239,6 +237,9 @@ typedef struct OVERLAY_PrivateData {
   DRWShadingGroup *particle_dots_grp;
   DRWShadingGroup *particle_shapes_grp;
   DRWShadingGroup *sculpt_mask_grp;
+  DRWShadingGroup *wires_grp[2][2];     /* With and without coloring. */
+  DRWShadingGroup *wires_all_grp[2][2]; /* With and without coloring. */
+  DRWShadingGroup *wires_sculpt_grp[2];
 
   DRWView *view_wires;
   DRWView *view_edit_faces;
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index 5bd7c8e4fae..6d4d4fc7dda 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -106,6 +106,7 @@ extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
 extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
 extern char datatoc_gpu_shader_flat_color_frag_glsl[];
 extern char datatoc_gpu_shader_point_varying_color_varying_outline_aa_frag_glsl[];
+extern char datatoc_gpu_shader_common_obinfos_lib_glsl[];
 
 extern char datatoc_common_colormanagement_lib_glsl[];
 extern char datatoc_common_fullscreen_vert_glsl[];
@@ -1189,6 +1190,8 @@ GPUShader *OVERLAY_shader_wireframe_select(void)
     sh_data->wireframe_select = GPU_shader_create_from_arrays({
         .vert = (const char *[]){sh_cfg->lib,
                                  datatoc_common_view_lib_glsl,
+                                 datatoc_common_globals_lib_glsl,
+                                 datatoc_gpu_shader_common_obinfos_lib_glsl,
                                  datatoc_wireframe_vert_glsl,
                                  NULL},
         .geom = (const char *[]){sh_cfg->lib,
@@ -1211,12 +1214,17 @@ GPUShader *OVERLAY_shader_wireframe(void)
     sh_data->wireframe = GPU_shader_create_from_arrays({
       .vert = (const char *[]){sh_cfg->lib,
                                datatoc_common_view_lib_glsl,
+                               datatoc_common_globals_lib_glsl,
+                               datatoc_gpu_shader_common_obinfos_lib_glsl,
                                datatoc_wireframe_vert_glsl,
                                NULL},
       .frag = (const char *[]){datatoc_wireframe_frag_glsl, NULL},
       /* Apple drivers does not support wide wires. Use geometry shader as a workaround. */
 #if USE_GEOM_SHADER_WORKAROUND
-      .geom = (const char *[]){sh_cfg->lib, datatoc_wireframe_geom_glsl, NULL},
+      .geom = (const char *[]){sh_cfg->lib,
+                               datatoc_common_globals_lib_glsl,
+                               datatoc_wireframe_geom_glsl,
+                               NULL},
       .defs = (const char *[]){sh_cfg->def, "#define USE_GEOM\n", NULL},
 #else
       .defs = (const char *[]){sh_cfg->def, NULL},
diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c
index 7717d803df9..38cf1cb6682 100644
--- a/source/blender/draw/engines/overlay/overlay_wireframe.c
+++ b/source/blender/draw/engines/overlay/overlay_wireframe.c
@@ -48,115 +48,61 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata)
   OVERLAY_PassList *psl = vedata->psl;
   OVERLAY_PrivateData *pd = vedata->stl->pd;
   const DRWContextState *draw_ctx = DRW_context_state_get();
+  DRWShadingGroup *grp = NULL;
 
-  const bool use_select = (DRW_state_is_select() || DRW_state_is_depth());
-  GPUShader *wires_sh = use_select ? OVERLAY_shader_wireframe_select() :
-                                     OVERLAY_shader_wireframe();
-
-  DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL |
-                   DRW_STATE_STENCIL_EQUAL | DRW_STATE_FIRST_VERTEX_CONVENTION;
-  DRW_PASS_CREATE(psl->wireframe_ps, state | pd->clipping_state);
-
-  DRWState state_xray = DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_STENCIL |
-                        DRW_STATE_DEPTH_GREATER_EQUAL | DRW_STATE_STENCIL_NEQUAL |
-                        DRW_STATE_FIRST_VERTEX_CONVENTION;
-  DRW_PASS_CREATE(psl->wireframe_xray_ps, state_xray | pd->clipping_state);
-
-  pd->wires_grp = DRW_shgroup_create(wires_sh, psl->wireframe_ps);
-  DRW_shgroup_uniform_block_persistent(pd->wires_grp, "globalsBlock", G_draw.block_ubo);
+  View3DShading *shading = &draw_ctx->v3d->shading;
 
-  pd->wires_xray_grp = DRW_shgroup_create(wires_sh, psl->wireframe_xray_ps);
-  DRW_shgroup_uniform_block_persistent(pd->wires_xray_grp, "globalsBlock", G_draw.block_ubo);
-
-  pd->clear_stencil = (draw_ctx->v3d->shading.type > OB_SOLID);
+  pd->clear_stencil = (shading->type > OB_SOLID);
   pd->shdata.wire_step_param = pd->overlay.wireframe_threshold - 254.0f / 255.0f;
-}
 
-static void wire_color_get(const View3D *v3d,
-                           const Object *ob,
-                           const bool use_coloring,
-                           float **rim_col,
-                           float **wire_col)
-{
-#ifndef NDEBUG
-  *rim_col = NULL;
-  *wire_col = NULL;
-#endif
-  const DRWContextState *draw_ctx = DRW_context_state_get();
+  bool is_wire_shmode = (shading->type == OB_WIRE);
+  bool is_object_color = is_wire_shmode && (shading->wire_color_type == V3D_SHADING_OBJECT_COLOR);
+  bool is_random_color = is_wire_shmode && (shading->wire_color_type == V3D_SHADING_RANDOM_COLOR);
 
-  if (UNLIKELY(ob->base_flag & BASE_FROM_SET)) {
-    *rim_col = G_draw.block.colorDupli;
-    *wire_col = G_draw.block.colorDupli;
-  }
-  else if (UNLIKELY(ob->base_flag & BASE_FROM_DUPLI)) {
-    if (ob->base_flag & BASE_SELECTED) {
-      if (G.moving & G_TRANSFORM_OBJ) {
-        *rim_col = G_draw.block.colorTransform;
-      }
-      else {
-        *rim_col = G_draw.block.colorDupliSelect;
-      }
-    }
-    else {
-      *rim_col = G_draw.block.colorDupli;
-    }
-    *wire_col = G_draw.block.colorDupli;
-  }
-  else if ((ob->base_flag & BASE_SELECTED) && use_coloring) {
-    if (G.moving & G_TRANSFORM_OBJ) {
-      *rim_col = G_draw.block.colorTransform;
-    }
-    else if (ob == draw_ctx->obact) {
-      *rim_col = G_draw.block.colorActive;
+  const bool use_select = (DRW_state_is_select() || DRW_state_is_depth());
+  GPUShader *wires_sh = use_select ? OVERLAY_shader_wireframe_select() :
+                                     OVERLAY_shader_wireframe();
+
+  for (int xray = 0; xray < 2; xray++) {
+    DRWState state = DRW_STATE_FIRST_VERTEX_CONVENTION;
+    DRWPass *pass;
+    uint stencil_mask;
+
+    if (xray == 0) {
+      state |= DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL |
+               DRW_STATE_STENCIL_EQUAL;
+      DRW_PASS_CREATE(psl->wireframe_ps, state | pd->clipping_state);
+      pass = psl->wireframe_ps;
+      stencil_mask = 0xFF;
     }
     else {
-      *rim_col = G_draw.block.colorSelect;
+      state |= DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_STENCIL | DRW_STATE_DEPTH_GREATER_EQUAL |
+               DRW_STATE_STENCIL_NEQUAL;
+      DRW_PASS_CREATE(psl->wireframe_xray_ps, state | pd->clipping_state);
+      pass = psl->wireframe_xray_ps;
+      stencil_mask = 0x00;
     }
-    *wire_col = G_draw.block.colorWire;
-  }
-  else {
-    *rim_col = G_draw.block.colorWire;
-    *wire_col = G_draw.block.colorBackground;
-  }
-
-  if (v3d->shading.type == OB_WIRE) {
-    if (ELEM(v3d->shading.wire_color_type, V3D_SHADING_OBJECT_COLOR, V3D_SHADING_RANDOM_COLOR)) {
-      /* Theses stays valid until next call. So we need to copy them when using them as uniform. */
-      static float wire_col_val[3], rim_col_val[3];
-      *wire_col = wire_col_val;
-      *rim_col = rim_col_val;
-
-      if (v3d->shading.wire_color_type == V3D_SHADING_OBJECT_COLOR) {
-        linearrgb_to_srgb_v3_v3(*wire_col, ob->color);
-        mul_v3_fl(*wire_col, 0.5f);
-        copy_v3_v3(*rim_col, *wire_col);
-      }
-      else {
-        uint hash = BLI_ghashutil_strhash_p_murmur(ob->id.name);
-        if (ob->id.lib) {
-          hash = (hash * 13) ^ BLI_ghashutil_strhash_p_murmur(ob->id.lib->name);
-        }
-
-        float hue = BLI_hash_int_01(hash);
-        float hsv[3] = {hue, 0.75f, 0.8f};
-        hsv_to_rgb_v(hsv, *wire_col);
-        copy_v3_v3(*rim_col, *wire_col);
-      }
 
-      if ((ob->base_flag & BASE_SELECTED) && use_coloring) {
-        /* "Normalize" color. */
-        add_v3_fl(*wire_col, 1e-4f);
-        float brightness = max_fff((*wire_col)[0], (*wire_col)[1], (*wire_col)[2]);
-        mul_v3_fl(*wire_col, (0.5f / brightness));
-        add_v3_fl(*rim_col, 0.75f);
-      }
-      else {
-        mul_v3_fl(*rim_col, 0.5f);
-        add_v3_fl(*wire_col, 0.5f);
-      }
+    for (int use_coloring = 0; use_coloring < 2; use_coloring++) {
+      pd->wires_grp[xray][use_coloring] = grp = DRW_shgroup_create(wires_sh, pass);
+      DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+      DRW_shgroup_uniform_float_copy(grp, "wireStepParam", pd->shdata.wire_step_param);
+      DRW_shgroup_uniform_bool_copy(grp, "useColoring", use_coloring);
+      DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0);
+      DRW_shgroup_uniform_bool_copy(grp, "isObjectColor", is_object_color);
+      DRW_shgroup_uniform_bool_copy(grp, "isRandomColor", is_random_color);
+      DRW_shgroup_stencil_mask(grp, stencil_mask);
+
+      pd->wires_all_grp[xray][use_coloring] = grp = DRW_shgroup_create(wires_sh, pass);
+      DRW_shgroup_uniform_float_copy(grp, "wireStepParam", 1.0f);
+      DRW_shgroup_stencil_mask(grp, stencil_mask);
     }
+
+    pd->wires_sculpt_grp[xray] = grp = DRW_shgroup_create(wires_sh, pass);
+    DRW_sh

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list