|
|
|
|
@@ -999,13 +999,10 @@ void DRW_cache_free_old_batches(Main *bmain)
|
|
|
|
|
|
|
|
|
|
/* TODO(fclem): This is not optimal since it iter over all dupli instances.
|
|
|
|
|
* In this case only the source object should be tagged. */
|
|
|
|
|
int iter_flags = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET |
|
|
|
|
|
DEG_ITER_OBJECT_FLAG_VISIBLE | DEG_ITER_OBJECT_FLAG_DUPLI;
|
|
|
|
|
|
|
|
|
|
DEG_OBJECT_ITER_BEGIN (depsgraph, ob, iter_flags) {
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (depsgraph, ob) {
|
|
|
|
|
DRW_batch_cache_free_old(ob, ctime);
|
|
|
|
|
}
|
|
|
|
|
DEG_OBJECT_ITER_END;
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -1366,7 +1363,9 @@ static void drw_engines_enable_basic(void)
|
|
|
|
|
use_drw_engine(DRW_engine_viewport_basic_type.draw_engine);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_type)
|
|
|
|
|
static void drw_engines_enable(ViewLayer *view_layer,
|
|
|
|
|
RenderEngineType *engine_type,
|
|
|
|
|
bool gpencil_engine_needed)
|
|
|
|
|
{
|
|
|
|
|
Object *obact = OBACT(view_layer);
|
|
|
|
|
const enum eContextObjectMode mode = CTX_data_mode_enum_ex(
|
|
|
|
|
@@ -1377,7 +1376,9 @@ static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_t
|
|
|
|
|
|
|
|
|
|
drw_engines_enable_from_engine(engine_type, drawtype, use_xray);
|
|
|
|
|
/* grease pencil */
|
|
|
|
|
use_drw_engine(&draw_engine_gpencil_type);
|
|
|
|
|
if (gpencil_engine_needed) {
|
|
|
|
|
use_drw_engine(&draw_engine_gpencil_type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (DRW_state_draw_support()) {
|
|
|
|
|
/* Draw paint modes first so that they are drawn below the wireframes. */
|
|
|
|
|
@@ -1414,6 +1415,16 @@ static void drw_engines_data_validate(void)
|
|
|
|
|
GPU_viewport_engines_data_validate(DST.viewport, engine_handle_array);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Fast check to see if gpencil drawing engine is needed.
|
|
|
|
|
* For slow exact check use `DRW_render_check_grease_pencil` */
|
|
|
|
|
static bool drw_gpencil_engine_needed(Depsgraph *depsgraph, View3D *v3d)
|
|
|
|
|
{
|
|
|
|
|
const bool exclude_gpencil_rendering = v3d ? (v3d->object_type_exclude_viewport &
|
|
|
|
|
(1 << OB_GPENCIL)) != 0 :
|
|
|
|
|
false;
|
|
|
|
|
return (!exclude_gpencil_rendering) || DEG_id_type_any_exists(depsgraph, ID_GD);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------- */
|
|
|
|
|
/** \name View Update
|
|
|
|
|
* \{ */
|
|
|
|
|
@@ -1428,6 +1439,8 @@ void DRW_notify_view_update(const DRWUpdateContext *update_ctx)
|
|
|
|
|
Scene *scene = update_ctx->scene;
|
|
|
|
|
ViewLayer *view_layer = update_ctx->view_layer;
|
|
|
|
|
|
|
|
|
|
const bool gpencil_engine_needed = drw_gpencil_engine_needed(depsgraph, v3d);
|
|
|
|
|
|
|
|
|
|
/* Separate update for each stereo view. */
|
|
|
|
|
for (int view = 0; view < 2; view++) {
|
|
|
|
|
GPUViewport *viewport = WM_draw_region_get_viewport(ar, view);
|
|
|
|
|
@@ -1456,7 +1469,7 @@ void DRW_notify_view_update(const DRWUpdateContext *update_ctx)
|
|
|
|
|
.object_mode = OB_MODE_OBJECT,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
drw_engines_enable(view_layer, engine_type);
|
|
|
|
|
drw_engines_enable(view_layer, engine_type, gpencil_engine_needed);
|
|
|
|
|
|
|
|
|
|
for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
|
|
|
|
|
DrawEngineType *draw_engine = link->data;
|
|
|
|
|
@@ -1541,8 +1554,17 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph,
|
|
|
|
|
drw_context_state_init();
|
|
|
|
|
drw_viewport_var_init();
|
|
|
|
|
|
|
|
|
|
const int object_type_exclude_viewport = v3d->object_type_exclude_viewport;
|
|
|
|
|
/* Check if scene needs to perform the populate loop */
|
|
|
|
|
const bool internal_engine = (engine_type->flag & RE_INTERNAL) != 0;
|
|
|
|
|
const bool draw_type_render = v3d->shading.type == OB_RENDER;
|
|
|
|
|
const bool overlays_on = (v3d->flag2 & V3D_HIDE_OVERLAYS) == 0;
|
|
|
|
|
const bool gpencil_engine_needed = drw_gpencil_engine_needed(depsgraph, v3d);
|
|
|
|
|
const bool do_populate_loop = internal_engine || overlays_on || !draw_type_render ||
|
|
|
|
|
gpencil_engine_needed;
|
|
|
|
|
|
|
|
|
|
/* Get list of enabled engines */
|
|
|
|
|
drw_engines_enable(view_layer, engine_type);
|
|
|
|
|
drw_engines_enable(view_layer, engine_type, gpencil_engine_needed);
|
|
|
|
|
|
|
|
|
|
drw_engines_data_validate();
|
|
|
|
|
|
|
|
|
|
@@ -1565,15 +1587,8 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph,
|
|
|
|
|
drw_engines_world_update(scene);
|
|
|
|
|
|
|
|
|
|
/* Only iterate over objects for internal engines or when overlays are enabled */
|
|
|
|
|
const bool internal_engine = (engine_type->flag & RE_INTERNAL) != 0;
|
|
|
|
|
const bool draw_type_render = v3d->shading.type == OB_RENDER;
|
|
|
|
|
const bool overlays_on = (v3d->flag2 & V3D_HIDE_OVERLAYS) == 0;
|
|
|
|
|
if (internal_engine || overlays_on || !draw_type_render) {
|
|
|
|
|
const int object_type_exclude_viewport = v3d->object_type_exclude_viewport;
|
|
|
|
|
const int iter_flag = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY |
|
|
|
|
|
DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET | DEG_ITER_OBJECT_FLAG_VISIBLE |
|
|
|
|
|
DEG_ITER_OBJECT_FLAG_DUPLI;
|
|
|
|
|
DEG_OBJECT_ITER_BEGIN (depsgraph, ob, iter_flag) {
|
|
|
|
|
if (do_populate_loop) {
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (depsgraph, ob) {
|
|
|
|
|
if ((object_type_exclude_viewport & (1 << ob->type)) != 0) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
@@ -1585,7 +1600,7 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph,
|
|
|
|
|
drw_duplidata_load(DST.dupli_source);
|
|
|
|
|
drw_engines_cache_populate(ob);
|
|
|
|
|
}
|
|
|
|
|
DEG_OBJECT_ITER_END;
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
drw_duplidata_free();
|
|
|
|
|
@@ -1778,6 +1793,10 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph,
|
|
|
|
|
/* Helper to check if exit object type to render. */
|
|
|
|
|
bool DRW_render_check_grease_pencil(Depsgraph *depsgraph)
|
|
|
|
|
{
|
|
|
|
|
if (!drw_gpencil_engine_needed(depsgraph, NULL)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (depsgraph, ob) {
|
|
|
|
|
if (ob->type == OB_GPENCIL) {
|
|
|
|
|
if (DRW_object_visibility_in_active_context(ob) & OB_VISIBLE_SELF) {
|
|
|
|
|
@@ -2025,10 +2044,7 @@ void DRW_render_object_iter(
|
|
|
|
|
const int object_type_exclude_viewport = draw_ctx->v3d ?
|
|
|
|
|
draw_ctx->v3d->object_type_exclude_viewport :
|
|
|
|
|
0;
|
|
|
|
|
const int iter_flag = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY |
|
|
|
|
|
DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET | DEG_ITER_OBJECT_FLAG_VISIBLE |
|
|
|
|
|
DEG_ITER_OBJECT_FLAG_DUPLI;
|
|
|
|
|
DEG_OBJECT_ITER_BEGIN (depsgraph, ob, iter_flag) {
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (depsgraph, ob) {
|
|
|
|
|
if ((object_type_exclude_viewport & (1 << ob->type)) == 0) {
|
|
|
|
|
DST.dupli_parent = data_.dupli_parent;
|
|
|
|
|
DST.dupli_source = data_.dupli_object_current;
|
|
|
|
|
@@ -2044,7 +2060,7 @@ void DRW_render_object_iter(
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
DEG_OBJECT_ITER_END;
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;
|
|
|
|
|
|
|
|
|
|
drw_duplidata_free();
|
|
|
|
|
}
|
|
|
|
|
@@ -2282,13 +2298,10 @@ void DRW_draw_select_loop(struct Depsgraph *depsgraph,
|
|
|
|
|
FOREACH_OBJECT_IN_MODE_END;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
const int iter_flag = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY |
|
|
|
|
|
DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET | DEG_ITER_OBJECT_FLAG_VISIBLE |
|
|
|
|
|
DEG_ITER_OBJECT_FLAG_DUPLI;
|
|
|
|
|
const int object_type_exclude_select = (v3d->object_type_exclude_viewport |
|
|
|
|
|
v3d->object_type_exclude_select);
|
|
|
|
|
bool filter_exclude = false;
|
|
|
|
|
DEG_OBJECT_ITER_BEGIN (depsgraph, ob, iter_flag) {
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (depsgraph, ob) {
|
|
|
|
|
if (v3d->localvd && ((v3d->local_view_uuid & ob->base_local_view_bits) == 0)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
@@ -2318,7 +2331,7 @@ void DRW_draw_select_loop(struct Depsgraph *depsgraph,
|
|
|
|
|
drw_engines_cache_populate(ob);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
DEG_OBJECT_ITER_END;
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
drw_duplidata_free();
|
|
|
|
|
@@ -2400,10 +2413,7 @@ static void drw_draw_depth_loop_imp(void)
|
|
|
|
|
|
|
|
|
|
View3D *v3d = DST.draw_ctx.v3d;
|
|
|
|
|
const int object_type_exclude_viewport = v3d->object_type_exclude_viewport;
|
|
|
|
|
const int iter_flag = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY |
|
|
|
|
|
DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET | DEG_ITER_OBJECT_FLAG_VISIBLE |
|
|
|
|
|
DEG_ITER_OBJECT_FLAG_DUPLI;
|
|
|
|
|
DEG_OBJECT_ITER_BEGIN (DST.draw_ctx.depsgraph, ob, iter_flag) {
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (DST.draw_ctx.depsgraph, ob) {
|
|
|
|
|
if ((object_type_exclude_viewport & (1 << ob->type)) != 0) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
@@ -2417,7 +2427,7 @@ static void drw_draw_depth_loop_imp(void)
|
|
|
|
|
drw_duplidata_load(DST.dupli_source);
|
|
|
|
|
drw_engines_cache_populate(ob);
|
|
|
|
|
}
|
|
|
|
|
DEG_OBJECT_ITER_END;
|
|
|
|
|
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END;
|
|
|
|
|
|
|
|
|
|
drw_duplidata_free();
|
|
|
|
|
drw_engines_cache_finish();
|
|
|
|
|
|