int ged_find_botpt_nearest_pt(struct ged *gedp, int argc, const char *argv[]) { static const char *usage = "bot view_xyz"; struct rt_db_internal intern; struct rt_bot_internal *botip; mat_t mat; int nearest_pt; vect_t view; /* must be double for scanf */ double scan[ELEMENTS_PER_VECT]; GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); GED_CHECK_VIEW(gedp, GED_ERROR); GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR); /* initialize result */ bu_vls_trunc(gedp->ged_result_str, 0); /* must be wanting help */ if (argc == 1) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_HELP; } if (argc != 3) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_ERROR; } if (bu_sscanf(argv[2], "%lf %lf %lf", &scan[X], &scan[Y], &scan[Z]) != 3) { bu_vls_printf(gedp->ged_result_str, "%s: bad view location - %s", argv[0], argv[2]); return GED_ERROR; } if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) == GED_ERROR) { bu_vls_printf(gedp->ged_result_str, "%s: failed to find %s", argv[0], argv[1]); return GED_ERROR; } if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD || intern.idb_minor_type != DB5_MINORTYPE_BRLCAD_BOT) { bu_vls_printf(gedp->ged_result_str, "Object is not a BOT"); rt_db_free_internal(&intern); return GED_ERROR; } botip = (struct rt_bot_internal *)intern.idb_ptr; VMOVE(view, scan); /* convert double to fastf_t */ nearest_pt = rt_bot_find_v_nearest_pt2(botip, view, gedp->ged_gvp->gv_model2view); bu_vls_printf(gedp->ged_result_str, "%d", nearest_pt); rt_db_free_internal(&intern); return GED_OK; }
int render_flos_init(render_t *render, const char *frag_pos) { struct render_flos_s *d; double scan[3]; if (frag_pos == NULL) return -1; render->work = render_flos_work; render->free = render_flos_free; BU_ALLOC(render->data, struct render_flos_s); d = (struct render_flos_s *)render->data; bu_sscanf(frag_pos, "#(%lf %lf %lf)", &scan[0], &scan[1], &scan[2]); /* convert from double to fastf_t */ VMOVE(d->frag_pos, scan); return 0; }
int render_spall_init(render_t *render, const char *buf) { struct render_spall_s *d; vect_t *tri_list, *vec_list, normal, up; fastf_t plane[4], angle; int i; /* intentionally double for scan */ double ray_pos[3], ray_dir[3]; double scan; if (buf == NULL) return -1; render->work = render_spall_work; render->free = render_spall_free; bu_sscanf(buf, "(%lg %lg %lg) (%lg %lg %lg) %lg", &ray_pos[0], &ray_pos[1], &ray_pos[2], &ray_dir[0], &ray_dir[1], &ray_dir[2], &scan); angle = scan; /* double to fastf_t */ BU_ALLOC(render->data, struct render_spall_s); d = (struct render_spall_s *)render->data; VMOVE(d->ray_pos, ray_pos); VMOVE(d->ray_dir, ray_dir); tie_init(&d->tie, TESSELLATION, TIE_KDTREE_FAST); /* Calculate the normal to be used for the plane */ up[0] = 0; up[1] = 0; up[2] = 1; VCROSS(normal, ray_dir, up); VUNITIZE(normal); /* Construct the plane */ d->plane[0] = normal[0]; d->plane[1] = normal[1]; d->plane[2] = normal[2]; plane[3] = VDOT(normal, ray_pos); /* up is really new ray_pos */ d->plane[3] = -plane[3]; /******************/ /* The spall Cone */ /******************/ vec_list = (vect_t *)bu_malloc(sizeof(vect_t) * TESSELLATION, "vec_list"); tri_list = (vect_t *)bu_malloc(sizeof(vect_t) * TESSELLATION * 3, "tri_list"); render_util_spall_vec(d->ray_dir, angle, TESSELLATION, vec_list); /* triangles to approximate */ for (i = 0; i < TESSELLATION; i++) { VMOVE(tri_list[3*i+0], ray_pos); VSCALE(tri_list[3*i+1], vec_list[i], SPALL_LEN); VADD2(tri_list[3*i+1], tri_list[3*i+1], ray_pos); if (i == TESSELLATION - 1) { VSCALE(tri_list[3*i+2], vec_list[0], SPALL_LEN); VADD2(tri_list[3*i+2], tri_list[3*i+2], ray_pos); } else { VSCALE(tri_list[3*i+2], vec_list[i+1], SPALL_LEN); VADD2(tri_list[3*i+2], tri_list[3*i+2], ray_pos); } } /* tie_push(&d->tie, tri_list, TESSELLATION, NULL, 0); */ tie_prep(&d->tie); bu_free(vec_list, "vec_list"); bu_free(tri_list, "tri_list"); return 0; }
int get_args(int argc, char **argv) { int c, d; output_mode = CASCADE_A; cmd_fcen = cmd_fypr = cmd_rcen = cmd_rypr = cmd_acen = cmd_aypr = 0; print_time = 1; while ((c=bu_getopt(argc, argv, OPT_STR)) != -1) { switch (c) { case 'f': d = *(bu_optarg); if (d == 'c') { bu_sscanf(argv[bu_optind], "%lf", fcenter+0); bu_sscanf(argv[bu_optind+1], "%lf", fcenter+1); bu_sscanf(argv[bu_optind+2], "%lf", fcenter+2); bu_optind += 3; cmd_fcen = 1; break; } else if (d =='y') { bu_sscanf(argv[bu_optind], "%lf", fypr+0); bu_sscanf(argv[bu_optind+1], "%lf", fypr+1); bu_sscanf(argv[bu_optind+2], "%lf", fypr+2); bu_optind += 3; cmd_fypr = 1; break; } else { fprintf(stderr, "anim_cascade: unknown option -f%c\n", d); } break; case 'r': d = *(bu_optarg); if (d == 'c') { bu_sscanf(argv[bu_optind], "%lf", rcenter+0); bu_sscanf(argv[bu_optind+1], "%lf", rcenter+1); bu_sscanf(argv[bu_optind+2], "%lf", rcenter+2); bu_optind += 3; cmd_rcen = 1; break; } else if (d =='y') { bu_sscanf(argv[bu_optind], "%lf", rypr+0); bu_sscanf(argv[bu_optind+1], "%lf", rypr+1); bu_sscanf(argv[bu_optind+2], "%lf", rypr+2); bu_optind += 3; cmd_rypr = 1; break; } else { fprintf(stderr, "anim_cascade: unknown option -r%c\n", d); } break; case 'a': d = *(bu_optarg); if (d == 'c') { bu_sscanf(argv[bu_optind], "%lf", acenter+0); bu_sscanf(argv[bu_optind+1], "%lf", acenter+1); bu_sscanf(argv[bu_optind+2], "%lf", acenter+2); bu_optind += 3; cmd_acen = 1; break; } else if (d =='y') { bu_sscanf(argv[bu_optind], "%lf", aypr+0); bu_sscanf(argv[bu_optind+1], "%lf", aypr+1); bu_sscanf(argv[bu_optind+2], "%lf", aypr+2); bu_optind += 3; cmd_aypr = 1; break; } else { fprintf(stderr, "anim_cascade: unknown option -a%c\n", d); } break; case 'o': d = *(bu_optarg); if (d == 'r') { output_mode = CASCADE_R; } else if (d == 'f') { output_mode = CASCADE_F; } else if (d == 'a') { /* default */ output_mode = CASCADE_A; } else { fprintf(stderr, "anim_cascade: unknown option -i%c\n", d); } break; case 's': print_time = 0; break; default: return 0; } } return 1; }
int ged_move_botpts(struct ged *gedp, int argc, const char *argv[]) { static const char *usage = "bot vec vertex_1 [vertex_2 ... vertex_n]"; struct directory *dp; struct rt_db_internal intern; struct rt_bot_internal *botip; mat_t mat; register int i; size_t vertex_i; char *last; /* must be double for scanf */ double vec[ELEMENTS_PER_VECT]; GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR); /* initialize result */ bu_vls_trunc(gedp->ged_result_str, 0); /* must be wanting help */ if (argc == 1) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_HELP; } if (argc < 4) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_ERROR; } if ((last = strrchr(argv[1], '/')) == NULL) last = (char *)argv[1]; else ++last; if (last[0] == '\0') { bu_vls_printf(gedp->ged_result_str, "%s: illegal input - %s", argv[0], argv[1]); return GED_ERROR; } dp = db_lookup(gedp->ged_wdbp->dbip, last, LOOKUP_QUIET); if (dp == RT_DIR_NULL) { bu_vls_printf(gedp->ged_result_str, "%s: failed to find %s", argv[0], argv[1]); return GED_ERROR; } if (bu_sscanf(argv[2], "%lf %lf %lf", &vec[X], &vec[Y], &vec[Z]) != 3) { bu_vls_printf(gedp->ged_result_str, "%s: bad vector - %s", argv[0], argv[2]); return GED_ERROR; } VSCALE(vec, vec, gedp->ged_wdbp->dbip->dbi_local2base); if (wdb_import_from_path2(gedp->ged_result_str, &intern, argv[1], gedp->ged_wdbp, mat) == GED_ERROR) { bu_vls_printf(gedp->ged_result_str, "%s: failed to find %s", argv[0], argv[1]); return GED_ERROR; } if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD || intern.idb_minor_type != DB5_MINORTYPE_BRLCAD_BOT) { bu_vls_printf(gedp->ged_result_str, "Object is not a BOT"); rt_db_free_internal(&intern); return GED_ERROR; } botip = (struct rt_bot_internal *)intern.idb_ptr; for (i = 3; i < argc; ++i) { if (bu_sscanf(argv[i], "%zu", &vertex_i) != 1) { bu_vls_printf(gedp->ged_result_str, "%s: bad bot vertex index - %s\n", argv[0], argv[i]); continue; } if (vertex_i >= botip->num_vertices) { bu_vls_printf(gedp->ged_result_str, "%s: bad bot vertex index - %s\n", argv[0], argv[i]); continue; } VADD2(&botip->vertices[vertex_i*3], vec, &botip->vertices[vertex_i*3]); } { mat_t invmat; point_t curr_pt; size_t idx; bn_mat_inv(invmat, mat); for (idx = 0; idx < botip->num_vertices; idx++) { MAT4X3PNT(curr_pt, invmat, &botip->vertices[idx*3]); VMOVE(&botip->vertices[idx*3], curr_pt); } } GED_DB_PUT_INTERNAL(gedp, dp, &intern, &rt_uniresource, GED_ERROR); rt_db_free_internal(&intern); return GED_OK; }
int ged_bot_edge_split(struct ged *gedp, int argc, const char *argv[]) { static const char *usage = "bot edge"; struct directory *dp; struct rt_db_internal intern; struct rt_bot_internal *botip; mat_t mat; char *last; size_t v1_i; size_t v2_i; size_t last_fi; size_t last_vi; size_t save_vi; size_t i; point_t new_pt; GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR); /* initialize result */ bu_vls_trunc(gedp->ged_result_str, 0); /* must be wanting help */ if (argc == 1) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_HELP; } if (argc != 3) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_ERROR; } if ((last = strrchr(argv[1], '/')) == NULL) last = (char *)argv[1]; else ++last; if (last[0] == '\0') { bu_vls_printf(gedp->ged_result_str, "%s: illegal input - %s", argv[0], argv[1]); return GED_ERROR; } dp = db_lookup(gedp->ged_wdbp->dbip, last, LOOKUP_QUIET); if (dp == RT_DIR_NULL) { bu_vls_printf(gedp->ged_result_str, "%s: failed to find %s", argv[0], argv[1]); return GED_ERROR; } if (bu_sscanf(argv[2], "%zu %zu", &v1_i, &v2_i) != 2) { bu_vls_printf(gedp->ged_result_str, "%s: bad bot edge - %s", argv[0], argv[2]); return GED_ERROR; } if (wdb_import_from_path2(gedp->ged_result_str, &intern, last, gedp->ged_wdbp, mat) == GED_ERROR) { bu_vls_printf(gedp->ged_result_str, "%s: failed to find %s", argv[0], argv[1]); return GED_ERROR; } if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD || intern.idb_minor_type != DB5_MINORTYPE_BRLCAD_BOT) { bu_vls_printf(gedp->ged_result_str, "Object is not a BOT"); rt_db_free_internal(&intern); return GED_ERROR; } botip = (struct rt_bot_internal *)intern.idb_ptr; last_fi = botip->num_faces; last_vi = botip->num_vertices; if (v1_i >= botip->num_vertices || v2_i >= botip->num_vertices) { bu_vls_printf(gedp->ged_result_str, "%s: bad bot edge - %s", argv[0], argv[2]); rt_db_free_internal(&intern); return GED_ERROR; } /* * Create the new point, modify all faces (should only be two) * that share the specified edge and hook in the two extra faces. */ /* First, create some space */ botip->num_vertices++; botip->num_faces += 2; botip->vertices = (fastf_t *)bu_realloc((void *)botip->vertices, botip->num_vertices*3*sizeof(fastf_t), "realloc bot vertices"); botip->faces = (int *)bu_realloc((void *)botip->faces, botip->num_faces*3*sizeof(int), "realloc bot faces"); /* Create the new point. We're using the average of the edge's points */ VADD2(new_pt, &botip->vertices[v1_i*3], &botip->vertices[v2_i*3]); VSCALE(new_pt, new_pt, 0.5); /* Add the new point to the last position in the list of vertices. */ VMOVE(&botip->vertices[last_vi*3], new_pt); /* Update faces associated with the specified edge */ for (i = 0; i < last_fi; ++i) { if (((size_t)botip->faces[i*3] == v1_i && (size_t)botip->faces[i*3+1] == v2_i) || ((size_t)botip->faces[i*3] == v2_i && (size_t)botip->faces[i*3+1] == v1_i)) { save_vi = botip->faces[i*3+1]; botip->faces[i*3+1] = last_vi; /* Initialize a new face */ botip->faces[last_fi*3] = last_vi; botip->faces[last_fi*3+1] = save_vi; botip->faces[last_fi*3+2] = botip->faces[i*3+2]; ++last_fi; } else if (((size_t)botip->faces[i*3] == v1_i && (size_t)botip->faces[i*3+2] == v2_i) || ((size_t)botip->faces[i*3] == v2_i && (size_t)botip->faces[i*3+2] == v1_i)) { save_vi = botip->faces[i*3]; botip->faces[i*3] = last_vi; /* Initialize a new face */ botip->faces[last_fi*3] = last_vi; botip->faces[last_fi*3+1] = save_vi; botip->faces[last_fi*3+2] = botip->faces[i*3+1]; ++last_fi; } else if (((size_t)botip->faces[i*3+1] == v1_i && (size_t)botip->faces[i*3+2] == v2_i) || ((size_t)botip->faces[i*3+1] == v2_i && (size_t)botip->faces[i*3+2] == v1_i)) { save_vi = botip->faces[i*3+2]; botip->faces[i*3+2] = last_vi; /* Initialize a new face */ botip->faces[last_fi*3] = botip->faces[i*3]; botip->faces[last_fi*3+1] = last_vi; botip->faces[last_fi*3+2] = save_vi; ++last_fi; } if (last_fi >= botip->num_faces) break; } GED_DB_PUT_INTERNAL(gedp, dp, &intern, &rt_uniresource, GED_ERROR); rt_db_free_internal(&intern); return GED_OK; }
int ged_bot_face_split(struct ged *gedp, int argc, const char *argv[]) { static const char *usage = "bot face"; struct directory *dp; static fastf_t sf = 1.0 / 3.0; struct rt_db_internal intern; struct rt_bot_internal *botip; mat_t mat; char *last; size_t face_i; size_t last_vi; size_t save_vi; point_t new_pt; GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR); GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR); /* initialize result */ bu_vls_trunc(gedp->ged_result_str, 0); /* must be wanting help */ if (argc == 1) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_HELP; } if (argc != 3) { bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); return GED_ERROR; } if ((last = strrchr(argv[1], '/')) == NULL) last = (char *)argv[1]; else ++last; if (last[0] == '\0') { bu_vls_printf(gedp->ged_result_str, "%s: illegal input - %s", argv[0], argv[1]); return GED_ERROR; } dp = db_lookup(gedp->ged_wdbp->dbip, last, LOOKUP_QUIET); if (dp == RT_DIR_NULL) { bu_vls_printf(gedp->ged_result_str, "%s: failed to find %s", argv[0], argv[1]); return GED_ERROR; } if (bu_sscanf(argv[2], "%zu", &face_i) != 1) { bu_vls_printf(gedp->ged_result_str, "%s: bad bot vertex index - %s", argv[0], argv[2]); return GED_ERROR; } if (wdb_import_from_path2(gedp->ged_result_str, &intern, last, gedp->ged_wdbp, mat) == GED_ERROR) { bu_vls_printf(gedp->ged_result_str, "%s: failed to find %s", argv[0], argv[1]); return GED_ERROR; } if (intern.idb_major_type != DB5_MAJORTYPE_BRLCAD || intern.idb_minor_type != DB5_MINORTYPE_BRLCAD_BOT) { bu_vls_printf(gedp->ged_result_str, "Object is not a BOT"); rt_db_free_internal(&intern); return GED_ERROR; } botip = (struct rt_bot_internal *)intern.idb_ptr; last_vi = botip->num_vertices; if (face_i >= botip->num_faces) { bu_vls_printf(gedp->ged_result_str, "%s: bad bot face index - %s", argv[0], argv[2]); rt_db_free_internal(&intern); return GED_ERROR; } /* Create the new point, modify face_i and hook in the two extra faces */ /* First, create some space */ botip->num_vertices++; botip->num_faces += 2; botip->vertices = (fastf_t *)bu_realloc((void *)botip->vertices, botip->num_vertices*3*sizeof(fastf_t), "realloc bot vertices"); botip->faces = (int *)bu_realloc((void *)botip->faces, botip->num_faces*3*sizeof(int), "realloc bot faces"); /* Create the new point. For the moment, we're using the average of the face_i's points */ VADD3(new_pt, &botip->vertices[botip->faces[face_i*3]*3], &botip->vertices[botip->faces[face_i*3+1]*3], &botip->vertices[botip->faces[face_i*3+2]*3]); VSCALE(new_pt, new_pt, sf); /* Add the new point to the last position in the list of vertices. */ VMOVE(&botip->vertices[last_vi*3], new_pt); /* Update face_i */ save_vi = botip->faces[face_i*3+2]; botip->faces[face_i*3+2] = last_vi; /* Initialize the two new faces */ botip->faces[(botip->num_faces-2)*3] = botip->faces[face_i*3+1]; botip->faces[(botip->num_faces-2)*3+1] = save_vi; botip->faces[(botip->num_faces-2)*3+2] = last_vi; botip->faces[(botip->num_faces-1)*3] = save_vi; botip->faces[(botip->num_faces-1)*3+1] = botip->faces[face_i*3]; botip->faces[(botip->num_faces-1)*3+2] = last_vi; bu_vls_printf(gedp->ged_result_str, "%zu", last_vi); GED_DB_PUT_INTERNAL(gedp, dp, &intern, &rt_uniresource, GED_ERROR); rt_db_free_internal(&intern); return GED_OK; }