Revision: 54494
http://brlcad.svn.sourceforge.net/brlcad/?rev=54494&view=rev
Author: n_reed
Date: 2013-02-26 20:22:07 +0000 (Tue, 26 Feb 2013)
Log Message:
-----------
add ged_redraw to recalculate vlists without changing display state
Modified Paths:
--------------
brlcad/trunk/include/ged.h
brlcad/trunk/src/libged/draw.c
Modified: brlcad/trunk/include/ged.h
===================================================================
--- brlcad/trunk/include/ged.h 2013-02-26 20:16:16 UTC (rev 54493)
+++ brlcad/trunk/include/ged.h 2013-02-26 20:22:07 UTC (rev 54494)
@@ -1874,6 +1874,11 @@
GED_EXPORT extern int ged_units(struct ged *gedp, int argc, const char
*argv[]);
/**
+ * Recalculate plots for displayed objects.
+ */
+GED_EXPORT extern int ged_redraw(struct ged *gedp, int argc, const char
*argv[]);
+
+/**
* Convert the specified view point to a model point.
*/
GED_EXPORT extern int ged_v2m_point(struct ged *gedp, int argc, const char
*argv[]);
Modified: brlcad/trunk/src/libged/draw.c
===================================================================
--- brlcad/trunk/src/libged/draw.c 2013-02-26 20:16:16 UTC (rev 54493)
+++ brlcad/trunk/src/libged/draw.c 2013-02-26 20:22:07 UTC (rev 54494)
@@ -1731,7 +1731,219 @@
return gdlp;
}
+/* re-calculate a leaf's vlist based on its existing state */
+static union tree *
+redraw_leaf(
+ struct db_tree_state *tsp,
+ const struct db_full_path *pathp,
+ struct rt_db_internal *ip,
+ genptr_t client_data)
+{
+ union tree *curtree;
+ struct solid *sp, *curr_sp;
+ struct _ged_client_data *dgcdp = (struct _ged_client_data *)client_data;
+ RT_CK_DB_INTERNAL(ip);
+ RT_CK_TESS_TOL(tsp->ts_ttol);
+ BN_CK_TOL(tsp->ts_tol);
+ RT_CK_RESOURCE(tsp->ts_resp);
+
+ if (!dgcdp) {
+ return TREE_NULL;
+ }
+
+ /* find this path's solid struct */
+ sp = NULL;
+ for (BU_LIST_FOR(curr_sp, solid, &(dgcdp->gdlp->gdl_headSolid))) {
+ if (db_identical_full_paths(pathp, &(curr_sp->s_fullpath))) {
+ sp = curr_sp;
+ break;
+ }
+ }
+
+ if (sp == NULL) {
+ return TREE_NULL;
+ }
+
+ /* release existing vlist */
+ RT_FREE_VLIST(&sp->s_vlist);
+
+ /* use the solid's dmode to determine how to replot it */
+ dgcdp->dmode = sp->s_dmode;
+
+ if (sp->s_dmode == _GED_WIREFRAME) {
+ return wireframe_leaf(tsp, pathp, ip, client_data);
+ } else {
+ /* plot for shaded display */
+ struct bu_list vhead;
+ int is_db5_bot, is_db5_poly;
+
+ BU_LIST_INIT(&vhead);
+
+ is_db5_bot = is_db5_poly = 0;
+ if (ip->idb_major_type == DB5_MAJORTYPE_BRLCAD) {
+ if (ip->idb_minor_type == DB5_MINORTYPE_BRLCAD_BOT) {
+ is_db5_bot = 1;
+ } else if (ip->idb_minor_type == DB5_MINORTYPE_BRLCAD_POLY) {
+ is_db5_poly = 1;
+ }
+ }
+
+ /* bots and polys have their own routines for this */
+ if (is_db5_bot) {
+ (void)rt_bot_plot_poly(&vhead, ip, tsp->ts_ttol, tsp->ts_tol);
+ _ged_drawH_part2(0, &vhead, pathp, tsp, sp, dgcdp);
+ } if (is_db5_poly) {
+ (void)rt_pg_plot_poly(&vhead, ip, tsp->ts_ttol, tsp->ts_tol);
+ _ged_drawH_part2(0, &vhead, pathp, tsp, sp, dgcdp);
+ } else if (sp->s_dmode == _GED_SHADED_MODE_ALL) {
+ /* if we're shading another kind of solid, we'll use nmg
+ * tessellation
+ */
+ char *av[] = {NULL, NULL};
+ int ret, ac, ncpu = 1;
+ struct model *nmg_model;
+ struct ged *gedp;
+
+ gedp = dgcdp->gedp;
+ nmg_model = nmg_mm();
+ gedp->ged_wdbp->wdb_initial_tree_state.ts_m = &nmg_model;
+
+ if (dgcdp->draw_edge_uses) {
+ bu_vls_printf(gedp->ged_result_str, "drawing edge uses (-u)\n");
+ dgcdp->draw_edge_uses_vbp = rt_vlblock_init();
+ }
+
+ av[0] = db_path_to_string(pathp);
+ ac = 1;
+ ret = db_walk_tree(gedp->ged_wdbp->dbip,
+ ac,
+ (const char **)av,
+ ncpu,
+ &gedp->ged_wdbp->wdb_initial_tree_state,
+ NULL,
+ draw_nmg_region_end,
+ nmg_booltree_leaf_tess,
+ (genptr_t)dgcdp);
+
+ if (dgcdp->draw_edge_uses) {
+ _ged_cvt_vlblock_to_solids(gedp, dgcdp->draw_edge_uses_vbp,
"_EDGEUSES_", 0);
+ rt_vlblock_free(dgcdp->draw_edge_uses_vbp);
+ dgcdp->draw_edge_uses_vbp = (struct bn_vlblock *)NULL;
+ }
+
+ /* Destroy NMG */
+ nmg_km(nmg_model);
+
+ if (ret < 0) {
+ return TREE_NULL;
+ }
+ }
+ }
+
+ RT_GET_TREE(curtree, tsp->ts_resp);
+ curtree->tr_op = OP_NOP;
+
+ return curtree;
+}
+
+int
+ged_redraw(struct ged *gedp, int argc, const char *argv[])
+{
+ struct _ged_client_data *dgcdp;
+ struct ged_display_list *gdlp;
+ int ret, ac, ncpu;
+ char *av[] = {NULL, NULL};
+
+ GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
+ GED_CHECK_DRAWABLE(gedp, GED_ERROR);
+ GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR);
+ RT_CHECK_DBI(gedp->ged_wdbp->dbip);
+
+ bu_vls_trunc(gedp->ged_result_str, 0);
+
+ BU_GET(dgcdp, struct _ged_client_data);
+ dgcdp->gedp = gedp;
+
+ ac = ncpu = 1;
+
+ if (argc == 1) {
+ /* redraw everything */
+ for (BU_LIST_FOR(gdlp, ged_display_list,
&gedp->ged_gdp->gd_headDisplay)) {
+ dgcdp->gdlp = gdlp;
+
+ av[0] = bu_vls_addr(&gdlp->gdl_path);
+ ret = db_walk_tree(gedp->ged_wdbp->dbip,
+ ac,
+ (const char **)av,
+ ncpu,
+ &gedp->ged_wdbp->wdb_initial_tree_state,
+ NULL,
+ wireframe_region_end,
+ redraw_leaf,
+ (genptr_t)dgcdp);
+ if (ret < 0) {
+ return GED_ERROR;
+ }
+ }
+ } else {
+ int i;
+ struct db_full_path obj_path, dl_path;
+
+ /* redraw the specificied paths */
+ for (i = 1; i < argc; ++i) {
+ if (db_string_to_path(&obj_path, gedp->ged_wdbp->dbip, argv[i]) <
0) {
+ bu_vls_printf(gedp->ged_result_str,
+ "%s: %s is not a valid path\n", argv[0], argv[i]);
+ return GED_ERROR;
+ }
+
+ /* find the display list whose path matches/contains this path */
+ av[0] = NULL;
+ dgcdp->gdlp = NULL;
+
+ for (BU_LIST_FOR(gdlp, ged_display_list,
&gedp->ged_gdp->gd_headDisplay)) {
+
+ db_string_to_path(&dl_path, gedp->ged_wdbp->dbip,
+ bu_vls_addr(&gdlp->gdl_path));
+
+ if (db_full_path_match_top(&dl_path, &obj_path)) {
+ dgcdp->gdlp = gdlp;
+ break;
+ }
+ }
+
+ if (dgcdp->gdlp == NULL) {
+ bu_vls_printf(gedp->ged_result_str,
+ "%s: %s is not being displayed\n", argv[0], argv[i]);
+ return GED_ERROR;
+ }
+
+ /* redraw the display list path */
+ av[0] = bu_vls_addr(&dgcdp->gdlp->gdl_path);
+ ret = db_walk_tree(gedp->ged_wdbp->dbip,
+ ac,
+ (const char **)av,
+ ncpu,
+ &gedp->ged_wdbp->wdb_initial_tree_state,
+ NULL,
+ wireframe_region_end,
+ redraw_leaf,
+ (genptr_t)dgcdp);
+
+ if (ret < 0) {
+ bu_vls_printf(gedp->ged_result_str,
+ "%s: %s redraw failure\n", argv[0], argv[i]);
+ return GED_ERROR;
+ }
+ }
+ }
+
+ BU_PUT(dgcdp, struct _ged_client_data);
+
+ return GED_OK;
+}
+
/*
* Local Variables:
* tab-width: 8
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits