int useoptions(argoptions * opt, SceneHandle scene) { if (opt->useoutfilename == 1) { rt_outputfile(scene, opt->outfilename); } if (opt->verbosemode == 1) { rt_verbose(scene, 1); } if (opt->antialiasing != -1) { /* need new api code for this */ } if (opt->displaymode != -1) { rt_displaymode(scene, opt->displaymode); } if (opt->boundmode != -1) { rt_boundmode(scene, opt->boundmode); } if (opt->boundthresh != -1) { rt_boundthresh(scene, opt->boundthresh); } return 0; }
static errcode GetScenedefs(parsehandle * ph, SceneHandle scene) { int xres, yres; errcode rc = PARSENOERR; rc |= GetString(ph, "BEGIN_SCENE"); rc |= GetString(ph, "RESOLUTION"); fscanf(ph->ifp, "%d %d", &xres, &yres); rt_outputfile(scene, "outfile.tga"); rt_resolution(scene, xres, yres); rt_verbose(scene, 0); return rc; }
static errcode GetScenedefs(FILE * dfile, SceneHandle scene) { apivector Ccenter, Cview, Cup; apiflt zoom, aspectratio; int raydepth, antialiasing; rt_outputfile(scene, "outfile.tga"); rt_resolution(scene, 512, 512); rt_verbose(scene, 0); zoom=1.0; aspectratio=1.0; antialiasing=0; raydepth=6; Ccenter.x = 0.0; Ccenter.y = 0.0; Ccenter.z = -5.0; Cview.x = 0.0; Cview.y = 0.0; Cview.z = 1.0; Cup.x = 0.0; Cup.y = 1.0; Cup.z = 0.0; rt_camera_setup(scene, zoom, aspectratio, antialiasing, raydepth, Ccenter, Cview, Cup); { /* lighting hack */ apivector ctr; apitexture tex; memset(&tex, 0, sizeof(apitexture)); tex.col.r = 1.0; tex.col.g = 1.0; tex.col.b = 1.0; ctr.x = 0.0; ctr.y = 0.0; ctr.z = -100.0; rt_light(scene, rt_texture(scene, &tex), ctr, 1.0); } return PARSENOERR; }
int NFFGetScenedefs(FILE * dfile, SceneHandle scene) { apivector Ccenter, Cview, Cup; apiflt zoom, aspectratio; int raydepth, antialiasing; int xres, yres, verbose; apivector lookat; float vangle, hither; NFFGetString(dfile, "from"); NFFGetVector(dfile, &Ccenter); NFFGetString(dfile, "at"); NFFGetVector(dfile, &lookat); Cview.x = lookat.x - Ccenter.x; Cview.y = lookat.y - Ccenter.y; Cview.z = lookat.z - Ccenter.z; NFFGetString(dfile, "up"); NFFGetVector(dfile, &Cup); NFFGetString(dfile, "angle"); fscanf(dfile, "%f", &vangle); zoom = 1.0; /* XXX fix me later */ aspectratio = 1.0; NFFGetString(dfile, "hither"); fscanf(dfile, "%f", &hither); NFFGetString(dfile, "resolution"); fscanf(dfile, "%d %d", &xres, &yres); antialiasing = 0; raydepth = 6; verbose = 0; rt_outputfile(scene, "outfile.tga"); rt_resolution(scene, xres, yres); rt_verbose(scene, verbose); rt_camera_setup(scene, zoom, aspectratio, antialiasing, raydepth, Ccenter, Cview, Cup); rt_background(scene, backgr); return NFFNOERR; }
SceneHandle rt_newscene(void) { scenedef * scene; SceneHandle voidscene; scene = (scenedef *) malloc(sizeof(scenedef)); memset(scene, 0, sizeof(scenedef)); /* clear all valuas to 0 */ voidscene = (SceneHandle) scene; rt_outputfile(voidscene, "/dev/null"); /* default output file (.tga) */ rt_resolution(voidscene, 512, 512); /* 512x512 resolution */ rt_verbose(voidscene, 0); /* verbose messages off */ rt_rawimage(voidscene, NULL); /* raw image output off */ rt_boundmode(voidscene, RT_BOUNDING_ENABLED); /* spatial subdivision on */ rt_boundthresh(voidscene, MAXOCTNODES); /* default threshold */ rt_displaymode(voidscene, RT_DISPLAY_ENABLED); /* video output on */ rt_camerasetup(voidscene, 1.0, 1.0, 0, 6, rt_vector(0.0, 0.0, 0.0), rt_vector(0.0, 0.0, 1.0), rt_vector(0.0, 1.0, 0.0)); return scene; }
void rt_scenesetup(SceneHandle voidscene, char * outname, int hres, int vres, int verbose) { rt_outputfile(voidscene, outname); rt_resolution(voidscene, hres, vres); rt_verbose(voidscene, verbose); }
/* allocate and initialize a scene with default parameters */ SceneHandle rt_newscene(void) { scenedef * scene; SceneHandle voidscene; apicolor bgcolor = rt_color(0.0, 0.0, 0.0); apicolor ambcolor = rt_color(1.0, 1.0, 1.0); scene = (scenedef *) malloc(sizeof(scenedef)); memset(scene, 0, sizeof(scenedef)); /* clear all valuas to 0 */ voidscene = (SceneHandle) scene; rt_outputfile(voidscene, "/tmp/outfile.tga"); /* default output file */ rt_crop_disable(voidscene); /* disable cropping */ rt_outputformat(voidscene, RT_FORMAT_TARGA); /* default iamge format */ rt_resolution(voidscene, 512, 512); /* 512x512 resolution */ rt_verbose(voidscene, 0); /* verbose messages off */ rt_image_gamma(voidscene, 2.2f); /* set default gamma */ rt_image_clamp(voidscene); /* clamp image colors */ #if 1 rt_rawimage_rgb96f(voidscene, NULL); /* raw image output off */ #else rt_rawimage_rgb24(voidscene, NULL); /* raw image output off */ #endif rt_boundmode(voidscene, RT_BOUNDING_ENABLED); /* spatial subdivision on */ rt_boundthresh(voidscene, BOUNDTHRESH); /* default threshold */ rt_camera_setup(voidscene, 1.0, 1.0, 0, 6, rt_vector(0.0, 0.0, 0.0), rt_vector(0.0, 0.0, 1.0), rt_vector(0.0, 1.0, 0.0)); rt_camera_dof(voidscene, 1.0, 0.0); rt_shadermode(voidscene, RT_SHADER_AUTO); rt_rescale_lights(voidscene, 1.0); rt_phong_shader(voidscene, RT_SHADER_BLINN); rt_background(voidscene, bgcolor); rt_background_sky_sphere(voidscene, rt_vector(0.0, 1.0, 0.0), 0.3, 0, rt_color(0.0, 0.0, 0.0), rt_color(0.0, 0.0, 0.5)); rt_background_mode(voidscene, RT_BACKGROUND_TEXTURE_SOLID); rt_ambient_occlusion(voidscene, 0, ambcolor); /* disable AO by default */ rt_fog_rendering_mode(voidscene, RT_FOG_NORMAL); /* radial fog by default */ rt_fog_mode(voidscene, RT_FOG_NONE); /* disable fog by default */ rt_fog_parms(voidscene, bgcolor, 0.0, 1.0, 1.0); /* use max positive integer for max transparent surface limit by default */ rt_trans_max_surfaces(voidscene,((((int)1) << ((sizeof(int) * 8) - 2))-1)*2); rt_trans_mode(voidscene, RT_TRANS_ORIG); /* set transparency mode */ rt_normal_fixup_mode(voidscene, 0); /* disable normal fixup */ rt_shadow_filtering(voidscene, 1); /* shadow filtering on */ scene->objgroup.boundedobj = NULL; scene->objgroup.unboundedobj = NULL; scene->objgroup.numobjects = 0; scene->texlist = NULL; scene->lightlist = NULL; scene->cliplist = NULL; scene->numlights = 0; scene->scenecheck = 1; scene->parbuf = NULL; scene->threads = NULL; scene->threadparms = NULL; scene->flags = RT_SHADE_NOFLAGS; rt_set_numthreads(voidscene, -1); /* auto determine num threads */ /* number of distributed memory nodes, fills in array of node/cpu info */ scene->nodes = rt_getcpuinfo(&scene->cpuinfo); scene->mynode = rt_mynode(); return scene; }
int ray(int argc, char **argv) { #else int main(int argc, char **argv) { #endif SceneHandle scene; unsigned int rc; argoptions opt; char * filename; int node, fileindex; rt_timerhandle parsetimer; size_t len; node = rt_initialize(&argc, &argv); rt_set_ui_message(my_ui_message); rt_set_ui_progress(my_ui_progress); if (node == 0) { printf("Tachyon Parallel/Multiprocessor Ray Tracer Version %s \n", TACHYON_VERSION_STRING); printf("Copyright 1994-2010, John E. Stone <*****@*****.**> \n"); printf("------------------------------------------------------------ \n"); } if ((rc = getargs(argc, argv, &opt, node)) != 0) { rt_finalize(); exit(rc); } if (opt.numfiles > 1) { printf("Rendering %d scene files.\n", opt.numfiles); } for (fileindex=0; fileindex<opt.numfiles; fileindex++) { scene = rt_newscene(); /* process command line overrides */ presceneoptions(&opt, scene); filename = opt.filenames[fileindex]; if (opt.numfiles > 1) { printf("\nRendering scene file %d of %d, %s\n", fileindex+1, opt.numfiles, filename); } parsetimer=rt_timer_create(); rt_timer_start(parsetimer); len = strlen(filename); if (len > 4 && (!strcmp(filename+len-4, ".nff") || !strcmp(filename+len-4, ".NFF"))) { rc = ParseNFF(filename, scene); /* must be an NFF file */ } else if (len > 3 && (!strcmp(filename+len-3, ".ac") || !strcmp(filename+len-3, ".AC"))) { rc = ParseAC3D(filename, scene); /* Must be an AC3D file */ } #ifdef USELIBMGF else if (len > 4 && (!strcmp(filename+len-4, ".mgf") || !strcmp(filename+len-4, ".MGF"))) { rc = ParseMGF(filename, scene, 1); /* Must be an MGF file */ } #endif else { rc = readmodel(filename, scene); /* Assume its a Tachyon scene file */ } rt_timer_stop(parsetimer); if (rc == PARSENOERR && node == 0) printf("Scene Parsing Time: %10.4f seconds\n", rt_timer_time(parsetimer)); rt_timer_destroy(parsetimer); if (rc != PARSENOERR && node == 0) { switch(rc) { case PARSEBADFILE: printf("Parser failed due to nonexistent input file: %s\n", filename); break; case PARSEBADSUBFILE: printf("Parser failed due to nonexistent included file.\n"); break; case PARSEBADSYNTAX: printf("Parser failed due to an input file syntax error.\n"); break; case PARSEEOF: printf("Parser unexpectedly hit an end of file.\n"); break; case PARSEALLOCERR: printf("Parser ran out of memory.\n"); break; } if (fileindex+1 < opt.numfiles) printf("Aborting render, continuing with next scene file...\n"); else printf("Aborting render.\n"); rt_deletescene(scene); /* free the scene */ continue; /* process the next scene */ } /* process command line overrides */ postsceneoptions(&opt, scene); /* choose which rendering mode to use */ if (opt.usecamfile == 1) { return animate_scene(opt, scene, node); /* fly using prerecorded data */ } else if (strlen(opt.spaceball) > 0) { return fly_scene(opt, scene, node); /* fly with spaceball etc */ } else { if (opt.numfiles > 1 && opt.nosave != 1) { char multioutfilename[FILENAME_MAX]; sprintf(multioutfilename, opt.outfilename, fileindex); rt_outputfile(scene, multioutfilename); } rt_renderscene(scene); /* Render a single frame */ } rt_deletescene(scene); /* free the scene, get ready for next one */ } rt_finalize(); /* close down the rendering library and MPI */ freeoptions(&opt); /* free parsed command line option data */ return 0; }
/* * main loop for creating animations by playing recorded camera fly-throughs */ static int animate_scene(argoptions opt, SceneHandle scene, int node) { char outfilename[1000]; FILE * camfp; dispHandle * dh = NULL; if (node == 0) dh = tachyon_display_create(scene); /* if we have a camera file, then animate.. */ if ((camfp = fopen(opt.camfilename, "r")) != NULL) { floatvec cv, cu, cc; apivector cmv, cmu, cmc; int frameno = 0; float fps; rt_timerhandle fpstimer; rt_timerhandle animationtimer; rt_set_ui_message(NULL); rt_set_ui_progress(NULL); if (node == 0) printf("Running Camera File: %s\n", opt.camfilename); fpstimer=rt_timer_create(); animationtimer=rt_timer_create(); rt_timer_start(animationtimer); while (!feof(camfp)) { fscanf(camfp, "%f %f %f %f %f %f %f %f %f", &cv.x, &cv.y, &cv.z, &cu.x, &cu.y, &cu.z, &cc.x, &cc.y, &cc.z); cmv.x = cv.x; cmv.y = cv.y; cmv.z = cv.z; cmu.x = cu.x; cmu.y = cu.y; cmu.z = cu.z; cmc.x = cc.x; cmc.y = cc.y; cmc.z = cc.z; if (frameno != 0) { rt_timer_stop(fpstimer); fps = 1.0f / rt_timer_time(fpstimer); } else { fps = 0.0; } rt_timer_start(fpstimer); outfilename[0] = '\0'; if (opt.nosave == 1) { if (node == 0) { printf("\rRendering Frame: %9d %10.4f FPS ", frameno, fps); fflush(stdout); } } else { sprintf(outfilename, opt.outfilename, frameno); if (node == 0) { printf("\rRendering Frame to %s (%10.4f FPS) ", outfilename, fps); fflush(stdout); } } rt_outputfile(scene, outfilename); rt_camera_position(scene, cmc, cmv, cmu); rt_renderscene(scene); if (dh != NULL) tachyon_display_draw(dh); frameno++; } rt_timer_stop(animationtimer); fps = frameno / rt_timer_time(animationtimer); if (node == 0) { printf("\rCompleted animation of %d frames \n", frameno); printf("Animation Time: %10.4f seconds (Averaged %7.4f FPS)\n", rt_timer_time(animationtimer), fps); } rt_timer_destroy(fpstimer); fclose(camfp); } else { if (node == 0) { printf("Couldn't open camera file: %s\n", opt.camfilename); printf("Aborting render.\n"); } rt_deletescene(scene); /* free the scene */ rt_finalize(); /* close down the rendering library and MPI */ return -1; } if (node == 0) { printf("\nFinished Running Camera.\n"); if (dh !=NULL) tachyon_display_delete(dh); } rt_deletescene(scene); /* free the scene */ rt_finalize(); /* close down the rendering library and MPI */ return 0; }
/* * main loop for creating animations by flying using a spaceball * or other 3-D input mechanism. */ static int fly_scene(argoptions opt, SceneHandle scene, int node) { dispHandle * dh = NULL; int done = 0; int frameno = 0; float fps; rt_timerhandle fpstimer; rt_timerhandle animationtimer; char outfilename[1]; #if defined(USESPACEBALL) sbHandle * bh = NULL; #endif if (node == 0) dh = tachyon_display_create(scene); rt_set_ui_message(NULL); rt_set_ui_progress(NULL); if (node == 0) printf("Interactive Camera Flight\n"); outfilename[0] = '\0'; rt_outputfile(scene, outfilename); fpstimer=rt_timer_create(); animationtimer=rt_timer_create(); #if defined(USESPACEBALL) if (node == 0) { #if 1 bh = tachyon_init_spaceball(scene, opt.spaceball); #else if (rt_numnodes() < 2) { bh = tachyon_init_spaceball(scene, opt.spaceball); } else { printf("WARNING: Spaceball mode disabled when running with distributed memory"); } #endif } #endif rt_timer_start(animationtimer); while (!done) { if (frameno != 0) { rt_timer_stop(fpstimer); fps = 1.0f / rt_timer_time(fpstimer); } else { fps = 0.0; } rt_timer_start(fpstimer); if (node == 0) { printf("\rRendering Frame: %9d %10.4f FPS ", frameno, fps); fflush(stdout); } #if defined(USESPACEBALL) if (bh != NULL) done = tachyon_spaceball_update(bh, scene); #endif rt_renderscene(scene); if (dh != NULL) tachyon_display_draw(dh); frameno++; } rt_timer_stop(animationtimer); fps = frameno / rt_timer_time(animationtimer); if (node == 0) { printf("\rCompleted animation of %d frames \n", frameno); printf("Animation Time: %10.4f seconds (Averaged %7.4f FPS)\n", rt_timer_time(animationtimer), fps); } rt_timer_destroy(fpstimer); if (node == 0) { printf("\nFinished Running Camera.\n"); if (dh !=NULL) tachyon_display_delete(dh); } rt_deletescene(scene); /* free the scene */ rt_finalize(); /* close down the rendering library and MPI */ return 0; }
int main(int argc, char **argv) { SceneHandle scene; int i, j; apivector Ccenter, Cview, Cup; apivector ctr1, ctr2; apitexture tex1, tex2; void * vtx1, * vtx2; char fname[100]; rt_initialize(&argc, &argv); Ccenter.x=0.0; Ccenter.y=0.0; Ccenter.z=-3.0; Cview.x=0.0; Cview.y=0.0; Cview.z=1.0; Cup.x=0.0; Cup.y=1.0; Cup.z=0.0; ctr1.x=20.0; ctr1.y=20.0; ctr1.z=-40.0; ctr2.x=-20.0; ctr2.y=20.0; ctr2.z=-40.0; tex1.col.r=1.0; tex1.col.g=0.5; tex1.col.b=0.0; tex1.ambient=1.0; tex1.opacity=1.0; tex2=tex1; tex2.col.r=0.0; tex2.col.b=1.0; initspheres(); for (i=0; i<MAXFRAMES; i++) { scene = rt_newscene(); vtx1=rt_texture(scene, &tex1); vtx2=rt_texture(scene, &tex2); sprintf(fname,"outfile.%4.4d.tga",i); if (rt_mynode()==0) printf("Rendering: %s\n", fname); rt_outputfile(scene, fname); rt_resolution(scene, XRES, YRES); rt_verbose(scene, 0); rt_camera_setup(scene, 1.0, 1.0, 0, 5, Ccenter, Cview, Cup); movesp(); drawsp(scene); rt_light(scene, vtx1, ctr1, 1.0); rt_light(scene, vtx2, ctr2, 1.0); rt_renderscene(scene); rt_deletescene(scene); for (j=0; j<NUMSP; j++) free(sp[i].voidtex); } rt_finalize(); return 0; }