Commit: 77b66a96663c8e995160cc07287ccfea0e1a2b9b
Author: Campbell Barton
Date:   Sat Jan 26 15:00:03 2019 +1100
Branches: master
https://developer.blender.org/rB77b66a96663c8e995160cc07287ccfea0e1a2b9b

DRW: support clipping for empty object

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

M       source/blender/draw/intern/draw_builtin_shader.c
M       source/blender/draw/intern/draw_common.c
M       source/blender/draw/intern/draw_common.h
M       source/blender/draw/modes/object_mode.c
M       source/blender/draw/modes/shaders/object_empty_axes_vert.glsl
M       source/blender/draw/modes/shaders/object_empty_image_vert.glsl
M       source/blender/gpu/shaders/gpu_shader_instance_camera_vert.glsl
M       
source/blender/gpu/shaders/gpu_shader_instance_variying_size_variying_color_vert.glsl

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

diff --git a/source/blender/draw/intern/draw_builtin_shader.c 
b/source/blender/draw/intern/draw_builtin_shader.c
index 889dbaed3da..68866ad2903 100644
--- a/source/blender/draw/intern/draw_builtin_shader.c
+++ b/source/blender/draw/intern/draw_builtin_shader.c
@@ -44,6 +44,7 @@ extern char datatoc_gpu_shader_3D_vert_glsl[];
 extern char datatoc_gpu_shader_depth_only_frag_glsl[];
 extern char datatoc_gpu_shader_flat_color_frag_glsl[];
 extern char datatoc_gpu_shader_instance_camera_vert_glsl[];
+extern char 
datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl[];
 extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
 
 /* cache of built-in shaders (each is created on first use) */
