Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_cache.c
| Show First 20 Lines • Show All 3,550 Lines • ▼ Show 20 Lines | switch (ob->type) { | ||||
| case OB_VOLUME: | case OB_VOLUME: | ||||
| DRW_volume_batch_cache_validate((Volume *)ob->data); | DRW_volume_batch_cache_validate((Volume *)ob->data); | ||||
| break; | break; | ||||
| default: | default: | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| void drw_batch_cache_generate_requested(Object *ob) | static void drw_batch_cache_schedule_delayed_extraction(Object *ob) | ||||
| { | |||||
| BLI_gset_add(DST.delayed_extraction, ob); | |||||
| } | |||||
| static void drw_batch_cache_generate_requested_ex(Object *ob, | |||||
| const bool do_preparation, | |||||
| const bool do_delayed_extraction) | |||||
| { | { | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| const Scene *scene = draw_ctx->scene; | const Scene *scene = draw_ctx->scene; | ||||
| const enum eContextObjectMode mode = CTX_data_mode_enum_ex( | const enum eContextObjectMode mode = CTX_data_mode_enum_ex( | ||||
| draw_ctx->object_edit, draw_ctx->obact, draw_ctx->object_mode); | draw_ctx->object_edit, draw_ctx->obact, draw_ctx->object_mode); | ||||
| const bool is_paint_mode = ELEM( | const bool is_paint_mode = ELEM( | ||||
| mode, CTX_MODE_SCULPT, CTX_MODE_PAINT_TEXTURE, CTX_MODE_PAINT_VERTEX, CTX_MODE_PAINT_WEIGHT); | mode, CTX_MODE_SCULPT, CTX_MODE_PAINT_TEXTURE, CTX_MODE_PAINT_VERTEX, CTX_MODE_PAINT_WEIGHT); | ||||
| const bool use_hide = ((ob->type == OB_MESH) && | const bool use_hide = ((ob->type == OB_MESH) && | ||||
| ((is_paint_mode && (ob == draw_ctx->obact) && | ((is_paint_mode && (ob == draw_ctx->obact) && | ||||
| DRW_object_use_hide_faces(ob)) || | DRW_object_use_hide_faces(ob)) || | ||||
| ((mode == CTX_MODE_EDIT_MESH) && DRW_object_is_in_edit_mode(ob)))); | ((mode == CTX_MODE_EDIT_MESH) && DRW_object_is_in_edit_mode(ob)))); | ||||
| struct Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); | struct Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); | ||||
| switch (ob->type) { | switch (ob->type) { | ||||
| case OB_MESH: | case OB_MESH: | ||||
| if (do_preparation) { | |||||
| DRW_mesh_batch_cache_prepare_requested( | |||||
| DST.task_graph, ob, (Mesh *)ob->data, scene, is_paint_mode, use_hide); | |||||
| } | |||||
| if (do_delayed_extraction) { | |||||
| drw_batch_cache_schedule_delayed_extraction(ob); | |||||
| } | |||||
| else { | |||||
| DRW_mesh_batch_cache_create_requested( | DRW_mesh_batch_cache_create_requested( | ||||
| DST.task_graph, ob, (Mesh *)ob->data, scene, is_paint_mode, use_hide); | DST.task_graph, ob, (Mesh *)ob->data, scene, is_paint_mode, use_hide); | ||||
| } | |||||
| break; | break; | ||||
| case OB_CURVE: | case OB_CURVE: | ||||
| case OB_FONT: | case OB_FONT: | ||||
| case OB_SURF: | case OB_SURF: | ||||
| if (mesh_eval) { | if (mesh_eval) { | ||||
| if (do_preparation) { | |||||
| DRW_mesh_batch_cache_prepare_requested( | |||||
| DST.task_graph, ob, mesh_eval, scene, is_paint_mode, use_hide); | |||||
| } | |||||
| if (do_delayed_extraction) { | |||||
| drw_batch_cache_schedule_delayed_extraction(ob); | |||||
| } | |||||
| else { | |||||
| DRW_mesh_batch_cache_create_requested( | DRW_mesh_batch_cache_create_requested( | ||||
| DST.task_graph, ob, mesh_eval, scene, is_paint_mode, use_hide); | DST.task_graph, ob, mesh_eval, scene, is_paint_mode, use_hide); | ||||
| } | } | ||||
| } | |||||
| DRW_curve_batch_cache_create_requested(ob); | DRW_curve_batch_cache_create_requested(ob); | ||||
| break; | break; | ||||
| /* TODO all cases */ | /* TODO all cases */ | ||||
| default: | default: | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| void drw_batch_cache_generate_requested(Object *ob) | |||||
| { | |||||
| /* Default entry point. Perform the preparation step, but delay the extraction process. */ | |||||
| drw_batch_cache_generate_requested_ex(ob, true, true); | |||||
| } | |||||
| void drw_batch_cache_generate_requested_delayed(Object *ob) | void drw_batch_cache_generate_requested_delayed(Object *ob) | ||||
| { | { | ||||
| BLI_gset_add(DST.delayed_extraction, ob); | /* Perform the extraction process for objects where the extraction process have been delayed | ||||
| * (`drw_batch_cache_generate_requested`). This function is called after all the objects have | |||||
| * been prepared.*/ | |||||
| drw_batch_cache_generate_requested_ex(ob, false, false); | |||||
| } | |||||
| void drw_batch_cache_prepare_and_generate_requested_delayed(Object *ob) | |||||
| { | |||||
| /* Perform the preparation and extraction process. Do not delay the extraction process. | |||||
| * This function is called for objects that have already been scheduled for delayed extraction | |||||
| * (`drw_batch_cache_schedule_delayed`) and is responsible to perform the extraction. */ | |||||
| drw_batch_cache_generate_requested_ex(ob, true, false); | |||||
| } | |||||
| void drw_batch_cache_schedule_delayed(Object *ob) | |||||
| { | |||||
| /* Schedule an object to perform the preparation and extraction delayed after all the other | |||||
| * objects have been extracted. This is used for custom bone shapes. */ | |||||
| BLI_gset_add(DST.delayed_preparation_extraction, ob); | |||||
| } | } | ||||
| void DRW_batch_cache_free_old(Object *ob, int ctime) | void DRW_batch_cache_free_old(Object *ob, int ctime) | ||||
| { | { | ||||
| struct Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); | struct Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); | ||||
| switch (ob->type) { | switch (ob->type) { | ||||
| case OB_MESH: | case OB_MESH: | ||||
| DRW_mesh_batch_cache_free_old((Mesh *)ob->data, ctime); | DRW_mesh_batch_cache_free_old((Mesh *)ob->data, ctime); | ||||
| break; | break; | ||||
| case OB_CURVE: | case OB_CURVE: | ||||
| case OB_FONT: | case OB_FONT: | ||||
| case OB_SURF: | case OB_SURF: | ||||
| if (mesh_eval) { | if (mesh_eval) { | ||||
| DRW_mesh_batch_cache_free_old(mesh_eval, ctime); | DRW_mesh_batch_cache_free_old(mesh_eval, ctime); | ||||
| } | } | ||||
| break; | break; | ||||
| /* TODO all cases */ | /* TODO all cases */ | ||||
| default: | default: | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||