void cm_libdebug(char *buffer, com_table *ctp, struct rt_i *UNUSED(rtip)) { char *cp = buffer; /* This is really icky -- should have argc, argv interface */ while (*cp && isascii(*cp) && isspace((int)*cp)) cp++; if (*cp == '\0') { /* display current value */ bu_printb("libdebug ", RT_G_DEBUG, RT_DEBUG_FMT); bu_log("\n"); return; } /* Set a new value */ if (sscanf(cp, "%x", (unsigned int *)&RTG.debug) == 1) { bu_printb("libdebug ", RT_G_DEBUG, RT_DEBUG_FMT); bu_log("\n"); } else { com_usage(ctp); } }
int main(int argc, char *argv[]) { int opt; size_t i; const char *argv0 = argv[0]; struct rt_wdb *fd_out; struct bu_vls vls_in = BU_VLS_INIT_ZERO; struct bu_vls vls_out = BU_VLS_INIT_ZERO; int opt_debug = 0; int opt_verbose = 0; /* shapelib vars */ SHPHandle shapefile; size_t shp_num_invalid = 0; int shp_num_entities = 0; int shp_type = 0; /* intentionally double for scan */ double shp_min[4] = HINIT_ZERO; double shp_max[4] = HINIT_ZERO; /* geometry */ point2d_t *verts = NULL; size_t num_verts = 0; if (argc < 2) { usage(argv0); bu_exit(1, NULL); } while ((opt = bu_getopt(argc, argv, "dxv")) != -1) { switch (opt) { case 'd': opt_debug = 1; break; case 'x': sscanf(bu_optarg, "%x", (unsigned int *) &RTG.debug); bu_printb("librt RT_G_DEBUG", RT_G_DEBUG, DEBUG_FORMAT); bu_log("\n"); break; case 'v': opt_verbose++; break; default: usage(argv0); bu_exit(1, NULL); break; } } argv += bu_optind; argc -= bu_optind; if (opt_verbose) bu_log("Verbose output enabled.\n"); if (opt_debug) bu_log("Debugging output enabled.\n"); /* validate input/output file specifiers */ if (argc < 1) { usage(argv0); bu_exit(1, "ERROR: Missing input and output file names\n"); } bu_vls_strcat(&vls_in, argv[0]); if (argc < 2) { bu_vls_printf(&vls_out, "%s.g", argv[0]); } else { bu_vls_strcat(&vls_out, argv[1]); } if (opt_verbose) { bu_log("Reading from [%s]\n", bu_vls_addr(&vls_in)); bu_log("Writing to [%s]\n\n", bu_vls_addr(&vls_out)); } /* initialize single threaded resource */ rt_init_resource(&rt_uniresource, 0, NULL); /* open the input */ shapefile = SHPOpen(bu_vls_addr(&vls_in), "rb"); if (!shapefile) { bu_log("ERROR: Unable to open shapefile [%s]\n", bu_vls_addr(&vls_in)); bu_vls_free(&vls_in); bu_vls_free(&vls_out); bu_exit(4, NULL); } /* print shapefile details */ if (opt_verbose) { SHPGetInfo(shapefile, &shp_num_entities, &shp_type, shp_min, shp_max); bu_log("Shapefile Type: %s\n", SHPTypeName(shp_type)); bu_log("# of Shapes: %d\n\n", shp_num_entities); bu_log("File Bounds: (%12.3f,%12.3f, %.3g, %.3g)\n" " to (%12.3f,%12.3f, %.3g, %.3g)\n", shp_min[0], shp_min[1], shp_min[2], shp_min[3], shp_max[0], shp_max[1], shp_max[2], shp_max[3]); } /* open the .g for writing */ if ((fd_out = wdb_fopen(bu_vls_addr(&vls_out))) == NULL) { bu_log("ERROR: Unable to open shapefile [%s]\n", bu_vls_addr(&vls_out)); bu_vls_free(&vls_in); bu_vls_free(&vls_out); perror(argv0); bu_exit(5, NULL); } /* iterate over all entities */ for (i=0; i < (size_t)shp_num_entities; i++) { SHPObject *object; int shp_part; size_t j; object = SHPReadObject(shapefile, i); if (!object) { if (opt_debug) bu_log("Shape %zu of %zu is missing, skipping.\n", i+1, (size_t)shp_num_entities); continue; } /* validate the object */ if (opt_debug) { int shp_altered = SHPRewindObject(shapefile, object); if (shp_altered > 0) { bu_log("WARNING: Shape %zu of %zu has [%d] bad loop orientations.\n", i+1, (size_t)shp_num_entities, shp_altered); shp_num_invalid++; } } /* print detail header */ if (opt_verbose) { if (object->bMeasureIsUsed) { bu_log("\nShape:%zu (%s) nVertices=%d, nParts=%d\n" " Bounds:(%12.3f,%12.3f, %g, %g)\n" " to (%12.3f,%12.3f, %g, %g)\n", i+1, SHPTypeName(object->nSHPType), object->nVertices, object->nParts, object->dfXMin, object->dfYMin, object->dfZMin, object->dfMMin, object->dfXMax, object->dfYMax, object->dfZMax, object->dfMMax); } else { bu_log("\nShape:%zu (%s) nVertices=%d, nParts=%d\n" " Bounds:(%12.3f,%12.3f, %g)\n" " to (%12.3f,%12.3f, %g)\n", i+1, SHPTypeName(object->nSHPType), object->nVertices, object->nParts, object->dfXMin, object->dfYMin, object->dfZMin, object->dfXMax, object->dfYMax, object->dfZMax); } if (object->nParts > 0 && object->panPartStart[0] != 0) { if (opt_debug) bu_log("Shape %zu of %zu: panPartStart[0] = %d, not zero as expected.\n", i+1, (size_t)shp_num_entities, object->panPartStart[0]); continue; } } num_verts = 0; verts = (point2d_t *)bu_calloc((size_t)object->nVertices, sizeof(point2d_t), "alloc point array"); for (j = 0, shp_part = 1; j < (size_t)object->nVertices; j++) { if (shp_part < object->nParts && j == (size_t)object->panPartStart[shp_part]) { shp_part++; bu_log("Shape %zu of %zu: End of Loop\n", i+1, (size_t)shp_num_entities); make_shape(fd_out, opt_verbose, opt_debug, i, num_verts, verts); /* reset for next loop */ memset(verts, 0, sizeof(point2d_t) * object->nVertices); num_verts = 0; } bu_log("%zu/%zu:%zu/%zu\t\t", i+1, (size_t)shp_num_entities, j+1, (size_t)object->nVertices); bu_log("(%12.4f, %12.4f, %12.4f, %g)\n", object->padfX[j], object->padfY[j], object->padfZ[j], object->padfM[j]); V2SET(verts[num_verts], object->padfX[j], object->padfY[j]); num_verts++; } bu_log("Shape %zu of %zu: End of Loop\n", i+1, (size_t)shp_num_entities); make_shape(fd_out, opt_verbose, opt_debug, i, num_verts, verts); bu_free(verts, "free point array"); verts = NULL; num_verts = 0; SHPDestroyObject(object); object = NULL; } if (opt_verbose) { if (shp_num_invalid > 0) { bu_log("WARNING: %zu of %zu shape(s) had bad loop orientations.\n", shp_num_invalid, (size_t)shp_num_entities); } bu_log("\nDone.\n"); } /* close up our files */ SHPClose(shapefile); wdb_close(fd_out); /* free up allocated resources */ bu_vls_free(&vls_in); bu_vls_free(&vls_out); return 0; }
int main(int argc, char *argv[]) { struct user_data your_data = {0, BN_TOL_INIT_ZERO}; int i; int c; char idbuf[132] = {0}; struct rt_i *rtip; struct db_tree_state init_state; bu_setprogname(argv[0]); bu_setlinebuf(stderr); /* calculational tolerances * mostly used by NMG routines */ your_data.tol.magic = BN_TOL_MAGIC; your_data.tol.dist = BN_TOL_DIST; your_data.tol.dist_sq = your_data.tol.dist * your_data.tol.dist; your_data.tol.perp = 1e-6; your_data.tol.para = 1 - your_data.tol.perp; /* Get command line arguments. */ while ((c = bu_getopt(argc, argv, "t:a:n:o:r:x:X:")) != -1) { switch (c) { case 't': /* calculational tolerance */ your_data.tol.dist = atof(bu_optarg); your_data.tol.dist_sq = your_data.tol.dist * your_data.tol.dist; case 'o': /* Output file name */ /* grab output file name */ break; case 'x': /* librt debug flag */ sscanf(bu_optarg, "%x", &RTG.debug); bu_printb("librt RT_G_DEBUG", RT_G_DEBUG, DEBUG_FORMAT); bu_log("\n"); break; case 'X': /* NMG debug flag */ sscanf(bu_optarg, "%x", &RTG.NMG_debug); bu_printb("librt RTG.NMG_debug", RTG.NMG_debug, NMG_DEBUG_FORMAT); bu_log("\n"); break; default: print_usage(argv[0]); break; } } if (bu_optind+1 >= argc) { print_usage(argv[0]); } /* Open BRL-CAD database */ /* Scan all the records in the database and build a directory */ rtip=rt_dirbuild(argv[bu_optind], idbuf, sizeof(idbuf)); if (rtip == RTI_NULL) { bu_exit(1, "g-xxx: rt_dirbuild failure\n"); } init_state = rt_initial_tree_state; bu_optind++; /* Walk the trees named on the command line * outputting combinations and primitives */ for (i=bu_optind; i<argc; i++) { db_walk_tree(rtip->rti_dbip, argc - i, (const char **)&argv[i], 1 /* bu_avail_cpus() */, &init_state, region_start, region_end, primitive_func, (void *) &your_data); } return 0; }
int main(int argc, char **argv) { int c; int i; struct pshell *psh; struct pbar *pbp; struct wmember head; struct wmember all_head; char *nastran_file = "Converted from NASTRAN file (stdin)"; bu_setprogname(argv[0]); fpin = stdin; units = INCHES; /* FIXME: These need to be improved */ tol.magic = BN_TOL_MAGIC; tol.dist = 0.0005; tol.dist_sq = tol.dist * tol.dist; tol.perp = 1e-6; tol.para = 1 - tol.perp; while ((c=bu_getopt(argc, argv, "x:X:t:ni:o:mh?")) != -1) { switch (c) { case 'x': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.debug); bu_printb("librt RT_G_DEBUG", RT_G_DEBUG, DEBUG_FORMAT); bu_log("\n"); break; case 'X': sscanf(bu_optarg, "%x", (unsigned int *)&RTG.NMG_debug); bu_printb("librt RTG.NMG_debug", RTG.NMG_debug, NMG_DEBUG_FORMAT); bu_log("\n"); break; case 't': /* calculational tolerance */ tol.dist = atof(bu_optarg); tol.dist_sq = tol.dist * tol.dist; break; case 'n': polysolids = 0; break; case 'm': units = MM; break; case 'i': fpin = fopen(bu_optarg, "rb"); if (fpin == (FILE *)NULL) { bu_log("Cannot open NASTRAN file (%s) for reading!\n", bu_optarg); bu_exit(1, Usage, argv[0]); } nastran_file = bu_optarg; break; case 'o': output_file = bu_optarg; break; default: bu_exit(1, Usage, argv[0]); } } fpout = wdb_fopen(output_file); if (fpout == NULL) { bu_log("Cannot open BRL-CAD file (%s) for writing!\n", output_file); bu_exit(1, Usage, argv[0]); } if (!fpin || !fpout) { bu_exit(1, Usage, argv[0]); } line = (char *)bu_malloc(MAX_LINE_SIZE, "line"); next_line = (char *)bu_malloc(MAX_LINE_SIZE, "next_line"); prev_line = (char *)bu_malloc(MAX_LINE_SIZE, "prev_line"); curr_rec = (char **)bu_calloc(NO_OF_FIELDS, sizeof(char *), "curr_rec"); for (i=0; i<NO_OF_FIELDS; i++) curr_rec[i] = (char *)bu_malloc(sizeof(char)*FIELD_LENGTH, "curr_rec[i]"); prev_rec = (char **)bu_calloc(NO_OF_FIELDS, sizeof(char *), "prev_rec"); for (i=0; i<NO_OF_FIELDS; i++) prev_rec[i] = (char *)bu_malloc(sizeof(char)*FIELD_LENGTH, "prev_rec[i]"); /* first pass, find start of NASTRAN "bulk data" */ start_off = (-1); bulk_data_start_line = 0; while (bu_fgets(line, MAX_LINE_SIZE, fpin)) { bulk_data_start_line++; if (bu_strncmp(line, "BEGIN BULK", 10)) continue; start_off = bu_ftell(fpin); break; } if (start_off < 0) { bu_log("Cannot find start of bulk data in NASTRAN file!\n"); bu_exit(1, Usage, argv[0]); } /* convert BULK data deck into something reasonable */ fptmp = bu_temp_file(NULL, 0); if (fptmp == NULL) { perror(argv[0]); bu_exit(1, "Cannot open temporary file\n"); } convert_input(); /* initialize some lists */ BU_LIST_INIT(&coord_head.l); BU_LIST_INIT(&pbar_head.l); BU_LIST_INIT(&pshell_head.l); BU_LIST_INIT(&all_head.l); nmg_model = (struct model *)NULL; /* count grid points */ bu_fseek(fptmp, 0, SEEK_SET); while (bu_fgets(line, MAX_LINE_SIZE, fptmp)) { if (!bu_strncmp(line, "GRID", 4)) grid_count++; } if (!grid_count) { bu_exit(1, "No geometry in this NASTRAN file!\n"); } /* get default values and properties */ bu_fseek(fptmp, 0, SEEK_SET); while (get_next_record(fptmp, 1, 0)) { if (!bu_strncmp(curr_rec[0], "BAROR", 5)) { /* get BAR defaults */ bar_def_pid = atoi(curr_rec[2]); } else if (!bu_strncmp(curr_rec[0], "PBAR", 4)) { struct pbar *pb; BU_ALLOC(pb, struct pbar); pb->pid = atoi(curr_rec[1]); pb->mid = atoi(curr_rec[2]); pb->area = atof(curr_rec[3]); BU_LIST_INIT(&pb->head.l); BU_LIST_INSERT(&pbar_head.l, &pb->l); } else if (!bu_strncmp(curr_rec[0], "PSHELL", 6)) { BU_ALLOC(psh, struct pshell); psh->s = (struct shell *)NULL; psh->pid = atoi(curr_rec[1]); psh->mid = atoi(curr_rec[2]); psh->thick = atof(curr_rec[3]); BU_LIST_INSERT(&pshell_head.l, &psh->l); pshell_count++; } } /* allocate storage for grid points */ g_pts = (struct grid_point *)bu_calloc(grid_count, sizeof(struct grid_point), "grid points"); /* get all grid points */ bu_fseek(fptmp, 0, SEEK_SET); while (get_next_record(fptmp, 1, 0)) { int gid; int cid; double tmp[3]; if (bu_strncmp(curr_rec[0], "GRID", 4)) continue; gid = atoi(curr_rec[1]); cid = atoi(curr_rec[2]); for (i=0; i<3; i++) { tmp[i] = atof(curr_rec[i+3]); } g_pts[grid_used].gid = gid; g_pts[grid_used].cid = cid; g_pts[grid_used].v = (struct vertex **)bu_calloc(pshell_count + 1, sizeof(struct vertex *), "g_pts vertex array"); VMOVE(g_pts[grid_used].pt, tmp); grid_used++; } /* find coordinate systems */ bu_fseek(fptmp, 0, SEEK_SET); while (get_next_record(fptmp, 1, 0)) { if (bu_strncmp(curr_rec[0], "CORD", 4)) continue; get_coord_sys(); } /* convert everything to BRL-CAD coordinate system */ i = 0; while (convert_all_cs() || convert_all_pts()) { i++; if (i > 10) { bu_exit(1, "Cannot convert to default coordinate system, check for circular definition\n"); } } mk_id(fpout, nastran_file); /* get elements */ bu_fseek(fptmp, 0, SEEK_SET); while (get_next_record(fptmp, 1, 0)) { if (!bu_strncmp(curr_rec[0], "CBAR", 4)) get_cbar(); else if (!bu_strncmp(curr_rec[0], "CROD", 4)) get_cbar(); else if (!bu_strncmp(curr_rec[0], "CTRIA3", 6)) get_ctria3(); else if (!bu_strncmp(curr_rec[0], "CQUAD4", 6)) get_cquad4(); } if (nmg_model) { nmg_rebound(nmg_model, &tol); if (polysolids) mk_bot_from_nmg(fpout, "pshell.0", nmg_shell); else mk_nmg(fpout, "pshell.0", nmg_model); } BU_LIST_INIT(&head.l); for (BU_LIST_FOR(psh, pshell, &pshell_head.l)) { struct model *m; char name[NAMESIZE+1]; if (!psh->s) continue; m = nmg_find_model(&psh->s->l.magic); nmg_rebound(m, &tol); nmg_fix_normals(psh->s, &tol); if (psh->thick > tol.dist) { nmg_model_face_fuse(m, &tol); nmg_hollow_shell(psh->s, psh->thick*conv[units], 1, &tol); } sprintf(name, "pshell.%d", psh->pid); if (polysolids) mk_bot_from_nmg(fpout, name, psh->s); else mk_nmg(fpout, name, m); mk_addmember(name, &head.l, NULL, WMOP_UNION); } if (BU_LIST_NON_EMPTY(&head.l)) { mk_lfcomb(fpout, "shells", &head, 0); mk_addmember("shells", &all_head.l, NULL, WMOP_UNION); } BU_LIST_INIT(&head.l); for (BU_LIST_FOR(pbp, pbar, &pbar_head.l)) { char name[NAMESIZE+1]; if (BU_LIST_IS_EMPTY(&pbp->head.l)) continue; sprintf(name, "pbar_group.%d", pbp->pid); mk_lfcomb(fpout, name, &pbp->head, 0); mk_addmember(name, &head.l, NULL, WMOP_UNION); } if (BU_LIST_NON_EMPTY(&head.l)) { mk_lfcomb(fpout, "pbars", &head, 0); mk_addmember("pbars", &all_head.l, NULL, WMOP_UNION); } if (BU_LIST_NON_EMPTY(&all_head.l)) { mk_lfcomb(fpout, "all", &all_head, 0); } wdb_close(fpout); return 0; }
/* * M A I N */ int main(int argc, char **argv) { struct rt_i *rtip = NULL; char *title_file = NULL, *title_obj = NULL; /* name of file and first object */ char idbuf[RT_BUFSIZE] = {0}; /* First ID record info */ void application_init(); struct bu_vls times; int i; #if defined(_WIN32) && !defined(__CYGWIN__) setmode(fileno(stdin), O_BINARY); setmode(fileno(stdout), O_BINARY); setmode(fileno(stderr), O_BINARY); #else bu_setlinebuf( stdout ); bu_setlinebuf( stderr ); #endif #ifdef HAVE_SBRK beginptr = (char *) sbrk(0); #endif azimuth = 35.0; /* GIFT defaults */ elevation = 25.0; AmbientIntensity=0.4; background[0] = background[1] = 0.0; background[2] = 1.0/255.0; /* slightly non-black */ /* Before option processing, get default number of processors */ npsw = bu_avail_cpus(); /* Use all that are present */ if ( npsw > MAX_PSW ) npsw = MAX_PSW; /* Before option processing, do application-specific initialization */ RT_APPLICATION_INIT( &ap ); application_init(); /* Process command line options */ if ( !get_args( argc, argv ) ) { (void)fputs(usage, stderr); return 1; } /* Identify the versions of the libraries we are using. */ if (rt_verbosity & VERBOSE_LIBVERSIONS) { (void)fprintf(stderr, "%s%s%s%s\n", brlcad_ident(title), rt_version(), bn_version(), bu_version() ); } #if defined(DEBUG) (void)fprintf(stderr, "Compile-time debug symbols are available\n"); #endif #if defined(NO_BOMBING_MACROS) || defined(NO_MAGIC_CHECKING) || defined(NO_BADRAY_CECHKING) || defined(NO_DEBUG_CHECKING) (void)fprintf(stderr, "WARNING: Run-time debugging is disabled and may enhance performance\n"); #endif /* Identify what host we're running on */ if (rt_verbosity & VERBOSE_LIBVERSIONS) { char hostname[512] = {0}; #ifndef _WIN32 if ( gethostname( hostname, sizeof(hostname) ) >= 0 && hostname[0] != '\0' ) (void)fprintf(stderr, "Running on %s\n", hostname); #else sprintf(hostname, "Microsoft Windows"); (void)fprintf(stderr, "Running on %s\n", hostname); #endif } if ( bu_optind >= argc ) { fprintf(stderr, "%s: MGED database not specified\n", argv[0]); (void)fputs(usage, stderr); return 1; } if (rpt_overlap) ap.a_logoverlap = ((void (*)())0); else ap.a_logoverlap = rt_silent_logoverlap; /* If user gave no sizing info at all, use 512 as default */ if ( width <= 0 && cell_width <= 0 ) width = 512; if ( height <= 0 && cell_height <= 0 ) height = 512; /* If user didn't provide an aspect ratio, use the image * dimensions ratio as a default. */ if (aspect <= 0.0) { aspect = (fastf_t)width / (fastf_t)height; } if ( sub_grid_mode ) { /* check that we have a legal subgrid */ if ( sub_xmax >= width || sub_ymax >= height ) { fprintf( stderr, "rt: illegal values for subgrid %d,%d,%d,%d\n", sub_xmin, sub_ymin, sub_xmax, sub_ymax ); fprintf( stderr, "\tFor a %d X %d image, the subgrid must be within 0, 0,%d,%d\n", width, height, width-1, height-1 ); return 1; } } if ( incr_mode ) { int x = height; if ( x < width ) x = width; incr_nlevel = 1; while ( (1<<incr_nlevel) < x ) incr_nlevel++; height = width = 1<<incr_nlevel; if (rt_verbosity & VERBOSE_INCREMENTAL) fprintf(stderr, "incremental resolution, nlevels = %d, width=%d\n", incr_nlevel, width); } /* * Handle parallel initialization, if applicable. */ #ifndef PARALLEL npsw = 1; /* force serial */ #endif if ( npsw < 0 ) { /* Negative number means "all but" npsw */ npsw = bu_avail_cpus() + npsw; } /* allow debug builds to go higher than the max */ if (!(bu_debug & BU_DEBUG_PARALLEL)) { if ( npsw > MAX_PSW ) { npsw = MAX_PSW; } } if (npsw > 1) { rt_g.rtg_parallel = 1; if (rt_verbosity & VERBOSE_MULTICPU) fprintf(stderr, "Planning to run with %d processors\n", npsw ); } else { rt_g.rtg_parallel = 0; } /* Initialize parallel processor support */ bu_semaphore_init( RT_SEM_LAST ); /* * Do not use bu_log() or bu_malloc() before this point! */ if ( bu_debug ) { bu_printb( "libbu bu_debug", bu_debug, BU_DEBUG_FORMAT ); bu_log("\n"); } if ( RT_G_DEBUG ) { bu_printb( "librt rt_g.debug", rt_g.debug, DEBUG_FORMAT ); bu_log("\n"); } if ( rdebug ) { bu_printb( "rt rdebug", rdebug, RDEBUG_FORMAT ); bu_log("\n"); } /* We need this to run rt_dirbuild */ rt_init_resource( &rt_uniresource, MAX_PSW, NULL ); bn_rand_init( rt_uniresource.re_randptr, 0 ); title_file = argv[bu_optind]; title_obj = argv[bu_optind+1]; nobjs = argc - bu_optind - 1; objtab = &(argv[bu_optind+1]); if ( nobjs <= 0 ) { bu_log("%s: no objects specified -- raytrace aborted\n", argv[0]); return 1; } /* Echo back the command line arugments as given, in 3 Tcl commands */ if (rt_verbosity & VERBOSE_MODELTITLE) { struct bu_vls str; bu_vls_init(&str); bu_vls_from_argv( &str, bu_optind, (const char **)argv ); bu_vls_strcat( &str, "\nopendb " ); bu_vls_strcat( &str, title_file ); bu_vls_strcat( &str, ";\ntree " ); bu_vls_from_argv( &str, nobjs <= 16 ? nobjs : 16, (const char **)argv+bu_optind+1 ); if ( nobjs > 16 ) bu_vls_strcat( &str, " ..."); else bu_vls_putc( &str, ';' ); bu_log("%s\n", bu_vls_addr(&str) ); bu_vls_free(&str); } /* Build directory of GED database */ bu_vls_init( × ); rt_prep_timer(); if ( (rtip=rt_dirbuild(title_file, idbuf, sizeof(idbuf))) == RTI_NULL ) { bu_log("rt: rt_dirbuild(%s) failure\n", title_file); return 2; } ap.a_rt_i = rtip; (void)rt_get_timer( ×, NULL ); if (rt_verbosity & VERBOSE_MODELTITLE) bu_log("db title: %s\n", idbuf); if (rt_verbosity & VERBOSE_STATS) bu_log("DIRBUILD: %s\n", bu_vls_addr(×) ); bu_vls_free( × ); memory_summary(); /* Copy values from command line options into rtip */ rtip->rti_space_partition = space_partition; rtip->rti_nugrid_dimlimit = nugrid_dimlimit; rtip->rti_nu_gfactor = nu_gfactor; rtip->useair = use_air; rtip->rti_save_overlaps = save_overlaps; if ( rt_dist_tol > 0 ) { rtip->rti_tol.dist = rt_dist_tol; rtip->rti_tol.dist_sq = rt_dist_tol * rt_dist_tol; } if ( rt_perp_tol > 0 ) { rtip->rti_tol.perp = rt_perp_tol; rtip->rti_tol.para = 1 - rt_perp_tol; } if (rt_verbosity & VERBOSE_TOLERANCE) rt_pr_tol( &rtip->rti_tol ); /* before view_init */ if ( outputfile && strcmp( outputfile, "-") == 0 ) outputfile = (char *)0; /* * Initialize application. * Note that width & height may not have been set yet, * since they may change from frame to frame. */ if ( view_init( &ap, title_file, title_obj, outputfile!=(char *)0, framebuffer!=(char *)0 ) != 0 ) { /* Framebuffer is desired */ register int xx, yy; int zoom; /* Ask for a fb big enough to hold the image, at least 512. */ /* This is so MGED-invoked "postage stamps" get zoomed up big enough to see */ xx = yy = 512; if ( width > xx || height > yy ) { xx = width; yy = height; } bu_semaphore_acquire( BU_SEM_SYSCALL ); fbp = fb_open( framebuffer, xx, yy ); bu_semaphore_release( BU_SEM_SYSCALL ); if ( fbp == FBIO_NULL ) { fprintf(stderr, "rt: can't open frame buffer\n"); return 12; } bu_semaphore_acquire( BU_SEM_SYSCALL ); /* If fb came out smaller than requested, do less work */ if ( fb_getwidth(fbp) < width ) width = fb_getwidth(fbp); if ( fb_getheight(fbp) < height ) height = fb_getheight(fbp); /* If the fb is lots bigger (>= 2X), zoom up & center */ if ( width > 0 && height > 0 ) { zoom = fb_getwidth(fbp)/width; if ( fb_getheight(fbp)/height < zoom ) zoom = fb_getheight(fbp)/height; } else { zoom = 1; } (void)fb_view( fbp, width/2, height/2, zoom, zoom ); bu_semaphore_release( BU_SEM_SYSCALL ); } if ( (outputfile == (char *)0) && (fbp == FBIO_NULL) ) { /* If not going to framebuffer, or to a file, then use stdout */ if ( outfp == NULL ) outfp = stdout; /* output_is_binary is changed by view_init, as appropriate */ if ( output_is_binary && isatty(fileno(outfp)) ) { fprintf(stderr, "rt: attempting to send binary output to terminal, aborting\n"); return 14; } } /* * Initialize all the per-CPU memory resources. * The number of processors can change at runtime, init them all. */ for ( i=0; i < MAX_PSW; i++ ) { rt_init_resource( &resource[i], i, rtip ); bn_rand_init( resource[i].re_randptr, i ); } memory_summary(); #ifdef SIGUSR1 (void)signal( SIGUSR1, siginfo_handler ); #endif #ifdef SIGINFO (void)signal( SIGINFO, siginfo_handler ); #endif if ( !matflag ) { int frame_retval; def_tree( rtip ); /* Load the default trees */ do_ae( azimuth, elevation ); frame_retval = do_frame( curframe ); if (frame_retval != 0) { /* Release the framebuffer, if any */ if ( fbp != FBIO_NULL ) { fb_close(fbp); } return 1; } } else if ( !isatty(fileno(stdin)) && old_way( stdin ) ) { ; /* All is done */ } else { register char *buf; register int ret; /* * New way - command driven. * Process sequence of input commands. * All the work happens in the functions * called by rt_do_cmd(). */ while ( (buf = rt_read_cmd( stdin )) != (char *)0 ) { if ( R_DEBUG&RDEBUG_PARSE ) fprintf(stderr, "cmd: %s\n", buf ); ret = rt_do_cmd( rtip, buf, rt_cmdtab ); bu_free( buf, "rt_read_cmd command buffer" ); if ( ret < 0 ) break; } if ( curframe < desiredframe ) { fprintf(stderr, "rt: Desired frame %d not reached, last was %d\n", desiredframe, curframe); } } /* Release the framebuffer, if any */ if (fbp != FBIO_NULL) { fb_close(fbp); } return(0); }
/* * G E T _ A R G S */ int get_args( int argc, register char **argv ) { register int c; register int i; bu_optind = 1; /* restart */ #define GETOPT_STR \ ".:,:@:a:b:c:d:e:f:g:h:ij:k:l:n:o:p:q:rs:tu:v:w:x:A:BC:D:E:F:G:H:IJ:K:MN:O:P:Q:RST:U:V:WX:!:+:" while ( (c=bu_getopt( argc, argv, GETOPT_STR )) != EOF ) { switch ( c ) { case 'q': i = atoi(bu_optarg); if (i <= 0) { bu_exit(EXIT_FAILURE, "-q %d is < 0\n", i); } if ( i > BN_RANDHALFTABSIZE) { bu_exit(EXIT_FAILURE, "-q %d is > maximum (%d)\n", i, BN_RANDHALFTABSIZE); } bn_randhalftabsize = i; break; case 'h': i = sscanf(bu_optarg, "%lg,%lg,%lg,%lg", &airdensity, &haze[X], &haze[Y], &haze[Z]); break; case 't': transpose_grid = 1; break; case 'j': { register char *cp = bu_optarg; sub_xmin = atoi(cp); while ( (*cp >= '0' && *cp <= '9') ) cp++; while ( *cp && (*cp < '0' || *cp > '9') ) cp++; sub_ymin = atoi(cp); while ( (*cp >= '0' && *cp <= '9') ) cp++; while ( *cp && (*cp < '0' || *cp > '9') ) cp++; sub_xmax = atoi(cp); while ( (*cp >= '0' && *cp <= '9') ) cp++; while ( *cp && (*cp < '0' || *cp > '9') ) cp++; sub_ymax = atoi(cp); bu_log("Sub-rectangle: (%d,%d) (%d,%d)\n", sub_xmin, sub_ymin, sub_xmax, sub_ymax ); if ( sub_xmin >= 0 && sub_xmin < sub_xmax && sub_ymin >= 0 && sub_ymin < sub_ymax ) { sub_grid_mode = 1; } else { sub_grid_mode = 0; bu_log("WARNING: bad sub-rectangle, ignored\n"); } } break; case 'k': /* define cutting plane */ { fastf_t f; do_kut_plane = 1; i = sscanf(bu_optarg, "%lg,%lg,%lg,%lg", &kut_plane[X], &kut_plane[Y], &kut_plane[Z], &kut_plane[H]); if( i != 4 ) { bu_exit( EXIT_FAILURE, "ERROR: bad cutting plane\n" ); } /* verify that normal has unit length */ f = MAGNITUDE( kut_plane ); if( f <= SMALL ) { bu_exit( EXIT_FAILURE, "Bad normal for cutting plane, length=%g\n", f ); } f = 1.0 /f; VSCALE( kut_plane, kut_plane, f ); kut_plane[3] *= f; break; } case '.': nu_gfactor = (double)atof( bu_optarg ); break; case ',': space_partition = atoi(bu_optarg); break; case '@': nugrid_dimlimit = atoi(bu_optarg); break; case 'c': (void)rt_do_cmd( (struct rt_i *)0, bu_optarg, rt_cmdtab ); break; case 'C': { char buf[128] = {0}; int r, g, b; register char *cp = bu_optarg; r = atoi(cp); while ( (*cp >= '0' && *cp <= '9') ) cp++; while ( *cp && (*cp < '0' || *cp > '9') ) cp++; g = atoi(cp); while ( (*cp >= '0' && *cp <= '9') ) cp++; while ( *cp && (*cp < '0' || *cp > '9') ) cp++; b = atoi(cp); if ( r < 0 || r > 255 ) r = 255; if ( g < 0 || g > 255 ) g = 255; if ( b < 0 || b > 255 ) b = 255; #if defined(_WIN32) if (r == 0) background[0] = 0.0; else background[0] = r / 255.0; if (g == 0) background[1] = 0.0; else background[1] = g / 255.0; if (b == 0) background[2] = 0.0; else background[2] = b / 255.0; #else sprintf(buf, "set background=%f/%f/%f", r/255., g/255., b/255. ); (void)rt_do_cmd( (struct rt_i *)0, buf, rt_cmdtab ); #endif } break; case 'T': { double f; char *cp; f = 0; if ( sscanf( bu_optarg, "%lf", &f ) == 1 ) { if ( f > 0 ) rt_dist_tol = f; } f = 0; if ( (cp = strchr(bu_optarg, '/')) || (cp = strchr(bu_optarg, ',')) ) { if ( sscanf( cp+1, "%lf", &f ) == 1 ) { if ( f > 0 && f < 1 ) rt_perp_tol = f; } } bu_log("Using tolerance %lg", f); break; } case 'U': use_air = atoi( bu_optarg ); break; case 'I': interactive = 1; break; case 'i': incr_mode = 1; break; case 'S': stereo = 1; break; case 'J': sscanf( bu_optarg, "%x", &jitter ); break; case 'H': hypersample = atoi( bu_optarg ); if ( hypersample > 0 ) jitter = 1; break; case 'F': framebuffer = bu_optarg; break; case 'D': desiredframe = atoi( bu_optarg ); break; case 'K': finalframe = atoi( bu_optarg ); break; case 'N': sscanf( bu_optarg, "%x", (unsigned int *)&rt_g.NMG_debug); bu_log("NMG_debug=0x%x\n", rt_g.NMG_debug); break; case 'M': matflag = 1; break; case 'A': AmbientIntensity = atof( bu_optarg ); break; case 'x': sscanf( bu_optarg, "%x", (unsigned int *)&rt_g.debug ); break; case 'X': sscanf( bu_optarg, "%x", (unsigned int *)&rdebug ); break; case '!': sscanf( bu_optarg, "%x", (unsigned int *)&bu_debug ); break; case 's': /* Square size */ i = atoi( bu_optarg ); if ( i < 2 || i > MAX_WIDTH ) fprintf(stderr, "squaresize=%d out of range\n", i); else width = height = i; break; case 'n': i = atoi( bu_optarg ); if ( i < 2 || i > MAX_WIDTH ) fprintf(stderr, "height=%d out of range\n", i); else height = i; break; case 'W': (void)rt_do_cmd( (struct rt_i *)0, "set background=1.0/1.0/1.0", rt_cmdtab ); default_background = 0; break; case 'w': i = atoi( bu_optarg ); if ( i < 2 || i > MAX_WIDTH ) fprintf(stderr, "width=%d out of range\n", i); else width = i; break; case 'g': cell_width = atof( bu_optarg ); cell_newsize = 1; break; case 'G': cell_height = atof( bu_optarg ); cell_newsize = 1; break; case 'a': /* Set azimuth */ azimuth = atof( bu_optarg ); matflag = 0; break; case 'e': /* Set elevation */ elevation = atof( bu_optarg ); matflag = 0; break; case 'l': { char *item; /* Select lighting model # */ lightmodel= 1; /* Initialize with Full Lighting Model */ item= strtok(bu_optarg, ","); lightmodel= atoi(item); if (lightmodel == 7) { /* Process the photon mapping arguments */ item= strtok(NULL, ","); pmargs[0]= item ? atoi(item) : 16384; /* Number of Global Photons */ item= strtok(NULL, ","); pmargs[1]= item ? atof(item) : 50; /* Percent of Global Photons that should be used for Caustic Photons */ item= strtok(NULL, ","); pmargs[2]= item ? atoi(item) : 10; /* Number of Irradiance Sample Rays, Total Rays is this number squared */ item= strtok(NULL, ","); pmargs[3]= item ? atof(item) : 60.0; /* Angular Tolerance */ item= strtok(NULL, ","); pmargs[4]= item ? atoi(item) : 0; /* Random Seed */ item= strtok(NULL, ","); pmargs[5]= item ? atoi(item) : 0; /* Importance Mapping */ item= strtok(NULL, ","); pmargs[6]= item ? atoi(item) : 0; /* Irradiance Hypersampling */ item= strtok(NULL, ","); pmargs[7]= item ? atoi(item) : 0; /* Visualize Irradiance */ item= strtok(NULL, ","); pmargs[8]= item ? atof(item) : 1.0; /* Scale Lumens */ item= strtok(NULL,","); if (item) { bu_strlcpy(pmfile, item, sizeof(pmfile)); } else { pmfile[0]= 0; } } } break; case 'O': /* Output pixel file name, double precision format */ outputfile = bu_optarg; doubles_out = 1; break; case 'o': /* Output pixel file name, unsigned char format */ outputfile = bu_optarg; doubles_out = 0; break; case 'p': rt_perspective = atof( bu_optarg ); if ( rt_perspective < 0 || rt_perspective > 179 ) { fprintf(stderr, "persp=%g out of range\n", rt_perspective); rt_perspective = 0; } break; case 'u': units = bu_units_conversion(bu_optarg); if (units <= 0.0) { units = 1.0; bu_log("WARNING: bad units, using default (%s)\n", bu_units_string(units)); } break; case 'v': /* Set level of "non-debug" debugging output */ sscanf( bu_optarg, "%x", (unsigned int *)&rt_verbosity ); bu_printb( "Verbosity:", rt_verbosity, VERBOSE_FORMAT); bu_log("\n"); break; case 'E': eye_backoff = atof( bu_optarg ); break; case 'P': { /* Number of parallel workers */ int avail_cpus; avail_cpus = bu_avail_cpus(); npsw = atoi( bu_optarg ); if (npsw > avail_cpus ) { fprintf( stderr, "Requesting %d cpus, only %d available.", npsw, avail_cpus ); if ((bu_debug & BU_DEBUG_PARALLEL) || (RT_G_DEBUG & DEBUG_PARALLEL)) { fprintf(stderr, "\nAllowing surplus cpus due to debug flag.\n"); } else { fprintf( stderr, " Will use %d.\n", avail_cpus ); npsw = avail_cpus; } } if ( npsw == 0 || npsw < -MAX_PSW || npsw > MAX_PSW ) { fprintf(stderr, "Numer of requested cpus (%d) is out of range 1..%d", npsw, MAX_PSW); if ((bu_debug & BU_DEBUG_PARALLEL) || (RT_G_DEBUG & DEBUG_PARALLEL)) { fprintf(stderr, ", but allowing due to debug flag\n"); } else { fprintf(stderr, ", using -P1\n"); npsw = 1; } } } break; case 'Q': Query_one_pixel = ! Query_one_pixel; sscanf(bu_optarg, "%d,%d\n", &query_x, &query_y); break; case 'B': /* Remove all intentional random effects * (dither, etc) for benchmarking purposes. */ benchmark = 1; bn_mathtab_constant(); break; case 'b': /* Specify a single pixel to be done */ /* Actually processed in do_frame() */ string_pix_start = bu_optarg; npsw = 1; /* Cancel running in parallel */ break; case 'f': /* set expected playback rate in frames-per-second. * This actually gets stored as the delta-t per frame. */ if ( (frame_delta_t=atof( bu_optarg )) == 0.0) { fprintf(stderr, "Invalid frames/sec (%s) == 0.0\n", bu_optarg); frame_delta_t = 30.0; } frame_delta_t = 1.0 / frame_delta_t; break; case 'V': { /* View aspect */ fastf_t xx, yy; register char *cp = bu_optarg; xx = atof(cp); while ( (*cp >= '0' && *cp <= '9') || *cp == '.' ) cp++; while ( *cp && (*cp < '0' || *cp > '9') ) cp++; yy = atof(cp); if ( yy == 0 ) aspect = xx; else aspect = xx/yy; if ( aspect <= 0.0 ) { fprintf(stderr, "Bogus aspect %g, using 1.0\n", aspect); aspect = 1.0; } } break; case 'r': /* report overlapping region names */ rpt_overlap = 1; break; case 'R': /* DON'T report overlapping region names */ rpt_overlap = 0; break; case 'd': rpt_dist = atoi( bu_optarg ); break; case '+': { register char *cp = bu_optarg; switch (*cp) { case 't': output_is_binary = 0; break; default: fprintf(stderr, "ERROR: unknown option %c\n", *cp); return(0); /* BAD */ } } break; case EOF: fprintf(stderr, "ERROR: unknown option %c\n", c); return(0); /* BAD */ default: /* '?' */ fprintf(stderr, "ERROR: bad option specified\n"); return(0); /* BAD */ } } /* sanity checks for sane values */ if ( aspect <= 0.0 ) { aspect = 1.0; } /* Compat */ if (RT_G_DEBUG || R_DEBUG || rt_g.NMG_debug ) bu_debug |= BU_DEBUG_COREDUMP; if (RT_G_DEBUG & DEBUG_MEM_FULL) bu_debug |= BU_DEBUG_MEM_CHECK; if (RT_G_DEBUG & DEBUG_MEM) bu_debug |= BU_DEBUG_MEM_LOG; if (RT_G_DEBUG & DEBUG_PARALLEL) bu_debug |= BU_DEBUG_PARALLEL; if (RT_G_DEBUG & DEBUG_MATH) bu_debug |= BU_DEBUG_MATH; if (R_DEBUG & RDEBUG_RTMEM_END) bu_debug |= BU_DEBUG_MEM_CHECK; return(1); /* OK */ }