@@ -98,6 +99,25 @@ static GPUShader 
*drw_shader_get_builtin_shader_clipped(eGPUBuiltinShader shader
                                .frag = (const char 
*[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
                                .defs = (const char *[]){world_clip_def, 
NULL}});
                        break;
+
+               case GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE:
+                       if (r_test_only) {
+                               break;
+                       }
+                       shader = DRW_shader_create_from_arrays({
+                               .vert = (const char *[]){world_clip_lib, 
datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl, NULL},
+                               .frag = (const char 
*[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
+                               .defs = (const char *[]){world_clip_def, 
"#define UNIFORM_SCALE\n", NULL}});
+                       break;
+               case GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SCALE:
+                       if (r_test_only) {
+                               break;
+                       }
+                       shader = DRW_shader_create_from_arrays({
+                               .vert = (const char *[]){world_clip_lib, 
datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl, NULL},
+                               .frag = (const char 
*[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
+                               .defs = (const char *[]){world_clip_def, 
NULL}});
+                       break;
                default:
                        /* Unsupported, caller asserts. */
                        if (r_test_only) {
diff --git a/source/blender/draw/intern/draw_common.c 
b/source/blender/draw/intern/draw_common.c
index e7a129071b6..45cfca4e7d5 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -236,6 +236,7 @@ extern char datatoc_armature_stick_frag_glsl[];
 extern char datatoc_armature_dof_vert_glsl[];
 
 extern char datatoc_common_globals_lib_glsl[];
+extern char datatoc_common_world_clip_lib_glsl[];
 
 extern char datatoc_gpu_shader_flat_color_frag_glsl[];
 extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
@@ -244,7 +245,7 @@ extern char 
datatoc_gpu_shader_point_varying_color_frag_glsl[];
 extern char datatoc_object_mball_handles_vert_glsl[];
 extern char datatoc_object_empty_axes_vert_glsl[];
 
-static struct {
+typedef struct COMMON_Shaders {
        struct GPUShader *shape_outline;
        struct GPUShader *shape_solid;
        struct GPUShader *bone_axes;
@@ -264,7 +265,9 @@ static struct {
        struct GPUShader *empty_axes_sh;
 
        struct GPUShader *mball_handles;
-} g_shaders = {NULL};
+} COMMON_Shaders;
+
+static COMMON_Shaders g_shaders[DRW_SHADER_SLOT_LEN] = {{NULL}};
 
 static struct {
        struct GPUVertFormat *instance_screenspace;
@@ -295,9 +298,11 @@ void DRW_globals_free(void)
                MEM_SAFE_FREE(*format);
        }
 
-       struct GPUShader **shader = &g_shaders.shape_outline;
-       for (int i = 0; i < sizeof(g_shaders) / sizeof(void *); ++i, ++shader) {
-               DRW_SHADER_FREE_SAFE(*shader);
+       for (int j = 0; j < DRW_SHADER_SLOT_LEN; j++) {
+               struct GPUShader **shader = &g_shaders[j].shape_outline;
+               for (int i = 0; i < sizeof(g_shaders[j]) / sizeof(void *); ++i, 
++shader) {
+                       DRW_SHADER_FREE_SAFE(*shader);
+               }
        }
 }
 
@@ -434,9 +439,9 @@ DRWShadingGroup *shgroup_instance_screen_aligned(DRWPass 
*pass, struct GPUBatch
        return grp;
 }
 
-DRWShadingGroup *shgroup_instance_scaled(DRWPass *pass, struct GPUBatch *geom)
+DRWShadingGroup *shgroup_instance_scaled(DRWPass *pass, struct GPUBatch *geom, 
eDRW_ShaderSlot shader_slot)
 {
-       GPUShader *sh_inst = 
GPU_shader_get_builtin_shader(GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SCALE);
+       GPUShader *sh_inst = 
DRW_shader_get_builtin_shader(GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SCALE,
 shader_slot);
 
        DRW_shgroup_instance_format(g_formats.instance_scaled, {
                {"color",               DRW_ATTRIB_FLOAT, 3},
@@ -445,13 +450,15 @@ DRWShadingGroup *shgroup_instance_scaled(DRWPass *pass, 
struct GPUBatch *geom)
        });
 
        DRWShadingGroup *grp = DRW_shgroup_instance_create(sh_inst, pass, geom, 
g_formats.instance_scaled);
-
+       if (shader_slot == DRW_SHADER_SLOT_CLIPPED) {
+               DRW_shgroup_world_clip_planes_from_rv3d(grp, 
DRW_context_state_get()->rv3d);
+       }
        return grp;
 }
 
-DRWShadingGroup *shgroup_instance(DRWPass *pass, struct GPUBatch *geom)
+DRWShadingGroup *shgroup_instance(DRWPass *pass, struct GPUBatch *geom, 
eDRW_ShaderSlot shader_slot)
 {
-       GPUShader *sh_inst = 
GPU_shader_get_builtin_shader(GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE);
+       GPUShader *sh_inst = 
DRW_shader_get_builtin_shader(GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE, 
shader_slot);
 
        DRW_shgroup_instance_format(g_formats.instance_sized, {
                {"color",               DRW_ATTRIB_FLOAT, 4},
@@ -461,13 +468,15 @@ DRWShadingGroup *shgroup_instance(DRWPass *pass, struct 
GPUBatch *geom)
 
        DRWShadingGroup *grp = DRW_shgroup_instance_create(sh_inst, pass, geom, 
g_formats.instance_sized);
        DRW_shgroup_state_disable(grp, DRW_STATE_BLEND);
-
+       if (shader_slot == DRW_SHADER_SLOT_CLIPPED) {
+               DRW_shgroup_world_clip_planes_from_rv3d(grp, 
DRW_context_state_get()->rv3d);
+       }
        return grp;
 }
 
-DRWShadingGroup *shgroup_instance_alpha(DRWPass *pass, struct GPUBatch *geom)
+DRWShadingGroup *shgroup_instance_alpha(DRWPass *pass, struct GPUBatch *geom, 
eDRW_ShaderSlot shader_slot)
 {
-       GPUShader *sh_inst = 
GPU_shader_get_builtin_shader(GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE);
+       GPUShader *sh_inst = 
DRW_shader_get_builtin_shader(GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE, 
shader_slot);
 
        DRW_shgroup_instance_format(g_formats.instance_sized, {
                {"color",               DRW_ATTRIB_FLOAT, 4},
@@ -476,16 +485,22 @@ DRWShadingGroup *shgroup_instance_alpha(DRWPass *pass, 
struct GPUBatch *geom)
        });
 
        DRWShadingGroup *grp = DRW_shgroup_instance_create(sh_inst, pass, geom, 
g_formats.instance_sized);
-
+       if (shader_slot == DRW_SHADER_SLOT_CLIPPED) {
+               DRW_shgroup_world_clip_planes_from_rv3d(grp, 
DRW_context_state_get()->rv3d);
+       }
        return grp;
 }
 
-DRWShadingGroup *shgroup_instance_empty_axes(DRWPass *pass, struct GPUBatch 
*geom)
+DRWShadingGroup *shgroup_instance_empty_axes(DRWPass *pass, struct GPUBatch 
*geom, eDRW_ShaderSlot shader_slot)
 {
-       if (g_shaders.empty_axes_sh == NULL) {
-               g_shaders.empty_axes_sh = DRW_shader_create(
-                       datatoc_object_empty_axes_vert_glsl, NULL,
-                       datatoc_gpu_shader_flat_color_frag_glsl, NULL);
+       COMMON_Shaders *sh_data = &g_shaders[shader_slot];
+       const char *world_clip_lib_or_empty = (shader_slot == 
DRW_SHADER_SLOT_CLIPPED) ? datatoc_common_world_clip_lib_glsl : "";
+       const char *world_clip_def_or_empty = (shader_slot == 
DRW_SHADER_SLOT_CLIPPED) ? "#define USE_WORLD_CLIP_PLANES\n" : "";
+       if (sh_data->empty_axes_sh == NULL) {
+               sh_data->empty_axes_sh = DRW_shader_create_from_arrays({
+                       .vert = (const char *[]){world_clip_lib_or_empty, 
datatoc_object_empty_axes_vert_glsl, NULL},
+                       .frag = (const char 
*[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
+                       .defs = (const char *[]){world_clip_def_or_empty, 
NULL}});
        }
 
        DRW_shgroup_instance_format(g_formats.instance_sized, {
@@ -494,9 +509,11 @@ DRWShadingGroup *shgroup_instance_empty_axes(DRWPass 
*pass, struct GPUBatch *geo
                {"InstanceModelMatrix", DRW_ATTRIB_FLOAT, 16}
        });
 
-       DRWShadingGroup *grp = 
DRW_shgroup_instance_create(g_shaders.empty_axes_sh, pass, geom, 
g_formats.instance_sized);
+       DRWShadingGroup *grp = 
DRW_shgroup_instance_create(sh_data->empty_axes_sh, pass, geom, 
g_formats.instance_sized);
        DRW_shgroup_uniform_vec3(grp, "screenVecs[0]", 
DRW_viewport_screenvecs_get(), 2);
-
+       if (shader_slot == DRW_SHADER_SLOT_CLIPPED) {
+               DRW_shgroup_world_clip_planes_from_rv3d(grp, 
DRW_context_state_get()->rv3d);
+       }
        return grp;
 }
 
@@ -574,10 +591,11 @@ DRWShadingGroup *shgroup_spot_instance(DRWPass *pass, 
struct GPUBatch *geom)
 
 DRWShadingGroup *shgroup_instance_bone_axes(DRWPass *pass)
 {
-       if (g_shaders.bone_axes == NULL) {
-               g_shaders.bone_axes = DRW_shader_create(
-                           datatoc_armature_axes_vert_glsl, NULL,
-                           datatoc_gpu_shader_flat_color_frag_glsl, NULL);
+       COMMON_Shaders *sh_data = &g_shaders[DRW_SHADER_SLOT_DEFAULT];
+       if (sh_data->bone_axes == NULL) {
+               sh_data->bone_axes = DRW_shader_create(
+                       datatoc_armature_axes_vert_glsl, NULL,
+                       datatoc_gpu_shader_flat_color_frag_glsl, NULL);
        }
 
        DRW_shgroup_instance_format(g_formats.instance_color, {
@@ -586,7 +604,7 @@ DRWShadingGroup *shgroup_instance_bone_axes(DRWPass *pass)
        });
 
        DRWShadingGroup *grp = DRW_shgroup_instance_create(
-               g_shaders.bone_axes,
+               sh_data->bone_axes,
                pass, DRW_cache_bone_arrows_get(),
                g_formats.instance_color);
        DRW_shgroup_uniform_vec3(grp, "screenVecs[0]", 
DRW_viewport_screenvecs_get(), 2);
@@ -596,10 +614,11 @@ DRWShadingGroup *shgroup_instance_bone_axes(DRWPass *pass)
 
 DRWShadingGroup *shgroup_instance_bone_envelope_outline(DRWPass *pass)
 {
-       if (g_shaders.bone_envelope_outline == NULL) {
-               g_shaders.bone_envelope_outline = DRW_shader_create(
-                           datatoc_armature_envelope_outline_vert_glsl, NULL,
-                           datatoc_gpu_shader_flat_color_frag_glsl, NULL);
+       COMMON_Shaders *sh_data = &g_shaders[DRW_SHADER_SLOT_DEFAULT];
+       if (sh_data->bone_envelope_outline == NULL) {
+               sh_data->bone_envelope_outline = DRW_shader_create(
+                       datatoc_armature_envelope_outline_vert_glsl, NULL,
+                       datatoc_gpu_shader_flat_color_frag_glsl, NULL);
        }
 
        DRW_shgroup_instance_format(g_formats.instance_bone_envelope_outline, {
@@ -610,7 +629,7 @@ DRWShadingGroup 
*shgroup_instance_bone_envelope_outline(DRWPass *pass)
        });
 
        DRWShadingGroup *grp = DRW_shgroup_instance_create(
-               g_shaders.bone_envelope_outline,
+               sh_data->bone_envelope_outline,
                pass, DRW_cache_bone_envelop

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to