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:
authorDalai Felinto <dfelinto@gmail.com>2017-10-16 22:15:03 +0300
committerDalai Felinto <dfelinto@gmail.com>2017-10-16 22:29:04 +0300
commite4f2b2be26adbb5c34231598526a270559c6e183 (patch)
tree40601b1349372904cffe619003dcc83b7011d8be /source/blender/draw
parente8962f90de4222d6f750d3d3478eff65490365d8 (diff)
Workspace: Move engines to workspace and Properties Editor cleanup
Engine is not stored in WorkSpaces. That defines the "context" engine, which is used for the entire UI. The engine used for the poll of nodes (add node menu, new nodes when "Use Nodes") is obtained from context. Introduce a ViewRender struct for viewport settings that are defined for workspaces and scene. This struct will be populated with the hand-picked settings that can be defined per workspace as per the 2.8 design. * use_scene_settings * properties editor: workshop + organize context path Use Scene Settings ================== For viewport drawing, Workspaces have an option to use the Scene render settings (F12) instead of the viewport settings. This way users can quickly preview the final render settings, engine and View Layer. This will affect all the editors in that workspace, and it will be clearly indicated in the top-bar. Properties Editor: Add Workspace and organize context path ========================================================== We now have the properties of: Scene, Scene > Layer, Scene > World, Workspace [Scene | Workspace] > Render Layer > Object [Scene | Workspace] > Render Layer > Object > Data (...) Reviewers: Campbell Barton, Julian Eisel Differential Revision: https://developer.blender.org/D2842
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/DRW_engine.h4
-rw-r--r--source/blender/draw/engines/external/external_engine.c9
-rw-r--r--source/blender/draw/intern/DRW_render.h2
-rw-r--r--source/blender/draw/intern/draw_manager.c61
4 files changed, 46 insertions, 30 deletions
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 646d8716094..e96aec0766f 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -42,6 +42,8 @@ struct ViewportEngineData;
struct View3D;
struct rcti;
struct GPUOffScreen;
+struct RenderEngineType;
+struct WorkSpace;
#include "BLI_sys_types.h" /* for bool */
@@ -72,6 +74,7 @@ void DRW_draw_view(const struct bContext *C);
void DRW_draw_render_loop_ex(
struct Depsgraph *graph,
+ struct RenderEngineType *engine,
struct ARegion *ar, struct View3D *v3d,
const struct bContext *evil_C);
void DRW_draw_render_loop(
@@ -79,6 +82,7 @@ void DRW_draw_render_loop(
struct ARegion *ar, struct View3D *v3d);
void DRW_draw_render_loop_offscreen(
struct Depsgraph *graph,
+ struct RenderEngineType *engine,
struct ARegion *ar, struct View3D *v3d,
struct GPUOffScreen *ofs);
void DRW_draw_select_loop(
diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c
index f4b38b7ebbf..76f5b4d9840 100644
--- a/source/blender/draw/engines/external/external_engine.c
+++ b/source/blender/draw/engines/external/external_engine.c
@@ -151,17 +151,16 @@ static void external_draw_scene(void *vedata)
/* Create render engine. */
if (!rv3d->render_engine) {
- RenderEngine *engine;
- type = RE_engines_find(scene->r.engine);
+ RenderEngineType *engine_type = draw_ctx->engine;
- if (!(type->view_update && type->render_to_view)) {
+ if (!(engine_type->view_update && engine_type->render_to_view)) {
return;
}
- engine = RE_engine_create_ex(type, true);
+ RenderEngine *engine = RE_engine_create_ex(engine_type, true);
engine->tile_x = scene->r.tilex;
engine->tile_y = scene->r.tiley;
- type->view_update(engine, draw_ctx->evil_C);
+ engine_type->view_update(engine, draw_ctx->evil_C);
rv3d->render_engine = engine;
}
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 428bea17f7c..e8eedac7048 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -438,6 +438,8 @@ typedef struct DRWContextState {
/* Use 'scene->obedit' for edit-mode */
struct Object *obact; /* 'OBACT_NEW' */
+ struct RenderEngineType *engine;
+
/* Last resort (some functions take this as an arg so we can't easily avoid).
* May be NULL when used for selection or depth buffer. */
const struct bContext *evil_C;
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 38a767b7e34..2a3d9fafd2a 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -37,6 +37,7 @@
#include "BKE_object.h"
#include "BKE_pbvh.h"
#include "BKE_paint.h"
+#include "BKE_workspace.h"
#include "BLT_translation.h"
#include "BLF_api.h"
@@ -2905,15 +2906,14 @@ static void use_drw_engine(DrawEngineType *engine)
/* TODO revisit this when proper layering is implemented */
/* Gather all draw engines needed and store them in DST.enabled_engines
* That also define the rendering order of engines */
-static void DRW_engines_enable_from_engine(const Scene *scene)
+static void DRW_engines_enable_from_engine(RenderEngineType *engine)
{
/* TODO layers */
- RenderEngineType *type = RE_engines_find(scene->r.engine);
- if (type->draw_engine != NULL) {
- use_drw_engine(type->draw_engine);
+ if (engine->draw_engine != NULL) {
+ use_drw_engine(engine->draw_engine);
}
- if ((type->flag & RE_INTERNAL) == 0) {
+ if ((engine->flag & RE_INTERNAL) == 0) {
DRW_engines_enable_external();
}
}
@@ -2990,11 +2990,12 @@ static void DRW_engines_enable_external(void)
use_drw_engine(DRW_engine_viewport_external_type.draw_engine);
}
-static void DRW_engines_enable(const Scene *scene, SceneLayer *sl)
+static void DRW_engines_enable(const Scene *scene, SceneLayer *sl, RenderEngineType *engine)
{
Object *obact = OBACT_NEW(sl);
const int mode = CTX_data_mode_enum_ex(scene->obedit, obact);
- DRW_engines_enable_from_engine(scene);
+
+ DRW_engines_enable_from_engine(engine);
if (DRW_state_draw_support()) {
DRW_engines_enable_from_object_mode();
@@ -3153,7 +3154,8 @@ void DRW_notify_view_update(const bContext *C)
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d = ar->regiondata;
Scene *scene = DEG_get_evaluated_scene(graph);
- SceneLayer *sl = DEG_get_evaluated_scene_layer(graph);
+ RenderEngineType *engine = CTX_data_engine(C);
+ SceneLayer *scene_layer = CTX_data_scene_layer(C);
if (rv3d->viewport == NULL) {
return;
@@ -3165,17 +3167,17 @@ void DRW_notify_view_update(const bContext *C)
DST.viewport = rv3d->viewport;
DST.draw_ctx = (DRWContextState){
- ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), C,
+ ar, rv3d, v3d, scene, scene_layer, OBACT_NEW(scene_layer), engine, C,
};
- DRW_engines_enable(scene, sl);
+ DRW_engines_enable(scene, scene_layer, engine);
for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
- DrawEngineType *engine = link->data;
- ViewportEngineData *data = DRW_viewport_engine_data_get(engine);
+ DrawEngineType *draw_engine = link->data;
+ ViewportEngineData *data = DRW_viewport_engine_data_get(draw_engine);
- if (engine->view_update) {
- engine->view_update(data);
+ if (draw_engine->view_update) {
+ draw_engine->view_update(data);
}
}
@@ -3197,12 +3199,13 @@ void DRW_notify_view_update(const bContext *C)
void DRW_draw_view(const bContext *C)
{
struct Depsgraph *graph = CTX_data_depsgraph(C);
+ RenderEngineType *engine = CTX_data_engine(C);
ARegion *ar = CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
/* Reset before using it. */
memset(&DST, 0x0, sizeof(DST));
- DRW_draw_render_loop_ex(graph, ar, v3d, C);
+ DRW_draw_render_loop_ex(graph, engine, ar, v3d, C);
}
/**
@@ -3211,11 +3214,12 @@ void DRW_draw_view(const bContext *C)
*/
void DRW_draw_render_loop_ex(
struct Depsgraph *graph,
+ RenderEngineType *engine,
ARegion *ar, View3D *v3d,
const bContext *evil_C)
{
Scene *scene = DEG_get_evaluated_scene(graph);
- SceneLayer *sl = DEG_get_evaluated_scene_layer(graph);
+ SceneLayer *scene_layer = DEG_get_evaluated_scene_layer(graph);
RegionView3D *rv3d = ar->regiondata;
DST.draw_ctx.evil_C = evil_C;
@@ -3228,15 +3232,16 @@ void DRW_draw_render_loop_ex(
cache_is_dirty = GPU_viewport_cache_validate(DST.viewport, DRW_engines_get_hash());
DST.draw_ctx = (DRWContextState){
- ar, rv3d, v3d, scene, sl, OBACT_NEW(sl),
- /* reuse if caller sets */
- DST.draw_ctx.evil_C,
+ ar, rv3d, v3d, scene, scene_layer, OBACT_NEW(scene_layer), engine,
+
+ /* reuse if caller sets */
+ DST.draw_ctx.evil_C,
};
DRW_viewport_var_init();
/* Get list of enabled engines */
- DRW_engines_enable(scene, sl);
+ DRW_engines_enable(scene, scene_layer, engine);
/* Update ubos */
DRW_globals_update();
@@ -3316,11 +3321,15 @@ void DRW_draw_render_loop(
{
/* Reset before using it. */
memset(&DST, 0x0, sizeof(DST));
- DRW_draw_render_loop_ex(graph, ar, v3d, NULL);
+
+ Scene *scene = DEG_get_evaluated_scene(graph);
+ RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id);
+
+ DRW_draw_render_loop_ex(graph, engine, ar, v3d, NULL);
}
void DRW_draw_render_loop_offscreen(
- struct Depsgraph *graph,
+ struct Depsgraph *graph, RenderEngineType *engine,
ARegion *ar, View3D *v3d, GPUOffScreen *ofs)
{
RegionView3D *rv3d = ar->regiondata;
@@ -3335,7 +3344,7 @@ void DRW_draw_render_loop_offscreen(
/* Reset before using it. */
memset(&DST, 0x0, sizeof(DST));
DST.options.is_image_render = true;
- DRW_draw_render_loop_ex(graph, ar, v3d, NULL);
+ DRW_draw_render_loop_ex(graph, engine, ar, v3d, NULL);
/* restore */
{
@@ -3360,6 +3369,7 @@ void DRW_draw_select_loop(
bool UNUSED(use_obedit_skip), bool UNUSED(use_nearest), const rcti *rect)
{
Scene *scene = DEG_get_evaluated_scene(graph);
+ RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id);
SceneLayer *sl = DEG_get_evaluated_scene_layer(graph);
#ifndef USE_GPU_SELECT
UNUSED_VARS(vc, scene, sl, v3d, ar, rect);
@@ -3412,7 +3422,7 @@ void DRW_draw_select_loop(
/* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */
DST.draw_ctx = (DRWContextState){
- ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), (bContext *)NULL,
+ ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), engine, (bContext *)NULL,
};
DRW_viewport_var_init();
@@ -3478,6 +3488,7 @@ void DRW_draw_depth_loop(
ARegion *ar, View3D *v3d)
{
Scene *scene = DEG_get_evaluated_scene(graph);
+ RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id);
SceneLayer *sl = DEG_get_evaluated_scene_layer(graph);
RegionView3D *rv3d = ar->regiondata;
@@ -3508,7 +3519,7 @@ void DRW_draw_depth_loop(
/* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */
DST.draw_ctx = (DRWContextState){
- ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), (bContext *)NULL,
+ ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), engine, (bContext *)NULL,
};
DRW_viewport_var_init();