Commit: c403508e41c67367d1fdd725065951063d5ae7b2
Author: Campbell Barton
Date:   Wed Jan 23 12:37:12 2019 +1100
Branches: master
https://developer.blender.org/rBc403508e41c67367d1fdd725065951063d5ae7b2

DRW: changes to object mode engine needed to support clipping

Split out shader struct, no function changes.

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

M       source/blender/draw/modes/object_mode.c

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

diff --git a/source/blender/draw/modes/object_mode.c 
b/source/blender/draw/modes/object_mode.c
index 2705f4b834d..f43fca7177d 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -144,6 +144,28 @@ typedef struct OBJECT_Data {
        OBJECT_StorageList *stl;
 } OBJECT_Data;
 
+typedef struct OBJECT_Shaders {
+       /* fullscreen shaders */
+       GPUShader *outline_prepass;
+       GPUShader *outline_prepass_wire;
+       GPUShader *outline_resolve;
+       GPUShader *outline_resolve_aa;
+       GPUShader *outline_detect;
+       GPUShader *outline_detect_wire;
+       GPUShader *outline_fade;
+       GPUShader *outline_fade_large;
+
+       /* regular shaders */
+       GPUShader *object_empty_image;
+       GPUShader *object_empty_image_wire;
+       GPUShader *grid;
+       GPUShader *part_dot;
+       GPUShader *part_prim;
+       GPUShader *part_axis;
+       GPUShader *lightprobe_grid;
+       GPUShader *loose_points;
+} OBJECT_Shaders;
+
 /* *********** STATIC *********** */
 
 typedef struct OBJECT_ShadingGroupList {
@@ -305,25 +327,9 @@ static struct {
        struct GPUVertFormat *empty_image_format;
        struct GPUVertFormat *empty_image_wire_format;
 
-       /* fullscreen shaders */
-       GPUShader *outline_prepass_sh;
-       GPUShader *outline_prepass_wire_sh;
-       GPUShader *outline_resolve_sh;
-       GPUShader *outline_resolve_aa_sh;
-       GPUShader *outline_detect_sh;
-       GPUShader *outline_detect_wire_sh;
-       GPUShader *outline_fade_sh;
-       GPUShader *outline_fade_large_sh;
+       /* 0: normal, 1: clipped. */
+       OBJECT_Shaders sh_data[2];
 
-       /* regular shaders */
-       GPUShader *object_empty_image_sh;
-       GPUShader *object_empty_image_wire_sh;
-       GPUShader *grid_sh;
-       GPUShader *part_dot_sh;
-       GPUShader *part_prim_sh;
-       GPUShader *part_axis_sh;
-       GPUShader *lightprobe_grid_sh;
-       GPUShader *loose_points_sh;
        float camera_pos[3];
        float grid_settings[5];
        float grid_mesh_size;
@@ -362,6 +368,14 @@ static void DRW_shgroup_empty_ex(OBJECT_ShadingGroupList 
*sgl, float mat[4][4],
 
 /* *********** FUNCTIONS *********** */
 
+static int OBJECT_sh_data_index_from_rv3d(const RegionView3D *rv3d)
+{
+       if (rv3d->rflag & RV3D_CLIPPING) {
+               return 1;
+       }
+       return 0;
+}
+
 static void OBJECT_engine_init(void *vedata)
 {
        OBJECT_FramebufferList *fbl = ((OBJECT_Data *)vedata)->fbl;
@@ -401,39 +415,42 @@ static void OBJECT_engine_init(void *vedata)
        }
 
        /* Shaders */
-       if (!e_data.outline_resolve_sh) {
+       const DRWContextState *draw_ctx = DRW_context_state_get();
+       OBJECT_Shaders *sh_data = 
&e_data.sh_data[OBJECT_sh_data_index_from_rv3d(draw_ctx->rv3d)];
+
+       if (!sh_data->outline_resolve) {
                /* Outline */
-               e_data.outline_prepass_sh = 
DRW_shader_create_3D(datatoc_object_outline_prepass_frag_glsl, NULL);
+               sh_data->outline_prepass = 
DRW_shader_create_3D(datatoc_object_outline_prepass_frag_glsl, NULL);
 
-               e_data.outline_prepass_wire_sh = DRW_shader_create(
+               sh_data->outline_prepass_wire = DRW_shader_create(
                            datatoc_object_outline_prepass_vert_glsl,
                            datatoc_object_outline_prepass_geom_glsl,
                            datatoc_object_outline_prepass_frag_glsl, NULL);
 
-               e_data.outline_resolve_sh = 
DRW_shader_create_fullscreen(datatoc_object_outline_resolve_frag_glsl, NULL);
+               sh_data->outline_resolve = 
DRW_shader_create_fullscreen(datatoc_object_outline_resolve_frag_glsl, NULL);
 
-               e_data.outline_resolve_aa_sh = DRW_shader_create_with_lib(
+               sh_data->outline_resolve_aa = DRW_shader_create_with_lib(
                            datatoc_common_fullscreen_vert_glsl, NULL,
                            datatoc_object_outline_resolve_frag_glsl,
                            datatoc_common_fxaa_lib_glsl,
                            "#define FXAA_ALPHA\n"
                            "#define USE_FXAA\n");
 
-               e_data.outline_detect_sh = DRW_shader_create_with_lib(
+               sh_data->outline_detect = DRW_shader_create_with_lib(
                            datatoc_common_fullscreen_vert_glsl, NULL,
                            datatoc_object_outline_detect_frag_glsl,
                            datatoc_common_globals_lib_glsl,
                            NULL);
 
-               e_data.outline_detect_wire_sh = DRW_shader_create_with_lib(
+               sh_data->outline_detect_wire = DRW_shader_create_with_lib(
                            datatoc_common_fullscreen_vert_glsl, NULL,
                            datatoc_object_outline_detect_frag_glsl,
                            datatoc_common_globals_lib_glsl,
                            "#define WIRE\n");
 
 
-               e_data.outline_fade_sh = 
DRW_shader_create_fullscreen(datatoc_object_outline_expand_frag_glsl, NULL);
-               e_data.outline_fade_large_sh = 
DRW_shader_create_fullscreen(datatoc_object_outline_expand_frag_glsl, "#define 
LARGE_OUTLINE\n");
+               sh_data->outline_fade = 
DRW_shader_create_fullscreen(datatoc_object_outline_expand_frag_glsl, NULL);
+               sh_data->outline_fade_large = 
DRW_shader_create_fullscreen(datatoc_object_outline_expand_frag_glsl, "#define 
LARGE_OUTLINE\n");
 
                /* Empty images */
 #              define EMPTY_IMAGE_SHADER_DEFINES \
@@ -441,12 +458,12 @@ static void OBJECT_engine_init(void *vedata)
                        "#define DEPTH_FRONT " 
STRINGIFY(OB_EMPTY_IMAGE_DEPTH_FRONT) "\n" \
                        "#define DEPTH_BACK " 
STRINGIFY(OB_EMPTY_IMAGE_DEPTH_BACK) "\n"
 
-               e_data.object_empty_image_sh = DRW_shader_create(
+               sh_data->object_empty_image = DRW_shader_create(
                        datatoc_object_empty_image_vert_glsl, NULL,
                        datatoc_object_empty_image_frag_glsl,
                        EMPTY_IMAGE_SHADER_DEFINES);
 
-               e_data.object_empty_image_wire_sh = DRW_shader_create(
+               sh_data->object_empty_image_wire = DRW_shader_create(
                        datatoc_object_empty_image_vert_glsl, NULL,
                        datatoc_object_empty_image_frag_glsl,
                        EMPTY_IMAGE_SHADER_DEFINES
@@ -455,35 +472,34 @@ static void OBJECT_engine_init(void *vedata)
 #              undef EMPTY_IMAGE_SHADER_DEFINES
 
                /* Grid */
-               e_data.grid_sh = DRW_shader_create_with_lib(
+               sh_data->grid = DRW_shader_create_with_lib(
                        datatoc_object_grid_vert_glsl, NULL,
                        datatoc_object_grid_frag_glsl,
                        datatoc_common_globals_lib_glsl, NULL);
 
                /* Particles */
-               e_data.part_prim_sh = DRW_shader_create(
+               sh_data->part_prim = DRW_shader_create(
                        datatoc_object_particle_prim_vert_glsl, NULL, 
datatoc_gpu_shader_flat_color_frag_glsl, NULL);
 
-               e_data.part_axis_sh = DRW_shader_create(
+               sh_data->part_axis = DRW_shader_create(
                        datatoc_object_particle_prim_vert_glsl, NULL, 
datatoc_gpu_shader_flat_color_frag_glsl,
                        "#define USE_AXIS\n");
 
-               e_data.part_dot_sh = DRW_shader_create(
+               sh_data->part_dot = DRW_shader_create(
                        datatoc_object_particle_dot_vert_glsl, NULL, 
datatoc_object_particle_dot_frag_glsl, NULL);
 
                /* Lightprobes */
-               e_data.lightprobe_grid_sh = DRW_shader_create(
+               sh_data->lightprobe_grid = DRW_shader_create(
                        datatoc_object_lightprobe_grid_vert_glsl, NULL, 
datatoc_gpu_shader_flat_id_frag_glsl, NULL);
 
                /* Loose Points */
-               e_data.loose_points_sh = 
DRW_shader_create_3D(datatoc_object_loose_points_frag_glsl, NULL);
+               sh_data->loose_points = 
DRW_shader_create_3D(datatoc_object_loose_points_frag_glsl, NULL);
        }
 
        {
                /* Grid precompute */
                float invviewmat[4][4], invwinmat[4][4];
                float viewmat[4][4], winmat[4][4];
-               const DRWContextState *draw_ctx = DRW_context_state_get();
                View3D *v3d = draw_ctx->v3d;
                Scene *scene = draw_ctx->scene;
                RegionView3D *rv3d = draw_ctx->rv3d;
@@ -638,22 +654,14 @@ static void OBJECT_engine_free(void)
        MEM_SAFE_FREE(e_data.particle_format);
        MEM_SAFE_FREE(e_data.empty_image_format);
        MEM_SAFE_FREE(e_data.empty_image_wire_format);
-       DRW_SHADER_FREE_SAFE(e_data.outline_prepass_sh);
-       DRW_SHADER_FREE_SAFE(e_data.outline_prepass_wire_sh);
-       DRW_SHADER_FREE_SAFE(e_data.outline_resolve_sh);
-       DRW_SHADER_FREE_SAFE(e_data.outline_resolve_aa_sh);
-       DRW_SHADER_FREE_SAFE(e_data.outline_detect_sh);
-       DRW_SHADER_FREE_SAFE(e_data.outline_detect_wire_sh);
-       DRW_SHADER_FREE_SAFE(e_data.outline_fade_sh);
-       DRW_SHADER_FREE_SAFE(e_data.outline_fade_large_sh);
-       DRW_SHADER_FREE_SAFE(e_data.object_empty_image_sh);
-       DRW_SHADER_FREE_SAFE(e_data.object_empty_image_wire_sh);
-       DRW_SHADER_FREE_SAFE(e_data.grid_sh);
-       DRW_SHADER_FREE_SAFE(e_data.part_prim_sh);
-       DRW_SHADER_FREE_SAFE(e_data.part_axis_sh);
-       DRW_SHADER_FREE_SAFE(e_data.part_dot_sh);
-       DRW_SHADER_FREE_SAFE(e_data.lightprobe_grid_sh);
-       DRW_SHADER_FREE_SAFE(e_data.loose_points_sh);
+
+       for (int sh_data_index = 0; sh_data_index < ARRAY_SIZE(e_data.sh_data); 
sh_data_index++) {
+               OBJECT_Shaders *sh_data = &e_data.sh_data[sh_data_index];
+               GPUShader **sh_data_as_array = (GPUShader **)sh_data;
+               for (int i = 0; i < (sizeof(OBJECT_Shaders) / sizeof(GPUShader 
*)); i++) {
+                       DRW_SHADER_FREE_SAFE(sh_data_as_array[i]);
+               }
+       }
 }
 
 static DRWShadingGroup *shgroup_outline(DRWPass *pass, const int *ofs, 
GPUShader *sh)
@@ -899,7 +907,8 @@ static void image_calc_aspect(Image *ima, const int 
size[2], float r_image_aspec
 }
 
 static void DRW_shgroup_empty_image(
-        OBJECT_ShadingGroupList *sgl, Object *ob, const float color[3], 
RegionView3D *rv3d)
+        OBJECT_Shaders *sh_data, OBJECT_ShadingGroupList *sgl,
+        Object *ob, const float color[3], RegionView3D *rv3d)
 {
        /* TODO: 'StereoViews', see draw_empty_image. */
 
@@ -929,7 +938,7 @@ static void DRW_shgroup_empty_image(
         * ob->col[3] == 1.0f,  we could remove it from the sorting pass. */
 
        if (tex && (ob->col[3] > 0.0f)) {
-               DRWShadingGroup *grp = 
DRW_shgroup_create(e_data.object_empty_image_sh, sgl->image_empties);
+               DRWShadingGroup *grp = 
DRW_shgroup_create(sh_data->object_empty_image, sgl->image_empties);
                DRW_shgroup_uniform_texture(grp, "image", tex);
                /* TODO(fclem) implement DRW_shgroup_uniform_vec2_copy */
                DRW_shgroup_uniform_float_copy(grp, "aspectX", image_aspect[0]);
@@ -942,7 +951,7 @@ static void DRW_shgroup_empty_image(
        }
 
        {
-               DRWShadingGroup *grp = 
DRW_shgroup_create(e_data.object_empty_image_wire_sh, sgl->non_meshes);
+               DRWShadingGroup *grp = 
DRW_shgroup_create(sh_data->object_empty_image_wire, sgl->non_meshes);
                /* TODO(fclem) implement DRW_shgroup_uniform_vec2_copy */
                DRW_shgroup_uniform_float_copy(grp, "aspectX", image_aspect[0]);
                DRW_shgroup_uniform_float_copy(grp, "aspectY", image_aspect[1]);
@@ -962,6 +971,7 @@ static void OBJECT_cache_init(void *vedata)
        DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
        OBJECT_PrivateData *g_data;
        const DRWConte

@@ 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