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