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
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits