Revision: 76646 http://sourceforge.net/p/brlcad/code/76646 Author: starseeker Date: 2020-08-02 20:15:01 +0000 (Sun, 02 Aug 2020) Log Message: ----------- Now that we've gotten trunk into RELEASE so we can work on 7.32.0, merge the latest bioh changes to libged/libtclcad back into trunk. Next steps are likely to be more invasive, so this seems to be a reasonable sync point.
Modified Paths: -------------- brlcad/trunk/include/bu/magic.h brlcad/trunk/include/dm/bview.h brlcad/trunk/include/ged/defines.h brlcad/trunk/include/ged/view.h brlcad/trunk/include/tclcad.h brlcad/trunk/src/libged/arb/rotate_arb_face.c brlcad/trunk/src/libged/bb/bb.c brlcad/trunk/src/libged/bigE/bigE.c brlcad/trunk/src/libged/bot/bot.cpp brlcad/trunk/src/libged/bot/bot_dump.c brlcad/trunk/src/libged/bot/check.cpp brlcad/trunk/src/libged/bot/edbot.c brlcad/trunk/src/libged/bot/extrude.cpp brlcad/trunk/src/libged/bot/remesh.cpp brlcad/trunk/src/libged/clone/clone.c brlcad/trunk/src/libged/comb/comb.c brlcad/trunk/src/libged/comb_std/comb_std.c brlcad/trunk/src/libged/copymat/copymat.c brlcad/trunk/src/libged/display_list.c brlcad/trunk/src/libged/draw/draw.c brlcad/trunk/src/libged/draw/preview.c brlcad/trunk/src/libged/edcodes/edcodes.c brlcad/trunk/src/libged/edit/edit.c brlcad/trunk/src/libged/edmater/edmater.c brlcad/trunk/src/libged/erase/erase.c brlcad/trunk/src/libged/facetize/facetize.cpp brlcad/trunk/src/libged/gdiff/gdiff.c brlcad/trunk/src/libged/ged.c brlcad/trunk/src/libged/ged_private.h brlcad/trunk/src/libged/ged_util.c brlcad/trunk/src/libged/get/get.c brlcad/trunk/src/libged/get_obj_bounds.c brlcad/trunk/src/libged/get_type/get_type.c brlcad/trunk/src/libged/include/plugin.h brlcad/trunk/src/libged/joint/joint.c brlcad/trunk/src/libged/kill/kill.c brlcad/trunk/src/libged/killrefs/killrefs.c brlcad/trunk/src/libged/killtree/killtree.c brlcad/trunk/src/libged/mater/mater.cpp brlcad/trunk/src/libged/metaball/metaball.c brlcad/trunk/src/libged/move_arb_edge/move_arb_edge.c brlcad/trunk/src/libged/move_arb_face/move_arb_face.c brlcad/trunk/src/libged/ocenter/ocenter.c brlcad/trunk/src/libged/orotate/orotate.c brlcad/trunk/src/libged/oscale/oscale.c brlcad/trunk/src/libged/otranslate/otranslate.c brlcad/trunk/src/libged/pipe/pipe.c brlcad/trunk/src/libged/pipe.c brlcad/trunk/src/libged/polyclip.cpp brlcad/trunk/src/libged/process/process.c brlcad/trunk/src/libged/protate/protate.c brlcad/trunk/src/libged/pscale/pscale.c brlcad/trunk/src/libged/pset/pset.c brlcad/trunk/src/libged/ptranslate/ptranslate.c brlcad/trunk/src/libged/put/put.c brlcad/trunk/src/libged/put_comb/put_comb.c brlcad/trunk/src/libged/remove/remove.c brlcad/trunk/src/libged/rmater/rmater.c brlcad/trunk/src/libged/rtabort/rtabort.c brlcad/trunk/src/libged/rtcheck/rtcheck.c brlcad/trunk/src/libged/rtwizard/rtwizard.c brlcad/trunk/src/libged/select/select.c brlcad/trunk/src/libged/set_transparency/set_transparency.c brlcad/trunk/src/libged/vdraw/vdraw.c brlcad/trunk/src/libged/view/data_lines.c brlcad/trunk/src/libged/wcodes/wcodes.c brlcad/trunk/src/libged/zap/zap.c brlcad/trunk/src/libtclcad/fb.c brlcad/trunk/src/libtclcad/tclcad_mouse.c brlcad/trunk/src/libtclcad/tclcad_obj.c brlcad/trunk/src/libtclcad/tclcad_obj_wrapper.c brlcad/trunk/src/libtclcad/tclcad_polygons.c brlcad/trunk/src/libtclcad/tclcad_private.h brlcad/trunk/src/libtclcad/view/arrows.c brlcad/trunk/src/libtclcad/view/autoview.c brlcad/trunk/src/libtclcad/view/axes.c brlcad/trunk/src/libtclcad/view/draw.c brlcad/trunk/src/libtclcad/view/faceplate.c brlcad/trunk/src/libtclcad/view/labels.c brlcad/trunk/src/libtclcad/view/lines.c brlcad/trunk/src/libtclcad/view/refresh.c brlcad/trunk/src/libtclcad/view/util.c brlcad/trunk/src/libtclcad/view/view.h brlcad/trunk/src/mged/chgview.c brlcad/trunk/src/mged/dodraw.c brlcad/trunk/src/mged/mged.c brlcad/trunk/src/mged/overlay.c brlcad/trunk/src/mged/setup.c brlcad/trunk/src/mged/utility1.c brlcad/trunk/src/mged/wdb_obj.c brlcad/trunk/src/shapes/coil.c Added Paths: ----------- brlcad/trunk/src/libged/exec.cpp brlcad/trunk/src/libged/include/ Removed Paths: ------------- brlcad/trunk/src/libged/exec.cpp brlcad/trunk/src/libged/include/ Property Changed: ---------------- brlcad/trunk/ brlcad/trunk/NEWS brlcad/trunk/doc/ brlcad/trunk/include/ brlcad/trunk/regress/ brlcad/trunk/src/libged/polyclip.cpp Index: brlcad/trunk =================================================================== --- brlcad/trunk 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk 2020-08-02 20:15:01 UTC (rev 76646) Property changes on: brlcad/trunk ___________________________________________________________________ Modified: svn:mergeinfo ## -1,5 +1,5 ## /brlcad/branches/RELEASE:57439,57447-57860,69901-69913,70323-70333,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,75372-75685,76001-76451 -/brlcad/branches/bioh:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76355-76365,76368-76376,76577 +/brlcad/branches/bioh:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76354-76506,76577 /brlcad/branches/brep-debug:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69168,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927,69995-69996,70148-70149,70347-70349,70377,70526-70527,71006-71007,71009-71022,71046-71047,71049,71096-71100 /brlcad/branches/bullet:62518 /brlcad/branches/cmake:43219 Index: brlcad/trunk/NEWS =================================================================== --- brlcad/trunk/NEWS 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/NEWS 2020-08-02 20:15:01 UTC (rev 76646) Property changes on: brlcad/trunk/NEWS ___________________________________________________________________ Modified: svn:mergeinfo ## -1,5 +1,5 ## /brlcad/branches/RELEASE/NEWS:57439,57447-57860,68609-68613,69901-69913,70323-70333,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,76001-76451 -/brlcad/branches/bioh/NEWS:75894-75986,76088-76153 +/brlcad/branches/bioh/NEWS:75894-75986,76088-76153,76354-76506 /brlcad/branches/brep-debug/NEWS:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69168,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927,69995-69996,70148-70149,70347-70349,70377,70526-70527,71006-71007,71009-71022,71046-71047,71049,71096-71100 /brlcad/branches/bullet/NEWS:62518 /brlcad/branches/cmake/NEWS:43219 Index: brlcad/trunk/doc =================================================================== --- brlcad/trunk/doc 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/doc 2020-08-02 20:15:01 UTC (rev 76646) Property changes on: brlcad/trunk/doc ___________________________________________________________________ Modified: svn:mergeinfo ## -1,5 +1,5 ## /brlcad/branches/RELEASE/doc:57439,57447-57860,69901-69913,71917-72242,72525-72534,72826-72858,74376-74454,74964-75140 -/brlcad/branches/bioh/doc:75894-75986,76088-76153,76355-76365 +/brlcad/branches/bioh/doc:75894-75986,76088-76153,76354-76506 /brlcad/branches/brep-debug/doc:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927 /brlcad/branches/bullet/doc:62518 /brlcad/branches/cmake/doc:43219 Index: brlcad/trunk/include =================================================================== --- brlcad/trunk/include 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/include 2020-08-02 20:15:01 UTC (rev 76646) Property changes on: brlcad/trunk/include ___________________________________________________________________ Modified: svn:mergeinfo ## -1,5 +1,5 ## /brlcad/branches/RELEASE/include:57439,57447-57860,69901-69913,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,75372-75681 -/brlcad/branches/bioh/include:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153 +/brlcad/branches/bioh/include:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76354-76506 /brlcad/branches/brep-debug/include:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927 /brlcad/branches/bullet/include:62518 /brlcad/branches/cmake/include:43219 Modified: brlcad/trunk/include/bu/magic.h =================================================================== --- brlcad/trunk/include/bu/magic.h 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/include/bu/magic.h 2020-08-02 20:15:01 UTC (rev 76646) @@ -209,6 +209,7 @@ /* misc */ #define ANIMATE_MAGIC 0x414e4963 /**< ANIc */ +#define BVIEW_MAGIC 0x62766965 /**< bvie */ #define CURVE_BEZIER_MAGIC 0x62657a69 /**< bezi */ #define CURVE_CARC_MAGIC 0x63617263 /**< carc */ #define CURVE_LSEG_MAGIC 0x6c736567 /**< lseg */ Modified: brlcad/trunk/include/dm/bview.h =================================================================== --- brlcad/trunk/include/dm/bview.h 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/include/dm/bview.h 2020-08-02 20:15:01 UTC (rev 76646) @@ -196,7 +196,8 @@ }; struct bview { - struct bu_list l; + uint32_t magic; /**< @brief magic number */ + struct bu_vls gv_name; fastf_t gv_scale; fastf_t gv_size; /**< @brief 2.0 * scale */ fastf_t gv_isize; /**< @brief 1.0 / size */ @@ -251,11 +252,14 @@ fastf_t gv_curve_scale; fastf_t gv_data_vZ; size_t gv_bot_threshold; + int gv_hidden; + void *dmp; /* Display manager pointer, if one is associated with this view */ + void *u_data; /* Caller data associated with this view */ struct bu_ptbl *callbacks; }; -struct bview_client_data { +struct bview_solid_data { struct display_list *gdlp; int draw_solid_lines_only; int wireframe_color_override; @@ -266,37 +270,6 @@ void *freesolid; }; -/** - * A view object maintains state for controlling a view. - */ -struct view_obj { - struct bu_list l; - struct bu_vls vo_name; /**< @brief view object name/cmd */ - fastf_t vo_scale; - fastf_t vo_size; /**< @brief 2.0 * scale */ - fastf_t vo_invSize; /**< @brief 1.0 / size */ - fastf_t vo_perspective; /**< @brief perspective angle */ - fastf_t vo_local2base; /**< @brief scale local units to base units (i.e. mm) */ - fastf_t vo_base2local; /**< @brief scale base units (i.e. mm) to local units */ - vect_t vo_aet; - vect_t vo_eye_pos; /**< @brief eye position */ - vect_t vo_keypoint; - char vo_coord; /**< @brief coordinate system */ - char vo_rotate_about; /**< @brief indicates what point rotations are about */ - mat_t vo_rotation; - mat_t vo_center; - mat_t vo_model2view; - mat_t vo_pmodel2view; - mat_t vo_view2model; - mat_t vo_pmat; /**< @brief perspective matrix */ - struct bu_observer_list vo_observers; - void (*vo_callback)(); /**< @brief called in vo_update with vo_clientData and vop */ - void * vo_clientData; /**< @brief passed to vo_callback */ - int vo_zclip; - void *interp; -}; -#define VIEW_OBJ_NULL ((struct view_obj *)0) - #endif /* DM_BVIEW_H */ /** @} */ Modified: brlcad/trunk/include/ged/defines.h =================================================================== --- brlcad/trunk/include/ged/defines.h 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/include/ged/defines.h 2020-08-02 20:15:01 UTC (rev 76646) @@ -35,6 +35,7 @@ #include "bu/vls.h" #include "dm/bview.h" #include "rt/search.h" +#include "rt/solid.h" __BEGIN_DECLS @@ -73,16 +74,23 @@ #define GED_DISPLAY_LIST_NULL ((struct display_list *)0) #define GED_DRAWABLE_NULL ((struct ged_drawable *)0) #define GED_VIEW_NULL ((struct bview *)0) -#define GED_DM_VIEW_NULL ((struct ged_dm_view *)0) #define GED_RESULT_NULL ((void *)0) +/* Forward declaration */ +struct ged; + +typedef int (*ged_func_ptr)(struct ged *, int, const char *[]); #define GED_FUNC_PTR_NULL ((ged_func_ptr)0) -#define GED_REFRESH_CALLBACK_PTR_NULL ((ged_refresh_callback_ptr)0) -#define GED_CREATE_VLIST_SOLID_CALLBACK_PTR_NULL ((ged_create_vlist_solid_callback_ptr)0) -#define GED_CREATE_VLIST_CALLBACK_PTR_NULL ((ged_create_vlist_callback_ptr)0) -#define GED_FREE_VLIST_CALLBACK_PTR_NULL ((ged_free_vlist_callback_ptr)0) +/* Callback related definitions */ +typedef void (*ged_io_func_t)(void *, int); +typedef void (*ged_refresh_func_t)(void *); +typedef void (*ged_create_vlist_solid_func_t)(struct solid *); +typedef void (*ged_create_vlist_display_list_func_t)(struct display_list *); +typedef void (*ged_destroy_vlist_func_t)(unsigned int, int); +struct ged_callback_state; + /** * Definition of global parallel-processing semaphores. * @@ -116,10 +124,11 @@ struct ged_subprocess { - struct bu_list l; + uint32_t magic; /**< @brief magic number */ struct bu_process *p; void *chan; int aborted; + struct ged *gedp; }; /* FIXME: should be private */ @@ -145,11 +154,9 @@ /* FIXME: should be private */ struct ged_drawable { - struct bu_list l; - struct bu_list *gd_headDisplay; /**< @brief head of display list */ + struct bu_list *gd_headDisplay; /**< @brief head of display list */ struct bu_list *gd_headVDraw; /**< @brief head of vdraw list */ struct vd_curve *gd_currVHead; /**< @brief current vdraw head */ - struct solid *gd_freeSolids; /**< @brief ptr to head of free solid list */ char **gd_rt_cmd; /* DEPRECATED - will be removed, do not use */ int gd_rt_cmd_len; /* DEPRECATED - will be removed, do not use */ @@ -172,8 +179,8 @@ }; -typedef void (*ged_io_handler_callback_t)(void *, int); + struct ged_cmd; /* struct details are private - use accessor functions to manipulate */ @@ -180,13 +187,19 @@ struct ged_results; struct ged { - struct bu_list l; + struct bu_vls go_name; struct rt_wdb *ged_wdbp; + // The full set of bviews associated with this ged object + struct bu_ptbl ged_views; + + void *u_data; /**< @brief User data associated with this ged instance */ + /** for catching log messages */ struct bu_vls *ged_log; struct solid *freesolid; /* For now this is a struct solid, but longer term that may not always be true */ + struct bu_ptbl free_solids; /**< @brief solid structures available for reuse */ /* @todo: add support for returning an array of objects, not just a * simple string. @@ -205,22 +218,22 @@ struct bview *ged_gvp; struct bu_hash_tbl *ged_selections; /**< @brief object name -> struct rt_object_selections */ - void *ged_refresh_clientdata; /**< @brief client data passed to refresh handler */ - void (*ged_refresh_handler)(void *); /**< @brief function for handling refresh requests */ - void (*ged_output_handler)(struct ged *, char *); /**< @brief function for handling output */ char *ged_output_script; /**< @brief script for use by the outputHandler */ - void (*ged_create_vlist_solid_callback)(struct solid *); /**< @brief function to call after creating a vlist to create display list for solid */ - void (*ged_create_vlist_callback)(struct display_list *); /**< @brief function to call after all vlist created that loops through creating display list for each solid */ - void (*ged_free_vlist_callback)(unsigned int, int); /**< @brief function to call after freeing a vlist */ - /* FIXME -- this ugly hack needs to die. the result string should be stored before the call. */ + + /* FIXME -- this ugly hack needs to die. the result string should + * be stored before the call. + */ int ged_internal_call; - /* Handler functions for I/O communication with asynchronous subprocess commands */ - int io_mode; - void (*ged_create_io_handler)(void **chan, struct bu_process *p, int fd, int mode, void *data, ged_io_handler_callback_t callback); - void (*ged_delete_io_handler)(void *interp, void *chan, struct bu_process *p, int fd, void *data, ged_io_handler_callback_t callback); + /* TODO: hide all callback related symbols, callback typedefs + * (above), and eventually most if not all of the remaining fields + * into an _impl structure so callers are not tightly coupled to + * the ged structure. access via public functions that have been + * given design consideration. + */ + /* FOR LIBGED INTERNAL USE */ struct ged_cmd *cmds; int (*add)(struct ged *gedp, const struct ged_cmd *cmd); @@ -227,21 +240,51 @@ int (*del)(struct ged *gedp, const char *name); int (*run)(struct ged *gedp, int ac, char *av[]); - struct ged_subprocess gd_headSubprocess; /**< @brief head of forked processes */ + struct bu_ptbl ged_subp; /**< @brief forked sub-processes */ + /* Interface to LIBDM */ + void *ged_dmp; + + + /* Callbacks */ + + struct ged_callback_state *ged_cbs; + void (*ged_refresh_handler)(void *); /**< @brief function for handling refresh requests */ + void *ged_refresh_clientdata; /**< @brief client data passed to refresh handler */ + void (*ged_output_handler)(struct ged *, char *); /**< @brief function for handling output */ + void (*ged_create_vlist_solid_callback)(struct solid *); /**< @brief function to call after creating a vlist to create display list for solid */ + void (*ged_create_vlist_display_list_callback)(struct display_list *); /**< @brief function to call after all vlist created that loops through creating display list for each solid */ + void (*ged_destroy_vlist_callback)(unsigned int, int); /**< @brief function to call after freeing a vlist */ + + /* Handler functions for I/O communication with asynchronous subprocess commands. There + * are two opaque data structures at play here, with different scopes. One is the "data" + * pointer passed to ged_create_io_handler, which is used to store command-specific + * information internal to the library (the simplest thing to do is pass ged_subprocess + * in as the data pointer, but if that's not enough - see for example rtcheck - this + * mechanism allows for more elaborate measures. + * + * The second is ged_io_data, which is set in gedp by the calling application. This is where + * information specific to the parent's I/O environment (which by definition the library + * can't know about as it is application specific) lives. It should be assigned in the + * applications gedp before any calls to ged_create_io_handler are made. + * */ + void (*ged_create_io_handler)(struct ged_subprocess *gp, int fd, ged_io_func_t callback, void *data); + void (*ged_delete_io_handler)(struct ged_subprocess *gp, int fd); + void *ged_io_data; /**< brief caller supplied data */ + + // Other callbacks... + // Tcl command strings - these are libtclcad level callbacks that execute user supplied Tcl commands if set: + // gdv_callback, gdv_edit_motion_delta_callback, go_more_args_callback, go_rt_end_callback + // + // fbserv_obj: fbs_callback + // bview.h gv_callback (only used by MGED?) + // db_search_callback_t + void *ged_interp; /* Temporary - do not rely on when designing new functionality */ db_search_callback_t ged_interp_eval; /* FIXME: broke the rule written on the previous line */ - /* Interface to LIBDM */ - void *ged_dmp; }; -typedef int (*ged_func_ptr)(struct ged *, int, const char *[]); -typedef void (*ged_refresh_callback_ptr)(void *); -typedef void (*ged_create_vlist_solid_callback_ptr)(struct solid *); -typedef void (*ged_create_vlist_callback_ptr)(struct display_list *); -typedef void (*ged_free_vlist_callback_ptr)(unsigned int, int); - /* accessor functions for ged_results - calling * applications should not work directly with the * internals of ged_results, which are not guaranteed Modified: brlcad/trunk/include/ged/view.h =================================================================== --- brlcad/trunk/include/ged/view.h 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/include/ged/view.h 2020-08-02 20:15:01 UTC (rev 76646) @@ -64,15 +64,10 @@ /* defined in display_list.c */ GED_EXPORT void dl_set_iflag(struct bu_list *hdlp, int iflag); GED_EXPORT extern void dl_color_soltab(struct bu_list *hdlp); -GED_EXPORT extern void dl_erasePathFromDisplay(struct bu_list *hdlp, - struct db_i *dbip, - void (*callback)(unsigned int, int), - const char *path, - int allow_split, - struct solid *freesolid); +GED_EXPORT extern void dl_erasePathFromDisplay(struct ged *gedp, const char *path, int allow_split); GED_EXPORT extern struct display_list *dl_addToDisplay(struct bu_list *hdlp, struct db_i *dbip, const char *name); -GED_EXPORT extern int invent_solid(struct bu_list *hdlp, struct db_i *dbip, void (*callback_create)(struct solid *), void (*callback_free)(unsigned int, int), char *name, struct bu_list *vhead, long int rgb, int copy, fastf_t transparency, int dmode, struct solid *freesolid, int csoltab); +GED_EXPORT extern int invent_solid(struct ged *gedp, char *name, struct bu_list *vhead, long int rgb, int copy, fastf_t transparency, int dmode, int csoltab); /* defined in ged.c */ GED_EXPORT extern void ged_view_init(struct bview *gvp); @@ -154,6 +149,8 @@ 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); + // TODO - this (and probably the grid logic too) belong at the libdm level - they're operating // on the bview, rather than the ged level data... GED_EXPORT extern int ged_snap_to_lines(struct ged *gedp, fastf_t *vx, fastf_t *vy); Modified: brlcad/trunk/include/tclcad.h =================================================================== --- brlcad/trunk/include/tclcad.h 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/include/tclcad.h 2020-08-02 20:15:01 UTC (rev 76646) @@ -132,38 +132,40 @@ DM_EXPORT extern int fbs_open(struct fbserv_obj *fbsp, int port); DM_EXPORT extern int fbs_close(struct fbserv_obj *fbsp); +struct tclcad_ged_data { + struct ged *gedp; + struct bu_vls go_more_args_callback; + int go_more_args_callback_cnt; -struct ged_dm_view { - struct bu_list l; - struct bu_vls gdv_callback; - struct bu_vls gdv_edit_motion_delta_callback; - struct bu_vls gdv_name; - struct bview *gdv_view; - struct dm *gdv_dmp; - struct fbserv_obj gdv_fbs; - struct ged_obj *gdv_gop; - int gdv_hide_view; -}; + // These are view related, but appear to be intended as global across all + // views associated with the gedp - that is why they are here and not in + // tclcad_view_data. + struct bu_hash_tbl *go_edited_paths; + struct bu_vls go_rt_end_callback; + int go_rt_end_callback_cnt; + int go_dlist_on; + int go_refresh_on; -struct ged_obj { - struct ged *go_gedp; - struct ged_dm_view go_head_views; - struct bu_vls go_name; - struct bu_vls go_more_args_callback; - struct bu_vls go_rt_end_callback; + // TODO - these really shouldn't be libtclcad specific... we don't want to + // depend on Tcl for label primitives... struct bu_vls *go_prim_label_list; int go_prim_label_list_size; - int go_refresh_on; - int go_dlist_on; - Tcl_Interp *interp; - struct bu_hash_tbl *go_edited_paths; }; -#define GED_OBJ_NULL ((struct ged_obj *)0) +// Data specific to an individual view rather than the geometry database +// instance. +struct tclcad_view_data { + struct ged *gedp; + struct bu_vls gdv_edit_motion_delta_callback; + int gdv_edit_motion_delta_callback_cnt; + struct bu_vls gdv_callback; + int gdv_callback_cnt; + struct fbserv_obj gdv_fbs; +}; struct tclcad_obj { struct bu_list l; - struct ged_obj *to_gop; + struct ged *to_gedp; Tcl_Interp *to_interp; }; @@ -349,108 +351,108 @@ TCLCAD_EXPORT extern struct application *to_rt_gettrees_application(struct ged *gedp, int argc, const char *argv[]); -TCLCAD_EXPORT extern void go_refresh(struct ged_obj *gop, - struct ged_dm_view *gdvp); -TCLCAD_EXPORT extern void go_refresh_draw(struct ged_obj *gop, - struct ged_dm_view *gdvp, +TCLCAD_EXPORT extern void go_refresh(struct ged *gedp, + struct bview *gdvp); +TCLCAD_EXPORT extern void go_refresh_draw(struct ged *gedp, + struct bview *gdvp, int restore_zbuffer); -TCLCAD_EXPORT extern int go_view_axes(struct ged_obj *gop, - struct ged_dm_view *gdvp, +TCLCAD_EXPORT extern int go_view_axes(struct ged *gedp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_data_labels(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_data_arrows(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_data_pick(struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_data_axes(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_data_lines(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_data_move(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_data_move_object_mode(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_data_move_point_mode(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_data_polygons(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_mouse_poly_circ(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_mouse_poly_cont(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_mouse_poly_ell(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_mouse_poly_rect(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_poly_circ_mode(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_poly_ell_mode(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_poly_rect_mode(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); @@ -459,13 +461,13 @@ struct bu_vls *result_str); TCLCAD_EXPORT extern int go_poly_cont_build(Tcl_Interp *interp, struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); TCLCAD_EXPORT extern int go_poly_cont_build_end(Tcl_Interp *UNUSED(interp), struct ged *gedp, - struct ged_dm_view *gdvp, + struct bview *gdvp, int argc, const char *argv[], const char *usage); @@ -512,16 +514,17 @@ TCLCAD_EXPORT extern int tclcad_init(Tcl_Interp *interp, int init_gui, struct bu_vls *tlog); /** - * Create Tcl specific I/O handlers + * Tcl specific I/O handlers */ +struct tclcad_io_data { + Tcl_Channel chan; + Tcl_Interp *interp; + int io_mode; +}; TCLCAD_EXPORT void -tclcad_create_io_handler(void **chan, struct bu_process *p, int fd, int mode, void *data, ged_io_handler_callback_t callback); - -/** - * Delete Tcl specific I/O handlers - */ +tclcad_create_io_handler(struct ged_subprocess *p, int fd, ged_io_func_t callback, void *data); TCLCAD_EXPORT void -tclcad_delete_io_handler(void *interp, void *chan, struct bu_process *p, int fd, void *data, ged_io_handler_callback_t callback); +tclcad_delete_io_handler(struct ged_subprocess *p, int fd); /* dm_tcl.c */ Index: brlcad/trunk/regress =================================================================== --- brlcad/trunk/regress 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/regress 2020-08-02 20:15:01 UTC (rev 76646) Property changes on: brlcad/trunk/regress ___________________________________________________________________ Modified: svn:mergeinfo ## -1,5 +1,5 ## /brlcad/branches/RELEASE/regress:57439,57447-57860,69901-69913,71917-72242,72525-72534,72826-72858,74376-74454,75372-75681 -/brlcad/branches/bioh/regress:75860-75891,75894-75986,76088-76153,76355-76365,76368-76376 +/brlcad/branches/bioh/regress:75860-75891,75894-75986,76088-76153,76354-76506 /brlcad/branches/brep-debug/regress:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927 /brlcad/branches/bullet/regress:62518 /brlcad/branches/cmake/regress:43219 Modified: brlcad/trunk/src/libged/arb/rotate_arb_face.c =================================================================== --- brlcad/trunk/src/libged/arb/rotate_arb_face.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/arb/rotate_arb_face.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -95,7 +95,7 @@ return GED_ERROR; } - if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) == GED_ERROR) + if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) & GED_ERROR) return GED_ERROR; if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD || Modified: brlcad/trunk/src/libged/bb/bb.c =================================================================== --- brlcad/trunk/src/libged/bb/bb.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/bb/bb.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -126,7 +126,7 @@ VSETALL(rpp_min, INFINITY); VSETALL(rpp_max, -INFINITY); for (i = 0; i < argc; i++) { - if (ged_get_obj_bounds(gedp, argc - i, (const char **)argv+i, use_air, obj_min, obj_max) == GED_ERROR) + if (ged_get_obj_bounds(gedp, argc - i, (const char **)argv+i, use_air, obj_min, obj_max) & GED_ERROR) return GED_ERROR; VMINMAX(rpp_min, rpp_max, (double *)obj_min); VMINMAX(rpp_min, rpp_max, (double *)obj_max); Modified: brlcad/trunk/src/libged/bigE/bigE.c =================================================================== --- brlcad/trunk/src/libged/bigE/bigE.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/bigE/bigE.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -2053,7 +2053,7 @@ av[1] = (char *)0; for (i = 0; i < argc; ++i) { - dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[i], 0, gedp->freesolid); + dl_erasePathFromDisplay(gedp, argv[i], 0); dgcdp->gdlp = dl_addToDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, argv[i]); BU_ALLOC(dgcdp->ap, struct application); Modified: brlcad/trunk/src/libged/bot/bot.cpp =================================================================== --- brlcad/trunk/src/libged/bot/bot.cpp 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/bot/bot.cpp 2020-08-02 20:15:01 UTC (rev 76646) @@ -115,7 +115,7 @@ return GED_ERROR; } - if (_bot_obj_setup(gb, argv[1]) == GED_ERROR) { + if (_bot_obj_setup(gb, argv[1]) & GED_ERROR) { return GED_ERROR; } Modified: brlcad/trunk/src/libged/bot/bot_dump.c =================================================================== --- brlcad/trunk/src/libged/bot/bot_dump.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/bot/bot_dump.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -891,7 +891,7 @@ using_dbot_dump = 0; - if (bot_dump_get_args(gedp, argc, argv) == GED_ERROR) + if (bot_dump_get_args(gedp, argc, argv) & GED_ERROR) return GED_ERROR; if (bu_optind > argc) { Modified: brlcad/trunk/src/libged/bot/check.cpp =================================================================== --- brlcad/trunk/src/libged/bot/check.cpp 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/bot/check.cpp 2020-08-02 20:15:01 UTC (rev 76646) @@ -711,7 +711,7 @@ return GED_OK; } - if (_bot_obj_setup(gb, argv[argc-1]) == GED_ERROR) { + if (_bot_obj_setup(gb, argv[argc-1]) & GED_ERROR) { return GED_ERROR; } argc--; Modified: brlcad/trunk/src/libged/bot/edbot.c =================================================================== --- brlcad/trunk/src/libged/bot/edbot.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/bot/edbot.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -89,7 +89,7 @@ return GED_ERROR; } - if (wdb_import_from_path2(gedp->ged_result_str, &intern, last, gedp->ged_wdbp, mat) == GED_ERROR) { + if (wdb_import_from_path2(gedp->ged_result_str, &intern, last, gedp->ged_wdbp, mat) & GED_ERROR) { bu_vls_printf(gedp->ged_result_str, "%s: failed to find %s", argv[0], argv[1]); return GED_ERROR; } Modified: brlcad/trunk/src/libged/bot/extrude.cpp =================================================================== --- brlcad/trunk/src/libged/bot/extrude.cpp 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/bot/extrude.cpp 2020-08-02 20:15:01 UTC (rev 76646) @@ -100,7 +100,7 @@ argc--; argv++; - if (_bot_obj_setup(gb, argv[0]) == GED_ERROR) { + if (_bot_obj_setup(gb, argv[0]) & GED_ERROR) { return GED_ERROR; } Modified: brlcad/trunk/src/libged/bot/remesh.cpp =================================================================== --- brlcad/trunk/src/libged/bot/remesh.cpp 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/bot/remesh.cpp 2020-08-02 20:15:01 UTC (rev 76646) @@ -179,7 +179,7 @@ argc--; argv++; - if (_bot_obj_setup(gb, argv[0]) == GED_ERROR) { + if (_bot_obj_setup(gb, argv[0]) & GED_ERROR) { return GED_ERROR; } Modified: brlcad/trunk/src/libged/clone/clone.c =================================================================== --- brlcad/trunk/src/libged/clone/clone.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/clone/clone.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -1006,7 +1006,7 @@ } /* validate user options */ - if (get_args(gedp, argc, (char **)argv, &state) == GED_ERROR) + if (get_args(gedp, argc, (char **)argv, &state) & GED_ERROR) return GED_ERROR; bu_vls_init(&state.olist); Modified: brlcad/trunk/src/libged/comb/comb.c =================================================================== --- brlcad/trunk/src/libged/comb/comb.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/comb/comb.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -169,7 +169,7 @@ bu_vls_free(&orig_name); return GED_ERROR; } - if (region_flag_clear(gedp, new_dp) == GED_ERROR) { + if (region_flag_clear(gedp, new_dp) & GED_ERROR) { bu_vls_free(&comb_child_name); bu_vls_free(&orig_name); return GED_ERROR; Modified: brlcad/trunk/src/libged/comb_std/comb_std.c =================================================================== --- brlcad/trunk/src/libged/comb_std/comb_std.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/comb_std/comb_std.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -561,7 +561,7 @@ if (last_tok == TOK_RPAREN) { /* next token MUST be an operator */ - if (add_operator(gedp, &tok_hd.l, ptr, &last_tok) == GED_ERROR) { + if (add_operator(gedp, &tok_hd.l, ptr, &last_tok) & GED_ERROR) { free_tokens(&tok_hd.l); return GED_ERROR; } Modified: brlcad/trunk/src/libged/copymat/copymat.c =================================================================== --- brlcad/trunk/src/libged/copymat/copymat.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/copymat/copymat.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -150,7 +150,7 @@ wrapup: bu_vls_free(&pvls); - if (status == GED_ERROR) + if (status & GED_ERROR) rt_db_free_internal(&intern); return status; } Modified: brlcad/trunk/src/libged/display_list.c =================================================================== --- brlcad/trunk/src/libged/display_list.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/display_list.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -34,6 +34,7 @@ #include "bn/plot3.h" #include "rt/solid.h" +#include "ged.h" #include "./ged_private.h" /* defined in draw_calc.cpp */ @@ -203,10 +204,11 @@ * */ void -dl_erasePathFromDisplay(struct bu_list *hdlp, - struct db_i *dbip, void (*callback)(unsigned int, int), - const char *path, int allow_split, struct solid *freesolid) +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->ged_wdbp->dbip; + struct solid *freesolid = gedp->freesolid; struct display_list *gdlp; struct display_list *next_gdlp; struct display_list *last_gdlp; @@ -226,11 +228,11 @@ next_gdlp = BU_LIST_PNEXT(display_list, gdlp); if (BU_STR_EQUAL(path, bu_vls_addr(&gdlp->dl_path))) { - if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL) { + if (gedp->ged_destroy_vlist_callback != GED_DESTROY_VLIST_FUNC_NULL) { /* We can't assume the display lists are contiguous */ FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) { - (*callback)(BU_LIST_FIRST(solid, &gdlp->dl_headSolid)->s_dlist, 1); + ged_destroy_vlist_cb(gedp, BU_LIST_FIRST(solid, &gdlp->dl_headSolid)->s_dlist, 1); } } @@ -262,8 +264,7 @@ nsp = BU_LIST_PNEXT(solid, sp); if (db_full_path_match_top(&subpath, &sp->s_fullpath)) { - if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL) - (*callback)(sp->s_dlist, 1); + ged_destroy_vlist_cb(gedp, sp->s_dlist, 1); BU_LIST_DEQUEUE(&sp->l); FREE_SOLID(sp, &freesolid->l); @@ -302,21 +303,19 @@ HIDDEN void -eraseAllSubpathsFromSolidList(struct display_list *gdlp, +eraseAllSubpathsFromSolidList(struct ged *gedp, struct display_list *gdlp, struct db_full_path *subpath, - void (*callback)(unsigned int, int), - const int skip_first, struct solid *freesolid) + const int skip_first) { struct solid *sp; struct solid *nsp; + struct solid *freesolid = gedp->freesolid; sp = BU_LIST_NEXT(solid, &gdlp->dl_headSolid); while (BU_LIST_NOT_HEAD(sp, &gdlp->dl_headSolid)) { nsp = BU_LIST_PNEXT(solid, sp); if (db_full_path_subset(&sp->s_fullpath, subpath, skip_first)) { - if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL) - (*callback)(sp->s_dlist, 1); - + ged_destroy_vlist_cb(gedp, sp->s_dlist, 1); BU_LIST_DEQUEUE(&sp->l); FREE_SOLID(sp, &freesolid->l); } @@ -333,9 +332,10 @@ * */ void -_dl_eraseAllNamesFromDisplay(struct bu_list *hdlp, struct db_i *dbip, - void (*callback)(unsigned int, int), const char *name, const int skip_first, struct solid *freesolid) +_dl_eraseAllNamesFromDisplay(struct ged *gedp, const char *name, const int skip_first) { + struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay; + struct db_i *dbip = gedp->ged_wdbp->dbip; struct display_list *gdlp; struct display_list *next_gdlp; @@ -361,7 +361,7 @@ } if (BU_STR_EQUAL(tok, name)) { - _dl_freeDisplayListItem(dbip, callback, gdlp, freesolid); + _dl_freeDisplayListItem(gedp, gdlp); found = 1; break; @@ -375,7 +375,7 @@ struct db_full_path subpath; if (db_string_to_path(&subpath, dbip, name) == 0) { - eraseAllSubpathsFromSolidList(gdlp, &subpath, callback, skip_first, freesolid); + eraseAllSubpathsFromSolidList(gedp, gdlp, &subpath, skip_first); db_free_full_path(&subpath); } } @@ -387,12 +387,14 @@ int -_dl_eraseFirstSubpath(struct bu_list *hdlp, struct db_i *dbip, - void (*callback)(unsigned int, int), +_dl_eraseFirstSubpath(struct ged *gedp, struct display_list *gdlp, struct db_full_path *subpath, - const int skip_first, struct solid *freesolid) + const int skip_first) { + struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay; + struct db_i *dbip = gedp->ged_wdbp->dbip; + struct solid *freesolid = gedp->freesolid; struct solid *sp; struct solid *nsp; struct db_full_path dup_path; @@ -406,8 +408,7 @@ int ret; int full_len = sp->s_fullpath.fp_len; - if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL) - (*callback)(sp->s_dlist, 1); + ged_destroy_vlist_cb(gedp, sp->s_dlist, 1); sp->s_fullpath.fp_len = full_len - 1; db_dup_full_path(&dup_path, &sp->s_fullpath); @@ -438,15 +439,13 @@ * Erase/remove display list item from headDisplay if path is a subset of item's path. */ void -_dl_eraseAllPathsFromDisplay(struct bu_list *hdlp, struct db_i *dbip, - void (*callback)(unsigned int, int), - const char *path, - const int skip_first, - struct solid *freesolid) +_dl_eraseAllPathsFromDisplay(struct ged *gedp, const char *path, const int skip_first) { struct display_list *gdlp; struct display_list *next_gdlp; struct db_full_path fullpath, subpath; + struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay; + struct db_i *dbip = gedp->ged_wdbp->dbip; if (db_string_to_path(&subpath, dbip, path) == 0) { gdlp = BU_LIST_NEXT(display_list, hdlp); @@ -470,8 +469,8 @@ if (db_string_to_path(&fullpath, dbip, bu_vls_addr(&gdlp->dl_path)) == 0) { if (db_full_path_subset(&fullpath, &subpath, skip_first)) { - _dl_freeDisplayListItem(dbip, callback, gdlp, freesolid); - } else if (_dl_eraseFirstSubpath(hdlp, dbip, callback, gdlp, &subpath, skip_first, freesolid)) { + _dl_freeDisplayListItem(gedp, gdlp); + } else if (_dl_eraseFirstSubpath(gedp, gdlp, &subpath, skip_first)) { gdlp = BU_LIST_NEXT(display_list, hdlp); db_free_full_path(&fullpath); continue; @@ -489,18 +488,18 @@ void -_dl_freeDisplayListItem (struct db_i *dbip, - void (*callback)(unsigned int, int), - struct display_list *gdlp, struct solid *freesolid) +_dl_freeDisplayListItem (struct ged *gedp, struct display_list *gdlp) { + struct db_i *dbip = gedp->ged_wdbp->dbip; + struct solid *freesolid = gedp->freesolid; struct solid *sp; struct directory *dp; - if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL) { + if (gedp->ged_destroy_vlist_callback != GED_DESTROY_VLIST_FUNC_NULL) { /* We can't assume the display lists are contiguous */ FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) { - (*callback)(BU_LIST_FIRST(solid, &gdlp->dl_headSolid)->s_dlist, 1); + ged_destroy_vlist_cb(gedp, BU_LIST_FIRST(solid, &gdlp->dl_headSolid)->s_dlist, 1); } } @@ -668,10 +667,10 @@ } void -dl_add_path(struct display_list *gdlp, int dashflag, fastf_t transparency, int dmode, int hiddenLine, struct bu_list *vhead, const struct db_full_path *pathp, struct db_tree_state *tsp, unsigned char *wireframe_color_override, void (*callback)(struct solid *sp), struct solid *freesolid) +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 solid *sp; - GET_SOLID(sp, &freesolid->l); + GET_SOLID(sp, &dgcdp->freesolid->l); solid_append_vlist(sp, (struct bn_vlist *)vhead); @@ -691,23 +690,19 @@ solid_set_color_info(sp, wireframe_color_override, tsp); sp->s_dlist = 0; - sp->s_transparency = transparency; - sp->s_dmode = dmode; - sp->s_hiddenLine = hiddenLine; + sp->s_transparency = dgcdp->transparency; + sp->s_dmode = dgcdp->dmode; + sp->s_hiddenLine = dgcdp->hiddenLine; /* append solid to display list */ bu_semaphore_acquire(RT_SEM_MODEL); - BU_LIST_APPEND(gdlp->dl_headSolid.back, &sp->l); + BU_LIST_APPEND(dgcdp->gdlp->dl_headSolid.back, &sp->l); bu_semaphore_release(RT_SEM_MODEL); - if (callback != GED_CREATE_VLIST_SOLID_CALLBACK_PTR_NULL) { - (*callback)(sp); - } + ged_create_vlist_solid_cb(dgcdp->gedp, sp); } - - static fastf_t view_avg_size(struct bview *gvp) { @@ -932,8 +927,11 @@ int -dl_redraw(struct display_list *gdlp, struct db_i *dbip, struct db_tree_state *tsp, struct bview *gvp, void (*callback)(struct display_list *), int skip_subtractions) +dl_redraw(struct display_list *gdlp, struct ged *gedp, int skip_subtractions) { + struct db_i *dbip = gedp->ged_wdbp->dbip; + struct db_tree_state *tsp = &gedp->ged_wdbp->wdb_initial_tree_state; + struct bview *gvp = gedp->ged_gvp; int ret = 0; struct solid *sp; for (BU_LIST_FOR(sp, solid, &gdlp->dl_headSolid)) { @@ -941,8 +939,7 @@ ret += redraw_solid(sp, dbip, tsp, gvp); } } - if (callback != GED_CREATE_VLIST_CALLBACK_PTR_NULL) - (*callback)(gdlp); + ged_create_vlist_display_list_cb(gedp, gdlp); return ret; } @@ -956,7 +953,7 @@ point_t min, max; struct solid *sp; union tree *curtree; - struct bview_client_data *bview_data = (struct bview_client_data *)client_data; + struct bview_solid_data *bview_data = (struct bview_solid_data *)client_data; RT_CK_DB_INTERNAL(ip); BG_CK_TESS_TOL(tsp->ts_ttol); @@ -1124,11 +1121,12 @@ sp->s_vlen = bn_vlist_cmd_cnt((struct bn_vlist *)(&(sp->s_vlist))); } -int invent_solid(struct bu_list *hdlp, struct db_i *dbip, - void (*callback_create)(struct solid *), void (*callback_free)(unsigned int, int), - char *name, struct bu_list *vhead, long int rgb, int copy, fastf_t transparency, int dmode, - struct solid *freesolid, int csoltab) +int invent_solid(struct ged *gedp, char *name, struct bu_list *vhead, long int rgb, int copy, + fastf_t transparency, int dmode, int csoltab) { + struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay; + struct db_i *dbip = gedp->ged_wdbp->dbip; + struct solid *freesolid = gedp->freesolid; struct directory *dp; struct solid *sp; struct display_list *gdlp; @@ -1147,7 +1145,7 @@ * Name exists from some other overlay, * zap any associated solids */ - dl_erasePathFromDisplay(hdlp, dbip, callback_free, name, 0, freesolid); + dl_erasePathFromDisplay(gedp, name, 0); } /* Need to enter phony name in directory structure */ dp = db_diradd(dbip, name, RT_DIR_PHONY_ADDR, 0, RT_DIR_SOLID, (void *)&type); @@ -1191,8 +1189,7 @@ if (csoltab) color_soltab(sp); - if (callback_create != GED_CREATE_VLIST_SOLID_CALLBACK_PTR_NULL) - (*callback_create)(sp); + ged_create_vlist_solid_cb(gedp, sp); return 0; /* OK */ @@ -1279,8 +1276,10 @@ } void -dl_zap(struct bu_list *hdlp, struct db_i *dbip, void (*callback)(unsigned int, int), struct solid *freesolid) +dl_zap(struct ged *gedp, struct solid *freesolid) { + struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay; + struct db_i *dbip = gedp->ged_wdbp->dbip; struct solid *sp = SOLID_NULL; struct display_list *gdlp = NULL; struct bu_ptbl dls = BU_PTBL_INIT_ZERO; @@ -1289,8 +1288,8 @@ while (BU_LIST_WHILE(gdlp, display_list, hdlp)) { - if (callback != GED_FREE_VLIST_CALLBACK_PTR_NULL && BU_LIST_NON_EMPTY(&gdlp->dl_headSolid)) - (*callback)(BU_LIST_FIRST(solid, &gdlp->dl_headSolid)->s_dlist, + if (BU_LIST_NON_EMPTY(&gdlp->dl_headSolid)) + ged_destroy_vlist_cb(gedp, BU_LIST_FIRST(solid, &gdlp->dl_headSolid)->s_dlist, BU_LIST_LAST(solid, &gdlp->dl_headSolid)->s_dlist - BU_LIST_FIRST(solid, &gdlp->dl_headSolid)->s_dlist + 1); @@ -2452,8 +2451,9 @@ void -dl_set_transparency(struct bu_list *hdlp, struct directory **dpp, double transparency, void (*callback)(struct display_list *)) +dl_set_transparency(struct ged *gedp, struct directory **dpp, double transparency) { + struct bu_list *hdlp = gedp->ged_gdp->gd_headDisplay; struct display_list *gdlp; struct display_list *next_gdlp; struct solid *sp; @@ -2480,8 +2480,7 @@ } - if (callback != GED_CREATE_VLIST_CALLBACK_PTR_NULL) - (*callback)(gdlp); + ged_create_vlist_display_list_cb(gedp, gdlp); gdlp = next_gdlp; } Modified: brlcad/trunk/src/libged/draw/draw.c =================================================================== --- brlcad/trunk/src/libged/draw/draw.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/draw/draw.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -848,7 +848,7 @@ /* create solids */ for (i = 0; i < argc; ++i) { - struct bview_client_data bview_data; + struct bview_solid_data bview_data; bview_data.draw_solid_lines_only = dgcdp.draw_solid_lines_only; bview_data.wireframe_color_override = dgcdp.wireframe_color_override; bview_data.wireframe_color[0]= dgcdp.wireframe_color[0]; @@ -903,7 +903,7 @@ continue; } - ret = dl_redraw(gdlp, gedp->ged_wdbp->dbip, &gedp->ged_wdbp->wdb_initial_tree_state, gedp->ged_gvp, gedp->ged_create_vlist_callback, dgcdp.draw_non_subtract_only); + ret = dl_redraw(gdlp, gedp, dgcdp.draw_non_subtract_only); if (ret < 0) { /* restore view bot threshold */ if (gedp && gedp->ged_gvp) gedp->ged_gvp->gv_bot_threshold = threshold_cached; @@ -1134,7 +1134,7 @@ continue; } - dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, new_argv[i], 0, gedp->freesolid); + dl_erasePathFromDisplay(gedp, new_argv[i], 0); } drawtrees_retval = _ged_drawtrees(gedp, new_argc, (const char **)new_argv, kind, (struct _ged_client_data *)0); @@ -1168,7 +1168,7 @@ continue; } - dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[i], 0, gedp->freesolid); + dl_erasePathFromDisplay(gedp, argv[i], 0); } /* if our display is non-empty add -R to keep current view */ @@ -1246,7 +1246,7 @@ /* redraw everything */ for (BU_LIST_FOR(gdlp, display_list, gedp->ged_gdp->gd_headDisplay)) { - ret = dl_redraw(gdlp, gedp->ged_wdbp->dbip, &gedp->ged_wdbp->wdb_initial_tree_state, gedp->ged_gvp, gedp->ged_create_vlist_callback, 0); + ret = dl_redraw(gdlp, gedp, 0); if (ret < 0) { bu_vls_printf(gedp->ged_result_str, "%s: redraw failure\n", argv[0]); return GED_ERROR; @@ -1282,7 +1282,7 @@ found_path = 1; db_free_full_path(&dl_path); - ret = dl_redraw(gdlp, gedp->ged_wdbp->dbip, &gedp->ged_wdbp->wdb_initial_tree_state, gedp->ged_gvp, gedp->ged_create_vlist_callback, 0); + ret = dl_redraw(gdlp, gedp, 0); if (ret < 0) { bu_vls_printf(gedp->ged_result_str, "%s: %s redraw failure\n", argv[0], argv[i]); Modified: brlcad/trunk/src/libged/draw/preview.c =================================================================== --- brlcad/trunk/src/libged/draw/preview.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/draw/preview.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -146,8 +146,7 @@ _ged_drawtrees(_ged_current_gedp, _ged_current_gedp->ged_gdp->gd_rt_cmd_len, (const char **)&_ged_current_gedp->ged_gdp->gd_rt_cmd[1], preview_mode, (struct _ged_client_data *)0); } - if (_ged_current_gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL) - (*_ged_current_gedp->ged_refresh_handler)(_ged_current_gedp->ged_refresh_clientdata); + ged_refresh_cb(_ged_current_gedp); if (preview_delay > 0) { struct timeval tv; Modified: brlcad/trunk/src/libged/edcodes/edcodes.c =================================================================== --- brlcad/trunk/src/libged/edcodes/edcodes.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/edcodes/edcodes.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -227,7 +227,7 @@ (void)fclose(fp); - if (ged_wcodes(gedp, argc + 1, (const char **)av) == GED_ERROR) { + if (ged_wcodes(gedp, argc + 1, (const char **)av) & GED_ERROR) { bu_file_delete(tmpfil); bu_free((void *)av, "ged_edcodes_core av"); return GED_ERROR; Modified: brlcad/trunk/src/libged/edit/edit.c =================================================================== --- brlcad/trunk/src/libged/edit/edit.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/edit/edit.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -778,7 +778,7 @@ point_t rpp_max; size_t i; - if (ged_path_validate(gedp, path) == GED_ERROR) { + if (ged_path_validate(gedp, path) & GED_ERROR) { bu_vls_printf(gedp->ged_result_str, "path \"%s\" does not exist in" "the database", db_path_to_string(path)); return GED_ERROR; Modified: brlcad/trunk/src/libged/edmater/edmater.c =================================================================== --- brlcad/trunk/src/libged/edmater/edmater.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/edmater/edmater.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -91,7 +91,7 @@ (void)fclose(fp); - if (ged_wmater(gedp, argc, av) == GED_ERROR) { + if (ged_wmater(gedp, argc, av) & GED_ERROR) { bu_file_delete(tmpfil); bu_free((void *)av, "f_edmater: av"); return GED_ERROR; Modified: brlcad/trunk/src/libged/erase/erase.c =================================================================== --- brlcad/trunk/src/libged/erase/erase.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/erase/erase.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -74,7 +74,7 @@ if (strchr(argv[i], 'r')) { for (i = 1; i < (size_t)argc; ++i) - _dl_eraseAllPathsFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[i], 0, gedp->freesolid); + _dl_eraseAllPathsFromDisplay(gedp, argv[i], 0); return GED_OK; } @@ -166,11 +166,11 @@ if (new_argv[i][0] == '-') continue; - dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, new_argv[i], 1, gedp->freesolid); + dl_erasePathFromDisplay(gedp, new_argv[i], 1); } } else { for (i = 0; i < (size_t)argc; ++i) - dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[i], 1, gedp->freesolid); + dl_erasePathFromDisplay(gedp, argv[i], 1); } return GED_OK; Deleted: brlcad/trunk/src/libged/exec.cpp =================================================================== --- brlcad/trunk/src/libged/exec.cpp 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/exec.cpp 2020-08-02 20:15:01 UTC (rev 76646) @@ -1,95 +0,0 @@ -/* E X E C . C P P - * BRL-CAD - * - * Copyright (c) 2020 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 exec.cpp - * - * Brief description - * - */ - -#include "common.h" - -#include <map> -#include <string> - -#include "bu/time.h" -#include "ged.h" -#include "./include/plugin.h" - -extern "C" int -ged_exec(struct ged *gedp, int argc, const char *argv[]) { - if (!gedp || !argc || !argv) { - return GED_ERROR; - } - - double start = 0.0; - const char *tstr = getenv("GED_EXEC_TIME"); - if (tstr) { - start = bu_gettime(); - } - - // TODO - right now this is the map from the libged load - should probably - // use this to initialize a struct ged copy when ged_init is called, so - // client codes can add their own commands to their gedp... - // - // The ged_cmds map should always reflect the original, vanilla state of - // libged's command set so we have a clean fallback available if we ever - // need it to fall back on/recover with. - std::map<std::string, const struct ged_cmd *> *cmap = (std::map<std::string, const struct ged_cmd *> *)ged_cmds; - std::string key(argv[0]); - std::map<std::string, const struct ged_cmd *>::iterator c_it = cmap->find(key); - if (c_it == cmap->end()) { - bu_vls_printf(gedp->ged_result_str, "unknown command: %s", argv[0]); - return (GED_ERROR | GED_UNKNOWN); - } - - const struct ged_cmd *cmd = c_it->second; - - // TODO - if interactive command via cmd->i->interactive, don't execute - // unless we have the necessary callbacks defined in gedp - - int cret = (*cmd->i->cmd)(gedp, argc, argv); - - if (tstr) { - bu_log("%s time: %g\n", argv[0], (bu_gettime() - start)/1e6); - } - - // TODO - for the moment these are the hardcoded default opts. Eventually - // an opts var should be added to struct ged, and each exec call will set - // the gedp->opts value to the command defaults. Then the command option handling - // will be able to alter the flags if desired (for example, a flag to suppress - // autoview behavior will simply remove the flag from gedp->opts. - if (cmd->i->opts & GED_CMD_UPDATE_VIEW) { - // Do update view callback - if (gedp->ged_refresh_handler) { - (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata); - } - } - - return cret; -} - -// Local Variables: -// tab-width: 8 -// mode: C++ -// c-basic-offset: 4 -// indent-tabs-mode: t -// c-file-style: "stroustrup" -// End: -// ex: shiftwidth=4 tabstop=8 Copied: brlcad/trunk/src/libged/exec.cpp (from rev 76506, brlcad/branches/bioh/src/libged/exec.cpp) =================================================================== --- brlcad/trunk/src/libged/exec.cpp (rev 0) +++ brlcad/trunk/src/libged/exec.cpp 2020-08-02 20:15:01 UTC (rev 76646) @@ -0,0 +1,83 @@ +/* E X E C . C P P + * BRL-CAD + * + * Copyright (c) 2020 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 exec.cpp + * + * Brief description + * + */ + +#include "common.h" + +#include <map> +#include <string> + +#include "bu/time.h" +#include "ged.h" +#include "./include/plugin.h" + +extern "C" int +ged_exec(struct ged *gedp, int argc, const char *argv[]) { + if (!gedp || !argc || !argv) { + return GED_ERROR; + } + + double start = 0.0; + const char *tstr = getenv("GED_EXEC_TIME"); + if (tstr) { + start = bu_gettime(); + } + + // TODO - right now this is the map from the libged load - should probably + // use this to initialize a struct ged copy when ged_init is called, so + // client codes can add their own commands to their gedp... + // + // The ged_cmds map should always reflect the original, vanilla state of + // libged's command set so we have a clean fallback available if we ever + // need it to fall back on/recover with. + std::map<std::string, const struct ged_cmd *> *cmap = (std::map<std::string, const struct ged_cmd *> *)ged_cmds; + std::string key(argv[0]); + std::map<std::string, const struct ged_cmd *>::iterator c_it = cmap->find(key); + if (c_it == cmap->end()) { + bu_vls_printf(gedp->ged_result_str, "unknown command: %s", argv[0]); + return (GED_ERROR | GED_UNKNOWN); + } + + const struct ged_cmd *cmd = c_it->second; + + // TODO - if interactive command via cmd->i->interactive, don't execute + // unless we have the necessary callbacks defined in gedp + + int cret = (*cmd->i->cmd)(gedp, argc, argv); + + if (tstr) { + bu_log("%s time: %g\n", argv[0], (bu_gettime() - start)/1e6); + } + + return cret; +} + +// Local Variables: +// tab-width: 8 +// mode: C++ +// c-basic-offset: 4 +// indent-tabs-mode: t +// c-file-style: "stroustrup" +// End: +// ex: shiftwidth=4 tabstop=8 Modified: brlcad/trunk/src/libged/facetize/facetize.cpp =================================================================== --- brlcad/trunk/src/libged/facetize/facetize.cpp 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/facetize/facetize.cpp 2020-08-02 20:15:01 UTC (rev 76646) @@ -938,7 +938,7 @@ bu_vls_printf(&tmpname, "-0"); bu_vls_incr(&tmpname, NULL, NULL, &_db_uniq_test, (void *)gedp); } - if (_write_bot(gedp, tbot, bu_vls_addr(&tmpname), opts) == GED_ERROR) { + if (_write_bot(gedp, tbot, bu_vls_addr(&tmpname), opts) & GED_ERROR) { bu_log("SPSR: could not write BoT to temporary name %s\n", bu_vls_addr(&tmpname)); bu_vls_free(&tmpname); ret = GED_FACETIZE_FAILURE; Modified: brlcad/trunk/src/libged/gdiff/gdiff.c =================================================================== --- brlcad/trunk/src/libged/gdiff/gdiff.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/gdiff/gdiff.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -177,11 +177,11 @@ /* Clear any previous diff drawing */ if (db_lookup(gedp->ged_wdbp->dbip, "diff_visualff", LOOKUP_QUIET) != RT_DIR_NULL) - dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, "diff_visualff", 1, gedp->freesolid); + dl_erasePathFromDisplay(gedp, "diff_visualff", 1); if (db_lookup(gedp->ged_wdbp->dbip, "diff_visualff0000", LOOKUP_QUIET) != RT_DIR_NULL) - dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, "diff_visualff0000", 1, gedp->freesolid); + dl_erasePathFromDisplay(gedp, "diff_visualff0000", 1); if (db_lookup(gedp->ged_wdbp->dbip, "diff_visualffffff", LOOKUP_QUIET) != RT_DIR_NULL) - dl_erasePathFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, "diff_visualffffff", 1, gedp->freesolid); + dl_erasePathFromDisplay(gedp, "diff_visualffffff", 1); /* Draw left-only lines */ if (view_left) { Modified: brlcad/trunk/src/libged/ged.c =================================================================== --- brlcad/trunk/src/libged/ged.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/ged.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -86,13 +86,16 @@ /* Terminate any ged subprocesses */ if (gedp != GED_NULL) { - struct ged_subprocess *rrp; - for (BU_LIST_FOR(rrp, ged_subprocess, &gedp->gd_headSubprocess.l)) { + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_subp); i++) { + struct ged_subprocess *rrp = (struct ged_subprocess *)BU_PTBL_GET(&gedp->ged_subp, i); if (!rrp->aborted) { bu_terminate(bu_process_pid(rrp->p)); rrp->aborted = 1; } + bu_ptbl_rm(&gedp->ged_subp, (long *)rrp); + BU_PUT(rrp, struct ged_subprocess); } + bu_ptbl_reset(&gedp->ged_subp); } ged_free(gedp); @@ -154,7 +157,38 @@ gedp->ged_wdbp = RT_WDB_NULL; + bu_vls_free(&gedp->go_name); + + // Note - it is the caller's responsibility to have freed any data + // associated with the ged or its views in the u_data pointers. + // + // Since libged does not link libdm, it's also the responsibility of the + // caller to close any display managers associated with the view. + struct bview *gdvp; + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_views); i++) { + gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views, i); + bu_vls_free(&gdvp->gv_name); + bu_ptbl_free(gdvp->callbacks); + BU_PUT(gdvp->callbacks, struct bu_ptbl); + bu_free((void *)gdvp, "bview"); + } + bu_ptbl_free(&gedp->ged_views); + if (gedp->ged_gdp != GED_DRAWABLE_NULL) { + + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->free_solids); i++) { + // TODO - FREE_SOLID macro is stashing on the freesolid list, not + // BU_PUT-ing the solid objects themselves - is that what we expect + // when doing ged_free? I.e., is ownership of the free solid list + // with the struct ged or with the application as a whole? We're + // BU_PUT-ing gedp->freesolid - above why just that one? +#if 0 + struct solid *sp = (struct solid *)BU_PTBL_GET(&gedp->free_solids, i); + RT_FREE_VLIST(&(sp->s_vlist)); +#endif + } + bu_ptbl_free(&gedp->free_solids); + if (gedp->ged_gdp->gd_headDisplay) BU_PUT(gedp->ged_gdp->gd_headDisplay, struct bu_vls); if (gedp->ged_gdp->gd_headVDraw) @@ -178,6 +212,7 @@ BU_PUT(gedp->ged_result_str, struct bu_vls); } + // TODO - replace freesolid with free_solids ptbl { struct solid *nsp; sp = BU_LIST_NEXT(solid, &gedp->freesolid->l); @@ -193,19 +228,24 @@ free_object_selections(gedp->ged_selections); bu_hash_destroy(gedp->ged_selections); + BU_PUT(gedp->ged_cbs, struct ged_callback_state); + + bu_ptbl_free(&gedp->ged_subp); } void ged_init(struct ged *gedp) { - struct solid *freesolid; - if (gedp == GED_NULL) return; - BU_LIST_INIT(&gedp->l); gedp->ged_wdbp = RT_WDB_NULL; + // TODO - rename to ged_name + bu_vls_init(&gedp->go_name); + + BU_PTBL_INIT(&gedp->ged_views); + BU_GET(gedp->ged_log, struct bu_vls); bu_vls_init(gedp->ged_log); @@ -212,7 +252,7 @@ BU_GET(gedp->ged_results, struct ged_results); (void)_ged_results_init(gedp->ged_results); - BU_LIST_INIT(&gedp->gd_headSubprocess.l); + BU_PTBL_INIT(&gedp->ged_subp); /* For now, we're keeping the string... will go once no one uses it */ BU_GET(gedp->ged_result_str, struct bu_vls); @@ -230,19 +270,37 @@ gedp->ged_selections = bu_hash_create(32); /* init the solid list */ + struct solid *freesolid; BU_GET(freesolid, struct solid); BU_LIST_INIT(&freesolid->l); gedp->freesolid = freesolid; - gedp->ged_gdp->gd_freeSolids = freesolid; - /* (in)sanity */ + /* TODO: If we're init-ing the list here, does that mean the gedp has + * ownership of all solid objects created and stored here, and should we + * then free them when ged_free is called? (don't appear to be currently, + * just calling FREE_SOLID which doesn't de-allocate... */ + BU_PTBL_INIT(&gedp->free_solids); + + /* Initialize callbacks */ + BU_GET(gedp->ged_cbs, struct ged_callback_state); + gedp->ged_refresh_handler = NULL; + gedp->ged_refresh_clientdata = NULL; + gedp->ged_output_handler = NULL; + gedp->ged_create_vlist_solid_callback = NULL; + gedp->ged_create_vlist_display_list_callback = NULL; + gedp->ged_destroy_vlist_callback = NULL; + gedp->ged_create_io_handler = NULL; + gedp->ged_delete_io_handler = NULL; + gedp->ged_io_data = NULL; + + /* Out of the gate we don't have display managers or views */ gedp->ged_gvp = NULL; gedp->ged_dmp = NULL; - gedp->ged_refresh_clientdata = NULL; - gedp->ged_refresh_handler = NULL; - gedp->ged_output_handler = NULL; + + /* ? */ gedp->ged_output_script = NULL; gedp->ged_internal_call = 0; + } @@ -252,6 +310,8 @@ if (gvp == GED_VIEW_NULL) return; + gvp->magic = BVIEW_MAGIC; + gvp->gv_scale = 500.0; gvp->gv_size = 2.0 * gvp->gv_scale; gvp->gv_isize = 1.0 / gvp->gv_size; @@ -654,6 +714,81 @@ rt_db_free_internal(&intern); } +/* Callback wrapper functions */ + +void +ged_refresh_cb(struct ged *gedp) +{ + if (gedp->ged_refresh_handler != GED_REFRESH_FUNC_NULL) { + gedp->ged_cbs->ged_refresh_handler_cnt++; + if (gedp->ged_cbs->ged_refresh_handler_cnt > 1) { + bu_log("Warning - recursive call of gedp->ged_refresh_handler!\n"); + } + (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata); + gedp->ged_cbs->ged_refresh_handler_cnt--; + } +} + +void +ged_output_handler_cb(struct ged *gedp, char *str) +{ + if (gedp->ged_output_handler != (void (*)(struct ged *, char *))0) { + gedp->ged_cbs->ged_output_handler_cnt++; + if (gedp->ged_cbs->ged_output_handler_cnt > 1) { + bu_log("Warning - recursive call of gedp->ged_output_handler!\n"); + } + (*gedp->ged_output_handler)(gedp, str); + gedp->ged_cbs->ged_output_handler_cnt--; + } +} + +void +ged_create_vlist_solid_cb(struct ged *gedp, struct solid *s) +{ + if (gedp->ged_create_vlist_solid_callback != GED_CREATE_VLIST_SOLID_FUNC_NULL) { + gedp->ged_cbs->ged_create_vlist_solid_callback_cnt++; + if (gedp->ged_cbs->ged_create_vlist_solid_callback_cnt > 1) { + bu_log("Warning - recursive call of gedp->ged_create_vlist_solid_callback!\n"); + } + (*gedp->ged_create_vlist_solid_callback)(s); + gedp->ged_cbs->ged_create_vlist_solid_callback_cnt--; + } +} + +void +ged_create_vlist_display_list_cb(struct ged *gedp, struct display_list *dl) +{ + if (gedp->ged_create_vlist_display_list_callback != GED_CREATE_VLIST_DISPLAY_LIST_FUNC_NULL) { + gedp->ged_cbs->ged_create_vlist_display_list_callback_cnt++; + if (gedp->ged_cbs->ged_create_vlist_display_list_callback_cnt > 1) { + bu_log("Warning - recursive call of gedp->ged_create_vlist_callback!\n"); + } + (*gedp->ged_create_vlist_display_list_callback)(dl); + gedp->ged_cbs->ged_create_vlist_display_list_callback_cnt--; + } +} + +void +ged_destroy_vlist_cb(struct ged *gedp, unsigned int i, int j) +{ + if (gedp->ged_destroy_vlist_callback != GED_DESTROY_VLIST_FUNC_NULL) { + gedp->ged_cbs->ged_destroy_vlist_callback_cnt++; + if (gedp->ged_cbs->ged_destroy_vlist_callback_cnt > 1) { + bu_log("Warning - recursive call of gedp->ged_destroy_vlist_callback!\n"); + } + (*gedp->ged_destroy_vlist_callback)(i, j); + gedp->ged_cbs->ged_destroy_vlist_callback_cnt--; + } +} + +#if 0 +int +ged_io_handler_cb(struct ged *, ged_io_handler_callback_t *cb, void *, int) +{ + if ( +} +#endif + /* * Local Variables: * mode: C Modified: brlcad/trunk/src/libged/ged_private.h =================================================================== --- brlcad/trunk/src/libged/ged_private.h 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/ged_private.h 2020-08-02 20:15:01 UTC (rev 76646) @@ -82,6 +82,37 @@ /* Default libged column width assumption */ #define GED_TERMINAL_WIDTH 80 + +/* Callback management related structures */ +#define GED_REFRESH_FUNC_NULL ((ged_refresh_func_t)0) +#define GED_CREATE_VLIST_SOLID_FUNC_NULL ((ged_create_vlist_solid_func_t)0) +#define GED_CREATE_VLIST_DISPLAY_LIST_FUNC_NULL ((ged_create_vlist_display_list_func_t)0) +#define GED_DESTROY_VLIST_FUNC_NULL ((ged_destroy_vlist_func_t)0) + +// Private bookkeeping structure used by callback handlers +struct ged_callback_state { + int ged_refresh_handler_cnt; + int ged_output_handler_cnt; + int ged_create_vlist_solid_callback_cnt; + int ged_create_vlist_display_list_callback_cnt; + int ged_destroy_vlist_callback_cnt; + int ged_io_handler_callback_cnt; +}; + +/* These are wrapper functions, that should be called by libged code instead of + * the callback pointers supplied by the client (if any). They will do the boilerplate + * bookkeeping and validation required by callbacks. + */ +GED_EXPORT extern void ged_refresh_cb(struct ged *); +GED_EXPORT extern void ged_output_handler_cb(struct ged *, char *); +GED_EXPORT extern void ged_create_vlist_solid_cb(struct ged *, struct solid *); +GED_EXPORT extern void ged_create_vlist_display_list_cb(struct ged *, struct display_list *); +GED_EXPORT extern void ged_destroy_vlist_cb(struct ged *, unsigned int, int); +GED_EXPORT extern void ged_io_handler_cb(struct ged *, void *, int); + + + + struct _ged_funtab { char *ft_name; char *ft_parms; @@ -181,30 +212,22 @@ int validate); /* defined in display_list.c */ -GED_EXPORT extern void _dl_eraseAllNamesFromDisplay(struct bu_list *hdlp, struct db_i *dbip, - void (*callback)(unsigned int, int), - const char *name, - const int skip_first, struct solid *freesolid); -GED_EXPORT extern void _dl_eraseAllPathsFromDisplay(struct bu_list *hdlp, struct db_i *dbip, - void (*callback)(unsigned int, int), - const char *path, - const int skip_first, struct solid *freesolid); -extern void _dl_freeDisplayListItem(struct db_i *dbip, - void (*callback)(unsigned int, int), - struct display_list *gdlp, struct solid *freesolid); +GED_EXPORT extern void _dl_eraseAllNamesFromDisplay(struct ged *gedp, const char *name, const int skip_first); +GED_EXPORT extern void _dl_eraseAllPathsFromDisplay(struct ged *gedp, const char *path, const int skip_first); +extern void _dl_freeDisplayListItem(struct ged *gedp, struct display_list *gdlp); extern int headsolid_splitGDL(struct bu_list *hdlp, struct db_i *dbip, struct display_list *gdlp, struct db_full_path *path); GED_EXPORT extern int dl_bounding_sph(struct bu_list *hdlp, vect_t *min, vect_t *max, int pflag); /* Returns a bu_ptbl of all solids referenced by the display list */ extern struct bu_ptbl *dl_get_solids(struct display_list *gdlp); -GED_EXPORT extern void dl_add_path(struct display_list *gdlp, int dashflag, fastf_t transparency, int dmode, int hiddenLine, struct bu_list *vhead, const struct db_full_path *pathp, struct db_tree_state *tsp, unsigned char *wireframe_color_override, void (*callback)(struct solid *), struct solid *freesolid); +GED_EXPORT extern 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); -GED_EXPORT extern int dl_redraw(struct display_list *gdlp, struct db_i *dbip, struct db_tree_state *tsp, struct bview *gvp, void (*callback)(struct display_list *), int skip_subtractions); +GED_EXPORT extern int dl_redraw(struct display_list *gdlp, struct ged *gedp, int skip_subtractions); GED_EXPORT extern union tree * append_solid_to_display_list(struct db_tree_state *tsp, const struct db_full_path *pathp, struct rt_db_internal *ip, void *client_data); 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 bu_list *hdlp, struct db_i *dbip, void (*callback)(unsigned int, int), struct solid *freesolid); +GED_EXPORT void dl_zap(struct ged *gedp, struct solid *freesolid); 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); @@ -222,7 +245,7 @@ GED_EXPORT int dl_select(struct bu_list *hdlp, mat_t model2view, struct bu_vls *vls, double vx, double vy, double vwidth, double vheight, int rflag); GED_EXPORT int dl_select_partial(struct bu_list *hdlp, mat_t model2view, struct bu_vls *vls, double vx, double vy, double vwidth, double vheight, int rflag); -GED_EXPORT void dl_set_transparency(struct bu_list *hdlp, struct directory **dpp, double transparency, void (*callback)(struct display_list *)); +GED_EXPORT void dl_set_transparency(struct ged *gedp, struct directory **dpp, double transparency); /* defined in draw.c */ GED_EXPORT extern void _ged_cvt_vlblock_to_solids(struct ged *gedp, @@ -626,6 +649,10 @@ GED_EXPORT extern int ged_view_snap(struct ged *gedp, int argc, const char *argv[]); GED_EXPORT extern int ged_view_data_lines(struct ged *gedp, int argc, const char *argv[]); + +GED_EXPORT extern void ged_push_solid(struct ged *gedp, struct solid *sp); +GED_EXPORT extern struct solid *ged_pop_solid(struct ged *gedp); + __END_DECLS #endif /* LIBGED_GED_PRIVATE_H */ Modified: brlcad/trunk/src/libged/ged_util.c =================================================================== --- brlcad/trunk/src/libged/ged_util.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/ged_util.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -50,6 +50,42 @@ #include "ged.h" #include "./ged_private.h" +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); i++) { + gdvp = (struct bview *)BU_PTBL_GET(&gedp->ged_views, i); + if (BU_STR_EQUAL(bu_vls_addr(&gdvp->gv_name), key)) + break; + gdvp = NULL; + } + + return gdvp; +} + +void +ged_push_solid(struct ged *gedp, struct solid *sp) +{ + RT_FREE_VLIST(&(sp->s_vlist)); + sp->s_fullpath.fp_len = 0; // Don't free memory, but implicitly clear contents + bu_ptbl_ins(&gedp->free_solids, (long *)sp); +} + +struct solid * +ged_pop_solid(struct ged *gedp) +{ + struct solid *sp = NULL; + if (BU_PTBL_LEN(&gedp->free_solids)) { + sp = (struct solid *)BU_PTBL_GET(&gedp->free_solids, (BU_PTBL_LEN(&gedp->free_solids) - 1)); + bu_ptbl_rm(&gedp->free_solids, (long *)sp); + } else { + BU_ALLOC(sp, struct solid); // from GET_SOLID in rt/solid.h + db_full_path_init(&(sp)->s_fullpath); + } + return sp; +} + int _ged_results_init(struct ged_results *results) { @@ -1018,9 +1054,9 @@ wcolor[0] = (unsigned char)dgcdp->wireframe_color[0]; wcolor[1] = (unsigned char)dgcdp->wireframe_color[1]; wcolor[2] = (unsigned char)dgcdp->wireframe_color[2]; - dl_add_path(dgcdp->gdlp, dashflag, dgcdp->transparency, dgcdp->dmode, dgcdp->hiddenLine, vhead, pathp, tsp, wcolor, dgcdp->gedp->ged_create_vlist_solid_callback, dgcdp->freesolid); + dl_add_path(dashflag, vhead, pathp, tsp, wcolor, dgcdp); } else { - dl_add_path(dgcdp->gdlp, dashflag, dgcdp->transparency, dgcdp->dmode, dgcdp->hiddenLine, vhead, pathp, tsp, NULL, dgcdp->gedp->ged_create_vlist_solid_callback, dgcdp->freesolid); + dl_add_path(dashflag, vhead, pathp, tsp, NULL, dgcdp); } } @@ -1037,7 +1073,7 @@ if (BU_LIST_IS_EMPTY(&(vbp->head[i]))) continue; snprintf(namebuf, 64, "%s%lx", shortname, vbp->rgb[i]); - invent_solid(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_create_vlist_solid_callback, gedp->ged_free_vlist_callback, namebuf, &vbp->head[i], vbp->rgb[i], copy, 1.0, 0, gedp->freesolid, 0); + invent_solid(gedp, namebuf, &vbp->head[i], vbp->rgb[i], copy, 1.0, 0, 0); } } @@ -1297,30 +1333,24 @@ } } -struct _ged_rt_client_data { - struct ged_subprocess *rrtp; - struct ged *gedp; -}; - void _ged_rt_output_handler(void *clientData, int UNUSED(mask)) { - struct _ged_rt_client_data *drcdp = (struct _ged_rt_client_data *)clientData; - struct ged_subprocess *run_rtp; + struct ged_subprocess *rrtp = (struct ged_subprocess *)clientData; int count = 0; int retcode = 0; int read_failed = 0; char line[RT_MAXLINE+1] = {0}; - if (drcdp == (struct _ged_rt_client_data *)NULL || - drcdp->gedp == (struct ged *)NULL || - drcdp->rrtp == (struct ged_subprocess *)NULL) + if ((rrtp == (struct ged_subprocess *)NULL) || (rrtp->gedp == (struct ged *)NULL)) return; - run_rtp = drcdp->rrtp; + BU_CKMAG(rrtp, GED_CMD_MAGIC, "ged subprocess"); + struct ged *gedp = rrtp->gedp; + /* Get data from rt */ - if (bu_process_read((char *)line, &count, run_rtp->p, BU_PROCESS_STDERR, RT_MAXLINE) <= 0) { + if (bu_process_read((char *)line, &count, rrtp->p, BU_PROCESS_STDERR, RT_MAXLINE) <= 0) { read_failed = 1; } @@ -1328,14 +1358,14 @@ int aborted; /* Done watching for output, undo subprocess I/O hooks. */ - if (drcdp->gedp->ged_delete_io_handler) { - (*drcdp->gedp->ged_delete_io_handler)(drcdp->gedp->ged_interp, run_rtp->chan, - run_rtp->p, BU_PROCESS_STDERR, (void *)drcdp, - _ged_rt_output_handler); + if (gedp->ged_delete_io_handler) { + (*gedp->ged_delete_io_handler)(rrtp, BU_PROCESS_STDERR); } + + /* Either EOF has been sent or there was a read error. * there is no need to block indefinitely */ - retcode = bu_process_wait(&aborted, run_rtp->p, 120); + retcode = bu_process_wait(&aborted, rrtp->p, 120); if (aborted) bu_log("Raytrace aborted.\n"); @@ -1344,13 +1374,12 @@ else bu_log("Raytrace complete.\n"); - if (drcdp->gedp->ged_gdp->gd_rtCmdNotify != (void (*)(int))0) - drcdp->gedp->ged_gdp->gd_rtCmdNotify(aborted); + if (gedp->ged_gdp->gd_rtCmdNotify != (void (*)(int))0) + gedp->ged_gdp->gd_rtCmdNotify(aborted); - /* free run_rtp */ - BU_LIST_DEQUEUE(&run_rtp->l); - BU_PUT(run_rtp, struct ged_subprocess); - BU_PUT(drcdp, struct _ged_rt_client_data); + /* free rrtp */ + bu_ptbl_rm(&gedp->ged_subp, (long *)rrtp); + BU_PUT(rrtp, struct ged_subprocess); return; } @@ -1359,10 +1388,11 @@ line[count] = '\0'; /* handle (i.e., probably log to stderr) the resulting line */ - if (drcdp->gedp->ged_output_handler != (void (*)(struct ged *, char *))0) - drcdp->gedp->ged_output_handler(drcdp->gedp, line); + if (gedp->ged_output_handler != (void (*)(struct ged *, char *))0) + ged_output_handler_cb(gedp, line); else - bu_vls_printf(drcdp->gedp->ged_result_str, "%s", line); + bu_vls_printf(gedp->ged_result_str, "%s", line); + } void @@ -1431,7 +1461,6 @@ FILE *fp_in; vect_t eye_model; struct ged_subprocess *run_rtp; - struct _ged_rt_client_data *drcdp; struct bu_process *p = NULL; bu_process_exec(&p, gd_rt_cmd[0], cmd_len, gd_rt_cmd, 0, 0); @@ -1452,19 +1481,16 @@ bu_process_close(p, BU_PROCESS_STDIN); BU_GET(run_rtp, struct ged_subprocess); - BU_LIST_INIT(&run_rtp->l); - BU_LIST_APPEND(&gedp->gd_headSubprocess.l, &run_rtp->l); + run_rtp->magic = GED_CMD_MAGIC; + bu_ptbl_ins(&gedp->ged_subp, (long *)run_rtp); run_rtp->p = p; run_rtp->aborted = 0; + run_rtp->gedp = gedp; - BU_GET(drcdp, struct _ged_rt_client_data); - drcdp->gedp = gedp; - drcdp->rrtp = run_rtp; - /* If we know how, set up hooks so the parent process knows to watch for output. */ if (gedp->ged_create_io_handler) { - (*gedp->ged_create_io_handler)(&(run_rtp->chan), p, BU_PROCESS_STDERR, gedp->io_mode, (void *)drcdp, _ged_rt_output_handler); + (*gedp->ged_create_io_handler)(run_rtp, BU_PROCESS_STDERR, _ged_rt_output_handler, (void *)run_rtp); } return GED_OK; } @@ -1525,7 +1551,7 @@ av[0] = objp->d_namep; av[1] = NULL; - if (_ged_combadd2(gedp, combname, ac, av, region_flag, relation, ident, air, NULL, 1) == GED_ERROR) + if (_ged_combadd2(gedp, combname, ac, av, region_flag, relation, ident, air, NULL, 1) & GED_ERROR) return RT_DIR_NULL; /* Done changing stuff - update nref. */ Modified: brlcad/trunk/src/libged/get/get.c =================================================================== --- brlcad/trunk/src/libged/get/get.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/get/get.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -63,7 +63,7 @@ return GED_ERROR; } - if (wdb_import_from_path(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp) == GED_ERROR) + if (wdb_import_from_path(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp) & GED_ERROR) return GED_ERROR; if (!intern.idb_meth->ft_get) { Modified: brlcad/trunk/src/libged/get_obj_bounds.c =================================================================== --- brlcad/trunk/src/libged/get_obj_bounds.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/get_obj_bounds.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -245,7 +245,7 @@ VSETALL(rpp_min, MAX_FASTF); VREVERSE(rpp_max, rpp_min); - if (get_objpath_mat(gedp, argc, argv, gtdp) == GED_ERROR) + if (get_objpath_mat(gedp, argc, argv, gtdp) & GED_ERROR) return GED_ERROR; dp = gtdp->gtd_obj[gtdp->gtd_objpos-1]; Modified: brlcad/trunk/src/libged/get_type/get_type.c =================================================================== --- brlcad/trunk/src/libged/get_type/get_type.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/get_type/get_type.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -56,7 +56,7 @@ return GED_ERROR; } - if (wdb_import_from_path(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp) == GED_ERROR) + if (wdb_import_from_path(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp) & GED_ERROR) return GED_ERROR; if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD) { Modified: brlcad/trunk/src/libged/include/plugin.h =================================================================== --- brlcad/branches/bioh/src/libged/include/plugin.h 2020-07-26 02:18:58 UTC (rev 76506) +++ brlcad/trunk/src/libged/include/plugin.h 2020-08-02 20:15:01 UTC (rev 76646) @@ -47,18 +47,21 @@ * flags &= &( flag2 | flag3 ); */ +/* Unsigned long long (which we get from C99) must be at least 64 bits, so we + * may define up to 64 flags here. (although we probably don't want that many, + * using that type for future proofing...) */ #define GED_CMD_DEFAULT 0 -#define GED_CMD_INTERACTIVE 1 << 0 -#define GED_CMD_UPDATE_SCENE 1 << 1 -#define GED_CMD_UPDATE_VIEW 1 << 2 -#define GED_CMD_AUTOVIEW 1 << 3 -#define GED_CMD_ALL_VIEWS 1 << 4 -#define GED_CMD_VIEW_CALLBACK 1 << 5 +#define GED_CMD_INTERACTIVE 1ULL << 0 +#define GED_CMD_UPDATE_SCENE 1ULL << 1 +#define GED_CMD_UPDATE_VIEW 1ULL << 2 +#define GED_CMD_AUTOVIEW 1ULL << 3 +#define GED_CMD_ALL_VIEWS 1ULL << 4 +#define GED_CMD_VIEW_CALLBACK 1ULL << 5 struct ged_cmd_impl { const char *cname; ged_func_ptr cmd; - int64_t opts; + unsigned long long opts; }; Modified: brlcad/trunk/src/libged/joint/joint.c =================================================================== --- brlcad/trunk/src/libged/joint/joint.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/joint/joint.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -3231,8 +3231,7 @@ if (domesh) { joint_mesh(gedp, 0, 0); /* refreshing the screen */ - if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL) - (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata); + ged_refresh_cb(gedp); } joint_clear(); } @@ -3292,8 +3291,7 @@ joint_mesh(gedp, 0, 0); /* refreshing the screen */ - if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL) - (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata); + ged_refresh_cb(gedp); } } if (count < loops) { @@ -3325,8 +3323,7 @@ joint_mesh(gedp, 0, 0); /* refreshing the screen */ - if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL) - (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata); + ged_refresh_cb(gedp); } } } @@ -3342,8 +3339,7 @@ joint_mesh(gedp, 0, 0); /* refreshing the screen */ - if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL) - (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata); + ged_refresh_cb(gedp); } return GED_OK; } @@ -3462,8 +3458,7 @@ joint_mesh(gedp, 0, 0); /* refreshing the screen */ - if (gedp->ged_refresh_handler != GED_REFRESH_CALLBACK_PTR_NULL) - (*gedp->ged_refresh_handler)(gedp->ged_refresh_clientdata); + ged_refresh_cb(gedp); return GED_OK; } Modified: brlcad/trunk/src/libged/kill/kill.c =================================================================== --- brlcad/trunk/src/libged/kill/kill.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/kill/kill.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -107,7 +107,7 @@ if (is_phony) continue; - _dl_eraseAllNamesFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[i], 0, gedp->freesolid); + _dl_eraseAllNamesFromDisplay(gedp, argv[i], 0); if (db_delete(gedp->ged_wdbp->dbip, dp) != 0 || db_dirdelete(gedp->ged_wdbp->dbip, dp) != 0) { /* Abort kill processing on first error */ Modified: brlcad/trunk/src/libged/killrefs/killrefs.c =================================================================== --- brlcad/trunk/src/libged/killrefs/killrefs.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/killrefs/killrefs.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -69,7 +69,7 @@ if (!nflag && !gedp->ged_internal_call) { for (k = 1; k < argc; k++) - _dl_eraseAllNamesFromDisplay(gedp->ged_gdp->gd_headDisplay, gedp->ged_wdbp->dbip, gedp->ged_free_vlist_callback, argv[k], 1, gedp->freesolid); + _dl_eraseAllNamesFromDisplay(gedp, argv[k], 1); } ret = GED_OK; Modified: brlcad/trunk/src/libged/killtree/killtree.c =================================================================== --- brlcad/trunk/src/libged/killtree/killtree.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/killtree/killtree.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -111,7 +111,7 @@ bu_vls_printf(gktdp->gedp->ged_result_str, "%s ", dp->d_namep); } } else { - _dl_eraseAllNamesFromDisplay(gktdp->gedp->ged_gdp->gd_headDisplay, gktdp->gedp->ged_wdbp->dbip, gktdp->gedp->ged_free_vlist_callback, dp->d_namep, 0, gktdp->gedp->freesolid); + _dl_eraseAllNamesFromDisplay(gktdp->gedp, dp->d_namep, 0); bu_vls_printf(gktdp->gedp->ged_result_str, "KILL %s: %s\n", (dp->d_flags & RT_DIR_COMB) ? "COMB" : "Solid", Modified: brlcad/trunk/src/libged/mater/mater.cpp =================================================================== --- brlcad/trunk/src/libged/mater/mater.cpp 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/mater/mater.cpp 2020-08-02 20:15:01 UTC (rev 76646) @@ -390,7 +390,7 @@ } // As a first cut, do a fault intolerant read - if there are any problems we want to know - if (_ged_read_densities(&a, &dsource, gedp, densities_filename, 0) == GED_ERROR) { + if (_ged_read_densities(&a, &dsource, gedp, densities_filename, 0) & GED_ERROR) { a = NULL; } Modified: brlcad/trunk/src/libged/metaball/metaball.c =================================================================== --- brlcad/trunk/src/libged/metaball/metaball.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/metaball/metaball.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -149,7 +149,7 @@ /* convert from double to fastf_t */ VMOVE(model_pt, scan); - if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) == GED_ERROR) + if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) & GED_ERROR) return GED_ERROR; nearest = find_metaball_pnt_nearest_pnt(&((struct rt_metaball_internal *)intern.idb_ptr)->metaball_ctrl_head, Modified: brlcad/trunk/src/libged/move_arb_edge/move_arb_edge.c =================================================================== --- brlcad/trunk/src/libged/move_arb_edge/move_arb_edge.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/move_arb_edge/move_arb_edge.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -102,7 +102,7 @@ return GED_ERROR; } - if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) == GED_ERROR) + if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) & GED_ERROR) return GED_ERROR; if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD || Modified: brlcad/trunk/src/libged/move_arb_face/move_arb_face.c =================================================================== --- brlcad/trunk/src/libged/move_arb_face/move_arb_face.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/move_arb_face/move_arb_face.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -126,7 +126,7 @@ return GED_ERROR; } - if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) == GED_ERROR) + if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) & GED_ERROR) return GED_ERROR; if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD || Modified: brlcad/trunk/src/libged/ocenter/ocenter.c =================================================================== --- brlcad/trunk/src/libged/ocenter/ocenter.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/ocenter/ocenter.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -68,7 +68,7 @@ * One of the get bounds routines needs to be fixed to * work with all cases. In the meantime... */ - if (_ged_get_obj_bounds2(gedp, 1, argv+1, >d, rpp_min, rpp_max) == GED_ERROR) + if (_ged_get_obj_bounds2(gedp, 1, argv+1, >d, rpp_min, rpp_max) & GED_ERROR) return GED_ERROR; dp = gtd.gtd_obj[gtd.gtd_objpos-1]; Modified: brlcad/trunk/src/libged/orotate/orotate.c =================================================================== --- brlcad/trunk/src/libged/orotate/orotate.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/orotate/orotate.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -85,7 +85,7 @@ if (argc == 5) { /* Use the object's center as the keypoint. */ - if (_ged_get_obj_bounds2(gedp, 1, argv+1, >d, rpp_min, rpp_max) == GED_ERROR) + if (_ged_get_obj_bounds2(gedp, 1, argv+1, >d, rpp_min, rpp_max) & GED_ERROR) return GED_ERROR; dp = gtd.gtd_obj[gtd.gtd_objpos-1]; Modified: brlcad/trunk/src/libged/oscale/oscale.c =================================================================== --- brlcad/trunk/src/libged/oscale/oscale.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/oscale/oscale.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -75,7 +75,7 @@ } if (argc == 3) { - if (_ged_get_obj_bounds2(gedp, 1, argv+1, >d, rpp_min, rpp_max) == GED_ERROR) + if (_ged_get_obj_bounds2(gedp, 1, argv+1, >d, rpp_min, rpp_max) & GED_ERROR) return GED_ERROR; dp = gtd.gtd_obj[gtd.gtd_objpos-1]; Modified: brlcad/trunk/src/libged/otranslate/otranslate.c =================================================================== --- brlcad/trunk/src/libged/otranslate/otranslate.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/otranslate/otranslate.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -63,7 +63,7 @@ return GED_ERROR; } - if (_ged_get_obj_bounds2(gedp, 1, argv+1, >d, rpp_min, rpp_max) == GED_ERROR) + if (_ged_get_obj_bounds2(gedp, 1, argv+1, >d, rpp_min, rpp_max) & GED_ERROR) return GED_ERROR; dp = gtd.gtd_obj[gtd.gtd_objpos-1]; Modified: brlcad/trunk/src/libged/pipe/pipe.c =================================================================== --- brlcad/trunk/src/libged/pipe/pipe.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/pipe/pipe.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -191,7 +191,7 @@ /* convert from double to fastf_t */ VMOVE(model_pt, scan); - if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) == GED_ERROR) + if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) & GED_ERROR) return GED_ERROR; nearest = find_pipe_pnt_nearest_pnt(&((struct rt_pipe_internal *)intern.idb_ptr)->pipe_segs_head, Modified: brlcad/trunk/src/libged/pipe.c =================================================================== --- brlcad/trunk/src/libged/pipe.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/pipe.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -628,7 +628,7 @@ /* convert from double to fastf_t */ VMOVE(view_ps_pt, scan); - if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) == GED_ERROR) + if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) & GED_ERROR) return GED_ERROR; if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD || Modified: brlcad/trunk/src/libged/polyclip.cpp =================================================================== --- brlcad/trunk/src/libged/polyclip.cpp 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/polyclip.cpp 2020-08-02 20:15:01 UTC (rev 76646) @@ -158,7 +158,7 @@ struct contour_node *curr_cnode; struct bg_polygon *gpp; - if (wdb_import_from_path(gedp->ged_result_str, &intern, sname, gedp->ged_wdbp) == GED_ERROR) + if (wdb_import_from_path(gedp->ged_result_str, &intern, sname, gedp->ged_wdbp) & GED_ERROR) return (struct bg_polygon *)0; sketch_ip = (rt_sketch_internal *)intern.idb_ptr; Property changes on: brlcad/trunk/src/libged/polyclip.cpp ___________________________________________________________________ Modified: svn:mergeinfo ## -1,7 +1,7 ## /brlcad/branches/RELEASE/src/libged/polyclip/polyclip.cpp:57439,57447-57860,69901-69913,70323-70333,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,75372-75685 /brlcad/branches/RELEASE/src/libged/polyclip.cpp:57439,57447-57860,69901-69913,70323-70333,71915-72242,72525-72534,72826-72858,74376-74454,74964-75140,75372-75685,76001-76451 /brlcad/branches/bioh/src/libged/polyclip/polyclip.cpp:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76360-76365 -/brlcad/branches/bioh/src/libged/polyclip.cpp:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76355-76365,76368-76376 +/brlcad/branches/bioh/src/libged/polyclip.cpp:75720-75736,75740-75742,75860-75891,75894-75986,76088-76153,76354-76365,76368-76376,76506 /brlcad/branches/brep-debug/src/libged/polyclip/polyclip.cpp:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69168,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927,69995-69996,70148-70149,70347-70349,70377,70526-70527,71006-71007,71009-71022,71046-71047,71049,71096-71100 /brlcad/branches/brep-debug/src/libged/polyclip.cpp:61373,61375,61404,61427,61429,61470,61544,61567,61576,61999,62018,62094,62098,62107,62117,62406,62416-62519,62521-62584,62593-62614,62623,62658,62660-62674,62681-62771,62876,62901,62907,62910,62925,62928,62931-63025,63027,63051,63054-63056,63069,63071-63073,63122,63160-63161,63165,63171,63184,63187,63189-63190,63193-63196,63200,63202,63205-63210,63213,63219-63225,63232-63233,63236,63238,63338,63350-63353,63481,63618,63669,64173-64174,64176-64177,64229-64233,64242,64244,64360-64362,65165,65245,65249,65334,65833-65834,66370-66375,66931-66932,66934,67012-67015,67018-67019,67021-67022,67406,67740,67746-67748,67950,67952,68144-68145,68636,68640-68643,68820,69081,69109,69168,69206,69289,69346,69460-69461,69582-69583,69719-69721,69857-69859,69927,69995-69996,70148-70149,70347-70349,70377,70526-70527,71006-71007,71009-71022,71046-71047,71049,71096-71100 /brlcad/branches/bullet/src/libged/polyclip/polyclip.cpp:62518 Modified: brlcad/trunk/src/libged/process/process.c =================================================================== --- brlcad/trunk/src/libged/process/process.c 2020-08-02 19:53:00 UTC (rev 76645) +++ brlcad/trunk/src/libged/process/process.c 2020-08-02 20:15:01 UTC (rev 76646) @@ -57,7 +57,8 @@ unsigned int longest_pid = 0; /* Find the largest pid we'll have to print */ - for (BU_LIST_FOR(rrp, ged_subprocess, &gedp->gd_headSubprocess.l)) { + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_subp); i++) { + rrp = (struct ged_subprocess *)BU_PTBL_GET(&gedp->ged_subp, i); int pid = bu_process_pid(rrp->p); bu_vls_sprintf(&pid_str, "%d", pid); longest_pid = (bu_vls_strlen(&pid_str) > longest_pid) ? bu_vls_strlen(&pid_str) : longest_pid; @@ -65,7 +66,8 @@ bu_vls_free(&pid_str); /* For each process print a line */ - for (BU_LIST_FOR(rrp, ged_subprocess, &gedp->gd_headSubprocess.l)) { + for (size_t i = 0; i < BU_PTBL_LEN(&gedp->ged_subp); i++) { + rrp = (struct ged_subprocess *)BU_PTBL_GET(&gedp->ged_subp, i); struct bu_vls pline = BU_VLS_INIT_ZERO; struct bu_vls cmdroot = BU_VLS_INIT_ZERO; const char * const *argv; @@ -73,8 +75,8 @@ int pid = bu_process_pid(rrp->p); (void)bu_path_component(&cmdroot, argv[0], BU_PATH_BASENAME_EXTLESS); bu_vls_sprintf(&pline, "%*d %s", longest_pid, pid, bu_vls_cstr(&cmdroot)); @@ Diff output truncated at 100000 characters. @@ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits