Commit: 50fb3ea3de8db278fd135392b990158b745e3e3f
Author: Clément Foucault
Date:   Fri Feb 17 17:29:43 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB50fb3ea3de8db278fd135392b990158b745e3e3f

Clay Engine: Separate mode drawing to different files/engines.

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

M       source/blender/draw/CMakeLists.txt
M       source/blender/draw/engines/clay/clay.c
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.c
M       source/blender/draw/intern/draw_mode_pass.c
M       source/blender/draw/intern/draw_mode_pass.h
A       source/blender/draw/modes/edit_mode.c
A       source/blender/draw/modes/edit_mode.h
A       source/blender/draw/modes/object_mode.c
A       source/blender/draw/modes/object_mode.h
M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/gpu/GPU_viewport.h
M       source/blender/gpu/intern/gpu_viewport.c

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

diff --git a/source/blender/draw/CMakeLists.txt 
b/source/blender/draw/CMakeLists.txt
index 006fb0fbc2..be517d799a 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -27,6 +27,7 @@ set(INC
        .
        intern
        engines/clay
+       modes/
 
        ../blenkernel
        ../blenlib
@@ -55,12 +56,16 @@ set(SRC
        intern/draw_cache.c
        intern/draw_view.c
        engines/clay/clay.c
+       modes/edit_mode.c
+       modes/object_mode.c
 
        intern/DRW_render.h
        intern/draw_mode_pass.h
        intern/draw_cache.h
        intern/draw_view.h
        engines/clay/clay.h
+       modes/edit_mode.h
+       modes/object_mode.h
 
        ./DRW_engine.h
 )
diff --git a/source/blender/draw/engines/clay/clay.c 
b/source/blender/draw/engines/clay/clay.c
index 1673dd219c..f121eb8600 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -126,17 +126,9 @@ enum {
 
 /* keep it under MAX_PASSES */
 typedef struct CLAY_PassList{
-       /* default */
-       struct DRWPass *non_meshes_pass;
-       struct DRWPass *ob_center_pass;
-       /* engine specific */
        struct DRWPass *depth_pass;
        struct DRWPass *depth_pass_cull;
-       struct DRWPass *depth_pass_hidden_wire;
        struct DRWPass *clay_pass;
-       struct DRWPass *wire_overlay_pass;
-       struct DRWPass *wire_outline_pass;
-       struct DRWPass *wire_outline_pass_hidden_wire;
 } CLAY_PassList;
 
 //#define GTAO
@@ -286,8 +278,12 @@ MaterialEngineSettings *CLAY_material_settings_create(void)
        return (MaterialEngineSettings *)settings;
 }
 
-static void CLAY_engine_init(CLAY_StorageList *stl, CLAY_TextureList *txl, 
CLAY_FramebufferList *fbl)
+static void CLAY_engine_init(void)
 {
+       CLAY_StorageList *stl = DRW_engine_storage_list_get();
+       CLAY_TextureList *txl = DRW_engine_texture_list_get();
+       CLAY_FramebufferList *fbl = DRW_engine_framebuffer_list_get();
+
        /* Create Texture Array */
        if (!data.matcap_array) {
                PreviewImage *prv[24]; /* For now use all of the 24 internal 
matcaps */
@@ -384,56 +380,56 @@ static void CLAY_engine_init(CLAY_StorageList *stl, 
CLAY_TextureList *txl, CLAY_
                                     (int)viewport_size[0], 
(int)viewport_size[1],
                                     &tex, 1);
        }
-}
 
-static void CLAY_ssao_setup(void)
-{
-       float invproj[4][4];
-       float dfdyfacs[2];
-       bool is_persp = DRW_viewport_is_persp_get();
-       /* view vectors for the corners of the view frustum. Can be used to 
recreate the world space position easily */
-       float viewvecs[3][4] = {
-           {-1.0f, -1.0f, -1.0f, 1.0f},
-           {1.0f, -1.0f, -1.0f, 1.0f},
-           {-1.0f, 1.0f, -1.0f, 1.0f}
-       };
-       int i;
-       float *size = DRW_viewport_size_get();
-       RenderEngineSettingsClay *settings = DRW_render_settings_get(NULL, 
RE_engine_id_BLENDER_CLAY);
-
-       DRW_get_dfdy_factors(dfdyfacs);
-
-       data.ssao_params[0] = settings->ssao_samples;
-       data.ssao_params[1] = size[0] / 64.0;
-       data.ssao_params[2] = size[1] / 64.0;
-       data.ssao_params[3] = dfdyfacs[1]; /* dfdy sign for offscreen */
-
-       /* invert the view matrix */
-       DRW_viewport_matrix_get(data.winmat, DRW_MAT_WIN);
-       invert_m4_m4(invproj, data.winmat);
-
-       /* convert the view vectors to view space */
-       for (i = 0; i < 3; i++) {
-               mul_m4_v4(invproj, viewvecs[i]);
-               /* normalized trick see 
http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer
 */
-               mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][3]);
-               if (is_persp)
-                       mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][2]);
-               viewvecs[i][3] = 1.0;
-
-               copy_v4_v4(data.viewvecs[i], viewvecs[i]);
-       }
+       /* SSAO setup */
+       {
+               float invproj[4][4];
+               float dfdyfacs[2];
+               bool is_persp = DRW_viewport_is_persp_get();
+               /* view vectors for the corners of the view frustum. Can be 
used to recreate the world space position easily */
+               float viewvecs[3][4] = {
+                   {-1.0f, -1.0f, -1.0f, 1.0f},
+                   {1.0f, -1.0f, -1.0f, 1.0f},
+                   {-1.0f, 1.0f, -1.0f, 1.0f}
+               };
+               int i;
+               float *size = DRW_viewport_size_get();
+               RenderEngineSettingsClay *settings = 
DRW_render_settings_get(NULL, RE_engine_id_BLENDER_CLAY);
+
+               DRW_get_dfdy_factors(dfdyfacs);
+
+               data.ssao_params[0] = settings->ssao_samples;
+               data.ssao_params[1] = size[0] / 64.0;
+               data.ssao_params[2] = size[1] / 64.0;
+               data.ssao_params[3] = dfdyfacs[1]; /* dfdy sign for offscreen */
+
+               /* invert the view matrix */
+               DRW_viewport_matrix_get(data.winmat, DRW_MAT_WIN);
+               invert_m4_m4(invproj, data.winmat);
+
+               /* convert the view vectors to view space */
+               for (i = 0; i < 3; i++) {
+                       mul_m4_v4(invproj, viewvecs[i]);
+                       /* normalized trick see 
http://www.derschmale.com/2014/01/26/reconstructing-positions-from-the-depth-buffer
 */
+                       mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][3]);
+                       if (is_persp)
+                               mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][2]);
+                       viewvecs[i][3] = 1.0;
+
+                       copy_v4_v4(data.viewvecs[i], viewvecs[i]);
+               }
 
-       /* we need to store the differences */
-       data.viewvecs[1][0] -= data.viewvecs[0][0];
-       data.viewvecs[1][1] = data.viewvecs[2][1] - data.viewvecs[0][1];
+               /* we need to store the differences */
+               data.viewvecs[1][0] -= data.viewvecs[0][0];
+               data.viewvecs[1][1] = data.viewvecs[2][1] - data.viewvecs[0][1];
 
-       /* calculate a depth offset as well */
-       if (!is_persp) {
-               float vec_far[] = {-1.0f, -1.0f, 1.0f, 1.0f};
-               mul_m4_v4(invproj, vec_far);
-               mul_v3_fl(vec_far, 1.0f / vec_far[3]);
-               data.viewvecs[1][2] = vec_far[2] - data.viewvecs[0][2];
+               /* calculate a depth offset as well */
+               if (!is_persp) {
+                       float vec_far[] = {-1.0f, -1.0f, 1.0f, 1.0f};
+                       mul_m4_v4(invproj, vec_far);
+                       mul_v3_fl(vec_far, 1.0f / vec_far[3]);
+                       data.viewvecs[1][2] = vec_far[2] - data.viewvecs[0][2];
+               }
        }
 }
 
@@ -605,112 +601,104 @@ static DRWShadingGroup *CLAY_object_shgrp_get(Object 
*ob, CLAY_StorageList *stl,
        return shgrps[id];
 }
 
