diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2017-02-08 14:26:41 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2017-02-08 16:44:37 +0300 |
commit | a38298f4dd1673a8305abdab687fc4a16f383e5f (patch) | |
tree | 16dcf35ecc1f9133d8c8baf880bc71ea56fa0771 /source | |
parent | d4913af84660318047e3404f9766014cd78864ab (diff) |
Bring back Lasso and Circle selection back
(and replace more instances of BaseLegacy/scene->base with Base/sl->object_bases)
Still need mouse selection, box selection, and menu selection
Also, there is still a problem with BA_WAS_SEL, at the moment only the
objects centers are highlighted.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_scene.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 44 | ||||
-rw-r--r-- | source/blender/editors/curve/editcurve_paint.c | 1 | ||||
-rw-r--r-- | source/blender/editors/include/ED_view3d.h | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 30 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 12 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw_legacy.c | 73 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_intern.h | 11 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_project.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_select.c | 70 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_view.c | 21 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.h | 1 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 34 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_generics.c | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 4 |
15 files changed, 163 insertions, 147 deletions
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index 53bb69aedb6..181d4b12703 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -47,6 +47,7 @@ struct QuicktimeCodecData; struct RenderData; struct SceneRenderLayer; struct Scene; +struct SceneLayer; struct UnitSettings; struct Main; @@ -95,7 +96,7 @@ typedef struct SceneBaseIter { int BKE_scene_base_iter_next(struct EvaluationContext *eval_ctx, struct SceneBaseIter *iter, struct Scene **scene, int val, struct BaseLegacy **base, struct Object **ob); -void BKE_scene_base_flag_to_objects(struct Scene *scene); +void BKE_scene_base_flag_to_objects(struct SceneLayer *sl); void BKE_scene_base_flag_from_objects(struct Scene *scene); void BKE_scene_base_flag_sync_from_base(struct BaseLegacy *base); void BKE_scene_base_flag_sync_from_object(struct BaseLegacy *base); diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 1ce4bf8f9eb..6204a831fd9 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1746,40 +1746,24 @@ bool BKE_scene_uses_blender_game(const Scene *scene) return STREQ(scene->r.engine, RE_engine_id_BLENDER_GAME); } -void BKE_scene_base_flag_to_objects(struct Scene *scene) +void BKE_scene_base_flag_to_objects(SceneLayer *sl) { - BaseLegacy *base = scene->base.first; + Base *base = sl->object_bases.first; while (base) { - BKE_scene_base_flag_sync_from_base(base); - base = base->next; - } -} - -void BKE_scene_base_flag_from_objects(struct Scene *scene) -{ - BaseLegacy *base = scene->base.first; - - while (base) { - BKE_scene_base_flag_sync_from_object(base); + BKE_scene_object_base_flag_sync_from_base(base); base = base->next; } } void BKE_scene_base_flag_sync_from_base(BaseLegacy *base) { - Object *ob = base->object; - - /* keep the object only flags untouched */ - int flag = ob->flag & OB_FROMGROUP; - - ob->flag = base->flag_legacy; - ob->flag |= flag; + BKE_scene_object_base_flag_sync_from_base(base); } void BKE_scene_base_flag_sync_from_object(BaseLegacy *base) { - base->flag_legacy = base->object->flag; + BKE_scene_object_base_flag_sync_from_object(base); } void BKE_scene_object_base_flag_sync_from_base(Base *base) @@ -1791,11 +1775,27 @@ void BKE_scene_object_base_flag_sync_from_base(Base *base) ob->flag = base->flag; ob->flag |= flag; + + if ((base->flag & BASE_SELECTED) != 0) { + ob->flag |= SELECT; + } + else { + ob->flag &= ~SELECT; + } } void BKE_scene_object_base_flag_sync_from_object(Base *base) { - base->flag = base->object->flag; + Object *ob = base->object; + base->flag = ob->flag; + + if ((ob->flag & SELECT) != 0) { + base->flag |= BASE_SELECTED; + BLI_assert((base->flag & BASE_SELECTABLED) != 0); + } + else { + base->flag &= ~BASE_SELECTED; + } } void BKE_scene_disable_color_management(Scene *scene) diff --git a/source/blender/editors/curve/editcurve_paint.c b/source/blender/editors/curve/editcurve_paint.c index f0cec1a84bf..4720b76342c 100644 --- a/source/blender/editors/curve/editcurve_paint.c +++ b/source/blender/editors/curve/editcurve_paint.c @@ -703,6 +703,7 @@ static bool curve_draw_init(bContext *C, wmOperator *op, bool is_invoke) } else { cdd->vc.scene = CTX_data_scene(C); + cdd->vc.sl = CTX_data_scene_layer(C); cdd->vc.obedit = CTX_data_edit_object(C); } diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index 3bbc7617745..cc83b97fc00 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -49,6 +49,7 @@ struct Nurb; struct Object; struct RegionView3D; struct Scene; +struct SceneLayer; struct ScrArea; struct View3D; struct ViewContext; @@ -70,6 +71,7 @@ enum eGPUFXFlags; /* for derivedmesh drawing callbacks, for view3d_select, .... */ typedef struct ViewContext { struct Scene *scene; + struct SceneLayer *sl; struct Object *obact; struct Object *obedit; struct ARegion *ar; diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 23cbe840c9c..d72f908eb30 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -1231,7 +1231,7 @@ static void draw_transp_sun_volume(Lamp *la, unsigned pos) } #endif -void drawlamp(View3D *v3d, RegionView3D *rv3d, BaseLegacy *base, +void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, const char dt, const short dflag, const unsigned char ob_wire_col[4], const bool is_obact) { Object *ob = base->object; @@ -1309,7 +1309,7 @@ void drawlamp(View3D *v3d, RegionView3D *rv3d, BaseLegacy *base, if ((dflag & DRAW_CONSTCOLOR) == 0) { const float *color = curcol; if (ob->id.us > 1) { - if (is_obact || (ob->flag & SELECT)) { + if (is_obact || ((base->flag & BASE_SELECTED) != 0)) { static const float active_color[4] = {0.533f, 1.0f, 1.0f, 1.0f}; color = active_color; } @@ -2121,7 +2121,7 @@ static void drawcamera_stereo3d( } /* flag similar to draw_object() */ -void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, BaseLegacy *base, +void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, const short dflag, const unsigned char ob_wire_col[4]) { /* a standing up pyramid with (0,0,0) as top */ @@ -5678,7 +5678,7 @@ static void draw_particle_data(ParticleSystem *psys, RegionView3D *rv3d, * 7. clean up */ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv3d, - BaseLegacy *base, ParticleSystem *psys, + Base *base, ParticleSystem *psys, const char ob_dt, const short dflag) { Object *ob = base->object; @@ -5697,7 +5697,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv float cfra; float ma_col[3] = {0.0f, 0.0f, 0.0f}; int a, totpart, totpoint = 0, totve = 0, drawn, draw_as, totchild = 0; - bool select = (ob->flag & SELECT) != 0, create_cdata = false, need_v = false; + bool select = (base->flag & BASE_SELECTED) != 0, create_cdata = false, need_v = false; GLint polygonmode[2]; char numstr[32]; unsigned char tcol[4] = {0, 0, 0, 255}; @@ -7942,7 +7942,7 @@ static void drawtexspace(Object *ob) } /* draws wire outline */ -static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy *base, +static void drawObjectSelect(Scene *scene, SceneLayer *sl, View3D *v3d, ARegion *ar, Base *base, const unsigned char ob_wire_col[4]) { RegionView3D *rv3d = ar->regiondata; @@ -7989,7 +7989,7 @@ static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, BaseLegacy } } else if (ob->type == OB_ARMATURE) { - if (!(ob->mode & OB_MODE_POSE && base == scene->basact)) { + if (!(ob->mode & OB_MODE_POSE && base == sl->basact)) { glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f); draw_armature(scene, v3d, ar, base, OB_WIRE, 0, ob_wire_col, true); } @@ -8095,7 +8095,7 @@ static void draw_rigid_body_pivot(bRigidBodyJointConstraint *data, setlinestyle(0); } -void draw_object_wire_color(Scene *scene, BaseLegacy *base, unsigned char r_ob_wire_col[4]) +void draw_object_wire_color(Scene *scene, SceneLayer *sl, Base *base, unsigned char r_ob_wire_col[4]) { Object *ob = base->object; int colindex = 0; @@ -8136,7 +8136,7 @@ void draw_object_wire_color(Scene *scene, BaseLegacy *base, unsigned char r_ob_w } else { if ((base->flag & BASE_SELECTED) && (base->flag_legacy & BA_WAS_SEL)) { - theme_id = scene->basact == base ? TH_ACTIVE : TH_SELECT; + theme_id = sl->basact == base ? TH_ACTIVE : TH_SELECT; } else { if (ob->type == OB_LAMP) theme_id = TH_LAMP; @@ -8234,7 +8234,7 @@ void draw_rigidbody_shape(Object *ob) * main object drawing function, draws in selection * \param dflag (draw flag) can be DRAW_PICKING and/or DRAW_CONSTCOLOR, DRAW_SCENESET */ -void draw_object(Scene *scene, ARegion *ar, View3D *v3d, BaseLegacy *base, const short dflag) +void draw_object(Scene *scene, SceneLayer *sl, ARegion *ar, View3D *v3d, Base *base, const short dflag) { ModifierData *md = NULL; Object *ob = base->object; @@ -8244,7 +8244,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, BaseLegacy *base, const unsigned char _ob_wire_col[4]; /* dont initialize this */ const unsigned char *ob_wire_col = NULL; /* dont initialize this, use NULL crashes as a way to find invalid use */ bool zbufoff = false, is_paint = false, empty_object = false; - const bool is_obact = (ob == OBACT); + const bool is_obact = (ob == OBACT_NEW); const bool render_override = (v3d->flag2 & V3D_RENDER_OVERRIDE) != 0; const bool is_picking = (G.f & G_PICKSEL) != 0; const bool has_particles = (ob->particlesystem.first != NULL); @@ -8361,7 +8361,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, BaseLegacy *base, const ED_view3d_project_base(ar, base); - draw_object_wire_color(scene, base, _ob_wire_col); + draw_object_wire_color(scene, sl, base, _ob_wire_col); ob_wire_col = _ob_wire_col; glColor3ubv(ob_wire_col); @@ -8416,8 +8416,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, BaseLegacy *base, const /* draw outline for selected objects, mesh does itself */ if ((v3d->flag & V3D_SELECT_OUTLINE) && !render_override && ob->type != OB_MESH) { if (dt > OB_WIRE && (ob->mode & OB_MODE_EDIT) == 0 && (dflag & DRAW_SCENESET) == 0) { - if (!(ob->dtx & OB_DRAWWIRE) && (ob->flag & SELECT) && !(dflag & (DRAW_PICKING | DRAW_CONSTCOLOR))) { - drawObjectSelect(scene, v3d, ar, base, ob_wire_col); + if (!(ob->dtx & OB_DRAWWIRE) && (base->flag & BASE_SELECTED) && !(dflag & (DRAW_PICKING | DRAW_CONSTCOLOR))) { + drawObjectSelect(scene, sl, v3d, ar, base, ob_wire_col); } } } @@ -8599,7 +8599,7 @@ afterdraw: if ((dflag & DRAW_CONSTCOLOR) == 0) { /* for visibility, also while wpaint */ - if (col || (ob->flag & SELECT)) { + if (col || (base->flag & BASE_SELECTED)) { cpack(0xFFFFFF); } } diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 65966a67da8..1a65608b7b4 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1767,7 +1767,7 @@ static void draw_rotation_guide(RegionView3D *rv3d) /* ******************** non-meshes ***************** */ static void view3d_draw_non_mesh( -Scene *scene, Object *ob, BaseLegacy *base, View3D *v3d, +Scene *scene, SceneLayer *sl, Object *ob, Base *base, View3D *v3d, RegionView3D *rv3d, const bool is_boundingbox, const unsigned char color[4]) { glMatrixMode(GL_PROJECTION); @@ -1793,7 +1793,7 @@ RegionView3D *rv3d, const bool is_boundingbox, const unsigned char color[4]) drawaxes(rv3d->viewmatob, ob->empty_drawsize, ob->empty_drawtype, color); break; case OB_LAMP: - drawlamp(v3d, rv3d, base, OB_SOLID, DRAW_CONSTCOLOR, color, ob == OBACT); + drawlamp(v3d, rv3d, base, OB_SOLID, DRAW_CONSTCOLOR, color, ob == OBACT_NEW); break; case OB_CAMERA: drawcamera(scene, v3d, rv3d, base, DRAW_CONSTCOLOR, color); @@ -1889,9 +1889,9 @@ static void draw_all_objects(const bContext *C, ARegion *ar, const bool only_dep if ((base->flag & BASE_VISIBLED) != 0) { /* dupli drawing */ if (base->object->transflag & OB_DUPLI) - draw_dupli_objects(scene, ar, v3d, base); + draw_dupli_objects(scene, sl, ar, v3d, base); - draw_object(scene, ar, v3d, base, 0); + draw_object(scene, sl, ar, v3d, base, 0); } } @@ -1988,8 +1988,8 @@ static void view3d_draw_non_meshes(const bContext *C, ARegion *ar) Object *ob = base->object; unsigned char ob_wire_col[4]; - draw_object_wire_color(scene, base, ob_wire_col); - view3d_draw_non_mesh(scene, ob, base, v3d, rv3d, is_boundingbox, ob_wire_col); + draw_object_wire_color(scene, sl, base, ob_wire_col); + view3d_draw_non_mesh(scene, sl, ob, base, v3d, rv3d, is_boundingbox, ob_wire_col); } } diff --git a/source/blender/editors/space_view3d/view3d_draw_legacy.c b/source/blender/editors/space_view3d/view3d_draw_legacy.c index d3cf7cabb97..4fb0f6af489 100644 --- a/source/blender/editors/space_view3d/view3d_draw_legacy.c +++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c @@ -413,10 +413,10 @@ static void draw_selected_name(Scene *scene, Object *ob, rcti *rect) /* *********************** backdraw for selection *************** */ -static void backdrawview3d(Scene *scene, wmWindow *win, ARegion *ar, View3D *v3d) +static void backdrawview3d(Scene *scene, SceneLayer *sl, wmWindow *win, ARegion *ar, View3D *v3d) { RegionView3D *rv3d = ar->regiondata; - struct BaseLegacy *base = scene->basact; + struct Base *base = sl->basact; int multisample_enabled; BLI_assert(ar->regiontype == RGN_TYPE_WINDOW); @@ -513,7 +513,7 @@ static void backdrawview3d(Scene *scene, wmWindow *win, ARegion *ar, View3D *v3d G.f |= G_BACKBUFSEL; - if (base && (base->lay & v3d->lay)) + if (base && ((base->flag & BASE_VISIBLED) != 0)) draw_object_backbufsel(scene, v3d, rv3d, base->object); if (rv3d->gpuoffscreen) @@ -558,7 +558,7 @@ static void view3d_opengl_read_Z_pixels(ARegion *ar, int x, int y, int w, int h, void ED_view3d_backbuf_validate(ViewContext *vc) { if (vc->v3d->flag & V3D_INVALID_BACKBUF) - backdrawview3d(vc->scene, vc->win, vc->ar, vc->v3d); + backdrawview3d(vc->scene, vc->sl, vc->win, vc->ar, vc->v3d); } /** @@ -1047,7 +1047,7 @@ void ED_view3d_after_add(ListBase *lb, BaseLegacy *base, const short dflag) } /* disables write in zbuffer and draws it over */ -static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d) +static void view3d_draw_transp(Scene *scene, SceneLayer *sl, ARegion *ar, View3D *v3d) { View3DAfter *v3da; @@ -1055,7 +1055,7 @@ static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d) v3d->transp = true; while ((v3da = BLI_pophead(&v3d->afterdraw_transp))) { - draw_object(scene, ar, v3d, v3da->base, v3da->dflag); + draw_object(scene, sl, ar, v3d, v3da->base, v3da->dflag); MEM_freeN(v3da); } v3d->transp = false; @@ -1065,7 +1065,7 @@ static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d) } /* clears zbuffer and draws it over */ -static void view3d_draw_xray(Scene *scene, ARegion *ar, View3D *v3d, bool *clear) +static void view3d_draw_xray(Scene *scene, SceneLayer *sl, ARegion *ar, View3D *v3d, bool *clear) { if (*clear && v3d->zbuf) { glClear(GL_DEPTH_BUFFER_BIT); @@ -1075,7 +1075,7 @@ static void view3d_draw_xray(Scene *scene, ARegion *ar, View3D *v3d, bool *clear v3d->xray = true; View3DAfter *v3da; while ((v3da = BLI_pophead(&v3d->afterdraw_xray))) { - draw_object(scene, ar, v3d, v3da->base, v3da->dflag); + draw_object(scene, sl, ar, v3d, v3da->base, v3da->dflag); MEM_freeN(v3da); } v3d->xray = false; @@ -1083,7 +1083,7 @@ static void view3d_draw_xray(Scene *scene, ARegion *ar, View3D *v3d, bool *clear /* clears zbuffer and draws it over */ -static void view3d_draw_xraytransp(Scene *scene, ARegion *ar, View3D *v3d, const bool clear) +static void view3d_draw_xraytransp(Scene *scene, SceneLayer *sl, ARegion *ar, View3D *v3d, const bool clear) { if (clear && v3d->zbuf) glClear(GL_DEPTH_BUFFER_BIT); @@ -1095,7 +1095,7 @@ static void view3d_draw_xraytransp(Scene *scene, ARegion *ar, View3D *v3d, const View3DAfter *v3da; while ((v3da = BLI_pophead(&v3d->afterdraw_xraytransp))) { - draw_object(scene, ar, v3d, v3da->base, v3da->dflag); + draw_object(scene, sl, ar, v3d, v3da->base, v3da->dflag); MEM_freeN(v3da); } @@ -1134,13 +1134,13 @@ static DupliObject *dupli_step(DupliObject *dob) } static void draw_dupli_objects_color( - Scene *scene, ARegion *ar, View3D *v3d, BaseLegacy *base, + Scene *scene, SceneLayer *sl, ARegion *ar, View3D *v3d, BaseLegacy *base, const short dflag, const int color) { RegionView3D *rv3d = ar->regiondata; ListBase *lb; LodLevel *savedlod; - BaseLegacy tbase = {NULL}; + Base tbase = {NULL}; BoundBox bb, *bb_tmp; /* use a copy because draw_object, calls clear_mesh_caches */ GLuint displist = 0; unsigned char color_rgb[3]; @@ -1151,7 +1151,7 @@ static void draw_dupli_objects_color( short dtx; DupliApplyData *apply_data; - if (base->object->restrictflag & OB_RESTRICT_VIEW) return; + if ((base->flag & BASE_VISIBLED) == 0) return; if ((base->object->restrictflag & OB_RESTRICT_RENDER) && (v3d->flag2 & V3D_RENDER_OVERRIDE)) return; if (dflag & DRAW_CONSTCOLOR) { @@ -1162,6 +1162,7 @@ static void draw_dupli_objects_color( } tbase.flag_legacy = OB_FROMDUPLI | base->flag_legacy; + tbase.flag = base->flag; lb = object_duplilist(G.main->eval_ctx, scene, base->object); // BLI_listbase_sort(lb, dupli_ob_sort); /* might be nice to have if we have a dupli list with mixed objects. */ @@ -1255,7 +1256,7 @@ static void draw_dupli_objects_color( displist = glGenLists(1); glNewList(displist, GL_COMPILE); - draw_object(scene, ar, v3d, &tbase, dflag_dupli); + draw_object(scene, sl, ar, v3d, &tbase, dflag_dupli); glEndList(); use_displist = true; @@ -1272,7 +1273,7 @@ static void draw_dupli_objects_color( else { copy_m4_m4(dob->ob->obmat, dob->mat); GPU_begin_dupli_object(dob); - draw_object(scene, ar, v3d, &tbase, dflag_dupli); + draw_object(scene, sl, ar, v3d, &tbase, dflag_dupli); GPU_end_dupli_object(); } } @@ -1294,7 +1295,7 @@ static void draw_dupli_objects_color( glDeleteLists(displist, 1); } -void draw_dupli_objects(Scene *scene, ARegion *ar, View3D *v3d, BaseLegacy *base) +void draw_dupli_objects(Scene *scene, SceneLayer *sl, ARegion *ar, View3D *v3d, BaseLegacy *base) { /* define the color here so draw_dupli_objects_color can be called * from the set loop */ @@ -1304,7 +1305,7 @@ void draw_dupli_objects(Scene *scene, ARegion *ar, View3D *v3d, BaseLegacy *base if (base->object->dup_group && base->object->dup_group->id.us < 1) color = TH_REDALERT; - draw_dupli_objects_color(scene, ar, v3d, base, 0, color); + draw_dupli_objects_color(scene, sl, ar, v3d, base, 0, color); } /* XXX warning, not using gpu offscreen here */ @@ -1446,7 +1447,7 @@ void ED_view3d_draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d) void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaoverride) { RegionView3D *rv3d = ar->regiondata; - BaseLegacy *base; + Base *base; short zbuf = v3d->zbuf; short flag = v3d->flag; float glalphaclip = U.glalphaclip; @@ -1486,9 +1487,9 @@ void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaover Scene *sce_iter; for (SETLOOPER(scene->set, sce_iter, base)) { if (v3d->lay & base->lay) { - draw_object(scene, ar, v3d, base, 0); + draw_object(scene, sl, ar, v3d, base, 0); if (base->object->transflag & OB_DUPLI) { - draw_dupli_objects_color(scene, ar, v3d, base, dflag_depth, TH_UNDEFINED); + draw_dupli_objects_color(scene, sl, ar, v3d, base, dflag_depth, TH_UNDEFINED); } } } @@ -1498,9 +1499,9 @@ void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaover if ((base->flag & BASE_VISIBLED) != 0) { /* dupli drawing */ if (base->object->transflag & OB_DUPLI) { - draw_dupli_objects_color(scene, ar, v3d, base, dflag_depth, TH_UNDEFINED); + draw_dupli_objects_color(scene, sl, ar, v3d, base, dflag_depth, TH_UNDEFINED); } - draw_object(scene, ar, v3d, base, dflag_depth); + draw_object(scene, sl, ar, v3d, base, dflag_depth); } } @@ -1521,7 +1522,7 @@ void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaover if (v3d->afterdraw_xray.first || v3d->afterdraw_xraytransp.first) { glDepthFunc(GL_ALWAYS); /* always write into the depth bufer, overwriting front z values */ for (v3da = v3d->afterdraw_xray.first; v3da; v3da = v3da->next) { - draw_object(scene, ar, v3d, v3da->base, dflag_depth); + draw_object(scene, sl, ar, v3d, v3da->base, dflag_depth); } glDepthFunc(GL_LEQUAL); /* Now write the depth buffer normally */ } @@ -1530,21 +1531,21 @@ void ED_view3d_draw_depth(Scene *scene, ARegion *ar, View3D *v3d, bool alphaover v3d->xray = false; v3d->transp = true; while ((v3da = BLI_pophead(&v3d->afterdraw_transp))) { - draw_object(scene, ar, v3d, v3da->base, dflag_depth); + draw_object(scene, sl, ar, v3d, v3da->base, dflag_depth); MEM_freeN(v3da); } v3d->xray = true; v3d->transp = false; while ((v3da = BLI_pophead(&v3d->afterdraw_xray))) { - draw_object(scene, ar, v3d, v3da->base, dflag_depth); + draw_object(scene, sl, ar, v3d, v3da->base, dflag_depth); MEM_freeN(v3da); } v3d->xray = true; v3d->transp = true; while ((v3da = BLI_pophead(&v3d->afterdraw_xraytransp))) { - draw_object(scene, ar, v3d, v3da->base, dflag_depth); + draw_object(scene, sl, ar, v3d, v3da->base, dflag_depth); MEM_freeN(v3da); } @@ -1802,10 +1803,10 @@ static void view3d_draw_objects( for (SETLOOPER(scene->set, sce_iter, base)) { if (v3d->lay & base->lay) { UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.6f); - draw_object(scene, ar, v3d, base, dflag); + draw_object(scene, sl, ar, v3d, base, dflag); if (base->object->transflag & OB_DUPLI) { - draw_dupli_objects_color(scene, ar, v3d, base, dflag, TH_UNDEFINED); + draw_dupli_objects_color(scene, sl, ar, v3d, base, dflag, TH_UNDEFINED); } } } @@ -1818,9 +1819,9 @@ static void view3d_draw_objects( if ((base->flag & BASE_VISIBLED) != 0) { /* dupli drawing */ if (base->object->transflag & OB_DUPLI) - draw_dupli_objects(scene, ar, v3d, base); + draw_dupli_objects(scene, sl, ar, v3d, base); - draw_object(scene, ar, v3d, base, 0); + draw_object(scene, sl, ar, v3d, base, 0); } } } @@ -1835,11 +1836,11 @@ static void view3d_draw_objects( /* dupli drawing */ if (base->object->transflag & OB_DUPLI) { - draw_dupli_objects(scene, ar, v3d, base); + draw_dupli_objects(scene, sl, ar, v3d, base); } if ((base->flag & BASE_SELECTED) == 0) { if (base->object != scene->obedit) - draw_object(scene, ar, v3d, base, 0); + draw_object(scene, sl, ar, v3d, base, 0); } } } @@ -1851,7 +1852,7 @@ static void view3d_draw_objects( for (base = sl->object_bases.first; base; base = base->next) { if ((base->flag & BASE_VISIBLED) != 0) { if (base->object == scene->obedit || (base->flag & BASE_SELECTED)) { - draw_object(scene, ar, v3d, base, 0); + draw_object(scene, sl, ar, v3d, base, 0); } } } @@ -1873,7 +1874,7 @@ static void view3d_draw_objects( } /* transp and X-ray afterdraw stuff */ - if (v3d->afterdraw_transp.first) view3d_draw_transp(scene, ar, v3d); + if (v3d->afterdraw_transp.first) view3d_draw_transp(scene, sl, ar, v3d); /* always do that here to cleanup depth buffers if none needed */ if (fx) { @@ -1881,8 +1882,8 @@ static void view3d_draw_objects( GPU_fx_compositor_setup_XRay_pass(fx, do_composite_xray); } - if (v3d->afterdraw_xray.first) view3d_draw_xray(scene, ar, v3d, &xrayclear); - if (v3d->afterdraw_xraytransp.first) view3d_draw_xraytransp(scene, ar, v3d, xrayclear); + if (v3d->afterdraw_xray.first) view3d_draw_xray(scene, sl, ar, v3d, &xrayclear); + if (v3d->afterdraw_xraytransp.first) view3d_draw_xraytransp(scene, sl, ar, v3d, xrayclear); if (fx && do_composite_xray) { GPU_fx_compositor_XRay_resolve(fx); diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index f7346a378dc..242249af9af 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -47,6 +47,7 @@ struct bContext; struct bMotionPath; struct bPoseChannel; struct Mesh; +struct SceneLayer; struct wmOperatorType; struct wmWindowManager; struct wmKeyConfig; @@ -143,19 +144,19 @@ void draw_motion_paths_cleanup(View3D *v3d); /* drawobject.c */ -void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, BaseLegacy *base, const short dflag); +void draw_object(Scene *scene, struct SceneLayer *sl, struct ARegion *ar, View3D *v3d, BaseLegacy *base, const short dflag); void draw_mesh_object_outline(View3D *v3d, Object *ob, struct DerivedMesh *dm); bool draw_glsl_material(Scene *scene, struct Object *ob, View3D *v3d, const char dt); void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob, const char dt, int outline); void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob); -void draw_object_wire_color(Scene *scene, BaseLegacy *base, unsigned char r_ob_wire_col[4]); +void draw_object_wire_color(Scene *scene, struct SceneLayer *, Base *base, unsigned char r_ob_wire_col[4]); void drawaxes(const float viewmat_local[4][4], float size, char drawtype, const unsigned char color[4]); -void drawlamp(View3D *v3d, RegionView3D *rv3d, BaseLegacy *base, +void drawlamp(View3D *v3d, RegionView3D *rv3d, Base *base, const char dt, const short dflag, const unsigned char ob_wire_col[4], const bool is_obact); -void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, BaseLegacy *base, +void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, const short dflag, const unsigned char ob_wire_col[4]); void drawspeaker(const unsigned char ob_wire_col[3]); void draw_bounding_volume(struct Object *ob, char type); @@ -335,7 +336,7 @@ void VP_legacy_drawfloor(Scene *scene, View3D *v3d, const char **grid_unit, bool void VP_legacy_view3d_main_region_setup_view(Scene *scene, View3D *v3d, ARegion *ar, float viewmat[4][4], float winmat[4][4]); bool VP_legacy_view3d_stereo3d_active(const struct bContext *C, Scene *scene, View3D *v3d, RegionView3D *rv3d); void VP_legacy_view3d_stereo3d_setup(Scene *scene, View3D *v3d, ARegion *ar); -void draw_dupli_objects(Scene *scene, ARegion *ar, View3D *v3d, BaseLegacy *base); +void draw_dupli_objects(Scene *scene, SceneLayer *sl, ARegion *ar, View3D *v3d, BaseLegacy *base); bool VP_legacy_use_depth(Scene *scene, View3D *v3d); void VP_drawviewborder(Scene *scene, ARegion *ar, View3D *v3d); void VP_drawrenderborder(ARegion *ar, View3D *v3d); diff --git a/source/blender/editors/space_view3d/view3d_project.c b/source/blender/editors/space_view3d/view3d_project.c index 32d3e01a6b5..65a6dee2f6c 100644 --- a/source/blender/editors/space_view3d/view3d_project.c +++ b/source/blender/editors/space_view3d/view3d_project.c @@ -101,7 +101,7 @@ void ED_view3d_project_float_v3_m4(const ARegion *ar, const float vec[3], float /* Clipping Projection Functions * ***************************** */ -eV3DProjStatus ED_view3d_project_base(const struct ARegion *ar, struct BaseLegacy *base) +eV3DProjStatus ED_view3d_project_base(const struct ARegion *ar, struct Base *base) { eV3DProjStatus ret = ED_view3d_project_short_global(ar, base->object->obmat[3], &base->sx, V3D_PROJ_TEST_CLIP_DEFAULT); diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 3d767f97204..60bf078acc3 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -111,6 +111,7 @@ void view3d_set_viewcontext(bContext *C, ViewContext *vc) memset(vc, 0, sizeof(ViewContext)); vc->ar = CTX_wm_region(C); vc->scene = CTX_data_scene(C); + vc->sl = CTX_data_scene_layer(C); vc->v3d = CTX_wm_view3d(C); vc->win = CTX_wm_window(C); vc->rv3d = CTX_wm_region_view3d(C); @@ -401,13 +402,13 @@ static void do_lasso_select_pose(ViewContext *vc, Object *ob, const int mcords[] } } -static void object_deselect_all_visible(Scene *scene, View3D *v3d) +static void object_deselect_all_visible(SceneLayer *sl) { - BaseLegacy *base; + Base *base; - for (base = scene->base.first; base; base = base->next) { - if (BASE_SELECTABLE(v3d, base)) { - ED_base_object_select(base, BA_DESELECT); + for (base = sl->object_bases.first; base; base = base->next) { + if (BASE_SELECTABLE_NEW(base)) { + ED_object_base_select(base, BA_DESELECT); } } } @@ -415,17 +416,17 @@ static void object_deselect_all_visible(Scene *scene, View3D *v3d) static void do_lasso_select_objects(ViewContext *vc, const int mcords[][2], const short moves, const bool extend, const bool select) { - BaseLegacy *base; + Base *base; if (extend == false && select) - object_deselect_all_visible(vc->scene, vc->v3d); + object_deselect_all_visible(vc->sl); - for (base = vc->scene->base.first; base; base = base->next) { - if (BASE_SELECTABLE(vc->v3d, base)) { /* use this to avoid un-needed lasso lookups */ + for (base = vc->sl->object_bases.first; base; base = base->next) { + if (BASE_SELECTABLE_NEW(base)) { /* use this to avoid un-needed lasso lookups */ if (ED_view3d_project_base(vc->ar, base) == V3D_PROJ_RET_OK) { if (BLI_lasso_is_point_inside(mcords, moves, base->sx, base->sy, IS_CLIPPED)) { - ED_base_object_select(base, select ? BA_SELECT : BA_DESELECT); + ED_object_base_select(base, select ? BA_SELECT : BA_DESELECT); } } if (vc->obact == base->object && (base->object->mode & OB_MODE_POSE)) { @@ -1078,7 +1079,7 @@ void VIEW3D_OT_select_menu(wmOperatorType *ot) static void deselectall_except(SceneLayer *sl, Base *b) /* deselect all except b */ { for (Base *base = sl->object_bases.first; base; base = base->next) { - if (base->flag_legacy & SELECT) { + if (base->flag & BASE_SELECTED) { if (b != base) { ED_object_base_select(base, BA_DESELECT); } @@ -1086,7 +1087,7 @@ static void deselectall_except(SceneLayer *sl, Base *b) /* deselect all except } } -static BaseLegacy *object_mouse_select_menu(bContext *C, ViewContext *vc, unsigned int *buffer, int hits, const int mval[2], short toggle) +static Base *object_mouse_select_menu(bContext *C, ViewContext *vc, unsigned int *buffer, int hits, const int mval[2], short toggle) { short baseCount = 0; bool ok; @@ -1275,12 +1276,11 @@ static short mixed_bones_object_selectbuffer( } /* returns basact */ -static BaseLegacy *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffer, int hits, - BaseLegacy *startbase, bool has_bones, bool do_nearest) +static Base *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffer, int hits, + Base *startbase, bool has_bones, bool do_nearest) { - Scene *scene = vc->scene; - View3D *v3d = vc->v3d; - BaseLegacy *base, *basact = NULL; + SceneLayer *sl = vc->sl; + Base *base, *basact = NULL; int a; if (do_nearest) { @@ -1299,7 +1299,7 @@ static BaseLegacy *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffe } else { /* only exclude active object when it is selected... */ - if (BASACT && (BASACT->flag_legacy & SELECT) && hits > 1) notcol = BASACT->selcol; + if (BASACT_NEW && (BASACT_NEW->flag & BASE_SELECTED) && hits > 1) notcol = BASACT_NEW->selcol; for (a = 0; a < hits; a++) { if (min > buffer[4 * a + 1] && notcol != (buffer[4 * a + 3] & 0xFFFF)) { @@ -1309,9 +1309,9 @@ static BaseLegacy *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffe } } - base = FIRSTBASE; + base = FIRSTBASE_NEW; while (base) { - if (BASE_SELECTABLE(v3d, base)) { + if (BASE_SELECTABLE_NEW(base)) { if (base->selcol == selcol) break; } base = base->next; @@ -1324,13 +1324,13 @@ static BaseLegacy *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffe while (base) { /* skip objects with select restriction, to prevent prematurely ending this loop * with an un-selectable choice */ - if (base->object->restrictflag & OB_RESTRICT_SELECT) { + if ((base->flag & BASE_SELECTABLED) == 0) { base = base->next; - if (base == NULL) base = FIRSTBASE; + if (base == NULL) base = FIRSTBASE_NEW; if (base == startbase) break; } - if (BASE_SELECTABLE(v3d, base)) { + if (BASE_SELECTABLE_NEW(base)) { for (a = 0; a < hits; a++) { if (has_bones) { /* skip non-bone objects */ @@ -1349,7 +1349,7 @@ static BaseLegacy *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffe if (basact) break; base = base->next; - if (base == NULL) base = FIRSTBASE; + if (base == NULL) base = FIRSTBASE_NEW; if (base == startbase) break; } } @@ -1358,10 +1358,10 @@ static BaseLegacy *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffe } /* mval comes from event->mval, only use within region handlers */ -BaseLegacy *ED_view3d_give_base_under_cursor(bContext *C, const int mval[2]) +Base *ED_view3d_give_base_under_cursor(bContext *C, const int mval[2]) { ViewContext vc; - BaseLegacy *basact = NULL; + Base *basact = NULL; unsigned int buffer[MAXPICKBUF]; int hits; bool do_nearest; @@ -1374,7 +1374,7 @@ BaseLegacy *ED_view3d_give_base_under_cursor(bContext *C, const int mval[2]) if (hits > 0) { const bool has_bones = selectbuffer_has_bones(buffer, hits); - basact = mouse_select_eval_buffer(&vc, buffer, hits, vc.scene->base.first, has_bones, do_nearest); + basact = mouse_select_eval_buffer(&vc, buffer, hits, vc.sl->object_bases.first, has_bones, do_nearest); } return basact; @@ -1521,7 +1521,7 @@ static bool ed_object_select_pick( } basact->flag |= BASE_SELECTED; - basact->object->flag = basact->flag_legacy; + BKE_scene_object_base_flag_sync_from_base(basact); retval = true; @@ -2031,7 +2031,7 @@ static int do_object_pose_box_select(bContext *C, ViewContext *vc, rcti *rect, b CTX_DATA_END; } else { - object_deselect_all_visible(vc->scene, vc->v3d); + object_deselect_all_visible(vc->sl); } } @@ -2786,22 +2786,22 @@ static void obedit_circle_select(ViewContext *vc, const bool select, const int m static bool object_circle_select(ViewContext *vc, const bool select, const int mval[2], float rad) { - Scene *scene = vc->scene; + SceneLayer *sl = vc->sl; const float radius_squared = rad * rad; const float mval_fl[2] = {mval[0], mval[1]}; bool changed = false; - const int select_flag = select ? SELECT : 0; + const int select_flag = select ? BASE_SELECTED : 0; - BaseLegacy *base; - for (base = FIRSTBASE; base; base = base->next) { - if (BASE_SELECTABLE(vc->v3d, base) && ((base->flag_legacy & SELECT) != select_flag)) { + Base *base; + for (base = FIRSTBASE_NEW; base; base = base->next) { + if (BASE_SELECTABLE_NEW(base) && ((base->flag & BASE_SELECTED) != select_flag)) { float screen_co[2]; if (ED_view3d_project_float_global(vc->ar, base->object->obmat[3], screen_co, V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN | V3D_PROJ_TEST_CLIP_NEAR) == V3D_PROJ_RET_OK) { if (len_squared_v2v2(mval_fl, screen_co) <= radius_squared) { - ED_base_object_select(base, select ? BA_SELECT : BA_DESELECT); + ED_object_base_select(base, select ? BA_SELECT : BA_DESELECT); changed = true; } } diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 137e8162aed..9c6c832188f 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -1091,26 +1091,26 @@ void view3d_viewmatrix_set(Scene *scene, const View3D *v3d, RegionView3D *rv3d) } } -static void view3d_select_loop(ViewContext *vc, Scene *scene, View3D *v3d, ARegion *ar, bool use_obedit_skip) +static void view3d_select_loop(ViewContext *vc, Scene *scene, SceneLayer *sl, View3D *v3d, ARegion *ar, bool use_obedit_skip) { short code = 1; char dt; short dtx; if (vc->obedit && vc->obedit->type == OB_MBALL) { - draw_object(scene, ar, v3d, BASACT, DRAW_PICKING | DRAW_CONSTCOLOR); + draw_object(scene, sl, ar, v3d, BASACT_NEW, DRAW_PICKING | DRAW_CONSTCOLOR); } else if ((vc->obedit && vc->obedit->type == OB_ARMATURE)) { /* if not drawing sketch, draw bones */ if (!BDR_drawSketchNames(vc)) { - draw_object(scene, ar, v3d, BASACT, DRAW_PICKING | DRAW_CONSTCOLOR); + draw_object(scene, sl, ar, v3d, BASACT_NEW, DRAW_PICKING | DRAW_CONSTCOLOR); } } else { - BaseLegacy *base; + Base *base; v3d->xray = true; /* otherwise it postpones drawing */ - for (base = scene->base.first; base; base = base->next) { + for (base = sl->object_bases.first; base; base = base->next) { if (base->lay & v3d->lay) { if ((base->object->restrictflag & OB_RESTRICT_SELECT) || @@ -1122,13 +1122,13 @@ static void view3d_select_loop(ViewContext *vc, Scene *scene, View3D *v3d, ARegi base->selcol = code; if (GPU_select_load_id(code)) { - draw_object(scene, ar, v3d, base, DRAW_PICKING | DRAW_CONSTCOLOR); + draw_object(scene, sl, ar, v3d, base, DRAW_PICKING | DRAW_CONSTCOLOR); /* we draw duplicators for selection too */ if ((base->object->transflag & OB_DUPLI)) { ListBase *lb; DupliObject *dob; - BaseLegacy tbase; + Base tbase; tbase.flag_legacy = OB_FROMDUPLI; lb = object_duplilist(G.main->eval_ctx, scene, base->object); @@ -1145,7 +1145,7 @@ static void view3d_select_loop(ViewContext *vc, Scene *scene, View3D *v3d, ARegi dt = tbase.object->dt; tbase.object->dt = MIN2(tbase.object->dt, base->object->dt); dtx = tbase.object->dtx; tbase.object->dtx = base->object->dtx; - draw_object(scene, ar, v3d, &tbase, DRAW_PICKING | DRAW_CONSTCOLOR); + draw_object(scene, sl, ar, v3d, &tbase, DRAW_PICKING | DRAW_CONSTCOLOR); tbase.object->dt = dt; tbase.object->dtx = dtx; @@ -1173,6 +1173,7 @@ static void view3d_select_loop(ViewContext *vc, Scene *scene, View3D *v3d, ARegi short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int bufsize, const rcti *input, bool do_nearest) { Scene *scene = vc->scene; + SceneLayer *sl = vc->sl; View3D *v3d = vc->v3d; ARegion *ar = vc->ar; rctf rect; @@ -1209,7 +1210,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b else GPU_select_begin(buffer, bufsize, &rect, GPU_SELECT_ALL, 0); - view3d_select_loop(vc, scene, v3d, ar, use_obedit_skip); + view3d_select_loop(vc, scene, sl, v3d, ar, use_obedit_skip); hits = GPU_select_end(); @@ -1217,7 +1218,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b if (do_passes) { GPU_select_begin(buffer, bufsize, &rect, GPU_SELECT_NEAREST_SECOND_PASS, hits); - view3d_select_loop(vc, scene, v3d, ar, use_obedit_skip); + view3d_select_loop(vc, scene, sl, v3d, ar, use_obedit_skip); GPU_select_end(); } diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index d60eb2f0778..3abd86384cc 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -464,6 +464,7 @@ typedef struct TransInfo { struct ScrArea *sa; struct ARegion *ar; struct Scene *scene; + struct SceneLayer *sl; struct ToolSettings *settings; struct wmTimer *animtimer; struct wmKeyMap *keymap; /* so we can do lookups for header text */ diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 4260b877e90..2e8d583b14d 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -72,6 +72,7 @@ #include "BKE_fcurve.h" #include "BKE_global.h" #include "BKE_gpencil.h" +#include "BKE_layer.h" #include "BKE_key.h" #include "BKE_main.h" #include "BKE_mesh.h" @@ -5352,20 +5353,20 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob) static void set_trans_object_base_flags(TransInfo *t) { Scene *scene = t->scene; - View3D *v3d = t->view; + SceneLayer *sl = t->sl; /* * if Base selected and has parent selected: - * base->flag = BA_WAS_SEL + * base->flag_legacy = BA_WAS_SEL */ - BaseLegacy *base; + Base *base; /* don't do it if we're not actually going to recalculate anything */ if (t->mode == TFM_DUMMY) return; /* makes sure base flags and object flags are identical */ - BKE_scene_base_flag_to_objects(t->scene); + BKE_scene_base_flag_to_objects(t->sl); /* Make sure depsgraph is here. */ DAG_scene_relations_update(G.main, t->scene); @@ -5378,19 +5379,19 @@ static void set_trans_object_base_flags(TransInfo *t) } } - for (base = scene->base.first; base; base = base->next) { + for (base = sl->object_bases.first; base; base = base->next) { base->flag_legacy &= ~BA_WAS_SEL; - if (TESTBASELIB_BGMODE(v3d, scene, base)) { + if (TESTBASELIB_BGMODE_NEW(base)) { Object *ob = base->object; Object *parsel = ob->parent; /* if parent selected, deselect */ while (parsel) { - if (parsel->flag & SELECT) { - BaseLegacy *parbase = BKE_scene_base_find(scene, parsel); + Base *parbase = BKE_scene_layer_base_find(sl, parsel); + if (parbase->flag & BASE_SELECTED) { if (parbase) { /* in rare cases this can fail */ - if (TESTBASELIB_BGMODE(v3d, scene, parbase)) { + if (TESTBASELIB_BGMODE_NEW(parbase)) { break; } } @@ -5406,7 +5407,7 @@ static void set_trans_object_base_flags(TransInfo *t) base->flag_legacy |= BA_TRANSFORM_CHILD; } else { - base->flag_legacy &= ~SELECT; + base->flag &= ~BASE_SELECTED; base->flag_legacy |= BA_WAS_SEL; } } @@ -5416,7 +5417,7 @@ static void set_trans_object_base_flags(TransInfo *t) /* and we store them temporal in base (only used for transform code) */ /* this because after doing updates, the object->recalc is cleared */ - for (base = scene->base.first; base; base = base->next) { + for (base = sl->object_bases.first; base; base = base->next) { if (base->object->recalc & OB_RECALC_OB) base->flag_legacy |= BA_HAS_RECALC_OB; if (base->object->recalc & OB_RECALC_DATA) @@ -5506,12 +5507,13 @@ static int count_proportional_objects(TransInfo *t) static void clear_trans_object_base_flags(TransInfo *t) { - Scene *sce = t->scene; - BaseLegacy *base; + SceneLayer *sl = t->sl; + Base *base; - for (base = sce->base.first; base; base = base->next) { - if (base->flag_legacy & BA_WAS_SEL) - base->flag_legacy |= SELECT; + for (base = sl->object_bases.first; base; base = base->next) { + if (base->flag_legacy & BA_WAS_SEL) { + base->flag |= BASE_SELECTED; + } base->flag_legacy &= ~(BA_WAS_SEL | BA_HAS_RECALC_OB | BA_HAS_RECALC_DATA | BA_TEMP_TAG | BA_TRANSFORM_CHILD | BA_TRANSFORM_PARENT); } diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 7351214f4ee..b92c075a9c7 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1108,6 +1108,7 @@ static int initTransInfo_edit_pet_to_flag(const int proportional) void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *event) { Scene *sce = CTX_data_scene(C); + SceneLayer *sl = CTX_data_scene_layer(C); ToolSettings *ts = CTX_data_tool_settings(C); ARegion *ar = CTX_wm_region(C); ScrArea *sa = CTX_wm_area(C); @@ -1117,6 +1118,7 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve PropertyRNA *prop; t->scene = sce; + t->sl = sl; t->sa = sa; t->ar = ar; t->obedit = obedit; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index c0810961529..29d96b900a0 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1989,6 +1989,10 @@ extern const char *RE_engine_id_CYCLES; (base->lay & (v3d ? v3d->lay : scene->lay)) && \ (base->object->restrictflag & OB_RESTRICT_VIEW) == 0) +#define TESTBASELIB_BGMODE_NEW(base) ( \ + ((base->flag & BASE_SELECTED) != 0) && \ + ((base->object->id.lib == NULL) && \ + ((base->flag & BASE_VISIBLED) != 0))) #define BASE_SELECTABLE_NEW(base) \ ((base->flag & BASE_SELECTABLED) != 0) |