void plotPartition(struct hit *ihitp, struct hit *ohitp) { if (plotfp == NULL) return; bu_semaphore_acquire(BU_SEM_SYSCALL); pl_3line(plotfp, (int) ihitp->hit_point[X], (int) ihitp->hit_point[Y], (int) ihitp->hit_point[Z], (int) ohitp->hit_point[X], (int) ohitp->hit_point[Y], (int) ohitp->hit_point[Z] ); bu_semaphore_release(BU_SEM_SYSCALL); return; }
void plotRayLine(struct xray *rayp) { int endpoint[3]; if (plotfp == NULL) return; VJOIN1(endpoint, rayp->r_pt, cellsz, rayp->r_dir); bu_semaphore_acquire(BU_SEM_SYSCALL); pl_color(plotfp, R_BURST, G_BURST, B_BURST); /* draw line */ pl_3line(plotfp, (int) rayp->r_pt[X], (int) rayp->r_pt[Y], (int) rayp->r_pt[Z], endpoint[X], endpoint[Y], endpoint[Z] ); bu_semaphore_release(BU_SEM_SYSCALL); return; }
/** * P L O T _ O B J E C T * * Set up for an object, transformed as indicated, and with an * object center as specified. The ratio of object to screen size * is passed in as a convenience. * * Returns 0 if object could be drawn, !0 if object was omitted. */ HIDDEN int plot_drawVList(struct dm *dmp, struct bn_vlist *vp) { static vect_t last; struct bn_vlist *tvp; point_t *pt_prev=NULL; fastf_t dist_prev=1.0; fastf_t dist; fastf_t delta; int useful = 0; if (((struct plot_vars *)dmp->dm_vars.priv_vars)->floating) { rt_vlist_to_uplot(((struct plot_vars *)dmp->dm_vars.priv_vars)->up_fp, &vp->l); return TCL_OK; } /* delta is used in clipping to insure clipped endpoint is * slightly in front of eye plane (perspective mode only). This * value is a SWAG that seems to work OK. */ delta = plotmat[15]*0.0001; if (delta < 0.0) delta = -delta; if (delta < SQRT_SMALL_FASTF) delta = SQRT_SMALL_FASTF; for (BU_LIST_FOR(tvp, bn_vlist, &vp->l)) { int i; int nused = tvp->nused; int *cmd = tvp->cmd; point_t *pt = tvp->pt; for (i = 0; i < nused; i++, cmd++, pt++) { static vect_t start, fin; switch (*cmd) { case BN_VLIST_POLY_START: case BN_VLIST_POLY_VERTNORM: case BN_VLIST_TRI_START: case BN_VLIST_TRI_VERTNORM: continue; case BN_VLIST_POLY_MOVE: case BN_VLIST_LINE_MOVE: case BN_VLIST_TRI_MOVE: /* Move, not draw */ if (dmp->dm_perspective > 0) { /* cannot apply perspective transformation to * points behind eye plane!!!! */ dist = VDOT(*pt, &plotmat[12]) + plotmat[15]; if (dist <= 0.0) { pt_prev = pt; dist_prev = dist; continue; } else { MAT4X3PNT(last, plotmat, *pt); dist_prev = dist; pt_prev = pt; } } else MAT4X3PNT(last, plotmat, *pt); continue; case BN_VLIST_POLY_DRAW: case BN_VLIST_POLY_END: case BN_VLIST_LINE_DRAW: case BN_VLIST_TRI_DRAW: case BN_VLIST_TRI_END: /* draw */ if (dmp->dm_perspective > 0) { /* cannot apply perspective transformation to * points behind eye plane!!!! */ dist = VDOT(*pt, &plotmat[12]) + plotmat[15]; if (dist <= 0.0) { if (dist_prev <= 0.0) { /* nothing to plot */ dist_prev = dist; pt_prev = pt; continue; } else { if (pt_prev) { fastf_t alpha; vect_t diff; point_t tmp_pt; /* clip this end */ VSUB2(diff, *pt, *pt_prev); alpha = (dist_prev - delta) / (dist_prev - dist); VJOIN1(tmp_pt, *pt_prev, alpha, diff); MAT4X3PNT(fin, plotmat, tmp_pt); } } } else { if (dist_prev <= 0.0) { if (pt_prev) { fastf_t alpha; vect_t diff; point_t tmp_pt; /* clip other end */ VSUB2(diff, *pt, *pt_prev); alpha = (-dist_prev + delta) / (dist - dist_prev); VJOIN1(tmp_pt, *pt_prev, alpha, diff); MAT4X3PNT(last, plotmat, tmp_pt); MAT4X3PNT(fin, plotmat, *pt); } } else { MAT4X3PNT(fin, plotmat, *pt); } } } else MAT4X3PNT(fin, plotmat, *pt); VMOVE(start, last); VMOVE(last, fin); break; } if (vclip(start, fin, dmp->dm_clipmin, dmp->dm_clipmax) == 0) continue; if (((struct plot_vars *)dmp->dm_vars.priv_vars)->is_3D) pl_3line(((struct plot_vars *)dmp->dm_vars.priv_vars)->up_fp, (int)(start[X] * 2047), (int)(start[Y] * 2047), (int)(start[Z] * 2047), (int)(fin[X] * 2047), (int)(fin[Y] * 2047), (int)(fin[Z] * 2047)); else pl_line(((struct plot_vars *)dmp->dm_vars.priv_vars)->up_fp, (int)(start[X] * 2047), (int)(start[Y] * 2047), (int)(fin[X] * 2047), (int)(fin[Y] * 2047)); useful = 1; } } if (useful) return TCL_OK; return TCL_ERROR; }