[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