diff --git a/include/bg/polygon.h b/include/bg/polygon.h index 02ba4c39c4e..a6300fc9901 100644 --- a/include/bg/polygon.h +++ b/include/bg/polygon.h @@ -340,7 +340,7 @@ struct bv_polygon { // // v->gv_width = dm_get_width((struct dm *)v->dmp); // v->gv_height = dm_get_height((struct dm *)v->dmp); -BG_EXPORT extern struct bv_scene_obj *bv_create_polygon(struct bview *v, int type, int x, int y); +BG_EXPORT extern struct bv_scene_obj *bv_create_polygon(struct bview *v, int type, int x, int y, struct bv_scene_obj *free_scene_obj); // Various update modes have similar logic - we pass in the flags to the update // routine to enable/disable specific portions of the overall flow. diff --git a/include/bv.h b/include/bv.h index eba5de9a45a..f3c3f0d21ac 100644 --- a/include/bv.h +++ b/include/bv.h @@ -44,7 +44,6 @@ #include "./bv/adc.h" #include "./bv/util.h" #include "./bv/vlist.h" -#include "./bv/view_sets.h" #endif /* BV_H */ diff --git a/include/bv/CMakeLists.txt b/include/bv/CMakeLists.txt index 111e1cbac17..f4dd31bb03d 100644 --- a/include/bv/CMakeLists.txt +++ b/include/bv/CMakeLists.txt @@ -9,7 +9,6 @@ set(bv_headers util.h vectfont.h vlist.h - view_sets.h ) BRLCAD_MANAGE_FILES(bv_headers ${INCLUDE_DIR}/brlcad/bv) diff --git a/include/bv/defines.h b/include/bv/defines.h index 44df5c2a522..0d7bf6e9ae0 100644 --- a/include/bv/defines.h +++ b/include/bv/defines.h @@ -212,15 +212,6 @@ struct bv_obj_settings { struct bview; -#define BV_SCENE_OBJ_DB 0 -#define BV_SCENE_OBJ_VIEW 1 -#define BV_SCENE_OBJ_DB_LOCAL 2 -#define BV_SCENE_OBJ_VIEW_LOCAL 3 - -#define BV_DB_OBJS 0x01 -#define BV_VIEW_OBJS 0x02 -#define BV_SHARED_OBJS 0x04 - struct bv_scene_obj { struct bu_list l; @@ -287,19 +278,9 @@ struct bv_scene_obj { /* Child objects of this object */ struct bu_ptbl children; - /* Object level pointers to parent containers. These are stored so - * that the object itself knows everything needed for data manipulation - * and it is unnecessary to explicitly pass other parameters. */ - - /* Reusable vlists */ - struct bu_list *vlfree; - /* Container for reusing bv_scene_obj allocations */ struct bv_scene_obj *free_scene_obj; - /* View container containing this object */ - struct bu_ptbl *otbl; - /* For more specialized routines not using vlists, we may need * additional drawing data associated with a scene object */ void *draw_data; @@ -432,7 +413,7 @@ struct bview_objs { // Container for db object groups unique to this view (typical use case is // adaptive plotting, where geometry wireframes may differ from view to // view and thus need unique vlists.) - struct bu_ptbl *db_objs; + struct bu_ptbl *view_grps; // Container for storing bv_scene_obj elements unique to this view. struct bu_ptbl *view_objs; @@ -545,11 +526,22 @@ struct bview { // Because bview instances frequently share objects in applications, they are // not always fully independent - we define a container and some basic // operations to manage this. -struct bview_set_internal; struct bview_set { - struct bview_set_internal *i; + struct bu_ptbl views; + struct bu_ptbl shared_db_objs; + struct bu_ptbl shared_view_objs; struct bview_settings settings; + + struct bv_scene_obj *free_scene_obj; + struct bu_list vlfree; }; +BV_EXPORT void +bv_set_init(struct bview_set *s); +BV_EXPORT void +bv_set_free(struct bview_set *s); + +BV_EXPORT void +bv_set_add(struct bview_set *s, struct bview *v); #endif /* BV_DEFINES_H */ diff --git a/include/bv/util.h b/include/bv/util.h index b810da015a8..9ec5dcebf5f 100644 --- a/include/bv/util.h +++ b/include/bv/util.h @@ -70,10 +70,6 @@ BV_EXPORT extern unsigned long long bv_hash(struct bview *v); /* Return a hash of the contents of a display list. Returns 0 on failure. */ BV_EXPORT extern unsigned long long bv_dl_hash(struct display_list *dl); -/* Return number of objects defined in any object container - * known to this view (0 if completely cleared). */ -BV_EXPORT size_t -bv_clear(struct bview *v, int flags); /* Note that some of these are mutually exclusive as far as producing any * changes - a simultaneous constraint in X and Y, for example, results in a @@ -101,6 +97,12 @@ BV_EXPORT extern int bv_adjust(struct bview *v, int dx, int dy, point_t keypoint * calculation is impossible), else 0. */ BV_EXPORT extern int bv_screen_to_view(struct bview *v, fastf_t *fx, fastf_t *fy, fastf_t x, fastf_t y); +/* Initialize a scene object to standard default settings */ +BV_EXPORT extern void bv_scene_obj_init(struct bv_scene_obj *s, struct bv_scene_obj *free_scene_obj); + +/* Free the object contents, including all child objects */ +BV_EXPORT extern void bv_scene_obj_free(struct bv_scene_obj *s, struct bv_scene_obj *free_scene_obj); + /* Compute the min, max, and center points of the scene object. * Return 1 if a bound was computed, else 0 */ BV_EXPORT extern int bv_scene_obj_bound(struct bv_scene_obj *s); @@ -109,47 +111,6 @@ BV_EXPORT extern int bv_scene_obj_bound(struct bv_scene_obj *s); * the vlist points in s in the context of view v */ BV_EXPORT extern fastf_t bv_vZ_calc(struct bv_scene_obj *s, struct bview *v, int mode); - -/* Given a view, create an object of the specified type. Issues such as memory - * management as a function of view settings are handled internally, so client - * codes don't need to manage it. */ -BV_EXPORT struct bv_scene_obj * -bv_obj_get(struct bview *v, int type); - -/* Given an object, create an object that is a child of that object. Issues - * such as memory management as a function of view settings are handled - * internally, so client codes don't need to manage it. */ -BV_EXPORT struct bv_scene_obj * -bv_obj_get_child(struct bv_scene_obj *s); - -/* Clear the contents of an object (including releasing its children), but keep - * it active in the view. Generally used when redrawing an object */ -BV_EXPORT void -bv_obj_reset(struct bv_scene_obj *s); - -/* Release an object to the internal pools. */ -BV_EXPORT void -bv_obj_put(struct bv_scene_obj *o); - -/* Given a scene object and a name vname, glob match child names and uuids to - * attempt to locate a child of s that matches vname */ -BV_EXPORT struct bv_scene_obj * -bv_find_child(struct bv_scene_obj *s, const char *vname); - -/* Given a view and a name vname, glob match names and uuids to attempt to - * locate a scene object in v that matches vname. - * - * NOTE - currently this is searching the top level objects, but does not walk - * down into their children. May want to support that in the future... */ -BV_EXPORT struct bv_scene_obj * -bv_find_obj(struct bview *v, const char *vname); - -/* For the given view, return a pointer to the bu_ptbl holding active scene - * objects with the specified type */ -BV_EXPORT struct bu_ptbl * -bv_view_objs(struct bview *v, int type); - - __END_DECLS /** @} */ diff --git a/include/bv/view_sets.h b/include/bv/view_sets.h deleted file mode 100644 index 04231ca13ee..00000000000 --- a/include/bv/view_sets.h +++ /dev/null @@ -1,93 +0,0 @@ -/* V I E W _ S E T S . H - * BRL-CAD - * - * Copyright (c) 1993-2022 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @addtogroup bv_util - * - * In applications with multiple views, those views typically share common - * scene objects and memory. To manage this sharing, we define view sets. - */ -/** @{ */ -/** @file bv/view_sets.h */ - -#ifndef BV_VIEW_SETS_H -#define BV_VIEW_SETS_H - -#include "common.h" -#include "bv/defines.h" - -__BEGIN_DECLS - -/** - * Initialize an empty view set - */ -BV_EXPORT void -bv_set_init(struct bview_set *s); - -/** - * Free view set - */ -BV_EXPORT void -bv_set_free(struct bview_set *s); - -/** - * Add view v to set s, handling shared memory assignments. - */ -BV_EXPORT void -bv_set_add_view(struct bview_set *s, struct bview *v); - -/** - * Remove view v from set s - */ -BV_EXPORT void -bv_set_rm_view(struct bview_set *s, struct bview *v); - -/** - * Return a bu_ptbl holding pointers to all views in set s - */ -BV_EXPORT struct bu_ptbl * -bv_set_views(struct bview_set *s); - -/** - * Return a pointer to the view with name vname, if it is present in s. If not - * found, returns NULL - */ -BV_EXPORT struct bview * -bv_set_find_view(struct bview_set *s, const char *vname); - - -// Expose free_scene_obj for older codes - do not use in new coding -BV_EXPORT struct bv_scene_obj * -bv_set_fsos(struct bview_set *s); - - -__END_DECLS - -/** @} */ - -#endif /* BV_VIEW_SETS_H */ - -/* - * Local Variables: - * mode: C - * tab-width: 8 - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ diff --git a/include/bv/vlist.h b/include/bv/vlist.h index a76f66c0d2e..cc410108559 100644 --- a/include/bv/vlist.h +++ b/include/bv/vlist.h @@ -316,10 +316,6 @@ BV_EXPORT extern void bv_vlblock_to_objs(struct bu_ptbl *out, struct bv_scene_obj *f, struct bu_list *vlfree); - -BV_EXPORT extern struct bv_scene_obj * -bv_vlblock_obj(struct bv_vlblock *vbp, struct bview *v, const char *name); - /** * Output a vlist as an extended 3-D floating point UNIX-Plot file. * You provide the file. Uses libplot3 routines to create the diff --git a/include/ged/view.h b/include/ged/view.h index ff42eace13a..64bb8f0427f 100644 --- a/include/ged/view.h +++ b/include/ged/view.h @@ -150,6 +150,8 @@ GED_EXPORT extern struct bg_polygon *ged_import_polygon(struct ged *gedp, const GED_EXPORT extern int ged_polygons_overlap(struct ged *gedp, struct bg_polygon *polyA, struct bg_polygon *polyB); GED_EXPORT extern void ged_polygon_fill_segments(struct ged *gedp, struct bg_polygon *poly, vect2d_t vfilldir, fastf_t vfilldelta); +GED_EXPORT extern struct bview * ged_find_view(struct ged *gedp, const char *key); + __END_DECLS #endif /* GED_VIEW_H */ diff --git a/include/rt/primitives/sketch.h b/include/rt/primitives/sketch.h index c617c9c3667..b0a6b2b0019 100644 --- a/include/rt/primitives/sketch.h +++ b/include/rt/primitives/sketch.h @@ -63,7 +63,7 @@ RT_EXPORT extern int curve_to_tcl_list(struct bu_vls *vls, struct rt_curve *crv); RT_EXPORT extern struct bv_scene_obj * -db_sketch_to_scene_obj(const char *sname, struct db_i *dbip, struct directory *dp, struct bview *sv); +db_sketch_to_scene_obj(const char *sname, struct db_i *dbip, struct directory *dp, struct bview *sv, struct bv_scene_obj *free_scene_obj); RT_EXPORT extern struct directory * db_scene_obj_to_sketch(struct db_i *dbip, const char *sname, struct bv_scene_obj *s); diff --git a/src/libbg/polygon_bview.c b/src/libbg/polygon_bview.c index b09be3c25d5..f547ccc54c0 100644 --- a/src/libbg/polygon_bview.c +++ b/src/libbg/polygon_bview.c @@ -38,6 +38,18 @@ #include "bg/plane.h" #include "bg/polygon.h" +#define GET_BV_SCENE_OBJ(p, fp) { \ + if (BU_LIST_IS_EMPTY(fp)) { \ + BU_ALLOC((p), struct bv_scene_obj); \ + } else { \ + p = BU_LIST_NEXT(bv_scene_obj, fp); \ + BU_LIST_DEQUEUE(&((p)->l)); \ + } \ + BU_LIST_INIT( &((p)->s_vlist) ); } + +#define FREE_BV_SCENE_OBJ(p, fp) { \ + BU_LIST_APPEND(fp, &((p)->l)); } + void bv_polygon_contour(struct bv_scene_obj *s, struct bg_poly_contour *c, int curr_c, int curr_i, int do_pnt) { @@ -45,7 +57,7 @@ bv_polygon_contour(struct bv_scene_obj *s, struct bg_poly_contour *c, int curr_c return; if (do_pnt) { - BV_ADD_VLIST(s->vlfree, &s->s_vlist, c->point[0], BV_VLIST_POINT_DRAW); + BV_ADD_VLIST(&s->s_v->vset->vlfree, &s->s_vlist, c->point[0], BV_VLIST_POINT_DRAW); return; } @@ -72,9 +84,15 @@ bv_fill_polygon(struct bv_scene_obj *s) return; // free old fill, if present - struct bv_scene_obj *fobj = bv_find_child(s, "*fill*"); - if (fobj) - bv_obj_put(fobj); + struct bv_scene_obj *fobj = NULL; + for (size_t i = 0; i < BU_PTBL_LEN(&s->children); i++) { + struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&s->children, i); + if (BU_STR_EQUAL(bu_vls_cstr(&s_c->s_uuid), "fill")) { + fobj = s_c; + BV_FREE_VLIST(&s->s_v->gv_objs.gv_vlfree, &s_c->s_vlist); + break; + } + } struct bv_polygon *p = (struct bv_polygon *)s->s_i_data; @@ -90,10 +108,17 @@ bv_fill_polygon(struct bv_scene_obj *s) return; // Got fill, create lines - fobj = bv_obj_get_child(s); - bu_vls_printf(&fobj->s_uuid, ":fill"); - fobj->s_os.s_line_width = 1; - fobj->s_soldash = 0; + if (!fobj) { + GET_BV_SCENE_OBJ(fobj, &s->free_scene_obj->l); + fobj->free_scene_obj = s->free_scene_obj; + BU_LIST_INIT(&(fobj->s_vlist)); + bu_vls_init(&fobj->s_uuid); + bu_vls_sprintf(&fobj->s_uuid, "fill"); + fobj->s_os.s_line_width = 1; + fobj->s_soldash = 0; + fobj->s_v = s->s_v; + bu_ptbl_ins(&s->children, (long *)fobj); + } bu_color_to_rgb_chars(&p->fill_color, fobj->s_color); for (size_t i = 0; i < fill->num_contours; i++) { bv_polygon_contour(fobj, &fill->contour[i], 0, -1, 0); @@ -106,12 +131,20 @@ bv_polygon_vlist(struct bv_scene_obj *s) if (!s) return; - // Reset obj drawing data - bv_obj_reset(s); + // free old s->s_vlist + BV_FREE_VLIST(&s->s_v->gv_objs.gv_vlfree, &s->s_vlist); + for (size_t i = 0; i < BU_PTBL_LEN(&s->children); i++) { + struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&s->children, i); + BV_FREE_VLIST(&s->s_v->gv_objs.gv_vlfree, &s_c->s_vlist); + // TODO - free bv_scene_obj itself (ptbls, etc.) + } + struct bv_polygon *p = (struct bv_polygon *)s->s_i_data; int type = p->type; + BU_LIST_INIT(&(s->s_vlist)); + for (size_t i = 0; i < p->polygon.num_contours; ++i) { /* Draw holes using segmented lines. Since vlists don't have a style * command for that, we make child scene objects for the holes. */ @@ -135,7 +168,11 @@ bv_polygon_vlist(struct bv_scene_obj *s) } if (p->polygon.hole[i]) { - struct bv_scene_obj *s_c = bv_obj_get_child(s); + struct bv_scene_obj *s_c; + GET_BV_SCENE_OBJ(s_c, &s->free_scene_obj->l); + s_c->free_scene_obj = s->free_scene_obj; + BU_LIST_INIT(&(s_c->s_vlist)); + BU_VLS_INIT(&(s_c->s_uuid)); s_c->s_soldash = 1; s_c->s_color[0] = s->s_color[0]; s_c->s_color[1] = s->s_color[1]; @@ -156,10 +193,16 @@ bv_polygon_vlist(struct bv_scene_obj *s) } struct bv_scene_obj * -bv_create_polygon(struct bview *v, int type, int x, int y) +bv_create_polygon(struct bview *v, int type, int x, int y, struct bv_scene_obj *free_scene_obj) { - struct bv_scene_obj *s = bv_obj_get(v, BV_SCENE_OBJ_VIEW); + struct bv_scene_obj *s; + GET_BV_SCENE_OBJ(s, &free_scene_obj->l); + s->free_scene_obj = free_scene_obj; + s->s_v = v; + s->s_type_flags |= BV_VIEWONLY; s->s_type_flags |= BV_POLYGONS; + BU_LIST_INIT(&(s->s_vlist)); + BU_PTBL_INIT(&s->children); struct bv_polygon *p; BU_GET(p, struct bv_polygon); @@ -852,7 +895,7 @@ bg_dup_view_polygon(const char *nname, struct bv_scene_obj *s) // TODO - fix this... // ip->v.gv_objs.vlfree = &s->s_v->vset->vlfree; - struct bv_scene_obj *np = bv_create_polygon(&ip->v, ip->type, ip->v.gv_prevMouseX, ip->v.gv_prevMouseY); + struct bv_scene_obj *np = bv_create_polygon(&ip->v, ip->type, ip->v.gv_prevMouseX, ip->v.gv_prevMouseY, s->free_scene_obj); // Internal "creation" view is defined - now set the working view that s is // using for normal operations. diff --git a/src/libbv/CMakeLists.txt b/src/libbv/CMakeLists.txt index e669ce1cd64..db2c323662e 100644 --- a/src/libbv/CMakeLists.txt +++ b/src/libbv/CMakeLists.txt @@ -29,7 +29,6 @@ set(LIBBV_SRCS tig/vector.c util.c vlist.c - view_sets.c ) BRLCAD_ADDLIB(libbv "${LIBBV_SRCS}" "libbn;libbu") @@ -40,7 +39,6 @@ add_subdirectory(tests) CMAKEFILES( CMakeLists.txt TODO - bv_private.h ) # Local Variables: diff --git a/src/libbv/bv_private.h b/src/libbv/bv_private.h deleted file mode 100644 index b2de16403b3..00000000000 --- a/src/libbv/bv_private.h +++ /dev/null @@ -1,52 +0,0 @@ -/* B V _ P R I V A T E . C - * BRL-CAD - * - * Copyright (c) 2020-2022 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @file bv_private.h - * - * Internal shared data structures - * - */ - -#include "common.h" -#include "bu/list.h" -#include "bu/ptbl.h" -#include "bv/defines.h" - -__BEGIN_DECLS - -struct bview_set_internal { - struct bu_ptbl views; - struct bu_ptbl shared_db_objs; - struct bu_ptbl shared_view_objs; - - struct bv_scene_obj *free_scene_obj; - struct bu_list vlfree; -}; - -__END_DECLS - -/* - * Local Variables: - * tab-width: 8 - * mode: C - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ diff --git a/src/libbv/hash.c b/src/libbv/hash.c index df29960bcc0..14be3c7d468 100644 --- a/src/libbv/hash.c +++ b/src/libbv/hash.c @@ -32,7 +32,6 @@ #include "bv/vlist.h" #include "bv/defines.h" #include "bv/util.h" -#include "bv/view_sets.h" #define XXH_STATIC_LINKING_ONLY #define XXH_IMPLEMENTATION #include "xxhash.h" @@ -311,9 +310,8 @@ bv_hash(struct bview *v) _bv_other_state_hash(state, &v->gv_tcl.gv_prim_labels); if (v->vset) { - struct bu_ptbl *db_objs = bv_view_objs(v, BV_SCENE_OBJ_DB); - for (size_t i = 0; i < BU_PTBL_LEN(db_objs); i++) { - struct bv_scene_group *g = (struct bv_scene_group *)BU_PTBL_GET(db_objs, i); + for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->shared_db_objs); i++) { + struct bv_scene_group *g = (struct bv_scene_group *)BU_PTBL_GET(&v->vset->shared_db_objs, i); if (BU_PTBL_IS_INITIALIZED(&g->children)) { for (size_t j = 0; j < BU_PTBL_LEN(&g->children); j++) { struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&g->children, j); @@ -322,9 +320,8 @@ bv_hash(struct bview *v) } bv_scene_obj_hash(state, g); } - struct bu_ptbl *view_objs = bv_view_objs(v, BV_SCENE_OBJ_VIEW); - for (size_t i = 0; i < BU_PTBL_LEN(view_objs); i++) { - struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(view_objs, i); + for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->shared_view_objs); i++) { + struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(&v->vset->shared_view_objs, i); if (BU_PTBL_IS_INITIALIZED(&s->children)) { for (size_t j = 0; j < BU_PTBL_LEN(&s->children); j++) { struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&s->children, j); @@ -335,8 +332,8 @@ bv_hash(struct bview *v) } } - for (size_t i = 0; i < BU_PTBL_LEN(v->gv_objs.db_objs); i++) { - struct bv_scene_group *g = (struct bv_scene_group *)BU_PTBL_GET(v->gv_objs.db_objs, i); + for (size_t i = 0; i < BU_PTBL_LEN(v->gv_objs.view_grps); i++) { + struct bv_scene_group *g = (struct bv_scene_group *)BU_PTBL_GET(v->gv_objs.view_grps, i); if (BU_PTBL_IS_INITIALIZED(&g->children)) { for (size_t j = 0; j < BU_PTBL_LEN(&g->children); j++) { struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&g->children, j); diff --git a/src/libbv/util.c b/src/libbv/util.c index 62d408ac27b..6b9b0771b3a 100644 --- a/src/libbv/util.c +++ b/src/libbv/util.c @@ -28,15 +28,12 @@ #include "vmath.h" #include "bu/log.h" #include "bu/malloc.h" -#include "bu/path.h" #include "bu/ptbl.h" #include "bu/str.h" #include "bn/mat.h" -#include "bv/defines.h" #include "bv/vlist.h" +#include "bv/defines.h" #include "bv/util.h" -#include "bv/view_sets.h" -#include "./bv_private.h" void bv_init(struct bview *gvp, struct bview_set *s) @@ -92,10 +89,10 @@ bv_init(struct bview *gvp, struct bview_set *s) VSET(gvp->gv_tcl.gv_prim_labels.gos_text_color, 255, 255, 0); - // gv_objs.db_objs is local to this view and thus is controlled + // gv_objs.view_grps is local to this view and thus is controlled // by the bv init and free routines. - BU_GET(gvp->gv_objs.db_objs, struct bu_ptbl); - bu_ptbl_init(gvp->gv_objs.db_objs, 8, "view_objs init"); + BU_GET(gvp->gv_objs.view_grps, struct bu_ptbl); + bu_ptbl_init(gvp->gv_objs.view_grps, 8, "view_objs init"); // gv_objs.view_objs is local to this view and thus is controlled // by the bv init and free routines. @@ -120,8 +117,8 @@ bv_free(struct bview *gvp) return; bu_vls_free(&gvp->gv_name); - bu_ptbl_free(gvp->gv_objs.db_objs); - BU_PUT(gvp->gv_objs.db_objs, struct bu_ptbl); + bu_ptbl_free(gvp->gv_objs.view_grps); + BU_PUT(gvp->gv_objs.view_grps, struct bu_ptbl); bu_ptbl_free(gvp->gv_objs.view_objs); BU_PUT(gvp->gv_objs.view_objs, struct bu_ptbl); @@ -489,138 +486,18 @@ bv_screen_to_view(struct bview *v, fastf_t *fx, fastf_t *fy, fastf_t x, fastf_t return 0; } -size_t -bv_clear(struct bview *v, int flags) -{ - struct bu_ptbl *sg = NULL; - struct bu_ptbl *sv = NULL; - if (!flags || flags & BV_DB_OBJS) { - sg = v->gv_objs.db_objs; - if (sg) { - for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { - struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); - bv_obj_put(cg); - } - bu_ptbl_reset(sg); - } - if ((!flags && !v->independent) || flags & BV_SHARED_OBJS) { - sg = bv_view_objs(v, BV_SCENE_OBJ_DB); - if (sg) { - for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { - struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); - bv_obj_put(cg); - } - bu_ptbl_reset(sg); - } - } - } - if (!flags || flags & BV_VIEW_OBJS) { - sv = v->gv_objs.view_objs; - if (sv) { - for (long i = (long)BU_PTBL_LEN(sv) - 1; i >= 0; i--) { - struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(sv, i); - bv_obj_put(s); - } - } - if ((!flags && !v->independent) || flags & BV_SHARED_OBJS) { - sv = bv_view_objs(v, BV_SCENE_OBJ_VIEW); - if (sv) { - for (long i = (long)BU_PTBL_LEN(sv) - 1; i >= 0; i--) { - struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(sv, i); - bv_obj_put(s); - } - bu_ptbl_reset(sv); - } - } - } - - size_t ocnt = BU_PTBL_LEN(v->gv_objs.db_objs) + BU_PTBL_LEN(v->gv_objs.view_objs); - if (!v->independent) { - sg = bv_view_objs(v, BV_SCENE_OBJ_DB); - if (sg) - ocnt += BU_PTBL_LEN(sg); - sv = bv_view_objs(v, BV_SCENE_OBJ_VIEW); - if (sv) - ocnt += BU_PTBL_LEN(sv); - } - return ocnt ; - -} - -struct bv_scene_obj * -bv_obj_get(struct bview *v, int type) +void +bv_scene_obj_init(struct bv_scene_obj *s, struct bv_scene_obj *free_scene_obj) { - if (!v) - return NULL; - - struct bv_scene_obj *s = NULL; - struct bu_ptbl *otbl = NULL; - - // What we get and from where is based on the requested obj type and the - // view type. If the caller is not asking for a local object, we will try - // to get a shared object. If the view has no associated set then the only - // available storage is the local storage, and that will be used instead. - // If a local object is requested, then the local storage is used - // regardless of whether or not a shared repository is available. - struct bv_scene_obj *free_scene_obj = NULL; - struct bu_list *vlfree = NULL; - if (type == BV_SCENE_OBJ_DB || type == BV_SCENE_OBJ_VIEW) { - if (v->vset) { - free_scene_obj = v->vset->i->free_scene_obj; - if (type == BV_SCENE_OBJ_DB) { - otbl = &v->vset->i->shared_db_objs; - } else { - otbl = &v->vset->i->shared_view_objs; - } - vlfree = &v->vset->i->vlfree; - } else { - free_scene_obj = v->gv_objs.free_scene_obj; - if (type == BV_SCENE_OBJ_DB) { - otbl = v->gv_objs.db_objs; - } else { - otbl = v->gv_objs.view_objs; - } - vlfree = &v->gv_objs.gv_vlfree; - } - } - if (type == BV_SCENE_OBJ_DB_LOCAL || type == BV_SCENE_OBJ_VIEW_LOCAL) { - free_scene_obj = v->gv_objs.free_scene_obj; - if (type == BV_SCENE_OBJ_DB_LOCAL) { - otbl = v->gv_objs.db_objs; - } else { - otbl = v->gv_objs.view_objs; - } - } - if (!free_scene_obj) - return NULL; - - // We know where we're going to get the object from - get it - if (BU_LIST_IS_EMPTY(&free_scene_obj->l)) { - BU_ALLOC((s), struct bv_scene_obj); - } else { - s = BU_LIST_NEXT(bv_scene_obj, &free_scene_obj->l); - BU_LIST_DEQUEUE(&((s)->l)); - } - BU_LIST_INIT( &((s)->s_vlist) ); - - // Do the initializations s->s_type_flags = 0; BU_LIST_INIT(&(s->s_vlist)); BU_VLS_INIT(&s->s_name); bu_vls_trunc(&s->s_name, 0); BU_VLS_INIT(&s->s_uuid); - if (type == BV_SCENE_OBJ_DB && v->vset) - bu_vls_sprintf(&s->s_uuid, "s:%zd", BU_PTBL_LEN(otbl)); - if (type == BV_SCENE_OBJ_DB_LOCAL) - bu_vls_sprintf(&s->s_uuid, "sl:%zd", BU_PTBL_LEN(otbl)); - if (type == BV_SCENE_OBJ_VIEW && v->vset) - bu_vls_sprintf(&s->s_uuid, "v:%zd", BU_PTBL_LEN(otbl)); - if (type == BV_SCENE_OBJ_VIEW_LOCAL) - bu_vls_sprintf(&s->s_uuid, "vl:%zd", BU_PTBL_LEN(otbl)); bu_vls_trunc(&s->s_uuid, 0); MAT_IDN(s->s_mat); - s->s_v = v; + s->s_v = NULL; s->s_i_data = NULL; s->s_update_callback = NULL; @@ -644,82 +521,19 @@ bv_obj_get(struct bview *v, int type) bu_ptbl_reset(&s->children); s->free_scene_obj = free_scene_obj; - s->vlfree = vlfree; - s->otbl = otbl; - - bu_ptbl_ins(otbl, (long *)s); - - return s; } -struct bv_scene_obj * -bv_obj_get_child(struct bv_scene_obj *sp) -{ - if (!sp) - return NULL; - - struct bv_scene_obj *s = NULL; - - // Children use their parent's info - if (BU_LIST_IS_EMPTY(&sp->free_scene_obj->l)) { - BU_ALLOC((s), struct bv_scene_obj); - } else { - s = BU_LIST_NEXT(bv_scene_obj, &sp->free_scene_obj->l); - BU_LIST_DEQUEUE(&((s)->l)); - } - BU_LIST_INIT( &((s)->s_vlist) ); - - // Do the initializations - s->s_type_flags = 0; - BU_LIST_INIT(&(s->s_vlist)); - if (!BU_VLS_IS_INITIALIZED(&s->s_name)) - BU_VLS_INIT(&s->s_name); - bu_vls_trunc(&s->s_name, 0); - if (!BU_VLS_IS_INITIALIZED(&s->s_uuid)) - BU_VLS_INIT(&s->s_uuid); - bu_vls_sprintf(&s->s_uuid, "child:%s:%zd", bu_vls_cstr(&sp->s_uuid), BU_PTBL_LEN(&sp->children)); - MAT_IDN(s->s_mat); - - s->s_v = sp->s_v; - - s->s_i_data = NULL; - s->s_update_callback = NULL; - s->s_free_callback = NULL; - - s->adaptive_wireframe = 0; - s->view_scale = 0.0; - - s->s_flag = UP; - s->s_iflag = DOWN; - VSET(s->s_color, 255, 0, 0); - s->s_soldash = 0; - s->s_arrow = 0; - - struct bv_obj_settings defaults = BV_OBJ_SETTINGS_INIT; - bv_obj_settings_sync(&s->s_os, &defaults); - - if (!BU_PTBL_IS_INITIALIZED(&s->children)) { - BU_PTBL_INIT(&s->children); - } - bu_ptbl_reset(&s->children); - - s->free_scene_obj = sp->free_scene_obj; - s->vlfree = sp->vlfree; - s->otbl = &sp->children; - - bu_ptbl_ins(&sp->children, (long *)s); - - return s; -} +#define FREE_BV_SCENE_OBJ(p, fp) { \ + BU_LIST_APPEND(fp, &((p)->l)); } void -bv_obj_reset(struct bv_scene_obj *s) +bv_scene_obj_free(struct bv_scene_obj *s, struct bv_scene_obj *free_scene_obj) { // handle children if (BU_PTBL_IS_INITIALIZED(&s->children)) { for (size_t i = 0; i < BU_PTBL_LEN(&s->children); i++) { struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&s->children, i); - bv_obj_put(s_c); + bv_scene_obj_free(s_c, free_scene_obj); } bu_ptbl_reset(&s->children); } @@ -730,105 +544,11 @@ bv_obj_reset(struct bv_scene_obj *s) // free vlist if (BU_LIST_IS_INITIALIZED(&s->s_vlist)) { - BV_FREE_VLIST(s->vlfree, &s->s_vlist); + BV_FREE_VLIST(&s->s_v->gv_objs.gv_vlfree, &s->s_vlist); } - BU_LIST_INIT(&(s->s_vlist)); -} -#define FREE_BV_SCENE_OBJ(p, fp) { \ - BU_LIST_APPEND(fp, &((p)->l)); } - -void -bv_obj_put(struct bv_scene_obj *s) -{ - bv_obj_reset(s); - - // Clear names - bu_vls_trunc(&s->s_uuid, 0); - bu_vls_trunc(&s->s_name, 0); - - bu_ptbl_rm(s->otbl, (long *)s); - - FREE_BV_SCENE_OBJ(s, &s->free_scene_obj->l); -} - -struct bv_scene_obj * -bv_find_obj(struct bview *v, const char *name) -{ - if (!v || !name) - return NULL; - - // First look for matches in shared sets, if any are defined - if (!v->independent && v->vset) { - for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->i->shared_db_objs); i++) { - struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&v->vset->i->shared_db_objs, i); - if (!bu_path_match(name, bu_vls_cstr(&s_c->s_name), 0)) - return s_c; - } - for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->i->shared_view_objs); i++) { - struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&v->vset->i->shared_view_objs, i); - if (!bu_path_match(name, bu_vls_cstr(&s_c->s_name), 0)) - return s_c; - } - } - - // Next look locally - for (size_t i = 0; i < BU_PTBL_LEN(v->gv_objs.db_objs); i++) { - struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(v->gv_objs.db_objs, i); - if (!bu_path_match(name, bu_vls_cstr(&s_c->s_name), 0)) - return s_c; - } - - for (size_t i = 0; i < BU_PTBL_LEN(v->gv_objs.view_objs); i++) { - struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(v->gv_objs.view_objs, i); - if (!bu_path_match(name, bu_vls_cstr(&s_c->s_name), 0)) - return s_c; - } - - // If none of the names matched, check uuids - if (!v->independent && v->vset) { - for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->i->shared_db_objs); i++) { - struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&v->vset->i->shared_db_objs, i); - if (!bu_path_match(name, bu_vls_cstr(&s_c->s_uuid), 0)) - return s_c; - } - for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->i->shared_view_objs); i++) { - struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&v->vset->i->shared_view_objs, i); - if (!bu_path_match(name, bu_vls_cstr(&s_c->s_uuid), 0)) - return s_c; - } - } - for (size_t i = 0; i < BU_PTBL_LEN(v->gv_objs.db_objs); i++) { - struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(v->gv_objs.db_objs, i); - if (!bu_path_match(name, bu_vls_cstr(&s_c->s_uuid), 0)) - return s_c; - } - for (size_t i = 0; i < BU_PTBL_LEN(v->gv_objs.view_objs); i++) { - struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(v->gv_objs.view_objs, i); - if (!bu_path_match(name, bu_vls_cstr(&s_c->s_uuid), 0)) - return s_c; - } - - return NULL; -} - -struct bv_scene_obj * -bv_find_child(struct bv_scene_obj *s, const char *vname) -{ - if (!s || !vname || !BU_PTBL_IS_INITIALIZED(&s->children)) - return NULL; - for (size_t i = 0; i < BU_PTBL_LEN(&s->children); i++) { - struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&s->children, i); - if (!bu_path_match(vname, bu_vls_cstr(&s_c->s_name), 0)) - return s_c; - } - for (size_t i = 0; i < BU_PTBL_LEN(&s->children); i++) { - struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&s->children, i); - if (!bu_path_match(vname, bu_vls_cstr(&s_c->s_uuid), 0)) - return s_c; - } - - return NULL; + bv_scene_obj_init(s, free_scene_obj); + FREE_BV_SCENE_OBJ(s, &free_scene_obj->l); } int @@ -907,17 +627,55 @@ bv_vZ_calc(struct bv_scene_obj *s, struct bview *v, int mode) return vZ; } - -struct bu_ptbl * -bv_view_objs(struct bview *v, int type) +void +bv_set_init(struct bview_set *s) +{ + BU_PTBL_INIT(&s->views); + bu_ptbl_init(&s->shared_db_objs, 8, "db_objs init"); + bu_ptbl_init(&s->shared_view_objs, 8, "view_objs init"); + BU_LIST_INIT(&s->vlfree); + /* init the solid list */ + BU_GET(s->free_scene_obj, struct bv_scene_obj); + BU_LIST_INIT(&s->free_scene_obj->l); +} +void +bv_set_free(struct bview_set *s) { - if (type == BV_SCENE_OBJ_DB) - return &v->vset->i->shared_db_objs; + // Note - it is the caller's responsibility to have freed any data + // associated with the ged or its views in the u_data pointers. + struct bview *gdvp; + for (size_t i = 0; i < BU_PTBL_LEN(&s->views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(&s->views, i); + bu_vls_free(&gdvp->gv_name); + if (gdvp->callbacks) { + bu_ptbl_free(gdvp->callbacks); + BU_PUT(gdvp->callbacks, struct bu_ptbl); + } + bu_free((void *)gdvp, "bv"); + } + bu_ptbl_free(&s->views); + + bu_ptbl_free(&s->shared_db_objs); + bu_ptbl_free(&s->shared_view_objs); + + // TODO - replace free_scene_obj with bu_ptbl + struct bv_scene_obj *sp, *nsp; + sp = BU_LIST_NEXT(bv_scene_obj, &s->free_scene_obj->l); + while (BU_LIST_NOT_HEAD(sp, &s->free_scene_obj->l)) { + nsp = BU_LIST_PNEXT(bv_scene_obj, sp); + BU_LIST_DEQUEUE(&((sp)->l)); + FREE_BV_SCENE_OBJ(sp, &s->free_scene_obj->l); + sp = nsp; + } + BU_PUT(s->free_scene_obj, struct bv_scene_obj); - if (type == BV_SCENE_OBJ_VIEW) - return &v->vset->i->shared_view_objs; + // TODO - clean up vlfree +} - return NULL; +void +bv_set_add(struct bview_set *s, struct bview *v){ + if (!s || !v) + return; } /* diff --git a/src/libbv/view_sets.c b/src/libbv/view_sets.c deleted file mode 100644 index 3ce6e627e5f..00000000000 --- a/src/libbv/view_sets.c +++ /dev/null @@ -1,144 +0,0 @@ -/* V I E W _ S E T S . C - * BRL-CAD - * - * Copyright (c) 2020-2022 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * version 2.1 as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @file bv_util.c - * - * Utility functions for operating on BRL-CAD view sets - * - */ - -#include "common.h" -#include -#include "vmath.h" -#include "bu/log.h" -#include "bu/malloc.h" -#include "bu/str.h" -#include "bn/mat.h" -#include "bv/defines.h" -#include "bv/view_sets.h" -#include "./bv_private.h" - -void -bv_set_init(struct bview_set *s) -{ - BU_GET(s->i, struct bview_set_internal); - BU_PTBL_INIT(&s->i->views); - bu_ptbl_init(&s->i->shared_db_objs, 8, "db_objs init"); - bu_ptbl_init(&s->i->shared_view_objs, 8, "view_objs init"); - BU_LIST_INIT(&s->i->vlfree); - /* init the solid list */ - BU_GET(s->i->free_scene_obj, struct bv_scene_obj); - BU_LIST_INIT(&s->i->free_scene_obj->l); -} - - -#define FREE_BV_SCENE_OBJ(p, fp) { \ - BU_LIST_APPEND(fp, &((p)->l)); } - -void -bv_set_free(struct bview_set *s) -{ - if (s->i) { - // Note - it is the caller's responsibility to have freed any data - // associated with the ged or its i->views in the u_data pointers. - struct bview *gdvp; - for (size_t i = 0; i < BU_PTBL_LEN(&s->i->views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(&s->i->views, i); - bu_vls_free(&gdvp->gv_name); - if (gdvp->callbacks) { - bu_ptbl_free(gdvp->callbacks); - BU_PUT(gdvp->callbacks, struct bu_ptbl); - } - bu_free((void *)gdvp, "bv"); - } - bu_ptbl_free(&s->i->views); - - bu_ptbl_free(&s->i->shared_db_objs); - bu_ptbl_free(&s->i->shared_view_objs); - - // TODO - replace free_scene_obj with bu_ptbl - struct bv_scene_obj *sp, *nsp; - sp = BU_LIST_NEXT(bv_scene_obj, &s->i->free_scene_obj->l); - while (BU_LIST_NOT_HEAD(sp, &s->i->free_scene_obj->l)) { - nsp = BU_LIST_PNEXT(bv_scene_obj, sp); - BU_LIST_DEQUEUE(&((sp)->l)); - FREE_BV_SCENE_OBJ(sp, &s->i->free_scene_obj->l); - sp = nsp; - } - BU_PUT(s->i->free_scene_obj, struct bv_scene_obj); - } - - // TODO - clean up vlfree -} - -void -bv_set_add_view(struct bview_set *s, struct bview *v){ - if (!s || !v) - return; - - bu_ptbl_ins(&s->i->views, (long *)v); -} - -void -bv_set_rm_view(struct bview_set *s, struct bview *v){ - if (!s || !v) - return; - - bu_ptbl_rm(&s->i->views, (long int *)v); -} - - -struct bu_ptbl * -bv_set_views(struct bview_set *s){ - if (!s) - return NULL; - - return &s->i->views; -} - -struct bview * -bv_set_find_view(struct bview_set *s, const char *vname) -{ - struct bview *v = NULL; - for (size_t i = 0; i < BU_PTBL_LEN(&s->i->views); i++) { - struct bview *tv = (struct bview *)BU_PTBL_GET(&s->i->views, i); - if (BU_STR_EQUAL(bu_vls_cstr(&tv->gv_name), vname)) { - v = tv; - break; - } - } - - return v; -} - -struct bv_scene_obj * -bv_set_fsos(struct bview_set *s) -{ - return s->i->free_scene_obj; -} - -/* - * Local Variables: - * tab-width: 8 - * mode: C - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ diff --git a/src/libbv/vlist.c b/src/libbv/vlist.c index 5496dc70c9a..5c09c0c6c4a 100644 --- a/src/libbv/vlist.c +++ b/src/libbv/vlist.c @@ -33,7 +33,6 @@ #include "bu/str.h" #include "bv/plot3.h" #include "bv/vlist.h" -#include "bv/util.h" size_t bv_vlist_cmd_cnt(struct bv_vlist *vlist) @@ -582,37 +581,6 @@ bv_vlblock_to_objs(struct bu_ptbl *out, const char *name_root, struct bv_vlblock } } -struct bv_scene_obj * -bv_vlblock_obj(struct bv_vlblock *vbp, struct bview *v, const char *name) -{ - if (!vbp || !v) - return NULL; - - struct bv_scene_obj *s = bv_find_obj(v, name); - if (s) { - bv_obj_reset(s); - } else { - s = bv_obj_get(v, BV_SCENE_OBJ_VIEW); - } - - for (size_t i = 0; i < vbp->nused; i++) { - if (!BU_LIST_IS_EMPTY(&(vbp->head[i]))) { - struct bv_scene_obj *sc = bv_obj_get_child(s); - struct bv_vlist *bvl = (struct bv_vlist *)&vbp->head[i]; - long int rgb = vbp->rgb[i]; - sc->s_vlen = bv_vlist_cmd_cnt(bvl); - BU_LIST_APPEND_LIST(&(sc->s_vlist), &(bvl->l)); - BU_LIST_INIT(&(bvl->l)); - sc->s_color[0] = (rgb>>16); - sc->s_color[1] = (rgb>>8); - sc->s_color[2] = (rgb) & 0xFF; - bu_vls_sprintf(&sc->s_name, "%s_%d_%d_%d", name, V3ARGS(sc->s_color)); - } - } - - return s; -} - void bv_vlist_to_uplot(FILE *fp, const struct bu_list *vhead) { diff --git a/src/libdm/view.c b/src/libdm/view.c index da1063f632a..5a2184dd992 100644 --- a/src/libdm/view.c +++ b/src/libdm/view.c @@ -652,9 +652,8 @@ dm_draw_viewobjs(struct rt_wdb *wdbp, struct bview *v, struct dm_view_data *vd, #endif // Draw geometry view objects - struct bu_ptbl *db_objs = bv_view_objs(v, BV_SCENE_OBJ_DB); - for (size_t i = 0; i < BU_PTBL_LEN(db_objs); i++) { - struct bv_scene_group *g = (struct bv_scene_group *)BU_PTBL_GET(db_objs, i); + for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->shared_db_objs); i++) { + struct bv_scene_group *g = (struct bv_scene_group *)BU_PTBL_GET(&v->vset->shared_db_objs, i); bu_log("Draw %s\n", bu_vls_cstr(&g->s_name)); dm_draw_scene_obj(dmp, g); } @@ -750,7 +749,7 @@ dm_draw_objs(struct bview *v, double base2local, double local2base, void (*dm_dr // Draw geometry view objects // TODO - draw opaque, then transparent - struct bu_ptbl *sg = (v->independent || v->gv_s->adaptive_plot) ? v->gv_objs.db_objs : bv_view_objs(v, BV_SCENE_OBJ_DB); + struct bu_ptbl *sg = (v->independent || v->gv_s->adaptive_plot) ? v->gv_objs.view_grps : &v->vset->shared_db_objs; for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { struct bv_scene_group *g = (struct bv_scene_group *)BU_PTBL_GET(sg, i); bu_log("Draw %s\n", bu_vls_cstr(&g->s_name)); @@ -758,8 +757,7 @@ dm_draw_objs(struct bview *v, double base2local, double local2base, void (*dm_dr } // Draw view-only objects (shared if settings match, otherwise view-specific) - struct bu_ptbl *view_objs = bv_view_objs(v, BV_SCENE_OBJ_VIEW); - struct bu_ptbl *vo = (v->independent) ? v->gv_objs.view_objs : view_objs; + struct bu_ptbl *vo = (v->independent) ? v->gv_objs.view_objs : &v->vset->shared_view_objs; for (size_t i = 0; i < BU_PTBL_LEN(vo); i++) { struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(vo, i); dm_draw_scene_obj(dmp, s); diff --git a/src/libged/autoview/autoview2.cpp b/src/libged/autoview/autoview2.cpp index 1d212cac3e7..cd3ce7470c2 100644 --- a/src/libged/autoview/autoview2.cpp +++ b/src/libged/autoview/autoview2.cpp @@ -88,8 +88,16 @@ ged_autoview2_core(struct ged *gedp, int argc, const char *argv[]) } if (bu_vls_strlen(&cvls)) { - v = bv_set_find_view(&gedp->ged_views, bu_vls_cstr(&cvls)); - if (!v) { + int found_match = 0; + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *tv = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); + if (BU_STR_EQUAL(bu_vls_cstr(&tv->gv_name), bu_vls_cstr(&cvls))) { + v = tv; + found_match = 1; + break; + } + } + if (!found_match) { bu_vls_printf(gedp->ged_result_str, "Specified view %s not found\n", bu_vls_cstr(&cvls)); bu_vls_free(&cvls); return BRLCAD_ERROR; @@ -124,9 +132,9 @@ ged_autoview2_core(struct ged *gedp, int argc, const char *argv[]) struct bu_ptbl *so; if (v->gv_s->adaptive_plot || v->independent) { - so = v->gv_objs.db_objs; + so = v->gv_objs.view_grps; } else { - so = bv_view_objs(v, BV_SCENE_OBJ_DB); + so = &v->vset->shared_db_objs; } vect_t minus, plus; int have_geom_objs = 0; @@ -182,7 +190,7 @@ ged_autoview2_core(struct ged *gedp, int argc, const char *argv[]) if (v->independent) { so = v->gv_objs.view_objs; } else { - so = bv_view_objs(v, BV_SCENE_OBJ_VIEW); + so = &v->vset->shared_view_objs; } for (size_t i = 0; i < BU_PTBL_LEN(so); i++) { struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(so, i); diff --git a/src/libged/bigE/bigE.c b/src/libged/bigE/bigE.c index d6742bd844b..ce4d6acdcd7 100644 --- a/src/libged/bigE/bigE.c +++ b/src/libged/bigE/bigE.c @@ -2006,6 +2006,7 @@ ged_E_core(struct ged *gedp, int argc, const char *argv[]) dgcdp->vs.color_override = 0; dgcdp->vs.transparency = 0; dgcdp->vs.s_dmode = _GED_BOOL_EVAL; + dgcdp->free_scene_obj = gedp->ged_views.free_scene_obj; /* Parse options. */ bu_optind = 1; /* re-init bu_getopt() */ diff --git a/src/libged/bot/bot_fuse.c b/src/libged/bot/bot_fuse.c index d7d9dd9eeaf..0bcadb1a9f9 100644 --- a/src/libged/bot/bot_fuse.c +++ b/src/libged/bot/bot_fuse.c @@ -132,7 +132,8 @@ show_dangling_edges(struct ged *gedp, const uint32_t *magic_p, const char *name, struct bu_vls nroot = BU_VLS_INIT_ZERO; bu_vls_sprintf(&nroot, "bot_fuse::%s", name); struct bview *view = gedp->ged_gvp; - bv_vlblock_obj(vbp, view, bu_vls_cstr(&nroot)); + struct bu_ptbl *vobjs = (view->independent) ? view->gv_objs.view_objs : &view->vset->shared_view_objs; + bv_vlblock_to_objs(vobjs, bu_vls_cstr(&nroot), vbp, view, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); bu_vls_free(&nroot); } else { _ged_cvt_vlblock_to_solids(gedp, vbp, name, 0); diff --git a/src/libged/bot/check.cpp b/src/libged/bot/check.cpp index d97c4c9b70e..1d039391fc2 100644 --- a/src/libged/bot/check.cpp +++ b/src/libged/bot/check.cpp @@ -255,7 +255,8 @@ draw_edges(struct ged *gedp, struct rt_bot_internal *bot, int num_edges, int edg struct bu_vls nroot = BU_VLS_INIT_ZERO; bu_vls_sprintf(&nroot, "bot_check::%s", draw_name); struct bview *view = gedp->ged_gvp; - bv_vlblock_obj(vbp, view, bu_vls_cstr(&nroot)); + struct bu_ptbl *vobjs = (view->independent) ? view->gv_objs.view_objs : &view->vset->shared_view_objs; + bv_vlblock_to_objs(vobjs, bu_vls_cstr(&nroot), vbp, view, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); bu_vls_free(&nroot); } else { _ged_cvt_vlblock_to_solids(gedp, vbp, draw_name, 0); diff --git a/src/libged/brep/brep.cpp b/src/libged/brep/brep.cpp index c7127fd6d50..0419f8bac4c 100644 --- a/src/libged/brep/brep.cpp +++ b/src/libged/brep/brep.cpp @@ -687,7 +687,8 @@ _brep_cmd_intersect(void *bs, int argc, const char **argv) const char *nview = getenv("GED_TEST_NEW_CMD_FORMS"); if (BU_STR_EQUAL(nview, "1")) { struct bview *view = gedp->ged_gvp; - bv_vlblock_obj(gb->vbp, view, "brep_intersect"); + struct bu_ptbl *vobjs = (view->independent) ? view->gv_objs.view_objs : &view->vset->shared_view_objs; + bv_vlblock_to_objs(vobjs, "brep_intersect::", gb->vbp, view, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); } else { char namebuf[65]; _ged_cvt_vlblock_to_solids(gedp, gb->vbp, namebuf, 0); diff --git a/src/libged/brep/plot.cpp b/src/libged/brep/plot.cpp index b4c3a810de8..b6cbfdff964 100644 --- a/src/libged/brep/plot.cpp +++ b/src/libged/brep/plot.cpp @@ -994,12 +994,12 @@ static void _brep_vlblock_plot(struct ged *gedp, struct bv_vlblock *vbp, const char *sname) { const char *nview = getenv("GED_TEST_NEW_CMD_FORMS"); + struct bu_vls nroot = BU_VLS_INIT_ZERO; struct bview *view = gedp->ged_gvp; + struct bu_ptbl *vobjs = (view->independent) ? view->gv_objs.view_objs : &view->vset->shared_view_objs; if (BU_STR_EQUAL(nview, "1")) { - struct bu_vls nroot = BU_VLS_INIT_ZERO; bu_vls_sprintf(&nroot, "brep::%s", sname); - bv_vlblock_obj(vbp, view, bu_vls_cstr(&nroot)); - bu_vls_free(&nroot); + bv_vlblock_to_objs(vobjs, bu_vls_cstr(&nroot), vbp, view, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); } else { _ged_cvt_vlblock_to_solids(gedp, vbp, sname, 0); } diff --git a/src/libged/check/check_overlaps.c b/src/libged/check/check_overlaps.c index d8f34ec2f74..d6eb69b214b 100644 --- a/src/libged/check/check_overlaps.c +++ b/src/libged/check/check_overlaps.c @@ -340,7 +340,8 @@ int check_overlaps(struct current_state *state, const char *nview = getenv("GED_TEST_NEW_CMD_FORMS"); if (BU_STR_EQUAL(nview, "1")) { struct bview *view = _ged_current_gedp->ged_gvp; - bv_vlblock_obj(check_plot.vbp, view, "check::overlaps"); + struct bu_ptbl *vobjs = (view->independent) ? view->gv_objs.view_objs : &view->vset->shared_view_objs; + bv_vlblock_to_objs(vobjs, "check::overlaps_", check_plot.vbp, view, _ged_current_gedp->ged_views.free_scene_obj, &_ged_current_gedp->ged_views.vlfree); } else { _ged_cvt_vlblock_to_solids(_ged_current_gedp, check_plot.vbp, "OVERLAPS", 0); } diff --git a/src/libged/display_list.c b/src/libged/display_list.c index 8755487bfe7..38b6d750190 100644 --- a/src/libged/display_list.c +++ b/src/libged/display_list.c @@ -41,6 +41,23 @@ #define LAST_SOLID(_sp) DB_FULL_PATH_CUR_DIR( &(_sp)->s_fullpath ) #define FIRST_SOLID(_sp) ((_sp)->s_fullpath.fp_names[0]) +#define GET_BV_SCENE_OBJ(p, fp) { \ + if (BU_LIST_IS_EMPTY(fp)) { \ + BU_ALLOC((p), struct bv_scene_obj); \ + struct ged_bv_data *bdata; \ + BU_GET(bdata, struct ged_bv_data); \ + db_full_path_init(&bdata->s_fullpath); \ + (p)->s_u_data = (void *)bdata; \ + } else { \ + p = BU_LIST_NEXT(bv_scene_obj, fp); \ + BU_LIST_DEQUEUE(&((p)->l)); \ + if ((p)->s_u_data) { \ + struct ged_bv_data *bdata = (struct ged_bv_data *)(p)->s_u_data; \ + bdata->s_fullpath.fp_len = 0; \ + } \ + } \ + BU_LIST_INIT( &((p)->s_vlist) ); } + #define FREE_BV_SCENE_OBJ(p, fp) { \ BU_LIST_APPEND(fp, &((p)->l)); \ BV_FREE_VLIST(&RTG.rtg_vlfree, &((p)->s_vlist)); } @@ -227,6 +244,7 @@ dl_erasePathFromDisplay(struct ged *gedp, const char *path, int allow_split) { struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay; struct db_i *dbip = gedp->dbip; + struct bv_scene_obj *free_scene_obj = gedp->ged_views.free_scene_obj; struct display_list *gdlp; struct display_list *next_gdlp; struct display_list *last_gdlp; @@ -234,7 +252,6 @@ dl_erasePathFromDisplay(struct ged *gedp, const char *path, int allow_split) struct directory *dp; struct db_full_path subpath; int found_subpath; - struct bv_scene_obj *free_scene_obj = bv_set_fsos(&gedp->ged_views); if (db_string_to_path(&subpath, dbip, path) == 0) found_subpath = 1; @@ -335,7 +352,7 @@ eraseAllSubpathsFromSolidList(struct ged *gedp, struct display_list *gdlp, { struct bv_scene_obj *sp; struct bv_scene_obj *nsp; - struct bv_scene_obj *free_scene_obj = bv_set_fsos(&gedp->ged_views); + struct bv_scene_obj *free_scene_obj = gedp->ged_views.free_scene_obj; sp = BU_LIST_NEXT(bv_scene_obj, &gdlp->dl_head_scene_obj); while (BU_LIST_NOT_HEAD(sp, &gdlp->dl_head_scene_obj)) { @@ -423,7 +440,7 @@ _dl_eraseFirstSubpath(struct ged *gedp, { struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay; struct db_i *dbip = gedp->dbip; - struct bv_scene_obj *free_scene_obj = bv_set_fsos(&gedp->ged_views); + struct bv_scene_obj *free_scene_obj = gedp->ged_views.free_scene_obj; struct bv_scene_obj *sp; struct bv_scene_obj *nsp; struct db_full_path dup_path; @@ -527,7 +544,7 @@ void _dl_freeDisplayListItem (struct ged *gedp, struct display_list *gdlp) { struct db_i *dbip = gedp->dbip; - struct bv_scene_obj *free_scene_obj = bv_set_fsos(&gedp->ged_views); + struct bv_scene_obj *free_scene_obj = gedp->ged_views.free_scene_obj; struct bv_scene_obj *sp; struct directory *dp; @@ -684,17 +701,11 @@ solid_append_vlist(struct bv_scene_obj *sp, struct bv_vlist *vlist) void dl_add_path(int dashflag, struct bu_list *vhead, const struct db_full_path *pathp, struct db_tree_state *tsp, unsigned char *wireframe_color_override, struct _ged_client_data *dgcdp) { - struct bv_scene_obj *sp = bv_obj_get(dgcdp->v, BV_SCENE_OBJ_DB); - struct ged_bv_data *bdata = (sp->s_u_data) ? (struct ged_bv_data *)sp->s_u_data : NULL; - if (!bdata) { - BU_GET(bdata, struct ged_bv_data); - db_full_path_init(&bdata->s_fullpath); - sp->s_u_data = (void *)bdata; - } else { - bdata->s_fullpath.fp_len = 0; - } + struct bv_scene_obj *sp; + GET_BV_SCENE_OBJ(sp, &dgcdp->free_scene_obj->l); if (!sp->s_u_data) return; + struct ged_bv_data *bdata = (struct ged_bv_data *)sp->s_u_data; solid_append_vlist(sp, (struct bv_vlist *)vhead); @@ -808,6 +819,7 @@ append_solid_to_display_list( void *client_data) { point_t min, max; + struct bv_scene_obj *sp; union tree *curtree; struct ged_solid_data *bv_data = (struct ged_solid_data *)client_data; @@ -832,17 +844,10 @@ append_solid_to_display_list( } /* create solid */ - struct bv_scene_obj *sp = bv_obj_get(bv_data->v, BV_SCENE_OBJ_DB); - struct ged_bv_data *bdata = (sp->s_u_data) ? (struct ged_bv_data *)sp->s_u_data : NULL; - if (!bdata) { - BU_GET(bdata, struct ged_bv_data); - db_full_path_init(&bdata->s_fullpath); - sp->s_u_data = (void *)bdata; - } else { - bdata->s_fullpath.fp_len = 0; - } + GET_BV_SCENE_OBJ(sp, &(((struct bv_scene_obj *)bv_data->free_scene_obj)->l)); if (!sp->s_u_data) return TREE_NULL; + struct ged_bv_data *bdata = (struct ged_bv_data *)sp->s_u_data; sp->s_size = 0; VSETALL(sp->s_center, 0.0); @@ -999,6 +1004,7 @@ int invent_solid(struct ged *gedp, char *name, struct bu_list *vhead, long int r { struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay; struct db_i *dbip = gedp->dbip; + struct bv_scene_obj *free_scene_obj = gedp->ged_views.free_scene_obj; struct directory *dp; struct bv_scene_obj *sp; struct display_list *gdlp; @@ -1021,17 +1027,10 @@ int invent_solid(struct ged *gedp, char *name, struct bu_list *vhead, long int r } /* Obtain a fresh solid structure, and fill it in */ - sp = bv_obj_get(gedp->ged_gvp, BV_SCENE_OBJ_DB); - struct ged_bv_data *bdata = (sp->s_u_data) ? (struct ged_bv_data *)sp->s_u_data : NULL; - if (!bdata) { - BU_GET(bdata, struct ged_bv_data); - db_full_path_init(&bdata->s_fullpath); - sp->s_u_data = (void *)bdata; - } else { - bdata->s_fullpath.fp_len = 0; - } + GET_BV_SCENE_OBJ(sp, &free_scene_obj->l); if (!sp->s_u_data) return -1; + struct ged_bv_data *bdata = (struct ged_bv_data *)sp->s_u_data; /* Need to enter phony name in directory structure */ dp = db_diradd(dbip, name, RT_DIR_PHONY_ADDR, 0, RT_DIR_SOLID, (void *)&type); @@ -1162,7 +1161,7 @@ dl_set_wflag(struct bu_list *hdlp, int wflag) } void -dl_zap(struct ged *gedp) +dl_zap(struct ged *gedp, struct bv_scene_obj *free_scene_obj) { struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay; struct db_i *dbip = gedp->dbip; @@ -1171,7 +1170,6 @@ dl_zap(struct ged *gedp) struct bu_ptbl dls = BU_PTBL_INIT_ZERO; struct directory *dp = RT_DIR_NULL; size_t i = 0; - struct bv_scene_obj *free_scene_obj = bv_set_fsos(&gedp->ged_views); while (BU_LIST_WHILE(gdlp, display_list, hdlp)) { diff --git a/src/libged/dm/dm.c b/src/libged/dm/dm.c index 69c64270f8c..f576e5e75d1 100644 --- a/src/libged/dm/dm.c +++ b/src/libged/dm/dm.c @@ -82,14 +82,13 @@ _dm_name_lookup(struct _ged_dm_info *gd, const char *dm_name) } struct ged *gedp = gd->gedp; - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - if (!BU_PTBL_LEN(views)) { + if (!BU_PTBL_LEN(&gedp->ged_views.views)) { bu_vls_printf(gedp->ged_result_str, ": no views defined in GED\n"); return NULL; } int dm_cnt = 0; - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (!gdvp->dmp) continue; dm_cnt++; @@ -99,8 +98,8 @@ _dm_name_lookup(struct _ged_dm_info *gd, const char *dm_name) return NULL; } - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); ndmp = (struct dm *)gdvp->dmp; if (ndmp && BU_STR_EQUAL(dm_name, bu_vls_cstr(dm_get_pathname(ndmp)))) { cdmp = ndmp; @@ -265,14 +264,13 @@ _dm_cmd_list(void *ds, int argc, const char **argv) } } - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - if (!BU_PTBL_LEN(views) && !cdmp) { + if (!BU_PTBL_LEN(&gedp->ged_views.views) && !cdmp) { bu_vls_printf(gedp->ged_result_str, ": no views defined in GED\n"); return BRLCAD_ERROR; } int dm_cnt = 0; - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (!gdvp->dmp) continue; dm_cnt++; @@ -282,8 +280,8 @@ _dm_cmd_list(void *ds, int argc, const char **argv) return BRLCAD_ERROR; } - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); struct dm *ndmp = (struct dm *)gdvp->dmp; if (!ndmp || ndmp == cdmp) continue; @@ -443,9 +441,8 @@ _dm_cmd_attach(void *ds, int argc, const char **argv) // No name - generate one bu_vls_sprintf(&dm_name, "%s-0", argv[0]); int exists = 0; - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); struct dm *ndmp = (struct dm *)gdvp->dmp; if (!ndmp) continue; @@ -458,8 +455,8 @@ _dm_cmd_attach(void *ds, int argc, const char **argv) while (exists && tries < DM_MAX_TRIES) { bu_vls_incr(&dm_name, NULL, "0:0:0:0:-", NULL, NULL); exists = 0; - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); struct dm *ndmp = (struct dm *)gdvp->dmp; if (!ndmp) continue; @@ -479,9 +476,8 @@ _dm_cmd_attach(void *ds, int argc, const char **argv) // Have name - see if it already exists bu_vls_sprintf(&dm_name, "%s", argv[1]); int exists = 0; - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); struct dm *ndmp = (struct dm *)gdvp->dmp; if (!ndmp) continue; @@ -501,7 +497,7 @@ _dm_cmd_attach(void *ds, int argc, const char **argv) if (!target_view) { BU_GET(target_view, struct bview); bv_init(target_view, &gedp->ged_views); - bv_set_add_view(&gedp->ged_views, target_view); + bu_ptbl_ins(&gedp->ged_views.views, (long *)target_view); } // Make sure the view width and height are non-zero if we're in a diff --git a/src/libged/draw.cpp b/src/libged/draw.cpp index a68d74a073f..22060f86c78 100644 --- a/src/libged/draw.cpp +++ b/src/libged/draw.cpp @@ -44,6 +44,15 @@ #include "./alphanum.h" #include "./ged_private.h" +#define GET_BV_SCENE_OBJ(p, fp) { \ + if (BU_LIST_IS_EMPTY(fp)) { \ + BU_ALLOC((p), struct bv_scene_obj); \ + } else { \ + p = BU_LIST_NEXT(bv_scene_obj, fp); \ + BU_LIST_DEQUEUE(&((p)->l)); \ + } \ + BU_LIST_INIT( &((p)->s_vlist) ); } + static int prim_tess(struct bv_scene_obj *s, struct rt_db_internal *ip) { @@ -538,6 +547,7 @@ draw_gather_paths(struct db_full_path *path, mat_t *curr_mat, void *client_data) { struct directory *dp; struct draw_data_t *dd= (struct draw_data_t *)client_data; + struct bv_scene_obj *free_scene_obj = dd->free_scene_obj; RT_CK_FULL_PATH(path); RT_CK_DBI(dd->dbip); @@ -578,9 +588,13 @@ draw_gather_paths(struct db_full_path *path, mat_t *curr_mat, void *client_data) // find it) we create it instead. // Have database object, make scene object - struct bv_scene_obj *s = bv_obj_get_child(dd->g); + struct bv_scene_obj *s; + GET_BV_SCENE_OBJ(s, &free_scene_obj->l); + bv_scene_obj_init(s, free_scene_obj); db_path_to_vls(&s->s_name, path); db_path_to_vls(&s->s_uuid, path); + // TODO - append hash of matrix and op to uuid to make it properly unique... + s->s_v = dd->v; MAT_COPY(s->s_mat, *curr_mat); bv_obj_settings_sync(&s->s_os, &dd->g->s_os); s->s_type_flags = BV_DBOBJ_BASED; diff --git a/src/libged/draw/draw.c b/src/libged/draw/draw.c index f972a0e2c63..dffe81ca47d 100644 --- a/src/libged/draw/draw.c +++ b/src/libged/draw/draw.c @@ -621,6 +621,9 @@ _ged_drawtrees(struct ged *gedp, int argc, const char *argv[], int kind, struct /* default transparency - opaque */ dgcdp.vs.transparency = 1.0; + /* free_scene_obj */ + dgcdp.free_scene_obj = gedp->ged_views.free_scene_obj; + enable_fastpath = 0; /* Parse options. */ @@ -862,7 +865,7 @@ _ged_drawtrees(struct ged *gedp, int argc, const char *argv[], int kind, struct bv_data.wireframe_color[2]= dgcdp.vs.color[2]; bv_data.transparency= dgcdp.vs.transparency; bv_data.dmode = dgcdp.vs.s_dmode; - bv_data.v = gedp->ged_gvp; + bv_data.free_scene_obj = (void *)gedp->ged_views.free_scene_obj; dgcdp.gdlp = dl_addToDisplay(gedp->ged_gdp->gd_headDisplay, gedp->dbip, argv[i]); bv_data.gdlp = dgcdp.gdlp; diff --git a/src/libged/draw/draw2.cpp b/src/libged/draw/draw2.cpp index ac3a1c038f3..530b0cd423b 100644 --- a/src/libged/draw/draw2.cpp +++ b/src/libged/draw/draw2.cpp @@ -44,6 +44,15 @@ #include "../alphanum.h" #include "../ged_private.h" +#define GET_BV_SCENE_OBJ(p, fp) { \ + if (BU_LIST_IS_EMPTY(fp)) { \ + BU_ALLOC((p), struct bv_scene_obj); \ + } else { \ + p = BU_LIST_NEXT(bv_scene_obj, fp); \ + BU_LIST_DEQUEUE(&((p)->l)); \ + } \ + BU_LIST_INIT( &((p)->s_vlist) ); } + static int _fp_bbox(fastf_t *s_size, point_t *bmin, point_t *bmax, struct db_full_path *fp, @@ -172,13 +181,14 @@ ged_draw_view(struct ged *gedp, struct bview *v, struct bv_obj_settings *vs, int { // Abbreviations for convenience struct db_i *dbip = gedp->dbip; + struct bv_scene_obj *free_scene_obj = gedp->ged_views.free_scene_obj; struct bu_ptbl *sg; // Where the groups get stored depends on our mode if (v->gv_s->adaptive_plot || v->independent) { - sg = v->gv_objs.db_objs; + sg = v->gv_objs.view_grps; } else { - sg = bv_view_objs(v, BV_SCENE_OBJ_DB); + sg = &v->vset->shared_db_objs; } // If we have no active groups and no view objects, we are drawing into a @@ -324,14 +334,17 @@ ged_draw_view(struct ged *gedp, struct bview *v, struct bv_obj_settings *vs, int } for (s_it = sclear.begin(); s_it != sclear.end(); s_it++) { struct bv_scene_obj *s = *s_it; - bv_obj_put(s); + bu_ptbl_rm(&g->children, (long *)s); + bv_scene_obj_free(s, free_scene_obj); } } else { // Create new group - g = bv_obj_get(v, BV_SCENE_OBJ_DB); + GET_BV_SCENE_OBJ(g, &free_scene_obj->l); + bv_scene_obj_init(g, free_scene_obj); db_path_to_vls(&g->s_name, fp); db_path_to_vls(&g->s_uuid, fp); bv_obj_settings_sync(&g->s_os, vs); + bu_ptbl_ins(sg, (long *)g); // If we're a blank slate, we're adaptive, and autoview isn't off // we need to be building up some sense of the view and object @@ -351,7 +364,8 @@ ged_draw_view(struct ged *gedp, struct bview *v, struct bv_obj_settings *vs, int // Clear anything superseded by the new path for (g_it = clear.begin(); g_it != clear.end(); g_it++) { struct bv_scene_group *cg = *g_it; - bv_obj_put(cg); + bu_ptbl_rm(sg, (long *)cg); + bv_scene_obj_free(cg, free_scene_obj); } } } @@ -420,6 +434,7 @@ ged_draw_view(struct ged *gedp, struct bview *v, struct bv_obj_settings *vs, int dd.v = v; dd.tol = &gedp->ged_wdbp->wdb_tol; dd.ttol = &gedp->ged_wdbp->wdb_ttol; + dd.free_scene_obj = gedp->ged_views.free_scene_obj; dd.color_inherit = 0; dd.bound_only = 0; dd.res = &rt_uniresource; @@ -508,9 +523,8 @@ static void _ged_shared_autoview(struct ged *gedp, struct bview *cv, int shared_blank_slate, int no_autoview) { if (shared_blank_slate && !no_autoview) { - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *v = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *v = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (v->independent || v == cv || v->gv_s->adaptive_plot) { continue; } @@ -567,8 +581,16 @@ ged_draw2_core(struct ged *gedp, int argc, const char *argv[]) int opt_ret = bu_opt_parse(NULL, argc, argv, vd); argc = opt_ret; if (bu_vls_strlen(&cvls)) { - cv = bv_set_find_view(&gedp->ged_views, bu_vls_cstr(&cvls)); - if (!cv) { + int found_match = 0; + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *tv = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); + if (BU_STR_EQUAL(bu_vls_cstr(&tv->gv_name), bu_vls_cstr(&cvls))) { + cv = tv; + found_match = 1; + break; + } + } + if (!found_match) { bu_vls_printf(gedp->ged_result_str, "Specified view %s not found\n", bu_vls_cstr(&cvls)); bu_vls_free(&cvls); return BRLCAD_ERROR; @@ -668,10 +690,7 @@ ged_draw2_core(struct ged *gedp, int argc, const char *argv[]) // out empty in the case of the shared list. It will get populated in the // first pass, but we still need to size the other views (if any). int shared_blank_slate = 0; - - struct bu_ptbl *sg = bv_view_objs(cv, BV_SCENE_OBJ_DB); - struct bu_ptbl *view_objs = bv_view_objs(cv, BV_SCENE_OBJ_VIEW); - if (!BU_PTBL_LEN(sg) && !BU_PTBL_LEN(view_objs)) { + if (!BU_PTBL_LEN(&cv->vset->shared_db_objs) && !BU_PTBL_LEN(&cv->vset->shared_view_objs)) { shared_blank_slate = 1; } @@ -682,19 +701,18 @@ ged_draw2_core(struct ged *gedp, int argc, const char *argv[]) // do the cleanup. Additionally, if cv is a shared view any additional // shared views whose plotting status has changed also needs the clear // operation. Independent views do not need this operation, since they use - // gv_objs.db_objs for both non-adaptive and adaptive plotting. (I.e. in + // gv_objs.view_grps for both non-adaptive and adaptive plotting. (I.e. in // independent drawing any contents from gv_objs.db_grps are ignored.) if (!cv->independent) { - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *v = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *v = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (v->independent) continue; - sg = cv->gv_objs.db_objs; + struct bu_ptbl *sg = cv->gv_objs.view_grps; if (sg && !v->gv_s->adaptive_plot) { for (size_t j = 0; j < BU_PTBL_LEN(sg); j++) { struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, j); - bv_obj_put(cg); + bv_scene_obj_free(cg, gedp->ged_views.free_scene_obj); } bu_ptbl_reset(sg); } @@ -724,9 +742,8 @@ ged_draw2_core(struct ged *gedp, int argc, const char *argv[]) // views have adaptive plotting enabled, we need only process the current // view. If we do have adaptive plotting on, it gets more complicated. int have_adaptive = 0; - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *v = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *v = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (v->independent) { // Independent views are handled individually by the above case - // this logic doesn't reference them. @@ -754,8 +771,8 @@ ged_draw2_core(struct ged *gedp, int argc, const char *argv[]) * do not consider independent views here. */ std::vector adaptive_views; struct bview *non_adaptive_view = NULL; - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *v = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *v = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (v->independent) continue; if (v->gv_s->adaptive_plot) { @@ -796,10 +813,9 @@ _ged_redraw_view(struct ged *gedp, struct bview *v, int argc, const char *argv[] // If going from adaptive to shared we only need to do so once, but when going // from shared to adaptive each view needs its own copy. Check for the transition // states, and handle accordingly. - struct bu_ptbl *sg = bv_view_objs(v, BV_SCENE_OBJ_DB); - if (v->gv_s->adaptive_plot && BU_PTBL_LEN(sg) && !BU_PTBL_LEN(v->gv_objs.db_objs)) { - for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { - struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); + if (v->gv_s->adaptive_plot && BU_PTBL_LEN(&v->vset->shared_db_objs) && !BU_PTBL_LEN(v->gv_objs.view_grps)) { + for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->shared_db_objs); i++) { + struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(&v->vset->shared_db_objs, i); if (v->independent) { int ac = 5; const char *av[6]; @@ -822,9 +838,9 @@ _ged_redraw_view(struct ged *gedp, struct bview *v, int argc, const char *argv[] } return BRLCAD_OK; } - if (!v->gv_s->adaptive_plot && !BU_PTBL_LEN(sg) && BU_PTBL_LEN(v->gv_objs.db_objs)) { - for (size_t i = 0; i < BU_PTBL_LEN(v->gv_objs.db_objs); i++) { - struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(v->gv_objs.db_objs, i); + if (!v->gv_s->adaptive_plot && !BU_PTBL_LEN(&v->vset->shared_db_objs) && BU_PTBL_LEN(v->gv_objs.view_grps)) { + for (size_t i = 0; i < BU_PTBL_LEN(v->gv_objs.view_grps); i++) { + struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(v->gv_objs.view_grps, i); if (v->independent) { int ac = 5; const char *av[6]; @@ -850,8 +866,9 @@ _ged_redraw_view(struct ged *gedp, struct bview *v, int argc, const char *argv[] // If we're not transitioning, it's a garden variety redraw. if (!argc) { + struct bu_ptbl *sg; if (v->independent) { - sg = v->gv_objs.db_objs; + sg = v->gv_objs.view_grps; for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); int ac = 5; @@ -865,7 +882,7 @@ _ged_redraw_view(struct ged *gedp, struct bview *v, int argc, const char *argv[] ged_exec(gedp, ac, (const char **)av); } } else { - sg = bv_view_objs(v, BV_SCENE_OBJ_DB); + sg = &v->vset->shared_db_objs; for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); int ac = 3; @@ -928,8 +945,16 @@ ged_redraw2_core(struct ged *gedp, int argc, const char *argv[]) int opt_ret = bu_opt_parse(NULL, argc, argv, vd); argc = opt_ret; if (bu_vls_strlen(&cvls)) { - cv = bv_set_find_view(&gedp->ged_views, bu_vls_cstr(&cvls)); - if (!cv) { + int found_match = 0; + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *tv = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); + if (BU_STR_EQUAL(bu_vls_cstr(&tv->gv_name), bu_vls_cstr(&cvls))) { + cv = tv; + found_match = 1; + break; + } + } + if (!found_match) { bu_vls_printf(gedp->ged_result_str, "Specified view %s not found\n", bu_vls_cstr(&cvls)); bu_vls_free(&cvls); return BRLCAD_ERROR; @@ -941,13 +966,12 @@ ged_redraw2_core(struct ged *gedp, int argc, const char *argv[]) if (cv) { return _ged_redraw_view(gedp, cv, argc, argv); } else { - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - if (!BU_PTBL_LEN(views)) { + if (!BU_PTBL_LEN(&gedp->ged_views.views)) { bu_vls_printf(gedp->ged_result_str, "No views defined\n"); return BRLCAD_OK; } - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *v = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *v = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (!v) { bu_log("WARNING, draw2.cpp:%d - null view stored in ged_views index %zu, skipping\n", __LINE__, i); continue; diff --git a/src/libged/draw/preview.c b/src/libged/draw/preview.c index 7a99667e051..18c808db86a 100644 --- a/src/libged/draw/preview.c +++ b/src/libged/draw/preview.c @@ -431,7 +431,8 @@ ged_preview_core(struct ged *gedp, int argc, const char *argv[]) const char *nview = getenv("GED_TEST_NEW_CMD_FORMS"); if (BU_STR_EQUAL(nview, "1")) { struct bview *view = gedp->ged_gvp; - bv_vlblock_obj(preview_vbp, view, "preview::eye_path"); + struct bu_ptbl *vobjs = (view->independent) ? view->gv_objs.view_objs : &view->vset->shared_view_objs; + bv_vlblock_to_objs(vobjs, "preview::eye_path_", preview_vbp, view, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); } else { _ged_cvt_vlblock_to_solids(gedp, preview_vbp, "EYE_PATH", 0); } diff --git a/src/libged/erase/erase2.cpp b/src/libged/erase/erase2.cpp index fc7125a94cc..ac90abf9864 100644 --- a/src/libged/erase/erase2.cpp +++ b/src/libged/erase/erase2.cpp @@ -37,6 +37,15 @@ #include "../alphanum.h" #include "../ged_private.h" +#define GET_BV_SCENE_OBJ(p, fp) { \ + if (BU_LIST_IS_EMPTY(fp)) { \ + BU_ALLOC((p), struct bv_scene_obj); \ + } else { \ + p = BU_LIST_NEXT(bv_scene_obj, fp); \ + BU_LIST_DEQUEUE(&((p)->l)); \ + } \ + BU_LIST_INIT( &((p)->s_vlist) ); } + // Need to process shallowest to deepest, so we properly split new scene groups // generated from higher level paths that are in turn split by other deeper // paths. @@ -59,7 +68,7 @@ struct dfp_cmp { /* Return 1 if we did a split, 0 otherwise */ int -path_add_children(std::set *ngrps, struct db_i *dbip, struct db_full_path *gfp, struct db_full_path *fp, struct bview *v) +path_add_children(std::set *ngrps, struct db_i *dbip, struct db_full_path *gfp, struct db_full_path *fp, struct bv_scene_obj *free_scene_obj) { // Get the list of immediate children from gfp: struct directory **children = NULL; @@ -99,13 +108,19 @@ path_add_children(std::set *ngrps, struct db_i *dbip, s db_add_node_to_full_path(gfp, dp); if (db_full_path_match_top(gfp, fp)) { if (DB_FULL_PATH_CUR_DIR(gfp) != DB_FULL_PATH_CUR_DIR(fp)) - path_add_children(ngrps, dbip, gfp, fp, v); + path_add_children(ngrps, dbip, gfp, fp, free_scene_obj); } else { struct bu_vls pvls = BU_VLS_INIT_ZERO; - struct bv_scene_group *g = bv_obj_get(v, BV_SCENE_OBJ_DB); + struct bv_scene_group *g; + GET_BV_SCENE_OBJ(g, &free_scene_obj->l); + BU_LIST_INIT(&(g->s_vlist)); + BU_PTBL_INIT(&g->children); bu_vls_trunc(&pvls, 0); db_path_to_vls(&pvls, gfp); + BU_VLS_INIT(&g->s_name); bu_vls_sprintf(&g->s_name, "%s", bu_vls_cstr(&pvls)); + BU_VLS_INIT(&g->s_uuid); + bu_vls_sprintf(&g->s_uuid, "%s", bu_vls_cstr(&pvls)); ngrps->insert(g); } i++; @@ -120,7 +135,7 @@ path_add_children(std::set *ngrps, struct db_i *dbip, s } void -new_scene_grps(std::set *all, struct db_i *dbip, struct bv_scene_group *cg, std::set &spaths, struct bview *v) +new_scene_grps(std::set *all, struct db_i *dbip, struct bv_scene_group *cg, std::set &spaths, struct bv_scene_obj *free_scene_obj) { std::set sfp; std::set::iterator s_it; @@ -176,7 +191,7 @@ new_scene_grps(std::set *all, struct db_i *dbip, struct if (db_full_path_match_top(gfp, fp)) { // Matches. Make new groups based on the children, and // eliminate the gfp group - if (path_add_children(&next_grps, dbip, gfp, fp, v)) { + if (path_add_children(&next_grps, dbip, gfp, fp, free_scene_obj)) { gclear.insert(ng); } } @@ -186,7 +201,8 @@ new_scene_grps(std::set *all, struct db_i *dbip, struct for (g_it = gclear.begin(); g_it != gclear.end(); g_it++) { struct bv_scene_group *ng = *g_it; ngrps.erase(ng); - bv_obj_put(ng); + bv_scene_obj_free(ng, free_scene_obj); + BU_PUT(ng, struct bv_scene_group); } // Populate ngrps for the next round @@ -268,8 +284,16 @@ ged_erase2_core(struct ged *gedp, int argc, const char *argv[]) int opt_ret = bu_opt_parse(NULL, argc, argv, vd); argc = opt_ret; if (bu_vls_strlen(&cvls)) { - v = bv_set_find_view(&gedp->ged_views, bu_vls_cstr(&cvls)); - if (!v) { + int found_match = 0; + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *tv = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); + if (BU_STR_EQUAL(bu_vls_cstr(&tv->gv_name), bu_vls_cstr(&cvls))) { + v = tv; + found_match = 1; + break; + } + } + if (!found_match) { bu_vls_printf(gedp->ged_result_str, "Specified view %s not found\n", bu_vls_cstr(&cvls)); bu_vls_free(&cvls); return BRLCAD_ERROR; @@ -311,7 +335,8 @@ ged_erase2_core(struct ged *gedp, int argc, const char *argv[]) // bu_vls_strncmp function, and prepend a "/" character in the case whare a // user supplies a name without the path prefix. // - struct bu_ptbl *sg = (v->independent || v->gv_s->adaptive_plot) ? v->gv_objs.db_objs : bv_view_objs(v, BV_SCENE_OBJ_DB); + struct bv_scene_obj *free_scene_obj = gedp->ged_views.free_scene_obj; + struct bu_ptbl *sg = (v->independent || v->gv_s->adaptive_plot) ? v->gv_objs.view_grps : &v->vset->shared_db_objs; std::set all; for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); @@ -366,7 +391,7 @@ ged_erase2_core(struct ged *gedp, int argc, const char *argv[]) for (c_it = clear.begin(); c_it != clear.end(); c_it++) { struct bv_scene_group *cg = *c_it; all.erase(cg); - bv_obj_put(cg); + bv_scene_obj_free(cg, free_scene_obj); } // Now, the splits. @@ -401,7 +426,8 @@ ged_erase2_core(struct ged *gedp, int argc, const char *argv[]) } for (s_it = sclear.begin(); s_it != sclear.end(); s_it++) { struct bv_scene_obj *s = *s_it; - bv_obj_put(s); + bu_ptbl_rm(&cg->children, (long *)s); + bv_scene_obj_free(s, free_scene_obj); } } @@ -410,7 +436,7 @@ ged_erase2_core(struct ged *gedp, int argc, const char *argv[]) struct bv_scene_group *cg = g_it->first; std::set &spaths = g_it->second; all.erase(cg); - new_scene_grps(&all, dbip, cg, spaths, v); + new_scene_grps(&all, dbip, cg, spaths, free_scene_obj); } // Repopulate the sg tbl with the final results diff --git a/src/libged/gdiff/gdiff.c b/src/libged/gdiff/gdiff.c index 7c155ce56f3..3503e3185f8 100644 --- a/src/libged/gdiff/gdiff.c +++ b/src/libged/gdiff/gdiff.c @@ -415,7 +415,8 @@ ged_gdiff_core(struct ged *gedp, int argc, const char *argv[]) const char *nview = getenv("GED_TEST_NEW_CMD_FORMS"); if (BU_STR_EQUAL(nview, "1")) { struct bview *view = gedp->ged_gvp; - bv_vlblock_obj(vbp, view, "gdiff"); + struct bu_ptbl *vobjs = (view->independent) ? view->gv_objs.view_objs : &view->vset->shared_view_objs; + bv_vlblock_to_objs(vobjs, "gdiff::", vbp, view, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); } else { _ged_cvt_vlblock_to_solids(gedp, vbp, "diff_visual", 0); } diff --git a/src/libged/ged_private.h b/src/libged/ged_private.h index 46fc4708372..f34b58d7a42 100644 --- a/src/libged/ged_private.h +++ b/src/libged/ged_private.h @@ -123,7 +123,7 @@ struct ged_solid_data { int wireframe_color[3]; fastf_t transparency; int dmode; - struct bview *v; + void *free_scene_obj; }; struct _ged_funtab { @@ -156,7 +156,7 @@ struct _ged_client_data { struct display_list *gdlp; int fastpath_count; /* statistics */ struct bv_vlblock *draw_edge_uses_vbp; - struct bview *v; + struct bv_scene_obj *free_scene_obj; @@ -196,6 +196,7 @@ struct draw_data_t { struct bv_obj_settings *vs; const struct bn_tol *tol; const struct bg_tess_tol *ttol; + struct bv_scene_obj *free_scene_obj; struct bu_color c; int color_inherit; int bool_op; @@ -266,7 +267,7 @@ GED_EXPORT extern union tree * append_solid_to_display_list(struct db_tree_state GED_EXPORT int dl_set_illum(struct display_list *gdlp, const char *obj, int illum); GED_EXPORT void dl_set_flag(struct bu_list *hdlp, int flag); GED_EXPORT void dl_set_wflag(struct bu_list *hdlp, int wflag); -GED_EXPORT void dl_zap(struct ged *gedp); +GED_EXPORT void dl_zap(struct ged *gedp, struct bv_scene_obj *free_scene_obj); GED_EXPORT int dl_how(struct bu_list *hdlp, struct bu_vls *vls, struct directory **dpp, int both); GED_EXPORT void dl_plot(struct bu_list *hdlp, FILE *fp, mat_t model2view, int floating, mat_t center, fastf_t scale, int Three_D, int Z_clip); GED_EXPORT void dl_png(struct bu_list *hdlp, mat_t model2view, fastf_t perspective, vect_t eye_pos, size_t size, size_t half_size, unsigned char **image); diff --git a/src/libged/ged_util.c b/src/libged/ged_util.c index e9647fb78a9..9add1510fd9 100644 --- a/src/libged/ged_util.c +++ b/src/libged/ged_util.c @@ -137,6 +137,20 @@ _ged_subcmd_exec(struct ged *gedp, struct bu_opt_desc *gopts, const struct bu_cm return BRLCAD_OK; } +struct bview * +ged_find_view(struct ged *gedp, const char *key) +{ + struct bview *gdvp = NULL; + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); + if (BU_STR_EQUAL(bu_vls_addr(&gdvp->gv_name), key)) + break; + gdvp = NULL; + } + + return gdvp; +} + void ged_push_scene_obj(struct ged *gedp, struct bv_scene_obj *sp) { @@ -1000,7 +1014,7 @@ ged_who_argc(struct ged *gedp) if (BU_STR_EQUAL(cmd2, "1")) { if (!gedp || !gedp->ged_gvp) return 0; - struct bu_ptbl *sg = bv_view_objs(gedp->ged_gvp, BV_SCENE_OBJ_DB); + struct bu_ptbl *sg = &gedp->ged_gvp->vset->shared_db_objs; return BU_PTBL_LEN(sg); } @@ -1034,7 +1048,7 @@ ged_who_argv(struct ged *gedp, char **start, const char **end) if (BU_STR_EQUAL(cmd2, "1")) { if (!gedp || !gedp->ged_gvp) return 0; - struct bu_ptbl *sg = bv_view_objs(gedp->ged_gvp, BV_SCENE_OBJ_DB); + struct bu_ptbl *sg = &gedp->ged_gvp->vset->shared_db_objs; for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { struct bv_scene_group *g = (struct bv_scene_group *)BU_PTBL_GET(sg, i); if ((vp != NULL) && ((const char **)vp < end)) { @@ -1422,8 +1436,7 @@ _ged_rt_set_eye_model(struct ged *gedp, const char *cmd2 = getenv("GED_TEST_NEW_CMD_FORMS"); if (BU_STR_EQUAL(cmd2, "1")) { - struct bu_ptbl *db_objs = bv_view_objs(gedp->ged_gvp, BV_SCENE_OBJ_DB); - (void)scene_bounding_sph(db_objs, &(extremum[0]), &(extremum[1]), 1); + (void)scene_bounding_sph(&gedp->ged_gvp->vset->shared_db_objs, &(extremum[0]), &(extremum[1]), 1); } else { (void)dl_bounding_sph(gedp->ged_gdp->gd_headDisplay, &(extremum[0]), &(extremum[1]), 1); } @@ -1635,7 +1648,7 @@ _ged_rt_write(struct ged *gedp, if (!argc) { const char *cmd2 = getenv("GED_TEST_NEW_CMD_FORMS"); if (BU_STR_EQUAL(cmd2, "1")) { - struct bu_ptbl *sg = bv_view_objs(gedp->ged_gvp, BV_SCENE_OBJ_DB); + struct bu_ptbl *sg = &gedp->ged_gvp->vset->shared_db_objs; for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { struct bv_scene_group *g = (struct bv_scene_group *)BU_PTBL_GET(sg, i); fprintf(fp, "draw %s;\n", bu_vls_cstr(&g->s_name)); diff --git a/src/libged/gqa/gqa.cpp b/src/libged/gqa/gqa.cpp index 41d6f5136b8..7eb29065066 100644 --- a/src/libged/gqa/gqa.cpp +++ b/src/libged/gqa/gqa.cpp @@ -2685,7 +2685,8 @@ ged_gqa_core(struct ged *gedp, int argc, const char *argv[]) const char *nview = getenv("GED_TEST_NEW_CMD_FORMS"); if (BU_STR_EQUAL(nview, "1")) { struct bview *view = gedp->ged_gvp; - bv_vlblock_obj(ged_gqa_plot.vbp, view, "gqa::overlaps"); + struct bu_ptbl *vobjs = (view->independent) ? view->gv_objs.view_objs : &view->vset->shared_view_objs; + bv_vlblock_to_objs(vobjs, "gqa::overlaps_", ged_gqa_plot.vbp, view, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); } else { _ged_cvt_vlblock_to_solids(gedp, ged_gqa_plot.vbp, "OVERLAPS", 0); } diff --git a/src/libged/joint/joint.c b/src/libged/joint/joint.c index 01aae441938..3393f3f9365 100644 --- a/src/libged/joint/joint.c +++ b/src/libged/joint/joint.c @@ -298,7 +298,8 @@ joint_mesh(struct ged *gedp, int argc, const char *argv[]) const char *nview = getenv("GED_TEST_NEW_CMD_FORMS"); if (BU_STR_EQUAL(nview, "1")) { struct bview *view = gedp->ged_gvp; - bv_vlblock_obj(vbp, view, "joint"); + struct bu_ptbl *vobjs = (view->independent) ? view->gv_objs.view_objs : &view->vset->shared_view_objs; + bv_vlblock_to_objs(vobjs, "joint::", vbp, view, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); } else { _ged_cvt_vlblock_to_solids(gedp, vbp, name, 0); } diff --git a/src/libged/lod/lod2.cpp b/src/libged/lod/lod2.cpp index 4f2390de64f..16b4b9a7c0c 100644 --- a/src/libged/lod/lod2.cpp +++ b/src/libged/lod/lod2.cpp @@ -48,7 +48,7 @@ ged_lod2_core(struct ged *gedp, int argc, const char *argv[]) /* initialize result */ bu_vls_trunc(gedp->ged_result_str, 0); - struct bview *cv = gedp->ged_gvp; + struct bview *cv = NULL; struct bu_vls cvls = BU_VLS_INIT_ZERO; struct bu_opt_desc vd[2]; BU_OPT(vd[0], "V", "view", "name", &bu_opt_vls, &cvls, "specify view to change lod setting on"); @@ -56,8 +56,16 @@ ged_lod2_core(struct ged *gedp, int argc, const char *argv[]) int opt_ret = bu_opt_parse(NULL, argc, argv, vd); argc = opt_ret; if (bu_vls_strlen(&cvls)) { - cv = bv_set_find_view(&gedp->ged_views, bu_vls_cstr(&cvls)); - if (!cv) { + int found_match = 0; + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *tv = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); + if (BU_STR_EQUAL(bu_vls_cstr(&tv->gv_name), bu_vls_cstr(&cvls))) { + cv = tv; + found_match = 1; + break; + } + } + if (!found_match) { bu_vls_printf(gedp->ged_result_str, "Specified view %s not found\n", bu_vls_cstr(&cvls)); bu_vls_free(&cvls); return BRLCAD_ERROR; @@ -65,7 +73,7 @@ ged_lod2_core(struct ged *gedp, int argc, const char *argv[]) } bu_vls_free(&cvls); - if (!cv) { + if (!cv && !BU_PTBL_LEN(&gedp->ged_views.views)) { return BRLCAD_OK; } @@ -77,19 +85,24 @@ ged_lod2_core(struct ged *gedp, int argc, const char *argv[]) /* Print current state if no args are supplied */ if (argc == 1) { - if (cv->gv_s->adaptive_plot) { + struct bview *gvp = cv; + if (!gvp) + gvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, 0); + if (!gvp) + return BRLCAD_ERROR; + if (gvp->gv_s->adaptive_plot) { bu_vls_printf(gedp->ged_result_str, "LoD drawing: enabled\n"); } else { bu_vls_printf(gedp->ged_result_str, "LoD drawing: disabled\n"); } - if (cv->gv_s->redraw_on_zoom) { + if (gvp->gv_s->redraw_on_zoom) { bu_vls_printf(gedp->ged_result_str, "Redraw on zoom: enabled\n"); } else { bu_vls_printf(gedp->ged_result_str, "Redraw on zoom: disabled\n"); } - bu_vls_printf(gedp->ged_result_str, "Point scale: %g\n", cv->gv_s->point_scale); - bu_vls_printf(gedp->ged_result_str, "Curve scale: %g\n", cv->gv_s->curve_scale); - bu_vls_printf(gedp->ged_result_str, "BoT face threshold: %zd\n", cv->gv_s->bot_threshold); + bu_vls_printf(gedp->ged_result_str, "Point scale: %g\n", gvp->gv_s->point_scale); + bu_vls_printf(gedp->ged_result_str, "Curve scale: %g\n", gvp->gv_s->curve_scale); + bu_vls_printf(gedp->ged_result_str, "BoT face threshold: %zd\n", gvp->gv_s->bot_threshold); return BRLCAD_OK; } @@ -106,9 +119,8 @@ ged_lod2_core(struct ged *gedp, int argc, const char *argv[]) } } else { int delta = 0; - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *v = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *v = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (!v) continue; if (!v->gv_s->adaptive_plot) { @@ -131,9 +143,8 @@ ged_lod2_core(struct ged *gedp, int argc, const char *argv[]) } } else { int delta = 0; - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *v = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *v = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (!v) continue; if (v->gv_s->adaptive_plot) { @@ -150,24 +161,34 @@ ged_lod2_core(struct ged *gedp, int argc, const char *argv[]) } } else if (argc == 1 && BU_STR_EQUAL(argv[0], "enabled")) { /* lod enabled - return on state */ - bu_vls_printf(gedp->ged_result_str, "%d", cv->gv_s->adaptive_plot); + struct bview *gvp = cv; + if (!gvp) + gvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, 0); + if (!gvp) + return BRLCAD_ERROR; + bu_vls_printf(gedp->ged_result_str, "%d", gvp->gv_s->adaptive_plot); } else if (BU_STR_EQUAL(argv[0], "scale")) { + struct bview *gvp = cv; + if (!gvp) + gvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, 0); + if (!gvp) + return BRLCAD_ERROR; if (argc == 2 || argc == 3) { if (BU_STR_EQUAL(argv[1], "points")) { if (argc == 2) { /* lod scale points - return current value */ - bu_vls_printf(gedp->ged_result_str, "%f", cv->gv_s->point_scale); + bu_vls_printf(gedp->ged_result_str, "%f", gvp->gv_s->point_scale); } else { /* lod scale points f - set value */ - cv->gv_s->point_scale = atof(argv[2]); + gvp->gv_s->point_scale = atof(argv[2]); } } else if (BU_STR_EQUAL(argv[1], "curves")) { if (argc == 2) { /* lod scale curves - return current value */ - bu_vls_printf(gedp->ged_result_str, "%f", cv->gv_s->curve_scale); + bu_vls_printf(gedp->ged_result_str, "%f", gvp->gv_s->curve_scale); } else { /* lod scale curves f - set value */ - cv->gv_s->curve_scale = atof(argv[2]); + gvp->gv_s->curve_scale = atof(argv[2]); } } else { printUsage = 1; @@ -176,10 +197,15 @@ ged_lod2_core(struct ged *gedp, int argc, const char *argv[]) printUsage = 1; } } else if (BU_STR_EQUAL(argv[0], "redraw")) { + struct bview *gvp = cv; + if (!gvp) + gvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, 0); + if (!gvp) + return BRLCAD_ERROR; printUsage = 1; if (argc == 1) { /* lod redraw - return current value */ - if (cv->gv_s->redraw_on_zoom) { + if (gvp->gv_s->redraw_on_zoom) { bu_vls_printf(gedp->ged_result_str, "onzoom"); } else { bu_vls_printf(gedp->ged_result_str, "off"); @@ -188,11 +214,11 @@ ged_lod2_core(struct ged *gedp, int argc, const char *argv[]) } else if (argc == 2) { if (BU_STR_EQUAL(argv[1], "off")) { /* lod redraw off */ - cv->gv_s->redraw_on_zoom = 0; + gvp->gv_s->redraw_on_zoom = 0; printUsage = 0; } else if (BU_STR_EQUAL(argv[1], "onzoom")) { /* lod redraw onzoom */ - cv->gv_s->redraw_on_zoom = 1; + gvp->gv_s->redraw_on_zoom = 1; printUsage = 0; } } diff --git a/src/libged/nirt/nirt.c b/src/libged/nirt/nirt.c index b96fd2437a6..eeae9ce1904 100644 --- a/src/libged/nirt/nirt.c +++ b/src/libged/nirt/nirt.c @@ -350,7 +350,8 @@ ged_nirt_core(struct ged *gedp, int argc, const char *argv[]) const char *nview = getenv("GED_TEST_NEW_CMD_FORMS"); if (BU_STR_EQUAL(nview, "1")) { struct bview *view = gedp->ged_gvp; - bv_vlblock_obj(vbp, view, "nirt"); + struct bu_ptbl *vobjs = (view->independent) ? view->gv_objs.view_objs : &view->vset->shared_view_objs; + bv_vlblock_to_objs(vobjs, "nirt::", vbp, view, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); } else { _ged_cvt_vlblock_to_solids(gedp, vbp, bu_vls_addr(&gedp->ged_gdp->gd_qray_basename), 0); } diff --git a/src/libged/overlay/overlay.c b/src/libged/overlay/overlay.c index 8cda71755bf..ce9db8f4290 100644 --- a/src/libged/overlay/overlay.c +++ b/src/libged/overlay/overlay.c @@ -220,7 +220,8 @@ ged_overlay_core(struct ged *gedp, int argc, const char *argv[]) const char *nview = getenv("GED_TEST_NEW_CMD_FORMS"); if (BU_STR_EQUAL(nview, "1")) { struct bview *v = gedp->ged_gvp; - bv_vlblock_obj(vbp, v, bu_vls_cstr(&nroot)); + struct bu_ptbl *vobjs = (v->independent) ? v->gv_objs.view_objs : &v->vset->shared_view_objs; + bv_vlblock_to_objs(vobjs, bu_vls_cstr(&nroot), vbp, gedp->ged_gvp, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); } else { _ged_cvt_vlblock_to_solids(gedp, vbp, name, 0); } diff --git a/src/libged/points_eval.c b/src/libged/points_eval.c index 5febd1b6c19..b2b817cd405 100644 --- a/src/libged/points_eval.c +++ b/src/libged/points_eval.c @@ -110,7 +110,7 @@ draw_points(struct bv_scene_obj *s) struct pnt_normal *pn = NULL; struct pnt_normal *pl = (struct pnt_normal *)pnts->point; - struct bu_list *vlfree = s->vlfree; + struct bu_list *vlfree = &s->s_v->vset->vlfree; struct bu_list *vhead = &s->s_vlist; for (BU_LIST_FOR(pn, pnt_normal, &(pl->l))) { vect_t v1pp, v2pp, v3pp = {0.0, 0.0, 0.0}; diff --git a/src/libged/rtcheck/rtcheck2.cpp b/src/libged/rtcheck/rtcheck2.cpp index 0d1569c6ee7..3e19eed4ec4 100644 --- a/src/libged/rtcheck/rtcheck2.cpp +++ b/src/libged/rtcheck/rtcheck2.cpp @@ -113,8 +113,7 @@ rtcheck_vector_handler(void *clientData, int type) // overlaps to draw, we're eliminating all the old objects const char *sname = "rtcheck::"; struct bview *v = gedp->ged_gvp; - struct bu_ptbl *view_objs = bv_view_objs(v, BV_SCENE_OBJ_VIEW); - struct bu_ptbl *vobjs = (v->independent) ? v->gv_objs.view_objs : view_objs; + struct bu_ptbl *vobjs = (v->independent) ? v->gv_objs.view_objs : &v->vset->shared_view_objs; std::set robjs; for (i = 0; i < BU_PTBL_LEN(vobjs); i++) { struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(vobjs, i); @@ -125,7 +124,8 @@ rtcheck_vector_handler(void *clientData, int type) std::set::iterator r_it; for (r_it = robjs.begin(); r_it != robjs.end(); r_it++) { struct bv_scene_obj *s = *r_it; - bv_obj_put(s); + bv_scene_obj_free(s, gedp->ged_views.free_scene_obj); + bu_ptbl_rm(vobjs, (long *)s); } /* Add any visual output generated by rtcheck */ @@ -140,7 +140,7 @@ rtcheck_vector_handler(void *clientData, int type) if (have_visual) { bu_log("final nused: %zu\n", rtcp->vbp->nused); - bv_vlblock_obj(rtcp->vbp, gedp->ged_gvp, sname); + bv_vlblock_to_objs(vobjs, sname, rtcp->vbp, gedp->ged_gvp, gedp->ged_views.free_scene_obj, &gedp->ged_views.vlfree); } } } diff --git a/src/libged/view/gobjs.cpp b/src/libged/view/gobjs.cpp index 4ab74729546..ab0c1432fc5 100644 --- a/src/libged/view/gobjs.cpp +++ b/src/libged/view/gobjs.cpp @@ -44,6 +44,15 @@ #include "../ged_private.h" #include "./ged_view.h" +#define GET_BV_SCENE_OBJ(p, fp) { \ + if (BU_LIST_IS_EMPTY(fp)) { \ + BU_ALLOC((p), struct bv_scene_obj); \ + } else { \ + p = BU_LIST_NEXT(bv_scene_obj, fp); \ + BU_LIST_DEQUEUE(&((p)->l)); \ + } \ + BU_LIST_INIT( &((p)->s_vlist) ); } + int _gobjs_cmd_create(void *bs, int argc, const char **argv) { @@ -116,9 +125,9 @@ _gobjs_cmd_create(void *bs, int argc, const char **argv) } /* Set up the toplevel object */ - struct bv_scene_group *g = bv_obj_get(v, BV_SCENE_OBJ_DB); - if (!g) - return BRLCAD_ERROR; + struct bv_scene_group *g; + GET_BV_SCENE_OBJ(g, &gedp->ged_views.free_scene_obj->l); + bv_scene_obj_init(g, gedp->ged_views.free_scene_obj); db_path_to_vls(&g->s_name, fp); bu_vls_sprintf(&g->s_uuid, "%s", argv[1]); g->s_i_data = (void *)ip; @@ -137,6 +146,7 @@ _gobjs_cmd_create(void *bs, int argc, const char **argv) dd.v = gedp->ged_gvp; dd.tol = &gedp->ged_wdbp->wdb_tol; dd.ttol = &gedp->ged_wdbp->wdb_ttol; + dd.free_scene_obj = gedp->ged_views.free_scene_obj; dd.color_inherit = 0; dd.bound_only = 0; dd.s_size = &s_size; @@ -179,7 +189,9 @@ _gobjs_cmd_delete(void *bs, int argc, const char **argv) bu_vls_printf(gedp->ged_result_str, "No view object named %s\n", gd->vobj); return BRLCAD_ERROR; } - bv_obj_put(s); + // TODO may need gv_objs.view_shared_objs depending on view type + bu_ptbl_rm(gedp->ged_gvp->gv_objs.view_objs, (long *)s); + bv_scene_obj_free(s, gedp->ged_views.free_scene_obj); return BRLCAD_OK; } @@ -232,14 +244,13 @@ _view_cmd_gobjs(void *bs, int argc, const char **argv) // If we're not wanting help and we have no subcommand, list current gobjs objects struct bview *v = gedp->ged_gvp; if (!ac && cmd_pos < 0 && !help) { - struct bu_ptbl *view_objs = bv_view_objs(v, BV_SCENE_OBJ_VIEW); - for (size_t i = 0; i < BU_PTBL_LEN(view_objs); i++) { - struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(view_objs, i); + for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->shared_view_objs); i++) { + struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(&v->vset->shared_view_objs, i); // TODO - strip gobjs:: prefix bu_vls_printf(gd->gedp->ged_result_str, "%s\n", bu_vls_cstr(&s->s_uuid)); } - if (view_objs != v->gv_objs.view_objs) { + if (&v->vset->shared_view_objs != v->gv_objs.view_objs) { for (size_t i = 0; i < BU_PTBL_LEN(v->gv_objs.view_objs); i++) { struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(v->gv_objs.view_objs, i); // TODO - strip gobjs:: prefix diff --git a/src/libged/view/objs.cpp b/src/libged/view/objs.cpp index 6d32fe94c93..4015b393fd9 100644 --- a/src/libged/view/objs.cpp +++ b/src/libged/view/objs.cpp @@ -41,6 +41,15 @@ extern "C" { #include "./ged_view.h" } +#define GET_BV_SCENE_OBJ(p, fp) { \ + if (BU_LIST_IS_EMPTY(fp)) { \ + BU_ALLOC((p), struct bv_scene_obj); \ + } else { \ + p = BU_LIST_NEXT(bv_scene_obj, fp); \ + BU_LIST_DEQUEUE(&((p)->l)); \ + } \ + BU_LIST_INIT( &((p)->s_vlist) ); } + int _objs_cmd_draw(void *bs, int argc, const char **argv) { @@ -108,7 +117,8 @@ _objs_cmd_delete(void *bs, int argc, const char **argv) bu_vls_printf(gedp->ged_result_str, "View object %s is associated with a database object - use 'erase' cmd to clear\n", gd->vobj); return BRLCAD_ERROR; } - bv_obj_put(s); + bu_ptbl_rm(gedp->ged_gvp->gv_objs.view_objs, (long *)s); + bv_scene_obj_free(s, gedp->ged_views.free_scene_obj); return BRLCAD_OK; } @@ -386,9 +396,8 @@ _view_cmd_objs(void *bs, int argc, const char **argv) struct bview *v = gedp->ged_gvp; if (!ac && cmd_pos < 0 && !help) { if (list_db) { - struct bu_ptbl *db_objs = bv_view_objs(v, BV_SCENE_OBJ_DB); - for (size_t i = 0; i < BU_PTBL_LEN(db_objs); i++) { - struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(db_objs, i); + for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->shared_db_objs); i++) { + struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(&v->vset->shared_db_objs, i); if (bu_list_len(&cg->s_vlist)) { bu_vls_printf(gd->gedp->ged_result_str, "%s\n", bu_vls_cstr(&cg->s_name)); } else { @@ -400,13 +409,12 @@ _view_cmd_objs(void *bs, int argc, const char **argv) } } if (list_view) { - struct bu_ptbl *view_objs = bv_view_objs(v, BV_SCENE_OBJ_VIEW); - for (size_t i = 0; i < BU_PTBL_LEN(view_objs); i++) { - struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(view_objs, i); + for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->shared_view_objs); i++) { + struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(&v->vset->shared_view_objs, i); bu_vls_printf(gd->gedp->ged_result_str, "%s\n", bu_vls_cstr(&s->s_uuid)); } - if (view_objs != v->gv_objs.view_objs) { + if (&v->vset->shared_view_objs != v->gv_objs.view_objs) { for (size_t i = 0; i < BU_PTBL_LEN(v->gv_objs.view_objs); i++) { struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(v->gv_objs.view_objs, i); bu_vls_printf(gd->gedp->ged_result_str, "%s\n", bu_vls_cstr(&s->s_uuid)); @@ -438,9 +446,8 @@ _view_cmd_objs(void *bs, int argc, const char **argv) } if (!gd->s) { - struct bu_ptbl *db_objs = bv_view_objs(v, BV_SCENE_OBJ_DB); - for (size_t i = 0; i < BU_PTBL_LEN(db_objs); i++) { - struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(db_objs, i); + for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->shared_db_objs); i++) { + struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(&v->vset->shared_db_objs, i); if (bu_list_len(&cg->s_vlist)) { if (BU_STR_EQUAL(gd->vobj, bu_vls_cstr(&cg->s_name))) { gd->s = cg; diff --git a/src/libged/view/polygons.c b/src/libged/view/polygons.c index 7ceda28b5b5..bcf445f6134 100644 --- a/src/libged/view/polygons.c +++ b/src/libged/view/polygons.c @@ -92,7 +92,7 @@ _poly_cmd_create(void *bs, int argc, const char **argv) } } - s = bv_create_polygon(gedp->ged_gvp, type, x, y); + s = bv_create_polygon(gedp->ged_gvp, type, x, y, gedp->ged_views.free_scene_obj); if (!s) { bu_vls_printf(gedp->ged_result_str, "Failed to create %s\n", gd->vobj); return BRLCAD_ERROR; @@ -640,7 +640,7 @@ _poly_cmd_import(void *bs, int argc, const char **argv) return BRLCAD_ERROR; } - s = db_sketch_to_scene_obj(gd->vobj, gedp->dbip, dp, gedp->ged_gvp); + s = db_sketch_to_scene_obj(gd->vobj, gedp->dbip, dp, gedp->ged_gvp, gedp->ged_views.free_scene_obj); if (!s) { bu_vls_printf(gedp->ged_result_str, "Failed to create %s\n", gd->vobj); return BRLCAD_ERROR; diff --git a/src/libged/view/view.c b/src/libged/view/view.c index 42e01f5ad0f..5af8df6528d 100644 --- a/src/libged/view/view.c +++ b/src/libged/view/view.c @@ -121,7 +121,14 @@ _view_cmd_independent(void *bs, int argc, const char **argv) return BRLCAD_ERROR; } - struct bview *v = bv_set_find_view(&gedp->ged_views, argv[0]); + struct bview *v = NULL; + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + v = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); + if (BU_STR_EQUAL(bu_vls_cstr(&v->gv_name), argv[0])) { + break; + } + } + if (!v) { bu_vls_printf(gedp->ged_result_str, "view %s not found\n", argv[0]); return BRLCAD_ERROR; @@ -135,7 +142,7 @@ _view_cmd_independent(void *bs, int argc, const char **argv) if (BU_STR_EQUAL(argv[1], "1")) { v->independent = 1; // Initialize local containers with current shared grps - struct bu_ptbl *sg = bv_view_objs(v, BV_SCENE_OBJ_DB); + struct bu_ptbl *sg = &v->vset->shared_db_objs; if (!sg) return BRLCAD_OK; for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { @@ -158,11 +165,12 @@ _view_cmd_independent(void *bs, int argc, const char **argv) if (BU_STR_EQUAL(argv[1], "0")) { v->independent = 0; // Clear local containers - struct bu_ptbl *sg = v->gv_objs.db_objs; + struct bu_ptbl *sg = v->gv_objs.view_grps; if (sg) { for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); - bv_obj_put(cg); + bv_scene_obj_free(cg, gedp->ged_views.free_scene_obj); + BU_PUT(cg, struct bv_scene_group); } bu_ptbl_reset(sg); } @@ -184,9 +192,8 @@ _view_cmd_list(void *bs, int argc, const char **argv) } struct ged *gedp = gd->gedp; - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - struct bview *v = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *v = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (v != gedp->ged_gvp) { bu_vls_printf(gedp->ged_result_str, " %s\n", bu_vls_cstr(&v->gv_name)); } else { @@ -491,9 +498,8 @@ struct bv_scene_obj *wobj = NULL; } } if (!wobj) { - struct bu_ptbl *sg = bv_view_objs(v, BV_SCENE_OBJ_DB); - for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { - struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); + for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->shared_db_objs); i++) { + struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(&v->vset->shared_db_objs, i); if (bu_list_len(&cg->s_vlist)) { if (!bu_vls_strcmp(&cg->s_name, &calc_target)) { wobj = cg; @@ -539,9 +545,8 @@ struct bv_scene_obj *wobj = NULL; } } } - struct bu_ptbl *sg = bv_view_objs(v, BV_SCENE_OBJ_DB); - for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { - struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); + for (size_t i = 0; i < BU_PTBL_LEN(&v->vset->shared_db_objs); i++) { + struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(&v->vset->shared_db_objs, i); if (bu_list_len(&cg->s_vlist)) { fastf_t calc_val = bv_vZ_calc(cg, gedp->ged_gvp, calc_mode); if (calc_mode) { diff --git a/src/libged/who/who2.cpp b/src/libged/who/who2.cpp index 8a5dbcbe8ab..896eb50fd1e 100644 --- a/src/libged/who/who2.cpp +++ b/src/libged/who/who2.cpp @@ -55,9 +55,7 @@ ged_who2_core(struct ged *gedp, int argc, const char *argv[]) return BRLCAD_ERROR; } - struct bu_ptbl *sg = bv_view_objs(gedp->ged_gvp, BV_SCENE_OBJ_DB); - if (!sg) - return BRLCAD_ERROR; + struct bu_ptbl *sg = &gedp->ged_gvp->vset->shared_db_objs; for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); bu_vls_printf(gedp->ged_result_str, "%s\n", bu_vls_cstr(&cg->s_name)); diff --git a/src/libged/wireframe_eval.c b/src/libged/wireframe_eval.c index 0ca88ccc270..6050b89530b 100644 --- a/src/libged/wireframe_eval.c +++ b/src/libged/wireframe_eval.c @@ -1803,7 +1803,7 @@ draw_m3(struct bv_scene_obj *s) dgcdp.fp = &d->fp; dgcdp.tol = d->tol; dgcdp.ttol = d->ttol; - dgcdp.vlfree = s->vlfree; + dgcdp.vlfree = &s->s_v->vset->vlfree; BU_ALLOC(dgcdp.ap, struct application); RT_APPLICATION_INIT(dgcdp.ap); diff --git a/src/libged/zap/zap.c b/src/libged/zap/zap.c index 1cfe896d0f1..b4e1c0e000c 100644 --- a/src/libged/zap/zap.c +++ b/src/libged/zap/zap.c @@ -58,7 +58,7 @@ ged_zap_core(struct ged *gedp, int argc, const char *argv[]) return BRLCAD_ERROR; } - dl_zap(gedp); + dl_zap(gedp, gedp->ged_views.free_scene_obj); return BRLCAD_OK; } diff --git a/src/libged/zap/zap2.cpp b/src/libged/zap/zap2.cpp index de9ac75c67d..16798c6a7aa 100644 --- a/src/libged/zap/zap2.cpp +++ b/src/libged/zap/zap2.cpp @@ -30,6 +30,85 @@ #include "../ged_private.h" +#define GET_BV_SCENE_OBJ(p, fp) { \ + if (BU_LIST_IS_EMPTY(fp)) { \ + BU_ALLOC((p), struct bv_scene_obj); \ + } else { \ + p = BU_LIST_NEXT(bv_scene_obj, fp); \ + BU_LIST_DEQUEUE(&((p)->l)); \ + } \ + BU_LIST_INIT( &((p)->s_vlist) ); } + +static int +ged_clear_view(struct ged *gedp, struct bview *v, int clear_solid_objs, int clear_view_objs) +{ + struct bu_ptbl *sv; + + if (clear_solid_objs) { + // Always make sure the view's specified local containers are cleared. We + // may be skipping the shared objects depending on the settings, but a zap + // on a view always clears the local versions. + struct bu_ptbl *sg = v->gv_objs.view_grps; + if (sg) { + for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { + struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); + bv_scene_obj_free(cg, gedp->ged_views.free_scene_obj); + } + bu_ptbl_reset(sg); + } + + // If set, clear the shared objects as well (this has implications + // beyond just this view, so it is only done when the caller + // specifically requests it.) + if (!v->independent) { + sg = &v->vset->shared_db_objs; + if (sg) { + for (size_t i = 0; i < BU_PTBL_LEN(sg); i++) { + struct bv_scene_group *cg = (struct bv_scene_group *)BU_PTBL_GET(sg, i); + bv_scene_obj_free(cg, gedp->ged_views.free_scene_obj); + } + bu_ptbl_reset(sg); + } + } + } + + // If we're not processing view objects, we're done + if (!clear_view_objs) + return BRLCAD_OK; + + // If the options indicate it, clear view objects as well + sv = v->gv_objs.view_objs; + if (sv) { + for (long i = (long)BU_PTBL_LEN(sv) - 1; i >= 0; i--) { + struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(sv, i); + bu_ptbl_rm(sv, (long *)s); + bv_scene_obj_free(s, gedp->ged_views.free_scene_obj); + } + } + if (!v->independent) { + sv = &v->vset->shared_view_objs; + if (sv) { + for (long i = (long)BU_PTBL_LEN(sv) - 1; i >= 0; i--) { + struct bv_scene_obj *s = (struct bv_scene_obj *)BU_PTBL_GET(sv, i); + bu_ptbl_rm(sv, (long *)s); + bv_scene_obj_free(s, gedp->ged_views.free_scene_obj); + } + } + } + + /* The application may need to adjust itself when the view is fully + * cleared. Since the blast command may immediately re-populate the + * display list, we set a flag in the view to inform the app a zap + * operation has taken place. */ + if (!BU_PTBL_LEN(v->gv_objs.view_objs) && !BU_PTBL_LEN(v->gv_objs.view_grps)) { + if (v->independent || (!BU_PTBL_LEN(&v->vset->shared_view_objs) && !BU_PTBL_LEN(&v->vset->shared_db_objs))) { + v->gv_s->gv_cleared = 1; + } + } + + return BRLCAD_OK; +} + /* * Erase all currently displayed geometry * @@ -78,8 +157,16 @@ ged_zap2_core(struct ged *gedp, int argc, const char *argv[]) } if (!clear_all_views && bu_vls_strlen(&cvls)) { - v = bv_set_find_view(&gedp->ged_views, bu_vls_cstr(&cvls)); - if (!v) { + int found_match = 0; + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + struct bview *tv = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); + if (BU_STR_EQUAL(bu_vls_cstr(&tv->gv_name), bu_vls_cstr(&cvls))) { + v = tv; + found_match = 1; + break; + } + } + if (!found_match) { bu_vls_printf(gedp->ged_result_str, "Specified view %s not found\n", bu_vls_cstr(&cvls)); bu_vls_free(&cvls); return BRLCAD_ERROR; @@ -100,32 +187,18 @@ ged_zap2_core(struct ged *gedp, int argc, const char *argv[]) // If we're clearing just one view, handle it if (v && v->independent && !clear_all_views) { - int flags = 0; - if (clear_solid_objs) - flags |= BV_DB_OBJS; - if (clear_view_objs) - flags |= BV_VIEW_OBJS; - if (!bv_clear(v, flags)) - v->gv_s->gv_cleared = 1; - return BRLCAD_OK; + return ged_clear_view(gedp, v, clear_solid_objs, clear_view_objs); } // Clear everything int ret = BRLCAD_OK; - struct bu_ptbl *views = bv_set_views(&gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - v = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views.views); i++) { + v = (struct bview *)BU_PTBL_GET(&gedp->ged_views.views, i); if (v->independent && !clear_all_views) continue; - int flags = BV_SHARED_OBJS; - if (clear_solid_objs) - flags |= BV_DB_OBJS; - if (clear_view_objs) - flags |= BV_VIEW_OBJS; - int nret = bv_clear(v, flags); - if (!nret) - v->gv_s->gv_cleared = 1; - ret = BRLCAD_OK; + int nret = ged_clear_view(gedp, v, clear_solid_objs, clear_view_objs); + if (nret & BRLCAD_ERROR) + ret = nret; } return ret; diff --git a/src/libqtcad/CMakeLists.txt b/src/libqtcad/CMakeLists.txt index 1dd2615dd51..1251bf95ba0 100644 --- a/src/libqtcad/CMakeLists.txt +++ b/src/libqtcad/CMakeLists.txt @@ -102,9 +102,9 @@ if(BRLCAD_ENABLE_QT) QT5_ADD_RESOURCES(qtcad_qrc qtcad_resources.qrc) endif (Qt6Widgets_FOUND) if (Qt6Widgets_FOUND) - BRLCAD_ADDLIB(libqtcad "${qtcad_srcs};${qtcad_moc_srcs};${qtcad_qrc}" "libged;libdm;librt;libbv;libbu;Qt6::Core;Qt6::Widgets;${OPENGL_LIBS}" SHARED) + BRLCAD_ADDLIB(libqtcad "${qtcad_srcs};${qtcad_moc_srcs};${qtcad_qrc}" "libged;libdm;librt;libbu;Qt6::Core;Qt6::Widgets;${OPENGL_LIBS}" SHARED) else() - BRLCAD_ADDLIB(libqtcad "${qtcad_srcs};${qtcad_moc_srcs};${qtcad_qrc}" "libged;libdm;librt;libbv;libbu;Qt5::Core;Qt5::Widgets;${OPENGL_LIBS}" SHARED) + BRLCAD_ADDLIB(libqtcad "${qtcad_srcs};${qtcad_moc_srcs};${qtcad_qrc}" "libged;libdm;librt;libbu;Qt5::Core;Qt5::Widgets;${OPENGL_LIBS}" SHARED) endif (Qt6Widgets_FOUND) set_target_properties(libqtcad PROPERTIES VERSION 20.0.1 SOVERSION 20) if (OPENGL_LIBS) diff --git a/src/libqtcad/QtCADQuad.cpp b/src/libqtcad/QtCADQuad.cpp index 09eacfa46bf..eb10a99c793 100644 --- a/src/libqtcad/QtCADQuad.cpp +++ b/src/libqtcad/QtCADQuad.cpp @@ -43,7 +43,6 @@ #include #include "bu/str.h" -#include "bv.h" #include "ged/defines.h" #include "ged/commands.h" #include "qtcad/QtCADQuad.h" @@ -68,7 +67,7 @@ QtCADQuad::QtCADQuad(QWidget *parent, struct ged *gedpRef, int type) : QWidget(p graphicsType = type; views[UPPER_RIGHT] = createView(UPPER_RIGHT); - bv_set_add_view(&gedp->ged_views, views[UPPER_RIGHT]->view()); + bu_ptbl_ins_unique(&gedp->ged_views.views, (long int *)views[UPPER_RIGHT]->view()); gedp->ged_gvp = views[UPPER_RIGHT]->view(); // Define the spacers @@ -161,7 +160,7 @@ QtCADQuad::changeToSingleFrame() // Don't want use cpu for views that are not visible if (views[i] != nullptr) { views[i]->disconnect(); - bv_set_rm_view(&gedp->ged_views, views[i]->view()); + bu_ptbl_rm(&gedp->ged_views.views, (long int *)(views[i]->view())); delete views[i]; views[i] = nullptr; } @@ -186,7 +185,7 @@ QtCADQuad::changeToQuadFrame() if (views[i] == nullptr) { views[i] = createView(i); } - bv_set_add_view(&gedp->ged_views, views[i]->view()); + bu_ptbl_ins_unique(&gedp->ged_views.views, (long int *)views[i]->view()); QObject::connect(views[i], &QtCADView::changed, this, &QtCADQuad::do_view_changed); } QGridLayout *layout = (QGridLayout *)this->layout(); diff --git a/src/librt/primitives/sketch/polygons.c b/src/librt/primitives/sketch/polygons.c index 608e3ff3afd..b43c3510736 100644 --- a/src/librt/primitives/sketch/polygons.c +++ b/src/librt/primitives/sketch/polygons.c @@ -85,7 +85,7 @@ _sketch_mat_aet(struct bview *gvp) } struct bv_scene_obj * -db_sketch_to_scene_obj(const char *sname, struct db_i *dbip, struct directory *dp, struct bview *sv) +db_sketch_to_scene_obj(const char *sname, struct db_i *dbip, struct directory *dp, struct bview *sv, struct bv_scene_obj *free_scene_obj) { // Begin import size_t ncontours = 0; @@ -111,7 +111,7 @@ db_sketch_to_scene_obj(const char *sname, struct db_i *dbip, struct directory *d } // Have a sketch - create an empty polygon - struct bv_scene_obj *s = bv_create_polygon(sv, BV_POLYGON_GENERAL, 0, 0); + struct bv_scene_obj *s = bv_create_polygon(sv, BV_POLYGON_GENERAL, 0, 0, free_scene_obj); if (!s) { rt_db_free_internal(&intern); return NULL; diff --git a/src/libtclcad/commands.c b/src/libtclcad/commands.c index 1bb9b443710..f09b9bb7339 100644 --- a/src/libtclcad/commands.c +++ b/src/libtclcad/commands.c @@ -1107,9 +1107,8 @@ to_deleteProc(ClientData clientData) // Clean up the libtclcad view data. struct bview *gdvp = NULL; - struct bu_ptbl *views = bv_set_views(&top->to_gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&top->to_gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(&top->to_gedp->ged_views.views, i); // There is a top level command created in the Tcl interp that is the name // of the dm. Clear that command. @@ -1347,7 +1346,7 @@ to_bg(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1417,7 +1416,7 @@ to_bounds(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1481,7 +1480,7 @@ to_configure(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1549,7 +1548,7 @@ to_constrain_rmode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1614,7 +1613,7 @@ to_constrain_tmode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1834,7 +1833,7 @@ to_data_move(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2234,7 +2233,7 @@ to_data_move_object_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2326,7 +2325,7 @@ to_data_move_point_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2417,7 +2416,7 @@ to_data_pick(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2805,7 +2804,7 @@ to_data_vZ(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3176,9 +3175,8 @@ to_dplot(struct ged *gedp, bu_vls_trunc(gedp->ged_result_str, 0); - struct bu_ptbl *views = bv_set_views(¤t_top->to_gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(¤t_top->to_gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(¤t_top->to_gedp->ged_views.views, i); if (to_is_viewable(gdvp)) { gedp->ged_gvp->gv_width = dm_get_width((struct dm *)gdvp->dmp); gedp->ged_gvp->gv_height = dm_get_height((struct dm *)gdvp->dmp); @@ -3249,9 +3247,8 @@ to_dplot(struct ged *gedp, Tcl_Free((char *)av_more); } - struct bu_ptbl *views = bv_set_views(¤t_top->to_gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(¤t_top->to_gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(¤t_top->to_gedp->ged_views.views, i); if (to_is_viewable(gdvp)) { gedp->ged_gvp->gv_width = dm_get_width((struct dm *)gdvp->dmp); gedp->ged_gvp->gv_height = dm_get_height((struct dm *)gdvp->dmp); @@ -3294,7 +3291,7 @@ to_fontsize(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3451,7 +3448,7 @@ to_init_view_bindings(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3485,7 +3482,7 @@ to_delete_view(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3553,7 +3550,7 @@ to_hide_view(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3692,7 +3689,7 @@ to_idle_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3800,7 +3797,7 @@ to_light(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3847,9 +3844,8 @@ to_list_views(struct ged *gedp, return BRLCAD_ERROR; } - struct bu_ptbl *views = bv_set_views(¤t_top->to_gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(¤t_top->to_gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(¤t_top->to_gedp->ged_views.views, i); bu_vls_printf(gedp->ged_result_str, "%s ", bu_vls_addr(&gdvp->gv_name)); } @@ -3884,9 +3880,8 @@ to_lod(struct ged *gedp, { struct bview *gdvp; - struct bu_ptbl *views = bv_set_views(¤t_top->to_gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(¤t_top->to_gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(¤t_top->to_gedp->ged_views.views, i); gedp->ged_gvp = gdvp; (*func)(gedp, argc, (const char **)argv); } @@ -3962,7 +3957,7 @@ to_edit_motion_delta_callback(struct ged *gedp, return BRLCAD_HELP; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4053,7 +4048,7 @@ to_move_arb_edge_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4112,7 +4107,7 @@ to_move_arb_face_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4227,7 +4222,7 @@ to_bot_move_pnt_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4287,7 +4282,7 @@ to_bot_move_pnts_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4349,7 +4344,7 @@ to_metaball_move_pnt_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4408,7 +4403,7 @@ to_pipe_move_pnt_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4586,7 +4581,7 @@ to_new_view(struct ged *gedp, bu_vls_printf(&new_gdvp->gv_name, "%s", argv[name_index]); bv_init(new_gdvp, ¤t_top->to_gedp->ged_views); new_gdvp->callbacks = callbacks; - bv_set_add_view(¤t_top->to_gedp->ged_views, new_gdvp); + bu_ptbl_ins(¤t_top->to_gedp->ged_views.views, (long *)new_gdvp); new_gdvp->gv_s->point_scale = 1.0; new_gdvp->gv_s->curve_scale = 1.0; @@ -4655,7 +4650,7 @@ to_orotate_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4713,7 +4708,7 @@ to_oscale_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4772,7 +4767,7 @@ to_otranslate_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4825,7 +4820,7 @@ to_paint_rect_area(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4874,7 +4869,7 @@ to_pix(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -4959,7 +4954,7 @@ to_png(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5062,7 +5057,7 @@ to_rect_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5147,7 +5142,7 @@ to_rotate_arb_face_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5207,7 +5202,7 @@ to_rotate_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5370,7 +5365,7 @@ to_protate_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5429,7 +5424,7 @@ to_pscale_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5488,7 +5483,7 @@ to_ptranslate_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5547,7 +5542,7 @@ to_data_scale_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5604,7 +5599,7 @@ to_scale_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5662,7 +5657,7 @@ to_screen2model(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5713,7 +5708,7 @@ to_screen2view(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5758,7 +5753,7 @@ to_set_coord(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5809,7 +5804,7 @@ to_snap_view(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5938,7 +5933,7 @@ to_translate_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -5992,7 +5987,7 @@ to_transparency(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -6039,7 +6034,7 @@ to_view_callback(struct ged *gedp, return BRLCAD_HELP; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -6087,7 +6082,7 @@ to_view_win_size(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -6152,7 +6147,7 @@ to_view2screen(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -6197,7 +6192,7 @@ to_vmake(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -6270,7 +6265,7 @@ to_vslew(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -6357,7 +6352,7 @@ to_zbuffer(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -6412,7 +6407,7 @@ to_zclip(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -6452,9 +6447,9 @@ to_create_vlist_callback_solid(struct bv_scene_obj *sp) int first = 1; struct tclcad_ged_data *tgd = (struct tclcad_ged_data *)current_top->to_gedp->u_data; - struct bu_ptbl *views = bv_set_views(¤t_top->to_gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + + for (size_t i = 0; i < BU_PTBL_LEN(¤t_top->to_gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(¤t_top->to_gedp->ged_views.views, i); if (tgd->go_dmv.dlist_on && to_is_viewable(gdvp)) { (void)dm_make_current((struct dm *)gdvp->dmp); @@ -6502,9 +6497,8 @@ to_destroy_vlist_callback(unsigned int dlist, int range) struct bview *gdvp; struct tclcad_ged_data *tgd = (struct tclcad_ged_data *)current_top->to_gedp->u_data; - struct bu_ptbl *views = bv_set_views(¤t_top->to_gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(¤t_top->to_gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(¤t_top->to_gedp->ged_views.views, i); if (tgd->go_dmv.dlist_on && to_is_viewable(gdvp)) { (void)dm_make_current((struct dm *)gdvp->dmp); (void)dm_free_dlists((struct dm *)gdvp->dmp, dlist, range); diff --git a/src/libtclcad/fb.c b/src/libtclcad/fb.c index 077ea4dcc03..9efea7a4073 100644 --- a/src/libtclcad/fb.c +++ b/src/libtclcad/fb.c @@ -987,7 +987,7 @@ to_set_fb_mode(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1043,7 +1043,7 @@ to_listen(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; diff --git a/src/libtclcad/mouse.c b/src/libtclcad/mouse.c index f4f5848824e..e6803f64c16 100644 --- a/src/libtclcad/mouse.c +++ b/src/libtclcad/mouse.c @@ -51,7 +51,7 @@ to_get_prev_mouse(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -92,7 +92,7 @@ to_mouse_append_pnt_common(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -168,7 +168,7 @@ to_mouse_brep_selection_append(struct ged *gedp, } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -280,7 +280,7 @@ to_mouse_brep_selection_translate(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -385,7 +385,7 @@ to_mouse_constrain_rot(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -495,7 +495,7 @@ to_mouse_constrain_trans(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -601,7 +601,7 @@ to_mouse_find_arb_edge(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -663,7 +663,7 @@ to_mouse_find_bot_edge(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -724,7 +724,7 @@ to_mouse_find_bot_pnt(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -786,7 +786,7 @@ to_mouse_find_metaball_pnt(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -849,7 +849,7 @@ to_mouse_find_pipe_pnt(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -907,7 +907,7 @@ to_mouse_joint_select( return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1017,7 +1017,7 @@ to_mouse_joint_selection_translate( return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1174,7 +1174,7 @@ to_mouse_move_arb_edge(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1270,7 +1270,7 @@ to_mouse_move_arb_face(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1382,7 +1382,7 @@ to_mouse_move_bot_pnt(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1549,7 +1549,7 @@ to_mouse_move_bot_pnts(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1659,7 +1659,7 @@ to_mouse_move_pnt_common(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1753,7 +1753,7 @@ to_mouse_orotate(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1860,7 +1860,7 @@ to_mouse_oscale(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1967,7 +1967,7 @@ to_mouse_otranslate(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2120,7 +2120,7 @@ to_mouse_poly_circ(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2295,7 +2295,7 @@ to_mouse_poly_cont(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2436,7 +2436,7 @@ to_mouse_poly_ell(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2621,7 +2621,7 @@ to_mouse_poly_rect(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2778,7 +2778,7 @@ to_mouse_rect(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2845,7 +2845,7 @@ to_mouse_rot(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -2934,7 +2934,7 @@ to_mouse_rotate_arb_face(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3016,7 +3016,7 @@ to_mouse_rotate_arb_face(struct ged *gedp, return BRLCAD_ERROR; \ } \ \ - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); \ + gdvp = ged_find_view(gedp, argv[1]); \ if (!gdvp) { \ bu_vls_printf(gedp->ged_result_str, "View not found - %s", (_argv)[1]); \ return BRLCAD_ERROR; \ @@ -3086,7 +3086,7 @@ to_data_scale(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3237,7 +3237,7 @@ to_mouse_protate(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3327,7 +3327,7 @@ to_mouse_pscale(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3423,7 +3423,7 @@ to_mouse_ptranslate(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -3516,7 +3516,7 @@ to_mouse_trans(struct ged *gedp, return BRLCAD_ERROR; } - struct bview *gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + struct bview *gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; diff --git a/src/libtclcad/polygons.c b/src/libtclcad/polygons.c index e0c777b054b..2e05c0747f5 100644 --- a/src/libtclcad/polygons.c +++ b/src/libtclcad/polygons.c @@ -1019,7 +1019,7 @@ to_data_polygons(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1095,7 +1095,7 @@ to_poly_circ_mode(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1369,13 +1369,13 @@ to_poly_cont_build(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1443,7 +1443,7 @@ to_poly_cont_build_end(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1530,7 +1530,7 @@ to_poly_ell_mode(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -1688,7 +1688,7 @@ to_poly_rect_mode(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; diff --git a/src/libtclcad/view/arrows.c b/src/libtclcad/view/arrows.c index d647a57b886..f2a0e2058ba 100644 --- a/src/libtclcad/view/arrows.c +++ b/src/libtclcad/view/arrows.c @@ -96,7 +96,7 @@ to_data_arrows(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; diff --git a/src/libtclcad/view/autoview.c b/src/libtclcad/view/autoview.c index 260bb923ac6..2ae30d5ab3c 100644 --- a/src/libtclcad/view/autoview.c +++ b/src/libtclcad/view/autoview.c @@ -77,7 +77,7 @@ to_autoview(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -97,9 +97,8 @@ to_autoview_all_views(struct tclcad_obj *top) { struct bview *gdvp; - struct bu_ptbl *views = bv_set_views(&top->to_gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&top->to_gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(&top->to_gedp->ged_views.views, i); to_autoview_view(gdvp, NULL); } } diff --git a/src/libtclcad/view/axes.c b/src/libtclcad/view/axes.c index 6a36cc88bd0..751e362cf96 100644 --- a/src/libtclcad/view/axes.c +++ b/src/libtclcad/view/axes.c @@ -503,7 +503,7 @@ to_data_axes(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -714,7 +714,7 @@ to_model_axes(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -772,7 +772,7 @@ to_view_axes(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; diff --git a/src/libtclcad/view/faceplate.c b/src/libtclcad/view/faceplate.c index fd6ee7d800c..c5d6b9652d9 100644 --- a/src/libtclcad/view/faceplate.c +++ b/src/libtclcad/view/faceplate.c @@ -56,7 +56,7 @@ to_faceplate(struct ged *gedp, if (argc < 4 || 7 < argc) goto bad; - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; diff --git a/src/libtclcad/view/labels.c b/src/libtclcad/view/labels.c index 554bad1216a..6d25df4d14d 100644 --- a/src/libtclcad/view/labels.c +++ b/src/libtclcad/view/labels.c @@ -96,7 +96,7 @@ to_data_labels(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; diff --git a/src/libtclcad/view/lines.c b/src/libtclcad/view/lines.c index 804c006a0e7..439f9e90431 100644 --- a/src/libtclcad/view/lines.c +++ b/src/libtclcad/view/lines.c @@ -105,7 +105,7 @@ to_data_lines(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; diff --git a/src/libtclcad/view/refresh.c b/src/libtclcad/view/refresh.c index 90311531372..92077d17865 100644 --- a/src/libtclcad/view/refresh.c +++ b/src/libtclcad/view/refresh.c @@ -157,9 +157,8 @@ to_refresh_all_views(struct tclcad_obj *top) { struct bview *gdvp; - struct bu_ptbl *views = bv_set_views(&top->to_gedp->ged_views); - for (size_t i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (size_t i = 0; i < BU_PTBL_LEN(&top->to_gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(&top->to_gedp->ged_views.views, i); to_refresh_view(gdvp); } } @@ -251,7 +250,7 @@ to_handle_refresh(struct ged *gedp, { struct bview *gdvp; - gdvp = bv_set_find_view(&gedp->ged_views, name); + gdvp = ged_find_view(gedp, name); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", name); return BRLCAD_ERROR; diff --git a/src/libtclcad/wrapper.c b/src/libtclcad/wrapper.c index 799ef3a9d44..26657518581 100644 --- a/src/libtclcad/wrapper.c +++ b/src/libtclcad/wrapper.c @@ -61,9 +61,8 @@ to_autoview_func(struct ged *gedp, if (!rflag && ret == BRLCAD_OK && strlen(bu_vls_addr(gedp->ged_result_str)) == 0) aflag = 1; - struct bu_ptbl *views = bv_set_views(¤t_top->to_gedp->ged_views); - for (i = 0; i < BU_PTBL_LEN(views); i++) { - gdvp = (struct bview *)BU_PTBL_GET(views, i); + for (i = 0; i < BU_PTBL_LEN(¤t_top->to_gedp->ged_views.views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(¤t_top->to_gedp->ged_views.views, i); if (to_is_viewable(gdvp)) { gedp->ged_gvp->gv_width = dm_get_width((struct dm *)gdvp->dmp); gedp->ged_gvp->gv_height = dm_get_height((struct dm *)gdvp->dmp); @@ -265,7 +264,7 @@ to_view_func_common(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; @@ -383,7 +382,7 @@ to_dm_func(struct ged *gedp, return BRLCAD_ERROR; } - gdvp = bv_set_find_view(&gedp->ged_views, argv[1]); + gdvp = ged_find_view(gedp, argv[1]); if (!gdvp) { bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); return BRLCAD_ERROR; diff --git a/src/mged/dodraw.c b/src/mged/dodraw.c index 73bb7ebed54..ff3238d0fdd 100644 --- a/src/mged/dodraw.c +++ b/src/mged/dodraw.c @@ -131,9 +131,8 @@ drawH_part2(int dashflag, struct bu_list *vhead, const struct db_full_path *path if (!existing_sp) { /* Handling a new solid */ - struct bv_scene_obj *free_scene_obj = bv_set_fsos(&GEDP->ged_views); - GET_BV_SCENE_OBJ(sp, &free_scene_obj->l); - BU_LIST_APPEND(&free_scene_obj->l, &((sp)->l) ); + GET_BV_SCENE_OBJ(sp, &GEDP->ged_views.free_scene_obj->l); + BU_LIST_APPEND(&GEDP->ged_views.free_scene_obj->l, &((sp)->l) ); sp->s_dlist = 0; } else { /* Just updating an existing solid. diff --git a/src/qged/app.cpp b/src/qged/app.cpp index 00aed468c21..7108cd5e002 100644 --- a/src/qged/app.cpp +++ b/src/qged/app.cpp @@ -203,7 +203,7 @@ qged_view_update(struct ged *gedp, std::unordered_set *chang { struct db_i *dbip = gedp->dbip; struct bview *v = gedp->ged_gvp; - struct bu_ptbl *sg = bv_view_objs(v, BV_SCENE_OBJ_DB); + struct bu_ptbl *sg = &v->vset->shared_db_objs; std::set regen; std::set erase; std::set::iterator r_it; diff --git a/src/qged/plugins/polygon/QPolyCreate.cpp b/src/qged/plugins/polygon/QPolyCreate.cpp index d0f0f42a5d2..79887ec9691 100644 --- a/src/qged/plugins/polygon/QPolyCreate.cpp +++ b/src/qged/plugins/polygon/QPolyCreate.cpp @@ -29,6 +29,9 @@ #include "../../app.h" #include "QPolyCreate.h" +#define FREE_BV_SCENE_OBJ(p, fp) { \ + BU_LIST_APPEND(fp, &((p)->l)); } + QPolyCreate::QPolyCreate() : QWidget() { @@ -170,7 +173,8 @@ QPolyCreate::finalize(bool) // to make a closed polygon. bg_polygon_free(&ip->polygon); BU_PUT(ip, struct bv_polygon); - bv_obj_put(p); + bu_ptbl_rm(gedp->ged_gvp->gv_objs.view_objs, (long *)p); + FREE_BV_SCENE_OBJ(p, &gedp->ged_views.free_scene_obj->l); do_bool = false; p = NULL; emit view_updated(&gedp->ged_gvp); @@ -206,7 +210,8 @@ QPolyCreate::finalize(bool) if (pcnt || op != bg_Union) { bg_polygon_free(&ip->polygon); BU_PUT(ip, struct bv_polygon); - bv_obj_put(p); + bu_ptbl_rm(gedp->ged_gvp->gv_objs.view_objs, (long *)p); + FREE_BV_SCENE_OBJ(p, &gedp->ged_views.free_scene_obj->l); } else { // Check if we have a name collision - if we do, it's no go @@ -229,7 +234,8 @@ QPolyCreate::finalize(bool) if (colliding) { bg_polygon_free(&ip->polygon); BU_PUT(ip, struct bv_polygon); - bv_obj_put(p); + bu_ptbl_rm(gedp->ged_gvp->gv_objs.view_objs, (long *)p); + FREE_BV_SCENE_OBJ(p, &gedp->ged_views.free_scene_obj->l); do_bool = false; p = NULL; emit view_updated(&gedp->ged_gvp); @@ -405,7 +411,7 @@ QPolyCreate::do_import_sketch() } // Names are valid, dp is ready - try the sketch import - p = db_sketch_to_scene_obj(vname, gedp->dbip, dp, gedp->ged_gvp); + p = db_sketch_to_scene_obj(vname, gedp->dbip, dp, gedp->ged_gvp, gedp->ged_views.free_scene_obj); bu_free(vname, "name cpy"); if (!p) { return; @@ -634,9 +640,9 @@ QPolyCreate::eventFilter(QObject *, QEvent *e) ptype = BV_POLYGON_GENERAL; } #ifdef USE_QT6 - p = bv_create_polygon(gedp->ged_gvp, ptype, m_e->position().x(), m_e->position().y()); + p = bv_create_polygon(gedp->ged_gvp, ptype, m_e->position().x(), m_e->position().y(), gedp->ged_views.free_scene_obj); #else - p = bv_create_polygon(gedp->ged_gvp, ptype, m_e->x(), m_e->y()); + p = bv_create_polygon(gedp->ged_gvp, ptype, m_e->x(), m_e->y(), gedp->ged_views.free_scene_obj); #endif p->s_v = gedp->ged_gvp; struct bv_polygon *ip = (struct bv_polygon *)p->s_i_data; diff --git a/src/qged/plugins/polygon/QPolyMod.cpp b/src/qged/plugins/polygon/QPolyMod.cpp index 7500e5a41da..013ee38b1e7 100644 --- a/src/qged/plugins/polygon/QPolyMod.cpp +++ b/src/qged/plugins/polygon/QPolyMod.cpp @@ -30,6 +30,16 @@ #include "QPolyCreate.h" #include "QPolyMod.h" +#define FREE_BV_SCENE_OBJ(p, fp) { \ + for (size_t c_i = 0; c_i < BU_PTBL_LEN(&p->children); c_i++) { \ + struct bv_scene_obj *s_c = (struct bv_scene_obj *)BU_PTBL_GET(&p->children, c_i); \ + BU_LIST_APPEND(fp, &((s_c)->l)); \ + BV_FREE_VLIST(&gedp->ged_views.vlfree, &((s_c)->s_vlist)); \ + } \ + BU_LIST_APPEND(fp, &((p)->l)); \ + BV_FREE_VLIST(&gedp->ged_views.vlfree, &((p)->s_vlist)); \ +} + QPolyMod::QPolyMod() : QWidget() { @@ -473,7 +483,8 @@ QPolyMod::toggle_closed_poly(bool checked) if (pcnt || op != bg_Union) { bg_polygon_free(&ip->polygon); BU_PUT(ip, struct bv_polygon); - bv_obj_put(p); + bu_ptbl_rm(gedp->ged_gvp->gv_objs.view_objs, (long *)p); + FREE_BV_SCENE_OBJ(p, &gedp->ged_views.free_scene_obj->l); p = NULL; } do_bool = false; @@ -517,7 +528,8 @@ QPolyMod::apply_bool_op() if (pcnt || op != bg_Union) { bg_polygon_free(&ip->polygon); BU_PUT(ip, struct bv_polygon); - bv_obj_put(p); + bu_ptbl_rm(gedp->ged_gvp->gv_objs.view_objs, (long *)p); + FREE_BV_SCENE_OBJ(p, &gedp->ged_views.free_scene_obj->l); mod_names->setCurrentIndex(0); if (mod_names->currentText().length()) { select(mod_names->currentText()); @@ -563,7 +575,8 @@ QPolyMod::delete_poly() struct bv_polygon *ip = (struct bv_polygon *)p->s_i_data; bg_polygon_free(&ip->polygon); BU_PUT(ip, struct bv_polygon); - bv_obj_put(p); + bu_ptbl_rm(gedp->ged_gvp->gv_objs.view_objs, (long *)p); + FREE_BV_SCENE_OBJ(p, &gedp->ged_views.free_scene_obj->l); mod_names->setCurrentIndex(0); if (mod_names->currentText().length()) { select(mod_names->currentText());