[Bf-blender-cvs] [7e7c9d4e17b] tmp-drw-callbatching: Object Mode: Outlines: Rewrite id pass generation

Clément Foucault noreply at git.blender.org
Sat Aug 17 14:50:06 CEST 2019


Commit: 7e7c9d4e17b5be72691bb3885c08989e63752428
Author: Clément Foucault
Date:   Wed Jun 5 19:16:23 2019 +0200
Branches: tmp-drw-callbatching
https://developer.blender.org/rB7e7c9d4e17b5be72691bb3885c08989e63752428

Object Mode: Outlines: Rewrite id pass generation

This makes the ID pass for outline detection use the new
resource_id in order to differenciate drawcalls.

Since the drawcalls have IDs in the range of [0..511] this means objects
with the same id will have their outlines merges. This will be fixed in
next commit.

Lightprobes have their outlines disabled for now.

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

M	source/blender/draw/modes/object_mode.c
M	source/blender/draw/modes/shaders/object_outline_detect_frag.glsl
M	source/blender/draw/modes/shaders/object_outline_prepass_frag.glsl
M	source/blender/draw/modes/shaders/object_outline_prepass_geom.glsl
M	source/blender/draw/modes/shaders/object_outline_prepass_vert.glsl

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

diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 534e23353eb..03f2f09e80a 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -285,15 +285,15 @@ typedef struct OBJECT_PrivateData {
   DRWShadingGroup *outlines_transform;
 
   /* Lightprobes */
-  DRWCallBuffer *lightprobes_cube_select;
-  DRWCallBuffer *lightprobes_cube_select_dupli;
-  DRWCallBuffer *lightprobes_cube_active;
-  DRWCallBuffer *lightprobes_cube_transform;
+  // DRWCallBuffer *lightprobes_cube_select;
+  // DRWCallBuffer *lightprobes_cube_select_dupli;
+  // DRWCallBuffer *lightprobes_cube_active;
+  // DRWCallBuffer *lightprobes_cube_transform;
 
-  DRWCallBuffer *lightprobes_planar_select;
-  DRWCallBuffer *lightprobes_planar_select_dupli;
-  DRWCallBuffer *lightprobes_planar_active;
-  DRWCallBuffer *lightprobes_planar_transform;
+  // DRWCallBuffer *lightprobes_planar_select;
+  // DRWCallBuffer *lightprobes_planar_select_dupli;
+  // DRWCallBuffer *lightprobes_planar_active;
+  // DRWCallBuffer *lightprobes_planar_transform;
 
   /* Objects Centers */
   DRWCallBuffer *center_active;
@@ -302,17 +302,6 @@ typedef struct OBJECT_PrivateData {
   DRWCallBuffer *center_selected_lib;
   DRWCallBuffer *center_deselected_lib;
 
-  /* Outlines id offset (accessed as an array) */
-  int id_ofs_active;
-  int id_ofs_select;
-  int id_ofs_select_dupli;
-  int id_ofs_transform;
-
-  int id_ofs_prb_active;
-  int id_ofs_prb_select;
-  int id_ofs_prb_select_dupli;
-  int id_ofs_prb_transform;
-
   bool xray_enabled;
   bool xray_enabled_and_not_wire;
 } OBJECT_PrivateData; /* Transient data */
@@ -415,7 +404,10 @@ static void OBJECT_engine_init(void *vedata)
   if (!sh_data->outline_resolve) {
     /* Outline */
     sh_data->outline_prepass = GPU_shader_create_from_arrays({
-        .vert = (const char *[]){sh_cfg_data->lib, datatoc_gpu_shader_3D_vert_glsl, NULL},
+        .vert = (const char *[]){sh_cfg_data->lib,
+                                 datatoc_common_view_lib_glsl,
+                                 datatoc_object_outline_prepass_vert_glsl,
+                                 NULL},
         .frag = (const char *[]){datatoc_object_outline_prepass_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg_data->def, NULL},
     });
@@ -429,7 +421,7 @@ static void OBJECT_engine_init(void *vedata)
                                  datatoc_object_outline_prepass_geom_glsl,
                                  NULL},
         .frag = (const char *[]){datatoc_object_outline_prepass_frag_glsl, NULL},
-        .defs = (const char *[]){sh_cfg_data->def, NULL},
+        .defs = (const char *[]){sh_cfg_data->def, "#define USE_GEOM\n", NULL},
     });
 
     sh_data->outline_resolve = DRW_shader_create_fullscreen(
@@ -724,12 +716,12 @@ static void OBJECT_engine_free(void)
 }
 
 static DRWShadingGroup *shgroup_outline(DRWPass *pass,
-                                        const int *ofs,
+                                        int outline_id,
                                         GPUShader *sh,
                                         eGPUShaderConfig sh_cfg)
 {
   DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
-  DRW_shgroup_uniform_int(grp, "baseId", ofs, 1);
+  DRW_shgroup_uniform_int_copy(grp, "outlineId", outline_id);
 
   if (sh_cfg == GPU_SHADER_CFG_CLIPPED) {
     DRW_shgroup_state_enable(grp, DRW_STATE_CLIP_PLANES);
@@ -768,107 +760,10 @@ static DRWShadingGroup *shgroup_points(DRWPass *pass,
   return grp;
 }
 
-static int *shgroup_theme_id_to_probe_outline_counter(OBJECT_StorageList *stl,
-                                                      int theme_id,
-                                                      const int base_flag)
-{
-  if (UNLIKELY(base_flag & BASE_FROM_DUPLI)) {
-    switch (theme_id) {
-      case TH_ACTIVE:
-      case TH_SELECT:
-        return &stl->g_data->id_ofs_prb_select_dupli;
-      case TH_TRANSFORM:
-      default:
-        return &stl->g_data->id_ofs_prb_transform;
-    }
-  }
-
-  switch (theme_id) {
-    case TH_ACTIVE:
-      return &stl->g_data->id_ofs_prb_active;
-    case TH_SELECT:
-      return &stl->g_data->id_ofs_prb_select;
-    case TH_TRANSFORM:
-    default:
-      return &stl->g_data->id_ofs_prb_transform;
-  }
-}
-
-static int *shgroup_theme_id_to_outline_counter(OBJECT_StorageList *stl,
-                                                int theme_id,
-                                                const int base_flag)
-{
-  if (UNLIKELY(base_flag & BASE_FROM_DUPLI)) {
-    switch (theme_id) {
-      case TH_ACTIVE:
-      case TH_SELECT:
-        return &stl->g_data->id_ofs_select_dupli;
-      case TH_TRANSFORM:
-      default:
-        return &stl->g_data->id_ofs_transform;
-    }
-  }
-
-  switch (theme_id) {
-    case TH_ACTIVE:
-      return &stl->g_data->id_ofs_active;
-    case TH_SELECT:
-      return &stl->g_data->id_ofs_select;
-    case TH_TRANSFORM:
-    default:
-      return &stl->g_data->id_ofs_transform;
-  }
-}
-
-static DRWCallBuffer *buffer_theme_id_to_probe_planar_outline_shgrp(OBJECT_StorageList *stl,
-                                                                    int theme_id)
-{
-  /* does not increment counter */
-  switch (theme_id) {
-    case TH_ACTIVE:
-      return stl->g_data->lightprobes_planar_active;
-    case TH_SELECT:
-      return stl->g_data->lightprobes_planar_select;
-    case TH_TRANSFORM:
-    default:
-      return stl->g_data->lightprobes_planar_transform;
-  }
-}
-
-static DRWCallBuffer *buffer_theme_id_to_probe_cube_outline_shgrp(OBJECT_StorageList *stl,
-                                                                  int theme_id,
-                                                                  const int base_flag)
-{
-  /* does not increment counter */
-  if (UNLIKELY(base_flag & BASE_FROM_DUPLI)) {
-    switch (theme_id) {
-      case TH_ACTIVE:
-      case TH_SELECT:
-        return stl->g_data->lightprobes_cube_select_dupli;
-      case TH_TRANSFORM:
-      default:
-        return stl->g_data->lightprobes_cube_transform;
-    }
-  }
-
-  switch (theme_id) {
-    case TH_ACTIVE:
-      return stl->g_data->lightprobes_cube_active;
-    case TH_SELECT:
-      return stl->g_data->lightprobes_cube_select;
-    case TH_TRANSFORM:
-    default:
-      return stl->g_data->lightprobes_cube_transform;
-  }
-}
-
 static DRWShadingGroup *shgroup_theme_id_to_outline_or_null(OBJECT_StorageList *stl,
                                                             int theme_id,
                                                             const int base_flag)
 {
-  int *counter = shgroup_theme_id_to_outline_counter(stl, theme_id, base_flag);
-  *counter += 1;
-
   if (UNLIKELY(base_flag & BASE_FROM_DUPLI)) {
     switch (theme_id) {
       case TH_ACTIVE:
@@ -1402,19 +1297,10 @@ static void OBJECT_cache_init(void *vedata)
       sh = sh_data->outline_prepass_wire;
     }
 
-    g_data->outlines_select = shgroup_outline(
-        psl->outlines, &g_data->id_ofs_select, sh, draw_ctx->sh_cfg);
-    g_data->outlines_select_dupli = shgroup_outline(
-        psl->outlines, &g_data->id_ofs_select_dupli, sh, draw_ctx->sh_cfg);
-    g_data->outlines_transform = shgroup_outline(
-        psl->outlines, &g_data->id_ofs_transform, sh, draw_ctx->sh_cfg);
-    g_data->outlines_active = shgroup_outline(
-        psl->outlines, &g_data->id_ofs_active, sh, draw_ctx->sh_cfg);
-
-    g_data->id_ofs_select = 0;
-    g_data->id_ofs_select_dupli = 0;
-    g_data->id_ofs_active = 0;
-    g_data->id_ofs_transform = 0;
+    g_data->outlines_transform = shgroup_outline(psl->outlines, 0, sh, draw_ctx->sh_cfg);
+    g_data->outlines_select = shgroup_outline(psl->outlines, 1, sh, draw_ctx->sh_cfg);
+    g_data->outlines_select_dupli = shgroup_outline(psl->outlines, 2, sh, draw_ctx->sh_cfg);
+    g_data->outlines_active = shgroup_outline(psl->outlines, 3, sh, draw_ctx->sh_cfg);
   }
 
   {
@@ -1424,29 +1310,24 @@ static void OBJECT_cache_init(void *vedata)
     struct GPUBatch *quad = DRW_cache_quad_get();
 
     /* Cubemap */
-    g_data->lightprobes_cube_select = buffer_instance_outline(
-        pass, sphere, &g_data->id_ofs_prb_select, draw_ctx->sh_cfg);
-    g_data->lightprobes_cube_select_dupli = buffer_instance_outline(
-        pass, sphere, &g_data->id_ofs_prb_select_dupli, draw_ctx->sh_cfg);
-    g_data->lightprobes_cube_active = buffer_instance_outline(
-        pass, sphere, &g_data->id_ofs_prb_active, draw_ctx->sh_cfg);
-    g_data->lightprobes_cube_transform = buffer_instance_outline(
-        pass, sphere, &g_data->id_ofs_prb_transform, draw_ctx->sh_cfg);
+    // g_data->lightprobes_cube_select = buffer_instance_outline(
+    //     pass, sphere, &g_data->id_ofs_prb_select, draw_ctx->sh_cfg);
+    // g_data->lightprobes_cube_select_dupli = buffer_instance_outline(
+    //     pass, sphere, &g_data->id_ofs_prb_select_dupli, draw_ctx->sh_cfg);
+    // g_data->lightprobes_cube_active = buffer_instance_outline(
+    //     pass, sphere, &g_data->id_ofs_prb_active, draw_ctx->sh_cfg);
+    // g_data->lightprobes_cube_transform = buffer_instance_outline(
+    //     pass, sphere, &g_data->id_ofs_prb_transform, draw_ctx->sh_cfg);
 
     /* Planar */
-    g_data->lightprobes_planar_select = buffer_instance_outline(
-        pass, quad, &g_data->id_ofs_prb_select, draw_ctx->sh_cfg);
-    g_data->lightprobes_planar_select_dupli = buffer_instance_outline(
-        pass, quad, &g_data->id_ofs_prb_select_dupli, draw_ctx->sh_cfg);
-    g_data->lightprobes_planar_active = buffer_instance_outline(
-        pass, quad, &g_data->id_ofs_prb_active, draw_ctx->sh_cfg);
-    g_data->lightprobes_planar_transform = buffer_instance_outline(
-        pass, quad, &g_data->id_ofs_prb_transform, draw_ctx->sh_cfg);
-
-    g_data->id_ofs_prb_select = 0;
-    g_data->id_ofs_prb_select_dupli = 0;
-    g_data->id_ofs_prb_active = 0;
-    g_data->id_ofs_prb_transform = 0;
+    // g_data->lightprobes_planar_select = buffer_instance_outline(
+    //     pass, quad, &g_data->id_ofs_prb_select, draw_ctx->sh_cfg);
+    // g_data->lightprobes_planar_select_dupli = buffer_instance_outline(
+    //     pass, quad, &g_data->id_ofs_prb_select_dupl

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list