Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2017-05-02 17:45:10 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-05-02 17:45:10 +0300
commit2b0f02057f457acec1ed9444ee7d833ab26d0d33 (patch)
tree8950524c178e5464423568cedb1b9b8fb74a2130 /source/blender
parent47239b40419750f0ad8284ba1de1012a638660fb (diff)
Draw Manager: split DRW_draw_view into 2 functions
Needed for offscreen render
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_context.h1
-rw-r--r--source/blender/blenkernel/intern/context.c14
-rw-r--r--source/blender/draw/DRW_engine.h4
-rw-r--r--source/blender/draw/intern/draw_manager.c51
4 files changed, 52 insertions, 18 deletions
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 22368104566..c911d9ec952 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -250,6 +250,7 @@ struct SceneLayer *CTX_data_scene_layer(const bContext *C);
struct ToolSettings *CTX_data_tool_settings(const bContext *C);
const char *CTX_data_mode_string(const bContext *C);
+int CTX_data_mode_enum_ex(const struct Object *obedit, const struct Object *ob);
int CTX_data_mode_enum(const bContext *C);
void CTX_data_main_set(bContext *C, struct Main *bmain);
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 20a3d4ac7e0..6ca9b1dab04 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -953,10 +953,9 @@ SceneCollection *CTX_data_scene_collection(const bContext *C)
return BKE_collection_master(scene);
}
-int CTX_data_mode_enum(const bContext *C)
+int CTX_data_mode_enum_ex(const Object *obedit, const Object *ob)
{
- Object *obedit = CTX_data_edit_object(C);
-
+ // Object *obedit = CTX_data_edit_object(C);
if (obedit) {
switch (obedit->type) {
case OB_MESH:
@@ -976,8 +975,7 @@ int CTX_data_mode_enum(const bContext *C)
}
}
else {
- Object *ob = CTX_data_active_object(C);
-
+ // Object *ob = CTX_data_active_object(C);
if (ob) {
if (ob->mode & OB_MODE_POSE) return CTX_MODE_POSE;
else if (ob->mode & OB_MODE_SCULPT) return CTX_MODE_SCULPT;
@@ -991,6 +989,12 @@ int CTX_data_mode_enum(const bContext *C)
return CTX_MODE_OBJECT;
}
+int CTX_data_mode_enum(const bContext *C)
+{
+ Object *obedit = CTX_data_edit_object(C);
+ Object *obact = obedit ? CTX_data_active_object(C) : NULL;
+ return CTX_data_mode_enum_ex(obedit, obact);
+}
/* would prefer if we can use the enum version below over this one - Campbell */
/* must be aligned with above enum */
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 62dae9b3e7b..6b3aee73229 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -63,6 +63,10 @@ void DRW_engine_viewport_data_size_get(
int *r_fbl_len, int *r_txl_len, int *r_psl_len, int *r_stl_len);
void DRW_draw_view(const struct bContext *C);
+
+void DRW_draw_render_loop(
+ struct Depsgraph *graph,
+ struct View3D *v3d, struct ARegion *ar);
void DRW_draw_select_loop(
struct Depsgraph *graph,
struct View3D *v3d, struct ARegion *ar,
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index d6c86d82291..f116ecbc8b4 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2003,10 +2003,9 @@ static void DRW_engines_enable_external(void)
use_drw_engine(DRW_engine_viewport_external_type.draw_engine);
}
-static void DRW_engines_enable(const bContext *C)
+static void DRW_engines_enable(const Scene *scene, SceneLayer *sl)
{
- Scene *scene = CTX_data_scene(C);
- const int mode = CTX_data_mode_enum(C);
+ const int mode = CTX_data_mode_enum_ex(scene->obedit, OBACT_NEW);
DRW_engines_enable_from_engine(scene);
DRW_engines_enable_from_object_mode();
DRW_engines_enable_from_mode(mode);
@@ -2179,20 +2178,40 @@ static void DRW_debug_gpu_stats(void)
* for each relevant engine / mode engine. */
void DRW_draw_view(const bContext *C)
{
- bool cache_is_dirty;
- RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ struct Depsgraph *graph = CTX_data_depsgraph(C);
+ ARegion *ar = CTX_wm_region(C);
+// RegionView3D *rv3d = ar->regiondata;
View3D *v3d = CTX_wm_view3d(C);
+
+ DST.draw_ctx.evil_C = C;
+
+ DRW_draw_render_loop(graph, v3d, ar);
+}
+
+void DRW_draw_render_loop(
+ struct Depsgraph *graph,
+ View3D *v3d, ARegion *ar)
+{
+ Scene *scene = DAG_get_scene(graph);
+ SceneLayer *sl = DAG_get_scene_layer(graph);
+ RegionView3D *rv3d = ar->regiondata;
+
+ bool cache_is_dirty;
DST.viewport = rv3d->viewport;
v3d->zbuf = true;
/* Get list of enabled engines */
- DRW_engines_enable(C);
+ DRW_engines_enable(scene, sl);
/* Setup viewport */
cache_is_dirty = GPU_viewport_cache_validate(DST.viewport, DRW_engines_get_hash());
- /* Save context for all later needs */
- DRW_context_state_init(C, &DST.draw_ctx);
+ DST.draw_ctx = (DRWContextState){
+ ar, rv3d, v3d, scene, sl,
+ /* reuse if caller sets */
+ DST.draw_ctx.evil_C,
+ };
+
DRW_viewport_var_init();
/* Update ubos */
@@ -2207,7 +2226,6 @@ void DRW_draw_view(const bContext *C)
if (cache_is_dirty) {
DRW_engines_cache_init();
- Depsgraph *graph = CTX_data_depsgraph(C);
DEG_OBJECT_ITER(graph, ob);
{
DRW_engines_cache_populate(ob);
@@ -2221,21 +2239,27 @@ void DRW_draw_view(const bContext *C)
DRW_engines_draw_background();
DRW_draw_callbacks_pre_scene();
- ED_region_draw_cb_draw(C, DST.draw_ctx.ar, REGION_DRAW_PRE_VIEW);
+ if (DST.draw_ctx.evil_C) {
+ ED_region_draw_cb_draw(DST.draw_ctx.evil_C, DST.draw_ctx.ar, REGION_DRAW_PRE_VIEW);
+ }
DRW_engines_draw_scene();
DRW_draw_callbacks_post_scene();
- ED_region_draw_cb_draw(C, DST.draw_ctx.ar, REGION_DRAW_POST_VIEW);
+ if (DST.draw_ctx.evil_C) {
+ ED_region_draw_cb_draw(DST.draw_ctx.evil_C, DST.draw_ctx.ar, REGION_DRAW_POST_VIEW);
+ }
DRW_engines_draw_text();
/* needed so manipulator isn't obscured */
glClear(GL_DEPTH_BUFFER_BIT);
- DRW_draw_manipulator();
+ if (DST.draw_ctx.evil_C) {
+ DRW_draw_manipulator();
- DRW_draw_region_info();
+ DRW_draw_region_info();
+ }
if (G.debug_value > 20) {
DRW_debug_cpu_stats();
@@ -2508,6 +2532,7 @@ void DRW_context_state_init(const bContext *C, DRWContextState *r_draw_ctx)
r_draw_ctx->evil_C = C;
}
+
const DRWContextState *DRW_context_state_get(void)
{
return &DST.draw_ctx;