[Bf-blender-cvs] [3b91989a093] blender2.8: Draw Manager: structural change
Clément Foucault
noreply at git.blender.org
Thu Mar 9 01:38:51 CET 2017
Commit: 3b91989a093aef874b601efcffd247cf61e73bad
Author: Clément Foucault
Date: Wed Mar 8 20:00:09 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB3b91989a093aef874b601efcffd247cf61e73bad
Draw Manager: structural change
All engines are now called by the draw manager. Engines are separate entities that cannot interfer with each others.
Also separated draw_mode_pass.c into the mode engines.
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/DRW_engine.h
M source/blender/draw/engines/clay/clay.c
M source/blender/draw/engines/clay/clay.h
M source/blender/draw/intern/DRW_render.h
M source/blender/draw/intern/draw_armature.c
A source/blender/draw/intern/draw_common.c
R052 source/blender/draw/intern/draw_mode_pass.h source/blender/draw/intern/draw_common.h
M source/blender/draw/intern/draw_manager.c
D source/blender/draw/intern/draw_mode_pass.c
R073 source/blender/draw/modes/object_mode.h source/blender/draw/modes/draw_mode_engines.h
M source/blender/draw/modes/edit_armature_mode.c
D source/blender/draw/modes/edit_armature_mode.h
M source/blender/draw/modes/edit_mesh_mode.c
D source/blender/draw/modes/edit_mesh_mode.h
M source/blender/draw/modes/object_mode.c
M source/blender/editors/space_view3d/CMakeLists.txt
M source/blender/editors/space_view3d/view3d_draw.c
M source/blender/gpu/GPU_viewport.h
M source/blender/gpu/intern/gpu_viewport.c
M source/blender/render/extern/include/RE_engine.h
M source/blender/render/intern/source/external_engine.c
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index cb2681fcf81..c04063d22f8 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -52,7 +52,7 @@ set(INC_SYS
set(SRC
intern/draw_manager.c
- intern/draw_mode_pass.c
+ intern/draw_common.c
intern/draw_cache.c
intern/draw_view.c
intern/draw_armature.c
@@ -62,13 +62,11 @@ set(SRC
modes/object_mode.c
intern/DRW_render.h
- intern/draw_mode_pass.h
+ intern/draw_common.h
intern/draw_cache.h
intern/draw_view.h
engines/clay/clay.h
- modes/edit_armature_mode.h
- modes/edit_mesh_mode.h
- modes/object_mode.h
+ modes/draw_mode_engines.h
./DRW_engine.h
)
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 05ecc7390d1..e8dc47245e3 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -30,10 +30,27 @@ struct CollectionEngineSettings;
struct DRWPass;
struct Material;
struct Scene;
+struct DrawEngineType;
+struct bContext;
+struct Object;
-void DRW_engines_init(void);
+/* Buffer and textures used by the viewport by default */
+typedef struct DefaultFramebufferList {
+ struct GPUFrameBuffer *default_fb;
+} DefaultFramebufferList;
+
+typedef struct DefaultTextureList {
+ struct GPUTexture *color;
+ struct GPUTexture *depth;
+} DefaultTextureList;
+
+void DRW_engines_register(void);
void DRW_engines_free(void);
+void DRW_engine_register(struct DrawEngineType *draw_engine_type);
+
+void DRW_draw_view(const struct bContext *C);
+
/* This is here because GPUViewport needs it */
void DRW_pass_free(struct DRWPass *pass);
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index cd19595b107..a91027cb314 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -124,6 +124,15 @@ typedef struct CLAY_PassList {
struct DRWPass *clay_pass;
} CLAY_PassList;
+typedef struct CLAY_Data {
+ char engine_name[32];
+ CLAY_FramebufferList *fbl;
+ CLAY_TextureList *txl;
+ CLAY_PassList *psl;
+ CLAY_StorageList *stl;
+} CLAY_Data;
+
+
//#define GTAO
/* Functions */
@@ -262,20 +271,12 @@ RenderEngineSettings *CLAY_render_settings_create(void)
return (RenderEngineSettings *)settings;
}
-MaterialEngineSettings *CLAY_material_settings_create(void)
-{
- MaterialEngineSettingsClay *settings = MEM_callocN(sizeof(MaterialEngineSettingsClay), "MaterialEngineSettingsClay");
-
- clay_material_settings_init(settings);
-
- return (MaterialEngineSettings *)settings;
-}
-
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();
+ CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+ CLAY_StorageList *stl = vedata->stl;
+ CLAY_TextureList *txl = vedata->txl;
+ CLAY_FramebufferList *fbl = vedata->fbl;
/* Create Texture Array */
if (!data.matcap_array) {
@@ -428,10 +429,11 @@ static void CLAY_engine_init(void)
static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *material_id)
{
+ CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+ CLAY_TextureList *txl = vedata->txl;
const int depthloc = 0, matcaploc = 1, jitterloc = 2, sampleloc = 3;
DRWShadingGroup *grp = DRW_shgroup_create(data.clay_sh, pass);
- CLAY_TextureList *txl = DRW_engine_texture_list_get();
DRW_shgroup_uniform_vec2(grp, "screenres", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_buffer(grp, "depthtex", &txl->depth_dup, depthloc);
@@ -599,9 +601,9 @@ static DRWShadingGroup *depth_shgrp_cull;
static void CLAY_cache_init(void)
{
- CLAY_PassList *psl = DRW_engine_pass_list_get();
- CLAY_StorageList *stl = DRW_engine_storage_list_get();
-
+ CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+ CLAY_PassList *psl = vedata->psl;
+ CLAY_StorageList *stl = vedata->stl;
/* Depth Pass */
{
@@ -622,100 +624,46 @@ static void CLAY_cache_init(void)
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();
+ CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+ CLAY_PassList *psl = vedata->psl;
+ CLAY_StorageList *stl = vedata->stl;
+
struct Batch *geom;
DRWShadingGroup *clay_shgrp;
- bool do_occlude_wire = false;
- bool do_cull = false;
- CollectionEngineSettings *ces_mode_ed, *ces_mode_ob;
-
- switch (mode) {
- case CTX_MODE_EDIT_MESH:
- case CTX_MODE_EDIT_CURVE:
- case CTX_MODE_EDIT_SURFACE:
- case CTX_MODE_EDIT_TEXT:
- case CTX_MODE_EDIT_ARMATURE:
- case CTX_MODE_EDIT_METABALL:
- case CTX_MODE_EDIT_LATTICE:
- case CTX_MODE_POSE:
- case CTX_MODE_SCULPT:
- case CTX_MODE_PAINT_WEIGHT:
- case CTX_MODE_PAINT_VERTEX:
- case CTX_MODE_PAINT_TEXTURE:
- case CTX_MODE_PARTICLE:
- ces_mode_ed = BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, "");
- do_occlude_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire");
- break;
- case CTX_MODE_OBJECT:
- ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
- do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling");
- break;
- }
- if (do_occlude_wire)
+ if (!DRW_is_object_renderable(ob))
return;
- switch (ob->type) {
- case OB_MESH:
- geom = DRW_cache_surface_get(ob);
+ CollectionEngineSettings *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
+ bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling");
- /* Depth Prepass */
- DRW_shgroup_call_add((do_cull) ? depth_shgrp_cull : depth_shgrp, geom, ob->obmat);
+ /* TODO all renderable */
+ if (ob->type == OB_MESH) {
+ geom = DRW_cache_surface_get(ob);
- /* Shading */
- clay_shgrp = CLAY_object_shgrp_get(ob, stl, psl);
- DRW_shgroup_call_add(clay_shgrp, geom, ob->obmat);
- break;
+ /* Depth Prepass */
+ DRW_shgroup_call_add((do_cull) ? depth_shgrp_cull : depth_shgrp, geom, ob->obmat);
+
+ /* Shading */
+ clay_shgrp = CLAY_object_shgrp_get(ob, stl, psl);
+ DRW_shgroup_call_add(clay_shgrp, geom, ob->obmat);
}
}
static void CLAY_cache_finish(void)
{
- CLAY_StorageList *stl = DRW_engine_storage_list_get();
+ CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+ CLAY_StorageList *stl = vedata->stl;
DRW_uniformbuffer_update(stl->mat_ubo, &stl->storage->mat_storage);
}
-static void CLAY_view_draw(RenderEngine *UNUSED(engine), const bContext *context)
+static void CLAY_draw_scene(void)
{
- DRW_viewport_init(context);
-
- /* This function may run for multiple viewports
- * so get the current viewport buffers */
- CLAY_PassList *psl = DRW_engine_pass_list_get();
- CLAY_FramebufferList *fbl = DRW_engine_framebuffer_list_get();
-
- CLAY_engine_init();
- DRW_mode_init();
-
- /* TODO : tag to refresh by the deps graph */
- /* ideally only refresh when objects are added/removed */
- /* or render properties / materials change */
- if (DRW_viewport_cache_is_dirty()) {
-
- SceneLayer *sl = CTX_data_scene_layer(context);
-
- CLAY_cache_init();
- DRW_mode_cache_init();
-
- DEG_OBJECT_ITER(sl, ob);
- {
- CLAY_cache_populate(ob);
- DRW_mode_cache_populate(ob);
- }
- DEG_OBJECT_ITER_END
-
- CLAY_cache_finish();
- DRW_mode_cache_finish();
- }
-
- /* Start Drawing */
- DRW_draw_background();
-
- DRW_draw_callbacks_pre_scene();
+ CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+ CLAY_PassList *psl = vedata->psl;
+ CLAY_FramebufferList *fbl = vedata->fbl;
+ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
/* Pass 1 : Depth pre-pass */
DRW_draw_pass(psl->depth_pass);
@@ -723,19 +671,10 @@ static void CLAY_view_draw(RenderEngine *UNUSED(engine), const bContext *context
/* Pass 2 : Duplicate depth */
/* Unless we go for deferred shading we need this to avoid manual depth test and artifacts */
- DRW_framebuffer_blit(fbl->default_fb, fbl->dupli_depth, true);
+ DRW_framebuffer_blit(dfbl->default_fb, fbl->dupli_depth, true);
/* Pass 3 : Shading */
DRW_draw_pass(psl->clay_pass);
-
- /* Pass 4 : Overlays */
- /* At this point all shaded geometry should have been rendered and their depth written */
- DRW_draw_mode_overlays();
-
- DRW_draw_callbacks_post_scene();
-
- /* Always finish by this */
- DRW_state_reset();
}
static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), CollectionEngineSettings *ces)
@@ -753,30 +692,39 @@ static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), Collec
BKE_collection_engine_property_add_float(ces, "ssao_factor_edge", 1.0f);
}
-void CLAY_engine_free(void)
+static void CLAY_engine_free(void)
{
- /* data.depth_sh Is builtin so it's automaticaly freed */
if (data.clay_sh) {
DRW_shader_free(data.clay_sh);
}
-
if (data.matcap_array) {
DRW_texture_free(data.matcap_array);
}
-
if (data.jitter_tx) {
DRW_texture_free(data.jitter_tx);
}
-
if (data.sampling_tx) {
DRW_texture_free(data.sampling_tx);
}
}
+DrawEngineType draw_engine_clay_type = {
+ NULL, NULL,
+ N_("Clay"),
+ &CLAY_engine_init,
+ &CLAY_engine_free,
+ &CLAY_cache_init,
+ &CLAY_cache_populate,
+ &CLAY_cache_finish,
+ NULL,
+ &CLAY_draw_scene
+};
+
RenderEngineType viewport_clay_type = {
NULL, NULL,
CLAY_ENGINE, N_("Clay"), RE_INTERNAL | RE_USE_OGL_PIPELINE,
- NULL, NULL, NULL, NULL, &CLAY_view_draw, NULL, &CLAY_collection_settings_create,
+ NULL, NULL, NULL, NULL, NULL, NULL, &CLAY_collection_settings_create,
+ &draw_engine_clay_type,
{NULL, NULL, NULL}
};
diff --git a/source/blender/draw/engines/clay/clay.h b/source/blender/draw/engines/clay/clay.h
index 34dd74b9500..1afe1ac5ea8 100644
--- a/source/blender/draw/engines/clay/clay.h
+++ b/source/blender/draw/engines/clay/clay.h
@@ -31,6 +31,4 @@ extern RenderEngineType viewport_clay_type;
struct RenderEngineSettings *CLAY_render_settings_create(void);
struct MaterialEngineSettings *CLAY_material_settings_create(void);
-void CLAY_engine_free(voi
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list