Object Mode: remove Scene.obedit in draw manager

Part of larger change to remove this variable entirely.
This commit is contained in:
Campbell Barton 2018-02-13 18:15:47 +11:00
parent 147c24aeeb
commit dacc6d4b02
10 changed files with 62 additions and 69 deletions

View File

@ -770,11 +770,7 @@ static void clay_cache_populate_particles(void *vedata, Object *ob)
CLAY_StorageList *stl = ((CLAY_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = draw_ctx->scene;
Object *obedit = scene->obedit;
if (ob != obedit) {
if (ob != draw_ctx->object_edit) {
for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) {
if (psys_check_enabled(ob, psys, false)) {
ParticleSettings *part = psys->part;

View File

@ -1377,7 +1377,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sld
}
if (ob->type == OB_MESH) {
if (ob != draw_ctx->scene->obedit) {
if (ob != draw_ctx->object_edit) {
material_hash = stl->g_data->hair_material_hash;
for (ModifierData *md = ob->modifiers.first; md; md = md->next) {

View File

@ -463,7 +463,7 @@ typedef struct DRWContextState {
struct Scene *scene; /* 'CTX_data_scene(C)' */
struct ViewLayer *view_layer; /* 'CTX_data_view_layer(C)' */
/* Use 'scene->obedit' for edit-mode */
/* Use 'object_edit' for edit-mode */
struct Object *obact; /* 'OBACT' */
struct RenderEngineType *engine_type;
@ -476,7 +476,11 @@ typedef struct DRWContextState {
* May be NULL when used for selection or depth buffer. */
const struct bContext *evil_C;
/* ---- */
/* Cache: initialized by 'drw_context_state_init'. */
struct Object *object_pose;
struct Object *object_edit;
} DRWContextState;

View File

@ -2210,13 +2210,10 @@ struct DRWTextStore *DRW_text_cache_ensure(void)
bool DRW_object_is_renderable(Object *ob)
{
Scene *scene = DST.draw_ctx.scene;
Object *obedit = scene->obedit;
BLI_assert(BKE_object_is_visible(ob, OB_VISIBILITY_CHECK_UNKNOWN_RENDER_MODE));
if (ob->type == OB_MESH) {
if (ob == obedit) {
if (ob == DST.draw_ctx.object_edit) {
IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_EDIT, "");
bool do_show_occlude_wire = BKE_collection_engine_property_value_get_bool(props, "show_occlude_wire");
if (do_show_occlude_wire) {
@ -2601,6 +2598,30 @@ static void drw_viewport_cache_resize(void)
DRW_instance_data_list_resize(DST.idatalist);
}
/* Not a viewport variable, we could split this out. */
static void drw_context_state_init(void)
{
/* Edit object. */
if (DST.draw_ctx.object_mode & OB_MODE_EDIT) {
DST.draw_ctx.object_edit = DST.draw_ctx.obact;
}
else {
DST.draw_ctx.object_edit = NULL;
}
/* Pose object. */
if (DST.draw_ctx.object_mode & OB_MODE_POSE) {
DST.draw_ctx.object_pose = DST.draw_ctx.obact;
}
else if (DST.draw_ctx.object_mode & OB_MODE_WEIGHT_PAINT) {
DST.draw_ctx.object_pose = BKE_object_pose_armature_get(DST.draw_ctx.obact);
}
else {
DST.draw_ctx.object_pose = NULL;
}
}
/* It also stores viewport variable to an immutable place: DST
* This is because a cache uniform only store reference
* to its value. And we don't want to invalidate the cache
@ -2608,7 +2629,6 @@ static void drw_viewport_cache_resize(void)
static void drw_viewport_var_init(void)
{
RegionView3D *rv3d = DST.draw_ctx.rv3d;
/* Refresh DST.size */
if (DST.viewport) {
int size[2];
@ -2664,8 +2684,8 @@ static void drw_viewport_var_init(void)
DST.backface = GL_CW;
glFrontFace(DST.frontface);
if (DST.draw_ctx.scene->obedit) {
ED_view3d_init_mats_rv3d(DST.draw_ctx.scene->obedit, rv3d);
if (DST.draw_ctx.object_edit) {
ED_view3d_init_mats_rv3d(DST.draw_ctx.object_edit, rv3d);
}
/* Alloc array of texture reference. */
@ -2678,19 +2698,6 @@ static void drw_viewport_var_init(void)
memset(viewport_matrix_override.override, 0x0, sizeof(viewport_matrix_override.override));
memset(DST.common_instance_data, 0x0, sizeof(DST.common_instance_data));
/* Not a viewport variable, we could split this out. */
{
if (DST.draw_ctx.object_mode & OB_MODE_POSE) {
DST.draw_ctx.object_pose = DST.draw_ctx.obact;
}
else if (DST.draw_ctx.object_mode & OB_MODE_WEIGHT_PAINT) {
DST.draw_ctx.object_pose = BKE_object_pose_armature_get(DST.draw_ctx.obact);
}
else {
DST.draw_ctx.object_pose = NULL;
}
}
}
void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type)
@ -3185,10 +3192,10 @@ 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, ViewLayer *view_layer, RenderEngineType *engine_type)
static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_type)
{
Object *obact = OBACT(view_layer);
const int mode = CTX_data_mode_enum_ex(scene->obedit, obact, DST.draw_ctx.object_mode);
const int mode = CTX_data_mode_enum_ex(DST.draw_ctx.object_edit, obact, DST.draw_ctx.object_mode);
drw_engines_enable_from_engine(engine_type);
@ -3366,7 +3373,7 @@ void DRW_notify_view_update(const DRWUpdateContext *update_ctx)
NULL,
};
drw_engines_enable(scene, view_layer, engine_type);
drw_engines_enable(view_layer, engine_type);
for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
DrawEngineType *draw_engine = link->data;
@ -3411,7 +3418,7 @@ void DRW_notify_id_update(const DRWUpdateContext *update_ctx, ID *id)
DST.draw_ctx = (DRWContextState){
ar, rv3d, v3d, scene, view_layer, OBACT(view_layer), engine_type, depsgraph, OB_MODE_OBJECT, NULL,
};
drw_engines_enable(scene, view_layer, engine_type);
drw_engines_enable(view_layer, engine_type);
for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
DrawEngineType *draw_engine = link->data;
ViewportEngineData *data = DRW_viewport_engine_data_ensure(draw_engine);
@ -3474,11 +3481,11 @@ void DRW_draw_render_loop_ex(
/* reuse if caller sets */
DST.draw_ctx.evil_C,
};
drw_context_state_init();
drw_viewport_var_init();
/* Get list of enabled engines */
drw_engines_enable(scene, view_layer, engine_type);
drw_engines_enable(view_layer, engine_type);
/* Update ubos */
DRW_globals_update();
@ -3651,6 +3658,7 @@ void DRW_render_to_image(RenderEngine *re, struct Depsgraph *depsgraph)
DST.draw_ctx = (DRWContextState){
NULL, NULL, NULL, scene, view_layer, OBACT(view_layer), engine_type, depsgraph, eval_ctx->object_mode, NULL,
};
drw_context_state_init();
DST.viewport = GPU_viewport_create();
const int size[2] = {(r->size * r->xsch) / 100, (r->size * r->ysch) / 100};
@ -3723,6 +3731,7 @@ void DRW_draw_select_loop(
Scene *scene = DEG_get_evaluated_scene(depsgraph);
RenderEngineType *engine_type = RE_engines_find(scene->view_render.engine_id);
ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
Object *obact = OBACT(view_layer);
#ifndef USE_GPU_SELECT
UNUSED_VARS(vc, scene, view_layer, v3d, ar, rect);
#else
@ -3737,14 +3746,12 @@ void DRW_draw_select_loop(
bool use_obedit = false;
int obedit_mode = 0;
if (scene->obedit && scene->obedit->type == OB_MBALL) {
use_obedit = true;
obedit_mode = CTX_MODE_EDIT_METABALL;
}
else if ((scene->obedit && scene->obedit->type == OB_ARMATURE)) {
/* if not drawing sketch, draw bones */
// if (!BDR_drawSketchNames(vc))
{
if (object_mode & OB_MODE_EDIT) {
if (obact->type == OB_MBALL) {
use_obedit = true;
obedit_mode = CTX_MODE_EDIT_METABALL;
}
else if (obact->type == OB_ARMATURE) {
use_obedit = true;
obedit_mode = CTX_MODE_EDIT_ARMATURE;
}
@ -3773,10 +3780,10 @@ 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, view_layer, OBACT(view_layer), engine_type, depsgraph, object_mode,
ar, rv3d, v3d, scene, view_layer, obact, engine_type, depsgraph, object_mode,
(bContext *)NULL,
};
drw_context_state_init();
drw_viewport_var_init();
/* Update ubos */
@ -3792,7 +3799,7 @@ void DRW_draw_select_loop(
drw_engines_cache_init();
if (use_obedit) {
drw_engines_cache_populate(scene->obedit);
drw_engines_cache_populate(obact);
}
else {
DEG_OBJECT_ITER(depsgraph, ob, DRW_iterator_mode_get(),
@ -3876,7 +3883,7 @@ void DRW_draw_depth_loop(
ar, rv3d, v3d, scene, view_layer, OBACT(view_layer), engine_type, depsgraph, object_mode,
(bContext *)NULL,
};
drw_context_state_init();
drw_viewport_var_init();
/* Update ubos */

View File

@ -229,12 +229,11 @@ static void EDIT_CURVE_cache_populate(void *vedata, Object *ob)
EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
const Scene *scene = draw_ctx->scene;
const Object *obedit = scene->obedit;
UNUSED_VARS(psl, stl);
if (ob->type == OB_CURVE) {
if (ob == obedit) {
if (ob == draw_ctx->object_edit) {
Curve *cu = ob->data;
/* Get geometry cache */
struct Gwn_Batch *geom;

View File

@ -188,13 +188,11 @@ static void EDIT_LATTICE_cache_populate(void *vedata, Object *ob)
EDIT_LATTICE_PassList *psl = ((EDIT_LATTICE_Data *)vedata)->psl;
EDIT_LATTICE_StorageList *stl = ((EDIT_LATTICE_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = draw_ctx->scene;
Object *obedit = scene->obedit;
UNUSED_VARS(psl);
if (ob->type == OB_LATTICE) {
if (ob == obedit) {
if (ob == draw_ctx->object_edit) {
/* Get geometry cache */
struct Gwn_Batch *geom;

View File

@ -443,11 +443,10 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
Scene *scene = draw_ctx->scene;
Object *obedit = scene->obedit;
struct Gwn_Batch *geom;
if (ob->type == OB_MESH) {
if (ob == obedit) {
if (ob == draw_ctx->object_edit) {
const Mesh *me = ob->data;
IDProperty *ces_mode_ed = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_EDIT, "");
bool do_occlude_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire");

View File

@ -169,11 +169,9 @@ static void EDIT_METABALL_cache_populate(void *vedata, Object *ob)
if (ob->type == OB_MBALL) {
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = draw_ctx->scene;
Object *obedit = scene->obedit;
DRWShadingGroup *group = stl->g_data->group;
if (ob == obedit) {
if (ob == draw_ctx->object_edit) {
MetaBall *mb = ob->data;
const bool is_select = DRW_state_is_select();

View File

@ -190,13 +190,11 @@ static void EDIT_TEXT_cache_populate(void *vedata, Object *ob)
EDIT_TEXT_PassList *psl = ((EDIT_TEXT_Data *)vedata)->psl;
EDIT_TEXT_StorageList *stl = ((EDIT_TEXT_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = draw_ctx->scene;
Object *obedit = scene->obedit;
UNUSED_VARS(psl, stl);
if (ob->type == OB_FONT) {
if (ob == obedit) {
if (ob == draw_ctx->object_edit) {
const Curve *cu = ob->data;
/* Get geometry cache */
struct Gwn_Batch *geom;

View File

@ -1790,7 +1790,6 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
OBJECT_PassList *psl = ((OBJECT_Data *)vedata)->psl;
OBJECT_StorageList *stl = ((OBJECT_Data *)vedata)->stl;
const DRWContextState *draw_ctx = DRW_context_state_get();
Scene *scene = draw_ctx->scene;
ViewLayer *view_layer = draw_ctx->view_layer;
View3D *v3d = draw_ctx->v3d;
int theme_id = TH_UNDEFINED;
@ -1810,8 +1809,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
bool do_outlines = ((ob->base_flag & BASE_SELECTED) != 0);
if (do_outlines) {
Object *obedit = scene->obedit;
if (ob != obedit && !((ob == draw_ctx->obact) && (draw_ctx->object_mode & OB_MODE_ALL_PAINT))) {
if ((ob != draw_ctx->object_edit) && !((ob == draw_ctx->obact) && (draw_ctx->object_mode & OB_MODE_ALL_PAINT))) {
struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob);
if (geom) {
theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL);
@ -1828,8 +1826,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
{
Mesh *me = ob->data;
if (me->totpoly == 0) {
Object *obedit = scene->obedit;
if (ob != obedit) {
if (ob != draw_ctx->object_edit) {
struct Gwn_Batch *geom = DRW_cache_mesh_edges_get(ob);
if (geom) {
if (theme_id == TH_UNDEFINED) {
@ -1847,8 +1844,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
break;
case OB_LATTICE:
{
Object *obedit = scene->obedit;
if (ob != obedit) {
if (ob != draw_ctx->object_edit) {
struct Gwn_Batch *geom = DRW_cache_lattice_wire_get(ob, false);
if (theme_id == TH_UNDEFINED) {
theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL);
@ -1862,8 +1858,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
case OB_CURVE:
{
Object *obedit = scene->obedit;
if (ob != obedit) {
if (ob != draw_ctx->object_edit) {
struct Gwn_Batch *geom = DRW_cache_curve_edge_wire_get(ob);
if (theme_id == TH_UNDEFINED) {
theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL);
@ -1875,8 +1870,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
}
case OB_MBALL:
{
Object *obedit = scene->obedit;
if (ob != obedit) {
if (ob != draw_ctx->object_edit) {
DRW_shgroup_mball_helpers(stl, ob, view_layer);
}
break;