int rt_obj_shot(struct soltab *stp, struct xray *rp, struct application *ap, struct seg *seghead) { int id; const struct rt_functab *ft; if (!stp || !rp) return -1; RT_CK_SOLTAB(stp); RT_CK_RAY(rp); if (ap) RT_CK_APPLICATION(ap); id = stp->st_id; if (id < 0) return -2; ft = &OBJ[id]; if (!ft) return -3; if (!ft->ft_shot) return -4; return ft->ft_shot(stp, rp, ap, seghead); }
/** * Intersect a ray with a xxx. If an intersection occurs, a struct * seg will be acquired and filled in. * * Returns - * 0 MISS * >0 HIT */ int rt_xxx_shot(struct soltab *stp, struct xray *rp, struct application *ap, struct seg *seghead) { struct xxx_specific *xxx; if (!stp) return -1; RT_CK_SOLTAB(stp); xxx = (struct xxx_specific *)stp->st_specific; if (!xxx) return -1; if (rp) RT_CK_RAY(rp); if (ap) RT_CK_APPLICATION(ap); if (!seghead) return -1; /* the EXAMPLE_NEW_SEGMENT block shows how one might add a new result * if the ray did hit the primitive. the segment values would need to * be adjusted accordingly to match real values instead of -1. */ #ifdef EXAMPLE_NEW_SEGMENT /* allocate a segment */ RT_GET_SEG(segp, ap->a_resource); segp->seg_stp = stp; /* stash a pointer to the primitive */ segp->seg_in.hit_dist = -1; /* XXX set to real distance to entry point */ segp->seg_out.hit_dist = -1; /* XXX set to real distance to exit point */ segp->seg_in.hit_surfno = -1; /* XXX set to a non-negative ID for entry surface */ segp->seg_out.hit_surfno = -1; /* XXX set to a non-negative ID for exit surface */ /* add segment to list of those encountered for this primitive */ BU_LIST_INSERT(&(seghead->l), &(segp->l)); return 2; /* num surface intersections == in + out == 2 */ #endif return 0; /* MISS */ }
/** * Given ONE ray distance, return the normal and entry/exit point. */ void rt_metaball_norm(register struct hit *hitp, struct soltab *stp, register struct xray *rp) { if (rp) RT_CK_RAY(rp); /* unused. */ rt_metaball_norm_internal(&(hitp->hit_normal), &(hitp->hit_point), (struct rt_metaball_internal *)(stp->st_specific)); return; }
int rt_obj_norm(struct hit *hitp, struct soltab *stp, struct xray *rp) { int id; const struct rt_functab *ft; if (!hitp || !stp) return -1; RT_CK_SOLTAB(stp); RT_CK_HIT(hitp); if (rp) RT_CK_RAY(rp); id = stp->st_id; if (id < 0) return -2; ft = &OBJ[id]; if (!ft) return -3; if (!ft->ft_norm) return -4; ft->ft_norm(hitp, stp, rp); return 0; }
/** * R T _ P G _ N O R M */ void rt_pg_norm(struct hit *hitp, struct soltab *stp, struct xray *rp) { if (!hitp || !stp || !rp) return; RT_CK_HIT(hitp); RT_CK_SOLTAB(stp); RT_CK_RAY(rp); /* Normals computed in rt_pg_shot, nothing to do here */ }