Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_manager.c
| Show First 20 Lines • Show All 993 Lines • ▼ Show 20 Lines | for (scene = bmain->scenes.first; scene; scene = scene->id.next) { | ||||
| for (view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { | for (view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { | ||||
| Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, false); | Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, false); | ||||
| if (depsgraph == NULL) { | if (depsgraph == NULL) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| /* TODO(fclem): This is not optimal since it iter over all dupli instances. | /* TODO(fclem): This is not optimal since it iter over all dupli instances. | ||||
| * In this case only the source object should be tagged. */ | * 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_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (depsgraph, ob) { | ||||
| DEG_ITER_OBJECT_FLAG_VISIBLE | DEG_ITER_OBJECT_FLAG_DUPLI; | |||||
| DEG_OBJECT_ITER_BEGIN (depsgraph, ob, iter_flags) { | |||||
| DRW_batch_cache_free_old(ob, ctime); | DRW_batch_cache_free_old(ob, ctime); | ||||
| } | } | ||||
| DEG_OBJECT_ITER_END; | DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Rendering (DRW_engines) | /** \name Rendering (DRW_engines) | ||||
| ▲ Show 20 Lines • Show All 344 Lines • ▼ Show 20 Lines | |||||
| /** | /** | ||||
| * Use for select and depth-drawing. | * Use for select and depth-drawing. | ||||
| */ | */ | ||||
| static void drw_engines_enable_basic(void) | static void drw_engines_enable_basic(void) | ||||
| { | { | ||||
| use_drw_engine(DRW_engine_viewport_basic_type.draw_engine); | 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); | Object *obact = OBACT(view_layer); | ||||
| const enum eContextObjectMode mode = CTX_data_mode_enum_ex( | const enum eContextObjectMode mode = CTX_data_mode_enum_ex( | ||||
| DST.draw_ctx.object_edit, obact, DST.draw_ctx.object_mode); | DST.draw_ctx.object_edit, obact, DST.draw_ctx.object_mode); | ||||
| View3D *v3d = DST.draw_ctx.v3d; | View3D *v3d = DST.draw_ctx.v3d; | ||||
| const int drawtype = v3d->shading.type; | const int drawtype = v3d->shading.type; | ||||
| const bool use_xray = XRAY_ENABLED(v3d); | const bool use_xray = XRAY_ENABLED(v3d); | ||||
| drw_engines_enable_from_engine(engine_type, drawtype, use_xray); | drw_engines_enable_from_engine(engine_type, drawtype, use_xray); | ||||
| /* grease pencil */ | /* grease pencil */ | ||||
| if (gpencil_engine_needed) { | |||||
| use_drw_engine(&draw_engine_gpencil_type); | use_drw_engine(&draw_engine_gpencil_type); | ||||
| } | |||||
| if (DRW_state_draw_support()) { | if (DRW_state_draw_support()) { | ||||
| /* Draw paint modes first so that they are drawn below the wireframes. */ | /* Draw paint modes first so that they are drawn below the wireframes. */ | ||||
| drw_engines_enable_from_paint_mode(mode); | drw_engines_enable_from_paint_mode(mode); | ||||
| drw_engines_enable_from_overlays(v3d->overlay.flag); | drw_engines_enable_from_overlays(v3d->overlay.flag); | ||||
| drw_engines_enable_from_object_mode(); | drw_engines_enable_from_object_mode(); | ||||
| drw_engines_enable_from_mode(mode); | drw_engines_enable_from_mode(mode); | ||||
| } | } | ||||
| Show All 20 Lines | for (LinkData *link = DST.enabled_engines.first; link; link = link->next) { | ||||
| DrawEngineType *engine = link->data; | DrawEngineType *engine = link->data; | ||||
| engine_handle_array[i++] = engine; | engine_handle_array[i++] = engine; | ||||
| } | } | ||||
| engine_handle_array[i] = NULL; | engine_handle_array[i] = NULL; | ||||
| GPU_viewport_engines_data_validate(DST.viewport, engine_handle_array); | 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); | |||||
jbakker: !exclude_gpencil_rendering | |||||
| } | |||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name View Update | /** \name View Update | ||||
| * \{ */ | * \{ */ | ||||
| void DRW_notify_view_update(const DRWUpdateContext *update_ctx) | void DRW_notify_view_update(const DRWUpdateContext *update_ctx) | ||||
| { | { | ||||
| RenderEngineType *engine_type = update_ctx->engine_type; | RenderEngineType *engine_type = update_ctx->engine_type; | ||||
| ARegion *ar = update_ctx->ar; | ARegion *ar = update_ctx->ar; | ||||
| View3D *v3d = update_ctx->v3d; | View3D *v3d = update_ctx->v3d; | ||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| Depsgraph *depsgraph = update_ctx->depsgraph; | Depsgraph *depsgraph = update_ctx->depsgraph; | ||||
| Scene *scene = update_ctx->scene; | Scene *scene = update_ctx->scene; | ||||
| ViewLayer *view_layer = update_ctx->view_layer; | ViewLayer *view_layer = update_ctx->view_layer; | ||||
| const bool gpencil_engine_needed = drw_gpencil_engine_needed(depsgraph, v3d); | |||||
| /* Separate update for each stereo view. */ | /* Separate update for each stereo view. */ | ||||
| for (int view = 0; view < 2; view++) { | for (int view = 0; view < 2; view++) { | ||||
| GPUViewport *viewport = WM_draw_region_get_viewport(ar, view); | GPUViewport *viewport = WM_draw_region_get_viewport(ar, view); | ||||
| if (!viewport) { | if (!viewport) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| /* XXX Really nasty locking. But else this could | /* XXX Really nasty locking. But else this could | ||||
| Show All 12 Lines | DST.draw_ctx = (DRWContextState){ | ||||
| .scene = scene, | .scene = scene, | ||||
| .view_layer = view_layer, | .view_layer = view_layer, | ||||
| .obact = OBACT(view_layer), | .obact = OBACT(view_layer), | ||||
| .engine_type = engine_type, | .engine_type = engine_type, | ||||
| .depsgraph = depsgraph, | .depsgraph = depsgraph, | ||||
| .object_mode = OB_MODE_OBJECT, | .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) { | for (LinkData *link = DST.enabled_engines.first; link; link = link->next) { | ||||
| DrawEngineType *draw_engine = link->data; | DrawEngineType *draw_engine = link->data; | ||||
| ViewportEngineData *data = drw_viewport_engine_data_ensure(draw_engine); | ViewportEngineData *data = drw_viewport_engine_data_ensure(draw_engine); | ||||
| if (draw_engine->view_update) { | if (draw_engine->view_update) { | ||||
| draw_engine->view_update(data); | draw_engine->view_update(data); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | DST.draw_ctx = (DRWContextState){ | ||||
| .depsgraph = depsgraph, | .depsgraph = depsgraph, | ||||
| /* reuse if caller sets */ | /* reuse if caller sets */ | ||||
| .evil_C = DST.draw_ctx.evil_C, | .evil_C = DST.draw_ctx.evil_C, | ||||
| }; | }; | ||||
| drw_context_state_init(); | drw_context_state_init(); | ||||
| drw_viewport_var_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 */ | /* 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(); | drw_engines_data_validate(); | ||||
| /* Update ubos */ | /* Update ubos */ | ||||
| DRW_globals_update(); | DRW_globals_update(); | ||||
| drw_debug_init(); | drw_debug_init(); | ||||
| DRW_hair_init(); | DRW_hair_init(); | ||||
| /* No framebuffer allowed before drawing. */ | /* No framebuffer allowed before drawing. */ | ||||
| BLI_assert(GPU_framebuffer_active_get() == NULL); | BLI_assert(GPU_framebuffer_active_get() == NULL); | ||||
Done Inline ActionsI don't think we need to do this loop, just always set do_populate_loop = true if there is some grease pencil object in the depsgraph seems enough to avoid the common cases. Looping can be expensive in big scenes so would not want to slow down those cases. brecht: I don't think we need to do this loop, just always set `do_populate_loop = true` if there is… | |||||
| /* Init engines */ | /* Init engines */ | ||||
| drw_engines_init(); | drw_engines_init(); | ||||
| /* Cache filling */ | /* Cache filling */ | ||||
| { | { | ||||
| PROFILE_START(stime); | PROFILE_START(stime); | ||||
| drw_engines_cache_init(); | drw_engines_cache_init(); | ||||
| drw_engines_world_update(scene); | drw_engines_world_update(scene); | ||||
| /* Only iterate over objects for internal engines or when overlays are enabled */ | /* Only iterate over objects for internal engines or when overlays are enabled */ | ||||
| const bool internal_engine = (engine_type->flag & RE_INTERNAL) != 0; | if (do_populate_loop) { | ||||
| const bool draw_type_render = v3d->shading.type == OB_RENDER; | DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (depsgraph, ob) { | ||||
| 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 ((object_type_exclude_viewport & (1 << ob->type)) != 0) { | if ((object_type_exclude_viewport & (1 << ob->type)) != 0) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| if (v3d->localvd && ((v3d->local_view_uuid & ob->base_local_view_bits) == 0)) { | if (v3d->localvd && ((v3d->local_view_uuid & ob->base_local_view_bits) == 0)) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| DST.dupli_parent = data_.dupli_parent; | DST.dupli_parent = data_.dupli_parent; | ||||
| DST.dupli_source = data_.dupli_object_current; | DST.dupli_source = data_.dupli_object_current; | ||||
| drw_duplidata_load(DST.dupli_source); | drw_duplidata_load(DST.dupli_source); | ||||
| drw_engines_cache_populate(ob); | drw_engines_cache_populate(ob); | ||||
| } | } | ||||
| DEG_OBJECT_ITER_END; | DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END; | ||||
| } | } | ||||
| drw_duplidata_free(); | drw_duplidata_free(); | ||||
| drw_engines_cache_finish(); | drw_engines_cache_finish(); | ||||
| DRW_render_instance_buffer_finish(); | DRW_render_instance_buffer_finish(); | ||||
| #ifdef USE_PROFILE | #ifdef USE_PROFILE | ||||
| ▲ Show 20 Lines • Show All 176 Lines • ▼ Show 20 Lines | void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph, | ||||
| /* we need to re-bind (annoying!) */ | /* we need to re-bind (annoying!) */ | ||||
| GPU_offscreen_bind(ofs, false); | GPU_offscreen_bind(ofs, false); | ||||
| } | } | ||||
| /* Helper to check if exit object type to render. */ | /* Helper to check if exit object type to render. */ | ||||
| bool DRW_render_check_grease_pencil(Depsgraph *depsgraph) | 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) { | DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (depsgraph, ob) { | ||||
| if (ob->type == OB_GPENCIL) { | if (ob->type == OB_GPENCIL) { | ||||
| if (DRW_object_visibility_in_active_context(ob) & OB_VISIBLE_SELF) { | if (DRW_object_visibility_in_active_context(ob) & OB_VISIBLE_SELF) { | ||||
| return true; | return true; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END; | DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END; | ||||
| ▲ Show 20 Lines • Show All 231 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| DRW_hair_init(); | DRW_hair_init(); | ||||
| const int object_type_exclude_viewport = draw_ctx->v3d ? | const int object_type_exclude_viewport = draw_ctx->v3d ? | ||||
| draw_ctx->v3d->object_type_exclude_viewport : | draw_ctx->v3d->object_type_exclude_viewport : | ||||
| 0; | 0; | ||||
| const int iter_flag = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | | DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (depsgraph, ob) { | ||||
| 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 ((object_type_exclude_viewport & (1 << ob->type)) == 0) { | if ((object_type_exclude_viewport & (1 << ob->type)) == 0) { | ||||
| DST.dupli_parent = data_.dupli_parent; | DST.dupli_parent = data_.dupli_parent; | ||||
| DST.dupli_source = data_.dupli_object_current; | DST.dupli_source = data_.dupli_object_current; | ||||
| DST.ob_state = NULL; | DST.ob_state = NULL; | ||||
| drw_duplidata_load(DST.dupli_source); | drw_duplidata_load(DST.dupli_source); | ||||
| if (!DST.dupli_source) { | if (!DST.dupli_source) { | ||||
| drw_batch_cache_validate(ob); | drw_batch_cache_validate(ob); | ||||
| } | } | ||||
| callback(vedata, ob, engine, depsgraph); | callback(vedata, ob, engine, depsgraph); | ||||
| if (!DST.dupli_source) { | if (!DST.dupli_source) { | ||||
| drw_batch_cache_generate_requested(ob); | drw_batch_cache_generate_requested(ob); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| DEG_OBJECT_ITER_END; | DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END; | ||||
| drw_duplidata_free(); | drw_duplidata_free(); | ||||
| } | } | ||||
| /* Assume a valid gl context is bound (and that the gl_context_mutex has been acquired). | /* Assume a valid gl context is bound (and that the gl_context_mutex has been acquired). | ||||
| * This function only setup DST and execute the given function. | * This function only setup DST and execute the given function. | ||||
| * Warning: similar to DRW_render_to_image you cannot use default lists (dfbl & dtxl). */ | * Warning: similar to DRW_render_to_image you cannot use default lists (dfbl & dtxl). */ | ||||
| void DRW_custom_pipeline(DrawEngineType *draw_engine_type, | void DRW_custom_pipeline(DrawEngineType *draw_engine_type, | ||||
| ▲ Show 20 Lines • Show All 221 Lines • ▼ Show 20 Lines | DRW_hair_init(); | ||||
| if (use_obedit) { | if (use_obedit) { | ||||
| FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, v3d, obact->type, obact->mode, ob_iter) { | FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, v3d, obact->type, obact->mode, ob_iter) { | ||||
| drw_engines_cache_populate(ob_iter); | drw_engines_cache_populate(ob_iter); | ||||
| } | } | ||||
| FOREACH_OBJECT_IN_MODE_END; | FOREACH_OBJECT_IN_MODE_END; | ||||
| } | } | ||||
| else { | 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 | | const int object_type_exclude_select = (v3d->object_type_exclude_viewport | | ||||
| v3d->object_type_exclude_select); | v3d->object_type_exclude_select); | ||||
| bool filter_exclude = false; | 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)) { | if (v3d->localvd && ((v3d->local_view_uuid & ob->base_local_view_bits) == 0)) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| if ((ob->base_flag & BASE_SELECTABLE) && | if ((ob->base_flag & BASE_SELECTABLE) && | ||||
| (object_type_exclude_select & (1 << ob->type)) == 0) { | (object_type_exclude_select & (1 << ob->type)) == 0) { | ||||
| if (object_filter_fn != NULL) { | if (object_filter_fn != NULL) { | ||||
| if (ob->base_flag & BASE_FROM_DUPLI) { | if (ob->base_flag & BASE_FROM_DUPLI) { | ||||
| Show All 13 Lines | else { | ||||
| DRW_select_load_id(ob_orig->runtime.select_id); | DRW_select_load_id(ob_orig->runtime.select_id); | ||||
| } | } | ||||
| DST.dupli_parent = data_.dupli_parent; | DST.dupli_parent = data_.dupli_parent; | ||||
| DST.dupli_source = data_.dupli_object_current; | DST.dupli_source = data_.dupli_object_current; | ||||
| drw_duplidata_load(DST.dupli_source); | drw_duplidata_load(DST.dupli_source); | ||||
| drw_engines_cache_populate(ob); | drw_engines_cache_populate(ob); | ||||
| } | } | ||||
| } | } | ||||
| DEG_OBJECT_ITER_END; | DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END; | ||||
| } | } | ||||
| drw_duplidata_free(); | drw_duplidata_free(); | ||||
| drw_engines_cache_finish(); | drw_engines_cache_finish(); | ||||
| DRW_render_instance_buffer_finish(); | DRW_render_instance_buffer_finish(); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 65 Lines • ▼ Show 20 Lines | static void drw_draw_depth_loop_imp(void) | ||||
| DRW_hair_init(); | DRW_hair_init(); | ||||
| { | { | ||||
| drw_engines_cache_init(); | drw_engines_cache_init(); | ||||
| drw_engines_world_update(DST.draw_ctx.scene); | drw_engines_world_update(DST.draw_ctx.scene); | ||||
| View3D *v3d = DST.draw_ctx.v3d; | View3D *v3d = DST.draw_ctx.v3d; | ||||
| const int object_type_exclude_viewport = v3d->object_type_exclude_viewport; | const int object_type_exclude_viewport = v3d->object_type_exclude_viewport; | ||||
| const int iter_flag = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | | DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN (DST.draw_ctx.depsgraph, ob) { | ||||
| 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) { | |||||
| if ((object_type_exclude_viewport & (1 << ob->type)) != 0) { | if ((object_type_exclude_viewport & (1 << ob->type)) != 0) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| if (v3d->localvd && ((v3d->local_view_uuid & ob->base_local_view_bits) == 0)) { | if (v3d->localvd && ((v3d->local_view_uuid & ob->base_local_view_bits) == 0)) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| DST.dupli_parent = data_.dupli_parent; | DST.dupli_parent = data_.dupli_parent; | ||||
| DST.dupli_source = data_.dupli_object_current; | DST.dupli_source = data_.dupli_object_current; | ||||
| drw_duplidata_load(DST.dupli_source); | drw_duplidata_load(DST.dupli_source); | ||||
| drw_engines_cache_populate(ob); | drw_engines_cache_populate(ob); | ||||
| } | } | ||||
| DEG_OBJECT_ITER_END; | DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END; | ||||
| drw_duplidata_free(); | drw_duplidata_free(); | ||||
| drw_engines_cache_finish(); | drw_engines_cache_finish(); | ||||
| DRW_render_instance_buffer_finish(); | DRW_render_instance_buffer_finish(); | ||||
| } | } | ||||
| /* Start Drawing */ | /* Start Drawing */ | ||||
| ▲ Show 20 Lines • Show All 793 Lines • Show Last 20 Lines | |||||
!exclude_gpencil_rendering