Revision: 76335 http://sourceforge.net/p/brlcad/code/76335 Author: starseeker Date: 2020-07-14 20:18:22 +0000 (Tue, 14 Jul 2020) Log Message: ----------- Extract at least some of the logic related to views
Modified Paths: -------------- brlcad/trunk/src/libtclcad/CMakeLists.txt brlcad/trunk/src/libtclcad/tclcad_obj.c brlcad/trunk/src/libtclcad/tclcad_private.h Added Paths: ----------- brlcad/trunk/src/libtclcad/tclcad_views.c Modified: brlcad/trunk/src/libtclcad/CMakeLists.txt =================================================================== --- brlcad/trunk/src/libtclcad/CMakeLists.txt 2020-07-14 19:54:26 UTC (rev 76334) +++ brlcad/trunk/src/libtclcad/CMakeLists.txt 2020-07-14 20:18:22 UTC (rev 76335) @@ -8,6 +8,7 @@ tclcad_obj_wrapper.c tclcad_eval.c tclcad_init.c + tclcad_views.c tkImgFmtPIX.c cmdhist_obj.c dm_obj.c Modified: brlcad/trunk/src/libtclcad/tclcad_obj.c =================================================================== --- brlcad/trunk/src/libtclcad/tclcad_obj.c 2020-07-14 19:54:26 UTC (rev 76334) +++ brlcad/trunk/src/libtclcad/tclcad_obj.c 2020-07-14 20:18:22 UTC (rev 76335) @@ -964,7 +964,6 @@ HIDDEN void to_create_vlist_callback(struct display_list *gdlp); HIDDEN void to_free_vlist_callback(unsigned int dlist, int range); HIDDEN void to_refresh_handler(void *clientdata); -HIDDEN void to_autoview_view(struct ged_dm_view *gdvp, const char *scale); HIDDEN void to_rt_end_callback_internal(int aborted); HIDDEN void to_output_handler(struct ged *gedp, char *line); @@ -974,14 +973,7 @@ typedef int (*to_wrapper_func_ptr)(struct ged *, int, const char *[], ged_func_ptr, const char *, int); #define TO_WRAPPER_FUNC_PTR_NULL (to_wrapper_func_ptr)0 -struct path_edit_params { - int edit_mode; - double dx; - double dy; - mat_t edit_mat; -}; - struct to_cmdtab { char *to_name; char *to_usage; @@ -7038,37 +7030,6 @@ } -int -to_is_viewable(struct ged_dm_view *gdvp) -{ - Tcl_Obj *our_result; - Tcl_Obj *saved_result; - int result_int; - const char *pathname = bu_vls_addr(dm_get_pathname(gdvp->gdv_dmp)); - - /* stash any existing result so we can inspect our own */ - saved_result = Tcl_GetObjResult(current_top->to_interp); - Tcl_IncrRefCount(saved_result); - - if (pathname && tclcad_eval(current_top->to_interp, "winfo viewable", 1, &pathname) != TCL_OK) { - return 0; - } - - our_result = Tcl_GetObjResult(current_top->to_interp); - Tcl_GetIntFromObj(current_top->to_interp, our_result, &result_int); - - /* restore previous result */ - Tcl_SetObjResult(current_top->to_interp, saved_result); - Tcl_DecrRefCount(saved_result); - - if (!result_int) { - return 0; - } - - return 1; -} - - HIDDEN int to_light(struct ged *gedp, int argc, @@ -14628,28 +14589,6 @@ } -void -to_refresh_all_views(struct tclcad_obj *top) -{ - struct ged_dm_view *gdvp; - - for (BU_LIST_FOR(gdvp, ged_dm_view, &top->to_gop->go_head_views.l)) { - to_refresh_view(gdvp); - } -} - - -void -to_refresh_view(struct ged_dm_view *gdvp) -{ - if (current_top == NULL || !current_top->to_gop->go_refresh_on) - return; - - if (to_is_viewable(gdvp)) - go_refresh(current_top->to_gop, gdvp); -} - - HIDDEN void to_refresh_handler(void *clientdata) { @@ -14660,45 +14599,7 @@ to_refresh_view(gdvp); } - HIDDEN void -to_autoview_view(struct ged_dm_view *gdvp, const char *scale) -{ - int ret; - const char *av[3]; - - gdvp->gdv_gop->go_gedp->ged_gvp = gdvp->gdv_view; - av[0] = "autoview"; - av[1] = scale; - av[2] = NULL; - - if (scale) - ret = ged_autoview(gdvp->gdv_gop->go_gedp, 2, (const char **)av); - else - ret = ged_autoview(gdvp->gdv_gop->go_gedp, 1, (const char **)av); - - if (ret == GED_OK) { - if (0 < bu_vls_strlen(&gdvp->gdv_callback)) { - Tcl_Eval(current_top->to_interp, bu_vls_addr(&gdvp->gdv_callback)); - } - - to_refresh_view(gdvp); - } -} - - -void -to_autoview_all_views(struct tclcad_obj *top) -{ - struct ged_dm_view *gdvp; - - for (BU_LIST_FOR(gdvp, ged_dm_view, &top->to_gop->go_head_views.l)) { - to_autoview_view(gdvp, NULL); - } -} - - -HIDDEN void to_rt_end_callback_internal(int aborted) { if (0 < bu_vls_strlen(¤t_top->to_gop->go_rt_end_callback)) { @@ -14726,651 +14627,6 @@ } -HIDDEN void go_dm_draw_arrows(struct dm *dmp, struct bview_data_arrow_state *gdasp, fastf_t sf); -HIDDEN void go_dm_draw_labels(struct dm *dmp, struct bview_data_label_state *gdlsp, matp_t m2vmat); -HIDDEN void go_dm_draw_lines(struct dm *dmp, struct bview_data_line_state *gdlsp); -HIDDEN void go_dm_draw_polys(struct dm *dmp, bview_data_polygon_state *gdpsp, int mode); - -HIDDEN void go_draw(struct ged_dm_view *gdvp); -HIDDEN int go_draw_dlist(struct ged_dm_view *gdvp); -HIDDEN void go_draw_faceplate(struct ged_obj *gop, struct ged_dm_view *gdvp); -HIDDEN void go_draw_solid(struct ged_dm_view *gdvp, struct solid *sp); - - -HIDDEN void -go_dm_draw_arrows(struct dm *dmp, struct bview_data_arrow_state *gdasp, fastf_t sf) -{ - register int i; - int saveLineWidth; - int saveLineStyle; - - if (gdasp->gdas_num_points < 1) - return; - - saveLineWidth = dm_get_linewidth(dmp); - saveLineStyle = dm_get_linestyle(dmp); - - /* set color */ - (void)dm_set_fg(dmp, - gdasp->gdas_color[0], - gdasp->gdas_color[1], - gdasp->gdas_color[2], 1, 1.0); - - /* set linewidth */ - (void)dm_set_line_attr(dmp, gdasp->gdas_line_width, 0); /* solid lines */ - - (void)dm_draw_lines_3d(dmp, - gdasp->gdas_num_points, - gdasp->gdas_points, 0); - - for (i = 0; i < gdasp->gdas_num_points; i += 2) { - point_t points[16]; - point_t A, B; - point_t BmA; - point_t offset; - point_t perp1, perp2; - point_t a_base; - point_t a_pt1, a_pt2, a_pt3, a_pt4; - - VMOVE(A, gdasp->gdas_points[i]); - VMOVE(B, gdasp->gdas_points[i+1]); - VSUB2(BmA, B, A); - - VUNITIZE(BmA); - VSCALE(offset, BmA, -gdasp->gdas_tip_length * sf); - - bn_vec_perp(perp1, BmA); - VUNITIZE(perp1); - - VCROSS(perp2, BmA, perp1); - VUNITIZE(perp2); - - VSCALE(perp1, perp1, gdasp->gdas_tip_width * sf); - VSCALE(perp2, perp2, gdasp->gdas_tip_width * sf); - - VADD2(a_base, B, offset); - VADD2(a_pt1, a_base, perp1); - VADD2(a_pt2, a_base, perp2); - VSUB2(a_pt3, a_base, perp1); - VSUB2(a_pt4, a_base, perp2); - - VMOVE(points[0], B); - VMOVE(points[1], a_pt1); - VMOVE(points[2], B); - VMOVE(points[3], a_pt2); - VMOVE(points[4], B); - VMOVE(points[5], a_pt3); - VMOVE(points[6], B); - VMOVE(points[7], a_pt4); - VMOVE(points[8], a_pt1); - VMOVE(points[9], a_pt2); - VMOVE(points[10], a_pt2); - VMOVE(points[11], a_pt3); - VMOVE(points[12], a_pt3); - VMOVE(points[13], a_pt4); - VMOVE(points[14], a_pt4); - VMOVE(points[15], a_pt1); - - (void)dm_draw_lines_3d(dmp, 16, points, 0); - } - - /* Restore the line attributes */ - (void)dm_set_line_attr(dmp, saveLineWidth, saveLineStyle); -} - - -HIDDEN void -go_dm_draw_labels(struct dm *dmp, struct bview_data_label_state *gdlsp, matp_t m2vmat) -{ - register int i; - - /* set color */ - (void)dm_set_fg(dmp, - gdlsp->gdls_color[0], - gdlsp->gdls_color[1], - gdlsp->gdls_color[2], 1, 1.0); - - for (i = 0; i < gdlsp->gdls_num_labels; ++i) { - point_t vpoint; - - MAT4X3PNT(vpoint, m2vmat, - gdlsp->gdls_points[i]); - (void)dm_draw_string_2d(dmp, gdlsp->gdls_labels[i], - vpoint[X], vpoint[Y], 0, 1); - } -} - - -HIDDEN void -go_dm_draw_lines(struct dm *dmp, struct bview_data_line_state *gdlsp) -{ - int saveLineWidth; - int saveLineStyle; - - if (gdlsp->gdls_num_points < 1) - return; - - saveLineWidth = dm_get_linewidth(dmp); - saveLineStyle = dm_get_linestyle(dmp); - - /* set color */ - (void)dm_set_fg(dmp, - gdlsp->gdls_color[0], - gdlsp->gdls_color[1], - gdlsp->gdls_color[2], 1, 1.0); - - /* set linewidth */ - (void)dm_set_line_attr(dmp, gdlsp->gdls_line_width, 0); /* solid lines */ - - (void)dm_draw_lines_3d(dmp, - gdlsp->gdls_num_points, - gdlsp->gdls_points, 0); - - /* Restore the line attributes */ - (void)dm_set_line_attr(dmp, saveLineWidth, saveLineStyle); -} - - -#define GO_DM_DRAW_POLY(_dmp, _gdpsp, _i, _last_poly, _mode) { \ - size_t _j; \ - \ - /* set color */ \ - (void)dm_set_fg((_dmp), \ - (_gdpsp)->gdps_polygons.polygon[_i].gp_color[0], \ - (_gdpsp)->gdps_polygons.polygon[_i].gp_color[1], \ - (_gdpsp)->gdps_polygons.polygon[_i].gp_color[2], \ - 1, 1.0); \ - \ - for (_j = 0; _j < (_gdpsp)->gdps_polygons.polygon[_i].num_contours; ++_j) { \ - size_t _last = (_gdpsp)->gdps_polygons.polygon[_i].contour[_j].num_points-1; \ - int _line_style; \ - \ - /* always draw holes using segmented lines */ \ - if ((_gdpsp)->gdps_polygons.polygon[_i].hole[_j]) { \ - _line_style = 1; \ - } else { \ - _line_style = (_gdpsp)->gdps_polygons.polygon[_i].gp_line_style; \ - } \ - \ - /* set the linewidth and linestyle for polygon i, contour j */ \ - (void)dm_set_line_attr((_dmp), \ - (_gdpsp)->gdps_polygons.polygon[_i].gp_line_width, \ - _line_style); \ - \ - (void)dm_draw_lines_3d((_dmp), \ - (_gdpsp)->gdps_polygons.polygon[_i].contour[_j].num_points, \ - (_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point, 1); \ - \ - if (_mode != TCLCAD_POLY_CONTOUR_MODE || _i != _last_poly || (_gdpsp)->gdps_cflag == 0) { \ - (void)dm_draw_line_3d((_dmp), \ - (_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point[_last], \ - (_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point[0]); \ - } \ - }} - - -HIDDEN void -go_dm_draw_polys(struct dm *dmp, bview_data_polygon_state *gdpsp, int mode) -{ - register size_t i, last_poly; - int saveLineWidth; - int saveLineStyle; - - if (gdpsp->gdps_polygons.num_polygons < 1) - return; - - saveLineWidth = dm_get_linewidth(dmp); - saveLineStyle = dm_get_linestyle(dmp); - - last_poly = gdpsp->gdps_polygons.num_polygons - 1; - for (i = 0; i < gdpsp->gdps_polygons.num_polygons; ++i) { - if (i == gdpsp->gdps_target_polygon_i) - continue; - - GO_DM_DRAW_POLY(dmp, gdpsp, i, last_poly, mode); - } - - /* draw the target poly last */ - GO_DM_DRAW_POLY(dmp, gdpsp, gdpsp->gdps_target_polygon_i, last_poly, mode); - - /* Restore the line attributes */ - (void)dm_set_line_attr(dmp, saveLineWidth, saveLineStyle); -} - - -HIDDEN void -go_draw(struct ged_dm_view *gdvp) -{ - (void)dm_loadmatrix(gdvp->gdv_dmp, gdvp->gdv_view->gv_model2view, 0); - - if (SMALL_FASTF < gdvp->gdv_view->gv_perspective) - (void)dm_loadpmatrix(gdvp->gdv_dmp, gdvp->gdv_view->gv_pmat); - else - (void)dm_loadpmatrix(gdvp->gdv_dmp, (fastf_t *)NULL); - - go_draw_dlist(gdvp); -} - - -/* Draw all display lists */ -HIDDEN int -go_draw_dlist(struct ged_dm_view *gdvp) -{ - register struct display_list *gdlp; - register struct display_list *next_gdlp; - struct solid *sp; - int line_style = -1; - struct dm *dmp = gdvp->gdv_dmp; - struct bu_list *hdlp = gdvp->gdv_gop->go_gedp->ged_gdp->gd_headDisplay; - - if (dm_get_transparency(dmp)) { - /* First, draw opaque stuff */ - gdlp = BU_LIST_NEXT(display_list, hdlp); - while (BU_LIST_NOT_HEAD(gdlp, hdlp)) { - next_gdlp = BU_LIST_PNEXT(display_list, gdlp); - - FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) { - if (sp->s_transparency < 1.0) - continue; - - if (line_style != sp->s_soldash) { - line_style = sp->s_soldash; - (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), line_style); - } - - go_draw_solid(gdvp, sp); - } - - gdlp = next_gdlp; - } - - /* disable write to depth buffer */ - (void)dm_set_depth_mask(dmp, 0); - - /* Second, draw transparent stuff */ - gdlp = BU_LIST_NEXT(display_list, hdlp); - while (BU_LIST_NOT_HEAD(gdlp, hdlp)) { - next_gdlp = BU_LIST_PNEXT(display_list, gdlp); - - FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) { - /* already drawn above */ - if (ZERO(sp->s_transparency - 1.0)) - continue; - - if (line_style != sp->s_soldash) { - line_style = sp->s_soldash; - (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), line_style); - } - - go_draw_solid(gdvp, sp); - } - - gdlp = next_gdlp; - } - - /* re-enable write to depth buffer */ - (void)dm_set_depth_mask(dmp, 1); - } else { - gdlp = BU_LIST_NEXT(display_list, hdlp); - while (BU_LIST_NOT_HEAD(gdlp, hdlp)) { - next_gdlp = BU_LIST_PNEXT(display_list, gdlp); - - FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) { - if (line_style != sp->s_soldash) { - line_style = sp->s_soldash; - (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), line_style); - } - - go_draw_solid(gdvp, sp); - } - - gdlp = next_gdlp; - } - } - - return GED_OK; -} - - -HIDDEN void -go_draw_faceplate(struct ged_obj *gop, struct ged_dm_view *gdvp) -{ - /* Center dot */ - if (gdvp->gdv_view->gv_center_dot.gos_draw) { - (void)dm_set_fg(gdvp->gdv_dmp, - gdvp->gdv_view->gv_center_dot.gos_line_color[0], - gdvp->gdv_view->gv_center_dot.gos_line_color[1], - gdvp->gdv_view->gv_center_dot.gos_line_color[2], - 1, 1.0); - (void)dm_draw_point_2d(gdvp->gdv_dmp, 0.0, 0.0); - } - - /* Model axes */ - if (gdvp->gdv_view->gv_model_axes.draw) { - point_t map; - point_t save_map; - - VMOVE(save_map, gdvp->gdv_view->gv_model_axes.axes_pos); - VSCALE(map, gdvp->gdv_view->gv_model_axes.axes_pos, gop->go_gedp->ged_wdbp->dbip->dbi_local2base); - MAT4X3PNT(gdvp->gdv_view->gv_model_axes.axes_pos, gdvp->gdv_view->gv_model2view, map); - - dm_draw_axes(gdvp->gdv_dmp, - gdvp->gdv_view->gv_size, - gdvp->gdv_view->gv_rotation, - &gdvp->gdv_view->gv_model_axes); - - VMOVE(gdvp->gdv_view->gv_model_axes.axes_pos, save_map); - } - - /* View axes */ - if (gdvp->gdv_view->gv_view_axes.draw) { - int width, height; - fastf_t inv_aspect; - fastf_t save_ypos; - - save_ypos = gdvp->gdv_view->gv_view_axes.axes_pos[Y]; - width = dm_get_width(gdvp->gdv_dmp); - height = dm_get_height(gdvp->gdv_dmp); - inv_aspect = (fastf_t)height / (fastf_t)width; - gdvp->gdv_view->gv_view_axes.axes_pos[Y] = save_ypos * inv_aspect; - dm_draw_axes(gdvp->gdv_dmp, - gdvp->gdv_view->gv_size, - gdvp->gdv_view->gv_rotation, - &gdvp->gdv_view->gv_view_axes); - - gdvp->gdv_view->gv_view_axes.axes_pos[Y] = save_ypos; - } - - - /* View scale */ - if (gdvp->gdv_view->gv_view_scale.gos_draw) - dm_draw_scale(gdvp->gdv_dmp, - gdvp->gdv_view->gv_size*gop->go_gedp->ged_wdbp->dbip->dbi_base2local, - bu_units_string(1/gop->go_gedp->ged_wdbp->dbip->dbi_base2local), - gdvp->gdv_view->gv_view_scale.gos_line_color, - gdvp->gdv_view->gv_view_params.gos_text_color); - - /* View parameters */ - if (gdvp->gdv_view->gv_view_params.gos_draw) { - struct bu_vls vls = BU_VLS_INIT_ZERO; - point_t center; - char *ustr; - - MAT_DELTAS_GET_NEG(center, gdvp->gdv_view->gv_center); - VSCALE(center, center, gop->go_gedp->ged_wdbp->dbip->dbi_base2local); - - ustr = (char *)bu_units_string(gop->go_gedp->ged_wdbp->dbip->dbi_local2base); - bu_vls_printf(&vls, "units:%s size:%.2f center:(%.2f, %.2f, %.2f) az:%.2f el:%.2f tw::%.2f", - ustr, - gdvp->gdv_view->gv_size * gop->go_gedp->ged_wdbp->dbip->dbi_base2local, - V3ARGS(center), - V3ARGS(gdvp->gdv_view->gv_aet)); - (void)dm_set_fg(gdvp->gdv_dmp, - gdvp->gdv_view->gv_view_params.gos_text_color[0], - gdvp->gdv_view->gv_view_params.gos_text_color[1], - gdvp->gdv_view->gv_view_params.gos_text_color[2], - 1, 1.0); - (void)dm_draw_string_2d(gdvp->gdv_dmp, bu_vls_addr(&vls), -0.98, -0.965, 10, 0); - bu_vls_free(&vls); - } - - /* Draw the angle distance cursor */ - if (gdvp->gdv_view->gv_adc.draw) - dm_draw_adc(gdvp->gdv_dmp, &(gdvp->gdv_view->gv_adc), gdvp->gdv_view->gv_view2model, gdvp->gdv_view->gv_model2view); - - /* Draw grid */ - if (gdvp->gdv_view->gv_grid.draw) - dm_draw_grid(gdvp->gdv_dmp, &gdvp->gdv_view->gv_grid, gdvp->gdv_view->gv_scale, gdvp->gdv_view->gv_model2view, gdvp->gdv_gop->go_gedp->ged_wdbp->dbip->dbi_base2local); - - /* Draw rect */ - if (gdvp->gdv_view->gv_rect.draw && gdvp->gdv_view->gv_rect.line_width) - dm_draw_rect(gdvp->gdv_dmp, &gdvp->gdv_view->gv_rect); -} - - -struct path_match_data { - struct db_full_path *s_fpath; - struct db_i *dbip; -}; - - -HIDDEN struct bu_hash_entry * -key_matches_paths(struct bu_hash_tbl *t, void *udata) -{ - struct path_match_data *data = (struct path_match_data *)udata; - struct db_full_path entry_fpath; - uint8_t *key; - char *path_string; - struct bu_hash_entry *entry = bu_hash_next(t, NULL); - - while (entry) { - (void)bu_hash_key(entry, &key, NULL); - path_string = (char *)key; - if (db_string_to_path(&entry_fpath, data->dbip, path_string) < 0) { - continue; - } - - if (db_full_path_match_top(&entry_fpath, data->s_fpath)) { - db_free_full_path(&entry_fpath); - return entry; - } - - db_free_full_path(&entry_fpath); - entry = bu_hash_next(t, entry); - } - - return NULL; -} - - -HIDDEN void -go_draw_solid(struct ged_dm_view *gdvp, struct solid *sp) -{ - struct ged_obj *gop = gdvp->gdv_gop; - struct dm *dmp = gdvp->gdv_dmp; - struct bu_hash_entry *entry; - struct path_edit_params *params = NULL; - mat_t save_mat, edit_model2view; - struct path_match_data data; - - data.s_fpath = &sp->s_fullpath; - data.dbip = gop->go_gedp->ged_wdbp->dbip; - entry = key_matches_paths(gop->go_edited_paths, &data); - - if (entry != NULL) { - params = (struct path_edit_params *)bu_hash_value(entry, NULL); - } - if (params) { - MAT_COPY(save_mat, gdvp->gdv_view->gv_model2view); - bn_mat_mul(edit_model2view, gdvp->gdv_view->gv_model2view, params->edit_mat); - dm_loadmatrix(dmp, edit_model2view, 0); - } - - if (gop->go_dlist_on) { - dm_draw_dlist(dmp, sp->s_dlist); - } else { - if (sp->s_iflag == UP) - (void)dm_set_fg(dmp, 255, 255, 255, 0, sp->s_transparency); - else - (void)dm_set_fg(dmp, - (unsigned char)sp->s_color[0], - (unsigned char)sp->s_color[1], - (unsigned char)sp->s_color[2], 0, sp->s_transparency); - - if (sp->s_hiddenLine) { - (void)dm_draw_vlist_hidden_line(dmp, (struct bn_vlist *)&sp->s_vlist); - } else { - (void)dm_draw_vlist(dmp, (struct bn_vlist *)&sp->s_vlist); - } - } - if (params) { - dm_loadmatrix(dmp, save_mat, 0); - } -} - - -HIDDEN void -go_draw_other(struct ged_obj *gop, struct ged_dm_view *gdvp) -{ - int width = dm_get_width(gdvp->gdv_dmp); - fastf_t sf = (fastf_t)(gdvp->gdv_view->gv_size) / (fastf_t)width; - - if (gdvp->gdv_view->gv_data_arrows.gdas_draw) - go_dm_draw_arrows(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_arrows, sf); - - if (gdvp->gdv_view->gv_sdata_arrows.gdas_draw) - go_dm_draw_arrows(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_arrows, sf); - - if (gdvp->gdv_view->gv_data_axes.draw) - dm_draw_data_axes(gdvp->gdv_dmp, - sf, - &gdvp->gdv_view->gv_data_axes); - - if (gdvp->gdv_view->gv_sdata_axes.draw) - dm_draw_data_axes(gdvp->gdv_dmp, - sf, - &gdvp->gdv_view->gv_sdata_axes); - - if (gdvp->gdv_view->gv_data_lines.gdls_draw) - go_dm_draw_lines(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_lines); - - if (gdvp->gdv_view->gv_sdata_lines.gdls_draw) - go_dm_draw_lines(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_lines); - - if (gdvp->gdv_view->gv_data_polygons.gdps_draw) - go_dm_draw_polys(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_polygons, gdvp->gdv_view->gv_mode); - - if (gdvp->gdv_view->gv_sdata_polygons.gdps_draw) - go_dm_draw_polys(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_polygons, gdvp->gdv_view->gv_mode); - - /* Restore to non-rotated, full brightness */ - (void)dm_normal(gdvp->gdv_dmp); - go_draw_faceplate(gop, gdvp); - - if (gdvp->gdv_view->gv_data_labels.gdls_draw) - go_dm_draw_labels(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_labels, gdvp->gdv_view->gv_model2view); - - if (gdvp->gdv_view->gv_sdata_labels.gdls_draw) - go_dm_draw_labels(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_labels, gdvp->gdv_view->gv_model2view); - - /* Draw labels */ - if (gdvp->gdv_view->gv_prim_labels.gos_draw) { - register int i; - - for (i = 0; i < gop->go_prim_label_list_size; ++i) { - dm_draw_labels(gdvp->gdv_dmp, - gop->go_gedp->ged_wdbp, - bu_vls_addr(&gop->go_prim_label_list[i]), - gdvp->gdv_view->gv_model2view, - gdvp->gdv_view->gv_prim_labels.gos_text_color, - NULL, NULL); - } - } -} - - -void -go_refresh(struct ged_obj *gop, struct ged_dm_view *gdvp) -{ - int restore_zbuffer = 0; - - /* Turn off the zbuffer if the framebuffer is active AND the zbuffer is on. */ - if (gdvp->gdv_fbs.fbs_mode != TCLCAD_OBJ_FB_MODE_OFF && dm_get_zbuffer(gdvp->gdv_dmp)) { - (void)dm_set_zbuffer(gdvp->gdv_dmp, 0); - restore_zbuffer = 1; - } - - (void)dm_draw_begin(gdvp->gdv_dmp); - go_refresh_draw(gop, gdvp, restore_zbuffer); - (void)dm_draw_end(gdvp->gdv_dmp); -} - - -void -go_refresh_draw(struct ged_obj *gop, struct ged_dm_view *gdvp, int restore_zbuffer) -{ - if (gdvp->gdv_fbs.fbs_mode == TCLCAD_OBJ_FB_MODE_OVERLAY) { - if (gdvp->gdv_view->gv_rect.draw) { - go_draw(gdvp); - - go_draw_other(gop, gdvp); - - /* disable write to depth buffer */ - (void)dm_set_depth_mask(gdvp->gdv_dmp, 0); - - fb_refresh(gdvp->gdv_fbs.fbs_fbp, - gdvp->gdv_view->gv_rect.pos[X], gdvp->gdv_view->gv_rect.pos[Y], - gdvp->gdv_view->gv_rect.dim[X], gdvp->gdv_view->gv_rect.dim[Y]); - - /* enable write to depth buffer */ - (void)dm_set_depth_mask(gdvp->gdv_dmp, 1); - - if (gdvp->gdv_view->gv_rect.line_width) - dm_draw_rect(gdvp->gdv_dmp, &gdvp->gdv_view->gv_rect); - } else { - /* disable write to depth buffer */ - (void)dm_set_depth_mask(gdvp->gdv_dmp, 0); - - fb_refresh(gdvp->gdv_fbs.fbs_fbp, 0, 0, - dm_get_width(gdvp->gdv_dmp), dm_get_height(gdvp->gdv_dmp)); - - /* enable write to depth buffer */ - (void)dm_set_depth_mask(gdvp->gdv_dmp, 1); - } - - if (restore_zbuffer) { - (void)dm_set_zbuffer(gdvp->gdv_dmp, 1); - } - - return; - } else if (gdvp->gdv_fbs.fbs_mode == TCLCAD_OBJ_FB_MODE_INTERLAY) { - go_draw(gdvp); - - /* disable write to depth buffer */ - (void)dm_set_depth_mask(gdvp->gdv_dmp, 0); - - if (gdvp->gdv_view->gv_rect.draw) { - fb_refresh(gdvp->gdv_fbs.fbs_fbp, - gdvp->gdv_view->gv_rect.pos[X], gdvp->gdv_view->gv_rect.pos[Y], - gdvp->gdv_view->gv_rect.dim[X], gdvp->gdv_view->gv_rect.dim[Y]); - } else - fb_refresh(gdvp->gdv_fbs.fbs_fbp, 0, 0, - dm_get_width(gdvp->gdv_dmp), dm_get_height(gdvp->gdv_dmp)); - - /* enable write to depth buffer */ - (void)dm_set_depth_mask(gdvp->gdv_dmp, 1); - - if (restore_zbuffer) { - (void)dm_set_zbuffer(gdvp->gdv_dmp, 1); - } - } else { - if (gdvp->gdv_fbs.fbs_mode == TCLCAD_OBJ_FB_MODE_UNDERLAY) { - /* disable write to depth buffer */ - (void)dm_set_depth_mask(gdvp->gdv_dmp, 0); - - if (gdvp->gdv_view->gv_rect.draw) { - fb_refresh(gdvp->gdv_fbs.fbs_fbp, - gdvp->gdv_view->gv_rect.pos[X], gdvp->gdv_view->gv_rect.pos[Y], - gdvp->gdv_view->gv_rect.dim[X], gdvp->gdv_view->gv_rect.dim[Y]); - } else - fb_refresh(gdvp->gdv_fbs.fbs_fbp, 0, 0, - dm_get_width(gdvp->gdv_dmp), dm_get_height(gdvp->gdv_dmp)); - - /* enable write to depth buffer */ - (void)dm_set_depth_mask(gdvp->gdv_dmp, 1); - } - - if (restore_zbuffer) { - (void)dm_set_zbuffer(gdvp->gdv_dmp, 1); - } - - go_draw(gdvp); - } - - go_draw_other(gop, gdvp); -} - - int go_run_tclscript(Tcl_Interp *interp, const char *tclscript, Modified: brlcad/trunk/src/libtclcad/tclcad_private.h =================================================================== --- brlcad/trunk/src/libtclcad/tclcad_private.h 2020-07-14 19:54:26 UTC (rev 76334) +++ brlcad/trunk/src/libtclcad/tclcad_private.h 2020-07-14 20:18:22 UTC (rev 76335) @@ -40,6 +40,13 @@ extern struct tclcad_obj HeadTclcadObj; extern struct tclcad_obj *current_top; +struct path_edit_params { + int edit_mode; + double dx; + double dy; + mat_t edit_mat; +}; + /** * function returns truthfully whether the library has been * initialized. calling this routine with setit true considers the @@ -72,12 +79,14 @@ extern int Rt_Init(Tcl_Interp *interp); +/* Tclcad view routines */ extern int to_is_viewable(struct ged_dm_view *gdvp); +extern void to_autoview_view(struct ged_dm_view *gdvp, const char *scale); extern void to_autoview_all_views(struct tclcad_obj *top); extern void to_refresh_all_views(struct tclcad_obj *top); extern void to_refresh_view(struct ged_dm_view *gdvp); -/* Tcl obj wrapper routines */ +/* Tclcad obj wrapper routines */ extern int to_autoview_func(struct ged *gedp, int argc, const char *argv[], Added: brlcad/trunk/src/libtclcad/tclcad_views.c =================================================================== --- brlcad/trunk/src/libtclcad/tclcad_views.c (rev 0) +++ brlcad/trunk/src/libtclcad/tclcad_views.c 2020-07-14 20:18:22 UTC (rev 76335) @@ -0,0 +1,758 @@ +/* T C L C A D _ V I E W S . C + * BRL-CAD + * + * Copyright (c) 2000-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. + */ +/** @addtogroup libtclcad */ +/** @{ */ +/** @file libtclcad/tclcad_views.c + * + * A quasi-object-oriented database interface. + * + * A GED object contains the attributes and methods for controlling a + * BRL-CAD geometry edit object. + * + */ +/** @} */ + +#include "common.h" +#include "bu/units.h" +#include "ged.h" +#include "tclcad.h" + +/* Private headers */ +#include "tclcad_private.h" + + +struct path_match_data { + struct db_full_path *s_fpath; + struct db_i *dbip; +}; + + +int +to_is_viewable(struct ged_dm_view *gdvp) +{ + Tcl_Obj *our_result; + Tcl_Obj *saved_result; + int result_int; + const char *pathname = bu_vls_addr(dm_get_pathname(gdvp->gdv_dmp)); + + /* stash any existing result so we can inspect our own */ + saved_result = Tcl_GetObjResult(current_top->to_interp); + Tcl_IncrRefCount(saved_result); + + if (pathname && tclcad_eval(current_top->to_interp, "winfo viewable", 1, &pathname) != TCL_OK) { + return 0; + } + + our_result = Tcl_GetObjResult(current_top->to_interp); + Tcl_GetIntFromObj(current_top->to_interp, our_result, &result_int); + + /* restore previous result */ + Tcl_SetObjResult(current_top->to_interp, saved_result); + Tcl_DecrRefCount(saved_result); + + if (!result_int) { + return 0; + } + + return 1; +} + +static void +go_draw_faceplate(struct ged_obj *gop, struct ged_dm_view *gdvp) +{ + /* Center dot */ + if (gdvp->gdv_view->gv_center_dot.gos_draw) { + (void)dm_set_fg(gdvp->gdv_dmp, + gdvp->gdv_view->gv_center_dot.gos_line_color[0], + gdvp->gdv_view->gv_center_dot.gos_line_color[1], + gdvp->gdv_view->gv_center_dot.gos_line_color[2], + 1, 1.0); + (void)dm_draw_point_2d(gdvp->gdv_dmp, 0.0, 0.0); + } + + /* Model axes */ + if (gdvp->gdv_view->gv_model_axes.draw) { + point_t map; + point_t save_map; + + VMOVE(save_map, gdvp->gdv_view->gv_model_axes.axes_pos); + VSCALE(map, gdvp->gdv_view->gv_model_axes.axes_pos, gop->go_gedp->ged_wdbp->dbip->dbi_local2base); + MAT4X3PNT(gdvp->gdv_view->gv_model_axes.axes_pos, gdvp->gdv_view->gv_model2view, map); + + dm_draw_axes(gdvp->gdv_dmp, + gdvp->gdv_view->gv_size, + gdvp->gdv_view->gv_rotation, + &gdvp->gdv_view->gv_model_axes); + + VMOVE(gdvp->gdv_view->gv_model_axes.axes_pos, save_map); + } + + /* View axes */ + if (gdvp->gdv_view->gv_view_axes.draw) { + int width, height; + fastf_t inv_aspect; + fastf_t save_ypos; + + save_ypos = gdvp->gdv_view->gv_view_axes.axes_pos[Y]; + width = dm_get_width(gdvp->gdv_dmp); + height = dm_get_height(gdvp->gdv_dmp); + inv_aspect = (fastf_t)height / (fastf_t)width; + gdvp->gdv_view->gv_view_axes.axes_pos[Y] = save_ypos * inv_aspect; + dm_draw_axes(gdvp->gdv_dmp, + gdvp->gdv_view->gv_size, + gdvp->gdv_view->gv_rotation, + &gdvp->gdv_view->gv_view_axes); + + gdvp->gdv_view->gv_view_axes.axes_pos[Y] = save_ypos; + } + + + /* View scale */ + if (gdvp->gdv_view->gv_view_scale.gos_draw) + dm_draw_scale(gdvp->gdv_dmp, + gdvp->gdv_view->gv_size*gop->go_gedp->ged_wdbp->dbip->dbi_base2local, + bu_units_string(1/gop->go_gedp->ged_wdbp->dbip->dbi_base2local), + gdvp->gdv_view->gv_view_scale.gos_line_color, + gdvp->gdv_view->gv_view_params.gos_text_color); + + /* View parameters */ + if (gdvp->gdv_view->gv_view_params.gos_draw) { + struct bu_vls vls = BU_VLS_INIT_ZERO; + point_t center; + char *ustr; + + MAT_DELTAS_GET_NEG(center, gdvp->gdv_view->gv_center); + VSCALE(center, center, gop->go_gedp->ged_wdbp->dbip->dbi_base2local); + + ustr = (char *)bu_units_string(gop->go_gedp->ged_wdbp->dbip->dbi_local2base); + bu_vls_printf(&vls, "units:%s size:%.2f center:(%.2f, %.2f, %.2f) az:%.2f el:%.2f tw::%.2f", + ustr, + gdvp->gdv_view->gv_size * gop->go_gedp->ged_wdbp->dbip->dbi_base2local, + V3ARGS(center), + V3ARGS(gdvp->gdv_view->gv_aet)); + (void)dm_set_fg(gdvp->gdv_dmp, + gdvp->gdv_view->gv_view_params.gos_text_color[0], + gdvp->gdv_view->gv_view_params.gos_text_color[1], + gdvp->gdv_view->gv_view_params.gos_text_color[2], + 1, 1.0); + (void)dm_draw_string_2d(gdvp->gdv_dmp, bu_vls_addr(&vls), -0.98, -0.965, 10, 0); + bu_vls_free(&vls); + } + + /* Draw the angle distance cursor */ + if (gdvp->gdv_view->gv_adc.draw) + dm_draw_adc(gdvp->gdv_dmp, &(gdvp->gdv_view->gv_adc), gdvp->gdv_view->gv_view2model, gdvp->gdv_view->gv_model2view); + + /* Draw grid */ + if (gdvp->gdv_view->gv_grid.draw) + dm_draw_grid(gdvp->gdv_dmp, &gdvp->gdv_view->gv_grid, gdvp->gdv_view->gv_scale, gdvp->gdv_view->gv_model2view, gdvp->gdv_gop->go_gedp->ged_wdbp->dbip->dbi_base2local); + + /* Draw rect */ + if (gdvp->gdv_view->gv_rect.draw && gdvp->gdv_view->gv_rect.line_width) + dm_draw_rect(gdvp->gdv_dmp, &gdvp->gdv_view->gv_rect); +} + +static struct bu_hash_entry * +key_matches_paths(struct bu_hash_tbl *t, void *udata) +{ + struct path_match_data *data = (struct path_match_data *)udata; + struct db_full_path entry_fpath; + uint8_t *key; + char *path_string; + struct bu_hash_entry *entry = bu_hash_next(t, NULL); + + while (entry) { + (void)bu_hash_key(entry, &key, NULL); + path_string = (char *)key; + if (db_string_to_path(&entry_fpath, data->dbip, path_string) < 0) { + continue; + } + + if (db_full_path_match_top(&entry_fpath, data->s_fpath)) { + db_free_full_path(&entry_fpath); + return entry; + } + + db_free_full_path(&entry_fpath); + entry = bu_hash_next(t, entry); + } + + return NULL; +} + +static void +go_draw_solid(struct ged_dm_view *gdvp, struct solid *sp) +{ + struct ged_obj *gop = gdvp->gdv_gop; + struct dm *dmp = gdvp->gdv_dmp; + struct bu_hash_entry *entry; + struct path_edit_params *params = NULL; + mat_t save_mat, edit_model2view; + struct path_match_data data; + + data.s_fpath = &sp->s_fullpath; + data.dbip = gop->go_gedp->ged_wdbp->dbip; + entry = key_matches_paths(gop->go_edited_paths, &data); + + if (entry != NULL) { + params = (struct path_edit_params *)bu_hash_value(entry, NULL); + } + if (params) { + MAT_COPY(save_mat, gdvp->gdv_view->gv_model2view); + bn_mat_mul(edit_model2view, gdvp->gdv_view->gv_model2view, params->edit_mat); + dm_loadmatrix(dmp, edit_model2view, 0); + } + + if (gop->go_dlist_on) { + dm_draw_dlist(dmp, sp->s_dlist); + } else { + if (sp->s_iflag == UP) + (void)dm_set_fg(dmp, 255, 255, 255, 0, sp->s_transparency); + else + (void)dm_set_fg(dmp, + (unsigned char)sp->s_color[0], + (unsigned char)sp->s_color[1], + (unsigned char)sp->s_color[2], 0, sp->s_transparency); + + if (sp->s_hiddenLine) { + (void)dm_draw_vlist_hidden_line(dmp, (struct bn_vlist *)&sp->s_vlist); + } else { + (void)dm_draw_vlist(dmp, (struct bn_vlist *)&sp->s_vlist); + } + } + if (params) { + dm_loadmatrix(dmp, save_mat, 0); + } +} + +/* Draw all display lists */ +static int +go_draw_dlist(struct ged_dm_view *gdvp) +{ + register struct display_list *gdlp; + register struct display_list *next_gdlp; + struct solid *sp; + int line_style = -1; + struct dm *dmp = gdvp->gdv_dmp; + struct bu_list *hdlp = gdvp->gdv_gop->go_gedp->ged_gdp->gd_headDisplay; + + if (dm_get_transparency(dmp)) { + /* First, draw opaque stuff */ + gdlp = BU_LIST_NEXT(display_list, hdlp); + while (BU_LIST_NOT_HEAD(gdlp, hdlp)) { + next_gdlp = BU_LIST_PNEXT(display_list, gdlp); + + FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) { + if (sp->s_transparency < 1.0) + continue; + + if (line_style != sp->s_soldash) { + line_style = sp->s_soldash; + (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), line_style); + } + + go_draw_solid(gdvp, sp); + } + + gdlp = next_gdlp; + } + + /* disable write to depth buffer */ + (void)dm_set_depth_mask(dmp, 0); + + /* Second, draw transparent stuff */ + gdlp = BU_LIST_NEXT(display_list, hdlp); + while (BU_LIST_NOT_HEAD(gdlp, hdlp)) { + next_gdlp = BU_LIST_PNEXT(display_list, gdlp); + + FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) { + /* already drawn above */ + if (ZERO(sp->s_transparency - 1.0)) + continue; + + if (line_style != sp->s_soldash) { + line_style = sp->s_soldash; + (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), line_style); + } + + go_draw_solid(gdvp, sp); + } + + gdlp = next_gdlp; + } + + /* re-enable write to depth buffer */ + (void)dm_set_depth_mask(dmp, 1); + } else { + gdlp = BU_LIST_NEXT(display_list, hdlp); + while (BU_LIST_NOT_HEAD(gdlp, hdlp)) { + next_gdlp = BU_LIST_PNEXT(display_list, gdlp); + + FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) { + if (line_style != sp->s_soldash) { + line_style = sp->s_soldash; + (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), line_style); + } + + go_draw_solid(gdvp, sp); + } + + gdlp = next_gdlp; + } + } + + return GED_OK; +} + +static void +go_draw(struct ged_dm_view *gdvp) +{ + (void)dm_loadmatrix(gdvp->gdv_dmp, gdvp->gdv_view->gv_model2view, 0); + + if (SMALL_FASTF < gdvp->gdv_view->gv_perspective) + (void)dm_loadpmatrix(gdvp->gdv_dmp, gdvp->gdv_view->gv_pmat); + else + (void)dm_loadpmatrix(gdvp->gdv_dmp, (fastf_t *)NULL); + + go_draw_dlist(gdvp); +} + + +#define GO_DM_DRAW_POLY(_dmp, _gdpsp, _i, _last_poly, _mode) { \ + size_t _j; \ + \ + /* set color */ \ + (void)dm_set_fg((_dmp), \ + (_gdpsp)->gdps_polygons.polygon[_i].gp_color[0], \ + (_gdpsp)->gdps_polygons.polygon[_i].gp_color[1], \ + (_gdpsp)->gdps_polygons.polygon[_i].gp_color[2], \ + 1, 1.0); \ + \ + for (_j = 0; _j < (_gdpsp)->gdps_polygons.polygon[_i].num_contours; ++_j) { \ + size_t _last = (_gdpsp)->gdps_polygons.polygon[_i].contour[_j].num_points-1; \ + int _line_style; \ + \ + /* always draw holes using segmented lines */ \ + if ((_gdpsp)->gdps_polygons.polygon[_i].hole[_j]) { \ + _line_style = 1; \ + } else { \ + _line_style = (_gdpsp)->gdps_polygons.polygon[_i].gp_line_style; \ + } \ + \ + /* set the linewidth and linestyle for polygon i, contour j */ \ + (void)dm_set_line_attr((_dmp), \ + (_gdpsp)->gdps_polygons.polygon[_i].gp_line_width, \ + _line_style); \ + \ + (void)dm_draw_lines_3d((_dmp), \ + (_gdpsp)->gdps_polygons.polygon[_i].contour[_j].num_points, \ + (_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point, 1); \ + \ + if (_mode != TCLCAD_POLY_CONTOUR_MODE || _i != _last_poly || (_gdpsp)->gdps_cflag == 0) { \ + (void)dm_draw_line_3d((_dmp), \ + (_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point[_last], \ + (_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point[0]); \ + } \ + }} + + +static void +go_dm_draw_polys(struct dm *dmp, bview_data_polygon_state *gdpsp, int mode) +{ + register size_t i, last_poly; + int saveLineWidth; + int saveLineStyle; + + if (gdpsp->gdps_polygons.num_polygons < 1) + return; + + saveLineWidth = dm_get_linewidth(dmp); + saveLineStyle = dm_get_linestyle(dmp); + + last_poly = gdpsp->gdps_polygons.num_polygons - 1; + for (i = 0; i < gdpsp->gdps_polygons.num_polygons; ++i) { + if (i == gdpsp->gdps_target_polygon_i) + continue; + + GO_DM_DRAW_POLY(dmp, gdpsp, i, last_poly, mode); + } + + /* draw the target poly last */ + GO_DM_DRAW_POLY(dmp, gdpsp, gdpsp->gdps_target_polygon_i, last_poly, mode); + + /* Restore the line attributes */ + (void)dm_set_line_attr(dmp, saveLineWidth, saveLineStyle); +} + +static void +go_dm_draw_lines(struct dm *dmp, struct bview_data_line_state *gdlsp) +{ + int saveLineWidth; + int saveLineStyle; + + if (gdlsp->gdls_num_points < 1) + return; + + saveLineWidth = dm_get_linewidth(dmp); + saveLineStyle = dm_get_linestyle(dmp); + + /* set color */ + (void)dm_set_fg(dmp, + gdlsp->gdls_color[0], + gdlsp->gdls_color[1], + gdlsp->gdls_color[2], 1, 1.0); + + /* set linewidth */ + (void)dm_set_line_attr(dmp, gdlsp->gdls_line_width, 0); /* solid lines */ + + (void)dm_draw_lines_3d(dmp, + gdlsp->gdls_num_points, + gdlsp->gdls_points, 0); + + /* Restore the line attributes */ + (void)dm_set_line_attr(dmp, saveLineWidth, saveLineStyle); +} + +static void +go_dm_draw_labels(struct dm *dmp, struct bview_data_label_state *gdlsp, matp_t m2vmat) +{ + register int i; + + /* set color */ + (void)dm_set_fg(dmp, + gdlsp->gdls_color[0], + gdlsp->gdls_color[1], + gdlsp->gdls_color[2], 1, 1.0); + + for (i = 0; i < gdlsp->gdls_num_labels; ++i) { + point_t vpoint; + + MAT4X3PNT(vpoint, m2vmat, + gdlsp->gdls_points[i]); + (void)dm_draw_string_2d(dmp, gdlsp->gdls_labels[i], + vpoint[X], vpoint[Y], 0, 1); + } +} + +static void +go_dm_draw_arrows(struct dm *dmp, struct bview_data_arrow_state *gdasp, fastf_t sf) +{ + register int i; + int saveLineWidth; + int saveLineStyle; + + if (gdasp->gdas_num_points < 1) + return; + + saveLineWidth = dm_get_linewidth(dmp); + saveLineStyle = dm_get_linestyle(dmp); + + /* set color */ + (void)dm_set_fg(dmp, + gdasp->gdas_color[0], + gdasp->gdas_color[1], + gdasp->gdas_color[2], 1, 1.0); + + /* set linewidth */ + (void)dm_set_line_attr(dmp, gdasp->gdas_line_width, 0); /* solid lines */ + + (void)dm_draw_lines_3d(dmp, + gdasp->gdas_num_points, + gdasp->gdas_points, 0); + + for (i = 0; i < gdasp->gdas_num_points; i += 2) { + point_t points[16]; + point_t A, B; + point_t BmA; + point_t offset; + point_t perp1, perp2; + point_t a_base; + point_t a_pt1, a_pt2, a_pt3, a_pt4; + + VMOVE(A, gdasp->gdas_points[i]); + VMOVE(B, gdasp->gdas_points[i+1]); + VSUB2(BmA, B, A); + + VUNITIZE(BmA); + VSCALE(offset, BmA, -gdasp->gdas_tip_length * sf); + + bn_vec_perp(perp1, BmA); + VUNITIZE(perp1); + + VCROSS(perp2, BmA, perp1); + VUNITIZE(perp2); + + VSCALE(perp1, perp1, gdasp->gdas_tip_width * sf); + VSCALE(perp2, perp2, gdasp->gdas_tip_width * sf); + + VADD2(a_base, B, offset); + VADD2(a_pt1, a_base, perp1); + VADD2(a_pt2, a_base, perp2); + VSUB2(a_pt3, a_base, perp1); + VSUB2(a_pt4, a_base, perp2); + + VMOVE(points[0], B); + VMOVE(points[1], a_pt1); + VMOVE(points[2], B); + VMOVE(points[3], a_pt2); + VMOVE(points[4], B); + VMOVE(points[5], a_pt3); + VMOVE(points[6], B); + VMOVE(points[7], a_pt4); + VMOVE(points[8], a_pt1); + VMOVE(points[9], a_pt2); + VMOVE(points[10], a_pt2); + VMOVE(points[11], a_pt3); + VMOVE(points[12], a_pt3); + VMOVE(points[13], a_pt4); + VMOVE(points[14], a_pt4); + VMOVE(points[15], a_pt1); + + (void)dm_draw_lines_3d(dmp, 16, points, 0); + } + + /* Restore the line attributes */ + (void)dm_set_line_attr(dmp, saveLineWidth, saveLineStyle); +} + + +static void +go_draw_other(struct ged_obj *gop, struct ged_dm_view *gdvp) +{ + int width = dm_get_width(gdvp->gdv_dmp); + fastf_t sf = (fastf_t)(gdvp->gdv_view->gv_size) / (fastf_t)width; + + if (gdvp->gdv_view->gv_data_arrows.gdas_draw) + go_dm_draw_arrows(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_arrows, sf); + + if (gdvp->gdv_view->gv_sdata_arrows.gdas_draw) + go_dm_draw_arrows(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_arrows, sf); + + if (gdvp->gdv_view->gv_data_axes.draw) + dm_draw_data_axes(gdvp->gdv_dmp, + sf, + &gdvp->gdv_view->gv_data_axes); + + if (gdvp->gdv_view->gv_sdata_axes.draw) + dm_draw_data_axes(gdvp->gdv_dmp, + sf, + &gdvp->gdv_view->gv_sdata_axes); + + if (gdvp->gdv_view->gv_data_lines.gdls_draw) + go_dm_draw_lines(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_lines); + + if (gdvp->gdv_view->gv_sdata_lines.gdls_draw) + go_dm_draw_lines(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_lines); + + if (gdvp->gdv_view->gv_data_polygons.gdps_draw) + go_dm_draw_polys(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_polygons, gdvp->gdv_view->gv_mode); + + if (gdvp->gdv_view->gv_sdata_polygons.gdps_draw) + go_dm_draw_polys(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_polygons, gdvp->gdv_view->gv_mode); + + /* Restore to non-rotated, full brightness */ + (void)dm_normal(gdvp->gdv_dmp); + go_draw_faceplate(gop, gdvp); + + if (gdvp->gdv_view->gv_data_labels.gdls_draw) + go_dm_draw_labels(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_labels, gdvp->gdv_view->gv_model2view); + + if (gdvp->gdv_view->gv_sdata_labels.gdls_draw) + go_dm_draw_labels(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_labels, gdvp->gdv_view->gv_model2view); + + /* Draw labels */ + if (gdvp->gdv_view->gv_prim_labels.gos_draw) { + register int i; + + for (i = 0; i < gop->go_prim_label_list_size; ++i) { + dm_draw_labels(gdvp->gdv_dmp, + gop->go_gedp->ged_wdbp, + bu_vls_addr(&gop->go_prim_label_list[i]), + gdvp->gdv_view->gv_model2view, + gdvp->gdv_view->gv_prim_labels.gos_text_color, + NULL, NULL); + } + } +} + +void +go_refresh_draw(struct ged_obj *gop, struct ged_dm_view *gdvp, int restore_zbuffer) +{ + if (gdvp->gdv_fbs.fbs_mode == TCLCAD_OBJ_FB_MODE_OVERLAY) { + if (gdvp->gdv_view->gv_rect.draw) { + go_draw(gdvp); + + go_draw_other(gop, gdvp); + + /* disable write to depth buffer */ + (void)dm_set_depth_mask(gdvp->gdv_dmp, 0); + + fb_refresh(gdvp->gdv_fbs.fbs_fbp, + gdvp->gdv_view->gv_rect.pos[X], gdvp->gdv_view->gv_rect.pos[Y], + gdvp->gdv_view->gv_rect.dim[X], gdvp->gdv_view->gv_rect.dim[Y]); + + /* enable write to depth buffer */ + (void)dm_set_depth_mask(gdvp->gdv_dmp, 1); + + if (gdvp->gdv_view->gv_rect.line_width) + dm_draw_rect(gdvp->gdv_dmp, &gdvp->gdv_view->gv_rect); + } else { + /* disable write to depth buffer */ + (void)dm_set_depth_mask(gdvp->gdv_dmp, 0); + + fb_refresh(gdvp->gdv_fbs.fbs_fbp, 0, 0, + dm_get_width(gdvp->gdv_dmp), dm_get_height(gdvp->gdv_dmp)); + + /* enable write to depth buffer */ + (void)dm_set_depth_mask(gdvp->gdv_dmp, 1); + } + + if (restore_zbuffer) { + (void)dm_set_zbuffer(gdvp->gdv_dmp, 1); + } + + return; + } else if (gdvp->gdv_fbs.fbs_mode == TCLCAD_OBJ_FB_MODE_INTERLAY) { + go_draw(gdvp); + + /* disable write to depth buffer */ + (void)dm_set_depth_mask(gdvp->gdv_dmp, 0); + + if (gdvp->gdv_view->gv_rect.draw) { + fb_refresh(gdvp->gdv_fbs.fbs_fbp, + gdvp->gdv_view->gv_rect.pos[X], gdvp->gdv_view->gv_rect.pos[Y], + gdvp->gdv_view->gv_rect.dim[X], gdvp->gdv_view->gv_rect.dim[Y]); + } else + fb_refresh(gdvp->gdv_fbs.fbs_fbp, 0, 0, + dm_get_width(gdvp->gdv_dmp), dm_get_height(gdvp->gdv_dmp)); + + /* enable write to depth buffer */ + (void)dm_set_depth_mask(gdvp->gdv_dmp, 1); + + if (restore_zbuffer) { + (void)dm_set_zbuffer(gdvp->gdv_dmp, 1); + } + } else { + if (gdvp->gdv_fbs.fbs_mode == TCLCAD_OBJ_FB_MODE_UNDERLAY) { + /* disable write to depth buffer */ + (void)dm_set_depth_mask(gdvp->gdv_dmp, 0); + + if (gdvp->gdv_view->gv_rect.draw) { + fb_refresh(gdvp->gdv_fbs.fbs_fbp, + gdvp->gdv_view->gv_rect.pos[X], gdvp->gdv_view->gv_rect.pos[Y], + gdvp->gdv_view->gv_rect.dim[X], gdvp->gdv_view->gv_rect.dim[Y]); + } else + fb_refresh(gdvp->gdv_fbs.fbs_fbp, 0, 0, + dm_get_width(gdvp->gdv_dmp), dm_get_height(gdvp->gdv_dmp)); + + /* enable write to depth buffer */ + (void)dm_set_depth_mask(gdvp->gdv_dmp, 1); + } + + if (restore_zbuffer) { + (void)dm_set_zbuffer(gdvp->gdv_dmp, 1); + } + + go_draw(gdvp); + } + + go_draw_other(gop, gdvp); +} + +void +go_refresh(struct ged_obj *gop, struct ged_dm_view *gdvp) +{ + int restore_zbuffer = 0; + + /* Turn off the zbuffer if the framebuffer is active AND the zbuffer is on. */ + if (gdvp->gdv_fbs.fbs_mode != TCLCAD_OBJ_FB_MODE_OFF && dm_get_zbuffer(gdvp->gdv_dmp)) { + (void)dm_set_zbuffer(gdvp->gdv_dmp, 0); + restore_zbuffer = 1; + } + + (void)dm_draw_begin(gdvp->gdv_dmp); + go_refresh_draw(gop, gdvp, restore_zbuffer); + (void)dm_draw_end(gdvp->gdv_dmp); +} + +void +to_refresh_view(struct ged_dm_view *gdvp) +{ + if (current_top == NULL || !current_top->to_gop->go_refresh_on) + return; + + if (to_is_viewable(gdvp)) + go_refresh(current_top->to_gop, gdvp); +} + +void +to_refresh_all_views(struct tclcad_obj *top) +{ + struct ged_dm_view *gdvp; + + for (BU_LIST_FOR(gdvp, ged_dm_view, &top->to_gop->go_head_views.l)) { + to_refresh_view(gdvp); + } +} + +void +to_autoview_view(struct ged_dm_view *gdvp, const char *scale) +{ + int ret; + const char *av[3]; + + gdvp->gdv_gop->go_gedp->ged_gvp = gdvp->gdv_view; + av[0] = "autoview"; + av[1] = scale; + av[2] = NULL; + + if (scale) + ret = ged_autoview(gdvp->gdv_gop->go_gedp, 2, (const char **)av); + else + ret = ged_autoview(gdvp->gdv_gop->go_gedp, 1, (const char **)av); + + if (ret == GED_OK) { + if (0 < bu_vls_strlen(&gdvp->gdv_callback)) { + Tcl_Eval(current_top->to_interp, bu_vls_addr(&gdvp->gdv_callback)); + } + + to_refresh_view(gdvp); + } +} + +void +to_autoview_all_views(struct tclcad_obj *top) +{ + struct ged_dm_view *gdvp; + + for (BU_LIST_FOR(gdvp, ged_dm_view, &top->to_gop->go_head_views.l)) { + to_autoview_view(gdvp, NULL); + } +} + +/* + * Local Variables: + * mode: C + * tab-width: 8 + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libtclcad/tclcad_views.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property 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