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.
This commit is contained in:
Dalai Felinto
2017-02-08 12:26:41 +01:00
parent d4913af846
commit a38298f4dd
15 changed files with 163 additions and 147 deletions

View File

@@ -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);

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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();
}

View File

@@ -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 */

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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)