-static void CLAY_create_cache(CLAY_PassList *passes, CLAY_StorageList *stl, 
const struct bContext *C)
+static DRWShadingGroup *depth_shgrp;
+static DRWShadingGroup *depth_shgrp_cull;
+
+static void CLAY_cache_init(void)
 {
-       SceneLayer *sl = CTX_data_scene_layer(C);
-       DRWShadingGroup *clay_shgrp;
-       DRWShadingGroup *depth_shgrp;
-       DRWShadingGroup *depth_shgrp_cull;
-       DRWShadingGroup *depth_shgrp_hidden_wire;
+       CLAY_PassList *psl = DRW_engine_pass_list_get();
+       CLAY_StorageList *stl = DRW_engine_storage_list_get();
+
 
        /* Depth Pass */
        {
-               passes->depth_pass_cull = DRW_pass_create("Depth Pass Cull", 
DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK);
-               depth_shgrp_cull = DRW_shgroup_create(data.depth_sh, 
passes->depth_pass_cull);
-               passes->depth_pass = DRW_pass_create("Depth Pass", 
DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
-               depth_shgrp = DRW_shgroup_create(data.depth_sh, 
passes->depth_pass);
-               passes->depth_pass_hidden_wire = DRW_pass_create("Depth Pass 
Hidden Wire", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | 
DRW_STATE_CULL_BACK);
-               depth_shgrp_hidden_wire = DRW_shgroup_create(data.depth_sh, 
passes->depth_pass_hidden_wire);
+               psl->depth_pass_cull = DRW_pass_create("Depth Pass Cull", 
DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK);
+               psl->depth_pass = DRW_pass_create("Depth Pass", 
DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+
+               depth_shgrp_cull = DRW_shgroup_create(data.depth_sh, 
psl->depth_pass_cull);
+               depth_shgrp = DRW_shgroup_create(data.depth_sh, 
psl->depth_pass);
        }
 
        /* Clay Pass */
        {
-               passes->clay_pass = DRW_pass_create("Clay Pass", 
DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL);
+               psl->clay_pass = DRW_pass_create("Clay Pass", 
DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL);
                stl->storage->ubo_current_id = 0;
                memset(stl->storage->shgrps, 0, sizeof(DRWShadingGroup *) * 
MAX_CLAY_MAT);
        }
+}
 
-       /* Object Mode */
-       {
-               DRW_pass_setup_common(&passes->wire_overlay_pass,
-                                         &passes->wire_outline_pass,
-                                         
&passes->wire_outline_pass_hidden_wire,
-                                         &passes->non_meshes_pass,
-                                         &passes->ob_center_pass);
-       }
+static void CLAY_cache_populate(Object *ob)
+{
+       const bContext *C = DRW_get_context();
+       int mode = CTX_data_mode_enum(C);
+       CLAY_StorageList *stl = DRW_engine_storage_list_get();
+       CLAY_PassList *psl = DRW_engine_pass_list_get();
+       struct Batch *geom;
+       DRWShadingGroup *clay_shgrp;
+       bool do_occlude_wire = false;
+       bool do_cull = false;
+       CollectionEngineSettings *ces_mode_ed, *ces_mode_ob;
 
-       /* TODO Create hash table of batch based on material id*/
-       DEG_OBJECT_ITER(sl, ob);
-       {
-               if ((ob->base_flag & BASE_VISIBLED) == 0) {
-                       continue;
-               }
+       if ((ob->base_flag & BASE_VISIBLED) == 0)
+               return;
 
-               CollectionEngineSettings *ces_mode_ob = 
BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
-               CollectionEngineSettings *ces_mode_ed = 
BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, "");
-
-               struct Batch *geom;
-               bool do_wire = 
BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_wire");
-               bool do_cull = 
BKE_collection_engine_property_value_get_bool(ces_mode_ob, 
"show_backface_culling");
-               bool do_occlude_wire = 
BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire");
-               bool do_outlines = ((ob->base_flag & BASE_SELECTED) != 0) || 
do_wire;
-
-               switch (ob->type) {
-                       case OB_MESH:
-                               geom = DRW_cache_surface_get(ob);
-
-                               /* Depth Prepass */
-                               if (do_occlude_wire)
-                                       
DRW_shgroup_call_add(depth_shgrp_hidden_wire, geom, ob->obmat);
-                               else
-                                       DRW_shgroup_call_add((do_cull) ? 
depth_shgrp_cull : depth_shgrp, geom, ob->obmat);
-
-                               /* Shading */
-                               if (!do_occlude_wire) {
-                                       clay_shgrp = CLAY_object_shgrp_get(ob, 
stl, passes);
-                                       DRW_shgroup_call_add(clay_shgrp, geom, 
ob->obmat);
-                               }
-
-                               
//DRW_shgroup_wire_overlay(passes->wire_overlay_pass, ob);
-
-                               /* Wires / Outlines */
-                               if (do_occlude_wire) {
-                                       
DRW_shgroup_wire_outline(passes->wire_outline_pass_hidden_wire, ob, true, 
false, true);
-                               }
-                               else {
-                                       
DRW_shgroup_wire_outline(passes->wire_outline_pass, ob, do_wire, false, 
do_outlines);
-                               }
-
-                               break;
-                       case OB_LAMP:
-                       case OB_CAMERA:
-                       case OB_EMPTY:
-                       default:
-                               DRW_shgroup_non_meshes(passes->non_meshes_pass, 
ob);
-                               break;
-               }
+       switch (mode) {
+               case CTX_MODE_EDIT_MESH:
+               case CTX_MODE_EDIT_CURVE:
+               case CTX_MODE_EDIT_SURFACE:
+               case CTX_MODE_EDIT_TEXT:
+               case 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to