[Bf-blender-cvs] [50fb3ea3de] blender2.8: Clay Engine: Separate mode drawing to different files/engines.
Clément Foucault
noreply at git.blender.org
Fri Feb 17 17:37:53 CET 2017
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. @@
More information about the Bf-blender-cvs
mailing list