void ShowScene2(int mode, int view_mode, int quad, GLint s_left, GLint s_down){ if(rotation_type==EYE_CENTERED&&nskyboxinfo>0)draw_skybox(); if(UpdateLIGHTS==1)updateLights(light_position0,light_position1); if(mode==DRAWSCENE){ glPointSize((float)1.0); /* ++++++++++++++++++++++++ draw trees +++++++++++++++++++++++++ */ if(ntreeinfo>0){ CLIP_GEOMETRY; drawtrees(); SNIFF_ERRORS("after drawtrees"); } /* ++++++++++++++++++++++++ draw particles +++++++++++++++++++++++++ */ if(showsmoke==1){ CLIP_VALS; drawpart_frame(); } /* ++++++++++++++++++++++++ draw evacuation +++++++++++++++++++++++++ */ if(showevac==1){ CLIP_VALS; drawevac_frame(); } /* ++++++++++++++++++++++++ draw targets +++++++++++++++++++++++++ */ if(showtarget==1){ CLIP_VALS; drawTargets(); } #ifdef pp_GEOMTEST if(show_geomtest==1){ CLIP_GEOMETRY; draw_geomtestclip(); draw_geomtestoutline(); } if(show_cutcells==1)draw_geom_cutcells(); #endif /* ++++++++++++++++++++++++ draw circular vents +++++++++++++++++++++++++ */ if(ncvents>0&&visCircularVents!=VENT_HIDE){ CLIP_GEOMETRY; DrawCircVents(visCircularVents); } /* ++++++++++++++++++++++++ draw sensors/sprinklers/heat detectors +++++++++++++++++++++++++ */ CLIP_GEOMETRY; draw_devices(); #ifdef pp_PILOT draw_pilot(); #endif SNIFF_ERRORS("after draw_devices"); if(visaxislabels==1){ UNCLIP; outputAxisLabels(); SNIFF_ERRORS("after outputAxisLables"); } /* ++++++++++++++++++++++++ draw user ticks +++++++++++++++++++++++++ */ if(visUSERticks==1){ antialias(ON); UNCLIP; draw_user_ticks(); antialias(OFF); SNIFF_ERRORS("after drawticks"); } /* ++++++++++++++++++++++++ draw ticks +++++++++++++++++++++++++ */ if(visFDSticks==1&&ntickinfo>0){ UNCLIP; drawticks(); SNIFF_ERRORS("after drawticks"); } /* ++++++++++++++++++++++++ draw ticks +++++++++++++++++++++++++ */ if(showgravity==1){ UNCLIP; drawaxis(); SNIFF_ERRORS("after drawaxis"); } /* draw the box framing the simulation (corners at (0,0,0) (xbar,ybar,zbar) */ /* ++++++++++++++++++++++++ draw simulation frame (corners at (0,0,0) and (xbar,ybar,zbar) +++++++++++++++++++++++++ */ if(isZoneFireModel==0&&visFrame==1&&highlight_flag==2){ CLIP_GEOMETRY; drawoutlines(); SNIFF_ERRORS("after drawoutlines"); } if(show_rotation_center==1){ unsigned char pcolor[4]; CLIP_GEOMETRY; glPushMatrix(); glTranslatef(camera_current->xcen,camera_current->ycen,camera_current->zcen); pcolor[0]=255*foregroundcolor[0]; pcolor[1]=255*foregroundcolor[1]; pcolor[2]=255*foregroundcolor[2]; drawsphere(0.03,pcolor); glPopMatrix(); } /* ++++++++++++++++++++++++ draw mesh +++++++++++++++++++++++++ */ if(setPDIM==1){ if(visGrid!=noGridnoProbe){ int igrid; mesh *meshi; UNCLIP; for(igrid=0;igrid<nmeshes;igrid++){ meshi=meshinfo+igrid; drawgrid(meshi); SNIFF_ERRORS("drawgrid"); } } } } /* end of if(mode==DRAWSCENE) code segment */ /* ++++++++++++++++++++++++ draw selected devices +++++++++++++++++++++++++ */ if(mode==SELECTOBJECT){ if(select_device==1){ CLIP_GEOMETRY; draw_devices(); SNIFF_ERRORS("after drawselect_devices"); return; } } /* ++++++++++++++++++++++++ draw selected avatars +++++++++++++++++++++++++ */ if(mode==SELECTOBJECT){ if(select_avatar==1){ CLIP_GEOMETRY; drawselect_avatars(); SNIFF_ERRORS("after drawselect_avatars"); return; } } /* ++++++++++++++++++++++++ draw selected tours +++++++++++++++++++++++++ */ if(mode==SELECTOBJECT){ if(edittour==1&&ntours>0){ CLIP_GEOMETRY; drawselect_tours(); SNIFF_ERRORS("after drawselect_tours"); return; } } /* ++++++++++++++++++++++++ draw tours +++++++++++++++++++++++++ */ if(showtours==1){ CLIP_GEOMETRY; drawtours(); SNIFF_ERRORS("after drawtours"); } /* ++++++++++++++++++++++++ draw stereo parallax indicator +++++++++++++++++++++++++ */ if(show_parallax==1){ UNCLIP; antialias(ON); glLineWidth(linewidth); glBegin(GL_LINES); glColor3fv(foregroundcolor); glVertex3f(0.75,0.0,0.25); glVertex3f(0.75,1.0,0.25); glEnd(); antialias(OFF); } /* ++++++++++++++++++++++++ draw blockages +++++++++++++++++++++++++ */ CLIP_GEOMETRY; drawBlockages(mode,DRAW_OPAQUE); SNIFF_ERRORS("drawBlockages"); /* ++++++++++++++++++++++++ draw triangles +++++++++++++++++++++++++ */ if(ngeominfoptrs>0){ CLIP_GEOMETRY; draw_geom(DRAW_OPAQUE,GEOM_STATIC); draw_geom(DRAW_OPAQUE,GEOM_DYNAMIC); } /* ++++++++++++++++++++++++ draw shooter points +++++++++++++++++++++++++ */ if(showshooter!=0&&shooter_active==1){ CLIP_VALS; draw_shooter(); } /* ++++++++++++++++++++++++ draw terrain +++++++++++++++++++++++++ */ if(visTerrainType!=TERRAIN_HIDDEN&&nterraininfo>0){ int i; //shaded 17 0 //stepped 18 1 //line 19 2 //texture 20 3 //hidden 20 4 CLIP_GEOMETRY; for(i=0;i<nterraininfo;i++){ terraindata *terri; int only_geom; terri = terraininfo + i; if(terri->loaded==1){ only_geom=0; } else{ only_geom=1; } switch(visTerrainType){ case TERRAIN_3D: drawterrain(terri,only_geom); break; case TERRAIN_2D_STEPPED: if(cullfaces==1)glDisable(GL_CULL_FACE); glPushMatrix(); glScalef(SCALE2SMV(1.0),SCALE2SMV(1.0),SCALE2SMV(1.0)); glTranslatef(-xbar0,-ybar0,-zbar0); DrawContours(&meshinfo[i].terrain_contour); glPopMatrix(); if(cullfaces==1)glEnable(GL_CULL_FACE); break; case TERRAIN_2D_LINE: glPushMatrix(); glScalef(SCALE2SMV(1.0),SCALE2SMV(1.0),SCALE2SMV(1.0)); glTranslatef(-xbar0,-ybar0,-zbar0); DrawLineContours(&meshinfo[i].terrain_contour,1.0); glPopMatrix(); break; case TERRAIN_3D_MAP: if(terrain_texture!=NULL&&terrain_texture->loaded==1){ drawterrain_texture(terri,only_geom); } else{ drawterrain(terri,only_geom); } break; default: ASSERT(FFALSE); break; } } } /* ++++++++++++++++++++++++ draw slice files +++++++++++++++++++++++++ */ if(show_gslice_triangles==1||show_gslice_normal==1||show_gslice_normal_keyboard==1||show_gslice_triangulation==1){ CLIP_VALS; drawgslice_outline(); } if((show_slices_and_vectors==1&&showvslice==1)||(showslice==1&&use_transparency_data==0)){ CLIP_VALS; drawslice_frame(); } /* ++++++++++++++++++++++++ draw boundary files +++++++++++++++++++++++++ */ if(showpatch==1){ CLIP_VALS; drawpatch_frame(); } /* ++++++++++++++++++++++++ draw labels +++++++++++++++++++++++++ */ if(visLabels==1){ CLIP_GEOMETRY; drawLabels(); } /* ++++++++++++++++++++++++ draw animated isosurfaces +++++++++++++++++++++++++ */ //if(isoinfo!=NULL)drawspherepoints(sphereinfo); if(showiso==1){ CLIP_VALS; drawiso(DRAW_OPAQUE); } /* ++++++++++++++++++++++++ draw zone fire modeling info +++++++++++++++++++++++++ */ if(nrooms>0){ CLIP_GEOMETRY; drawroomgeom(); SNIFF_ERRORS("after drawroomgeom"); } if(nrooms>0){ if(showzone==1){ CLIP_VALS; drawfiredata(); SNIFF_ERRORS("after drawroomdata"); if(ReadZoneFile==1&&nzvents>0){ drawventdata(); SNIFF_ERRORS("after drawventdata"); } } } //********************************************************************************** //********************************************************************************** //********************************************************************************** // nothing transparent should be drawn before this portion of the code // (ie draw all opaque objects first then draw transparent objects //********************************************************************************** //********************************************************************************** //********************************************************************************** /* ++++++++++++++++++++++++ draw triangles +++++++++++++++++++++++++ */ if(ngeominfoptrs>0){ CLIP_GEOMETRY; draw_geom(DRAW_TRANSPARENT,GEOM_STATIC); draw_geom(DRAW_TRANSPARENT,GEOM_DYNAMIC); } if(showiso==1){ CLIP_VALS; drawiso(DRAW_TRANSPARENT); } /* ++++++++++++++++++++++++ draw transparent faces +++++++++++++++++++++++++ */ CLIP_GEOMETRY; draw_transparent_faces(); /* ++++++++++++++++++++++++ draw 3D smoke +++++++++++++++++++++++++ */ if(show3dsmoke==1||showvolrender==1){ CLIP_VALS; drawsmoke_frame(); } if(active_smokesensors==1&&show_smokesensors!=0){ CLIP_VALS; getsmokesensors(); draw_devices_val(); } /* ++++++++++++++++++++++++ draw zone fire modeling info +++++++++++++++++++++++++ */ if(nrooms>0&&showzone==1){ CLIP_VALS; drawroomdata(); SNIFF_ERRORS("after drawroomdata"); } /* ++++++++++++++++++++++++ draw slice files +++++++++++++++++++++++++ */ if((show_slices_and_vectors==1&&showvslice==1)||(showslice==1&&use_transparency_data==1)){ CLIP_VALS; drawslice_frame(); SNIFF_ERRORS("after drawslice_frame"); } /* ++++++++++++++++++++++++ draw transparent blockages +++++++++++++++++++++++++ */ // draw_demo(20,20); // draw_demo2(1); CLIP_GEOMETRY; drawBlockages(mode,DRAW_TRANSPARENT); SNIFF_ERRORS("after drawBlokcages"); /* ++++++++++++++++++++++++ draw vector slice files +++++++++++++++++++++++++ */ if(showvslice==1){ CLIP_VALS; drawvslice_frame(); } SNIFF_ERRORS("after drawvslice"); /* ++++++++++++++++++++++++ draw plot3d files +++++++++++++++++++++++++ */ if(showplot3d==1){ CLIP_VALS; drawplot3d_frame(); } SNIFF_ERRORS("after drawplot3d"); }
/** * master hook function for the 'tracker' command used to create * copies of objects along a spline path. */ int f_tracker(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc, const char *argv[]) { size_t ret; struct spline s; vect_t *verts = (vect_t *)NULL; struct link *links = (struct link *)NULL; int opt; size_t i, j, k, inc; size_t n_verts, n_links; int arg = 1; FILE *points = (FILE *)NULL; char tok[81] = {0}, line[81] = {0}; char ch; fastf_t totlen = 0.0; fastf_t len, olen; fastf_t dist_to_next; fastf_t min, max, mid; fastf_t pt[3] = {0}; int no_draw = 0; /* allow interrupts */ if (setjmp(jmp_env) == 0) (void)signal(SIGINT, sig3); else return TCL_OK; bu_optind = 1; while ((opt = bu_getopt(argc, (char * const *)argv, "fh")) != EOF) { switch (opt) { case 'f': no_draw = 1; arg++; break; case 'h': Tcl_AppendResult(interp, "tracker [-fh] [# links] [increment] [spline.iges] [link...]\n\n", (char *)NULL); Tcl_AppendResult(interp, "-f:\tDo not draw the links as they are made.\n", (char *)NULL); Tcl_AppendResult(interp, "-h:\tPrint this message.\n\n", (char *)NULL); Tcl_AppendResult(interp, "\tThe prototype link(s) should be placed so that one\n", (char *)NULL); Tcl_AppendResult(interp, "\tpin's vertex lies on the origin and points along the\n", (char *)NULL); Tcl_AppendResult(interp, "\ty-axis, and the link should lie along the positive x-axis.\n\n", (char *)NULL); Tcl_AppendResult(interp, "\tIf two or more sublinks comprise the link, they are specified in this manner:\n", (char *)NULL); Tcl_AppendResult(interp, "\t<link1> <%% of total link> <link2> <%% of total link> ....\n", (char *)NULL); return TCL_OK; } } if (argc < arg+1) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter number of links: ", (char *)NULL); return TCL_ERROR; } n_verts = atoi(argv[arg++])+1; if (argc < arg+1) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter amount to increment parts by: ", (char *)NULL); return TCL_ERROR; } inc = atoi(argv[arg++]); if (argc < arg+1) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter spline file name: ", (char *)NULL); return TCL_ERROR; } if ((points = fopen(argv[arg++], "r")) == NULL) { fprintf(stdout, "tracker: couldn't open points file %s.\n", argv[arg-1]); return TCL_ERROR; } if (argc < arg+1) { Tcl_AppendResult(interp, MORE_ARGS_STR, "Enter prototype link name: ", (char *)NULL); fclose(points); return TCL_ERROR; } /* Prepare vert list *****************************/ n_links = ((argc-3)/2)>1?((argc-3)/2):1; verts = (vect_t *)malloc(sizeof(vect_t) * n_verts * (n_links+2)); /* Read in links names and link lengths **********/ links = (struct link *)malloc(sizeof(struct link)*n_links); for (i = arg; i < (size_t)argc; i+=2) { double scan; bu_vls_strcpy(&links[(i-arg)/2].name, argv[i]); if (argc > arg+1) { sscanf(argv[i+1], "%lf", &scan); /* double to fastf_t */ links[(i-arg)/2].pct = scan; } else { links[(i-arg)/2].pct = 1.0; } totlen += links[(i-arg)/2].pct; } if (!ZERO(totlen - 1.0)) fprintf(stdout, "ERROR\n"); /* Read in knots from specified file *************/ do bu_fgets(line, 81, points); while (!BU_STR_EQUAL(strtok(line, ","), "112")); bu_strlcpy(tok, strtok(NULL, ","), sizeof(tok)); bu_strlcpy(tok, strtok(NULL, ","), sizeof(tok)); bu_strlcpy(tok, strtok(NULL, ","), sizeof(tok)); bu_strlcpy(tok, strtok(NULL, ","), sizeof(tok)); s.n_segs = atoi(tok); s.t = (fastf_t *)bu_malloc(sizeof(fastf_t) * (s.n_segs+1), "t"); s.k = (struct knot *)bu_malloc(sizeof(struct knot) * (s.n_segs+1), "k"); for (i = 0; i <= s.n_segs; i++) { bu_strlcpy(tok, strtok(NULL, ","), sizeof(tok)); if (strstr(tok, "P") != NULL) { bu_fgets(line, 81, points); bu_fgets(line, 81, points); bu_strlcpy(tok, strtok(line, ","), sizeof(tok)); } s.t[i] = atof(tok); } for (i = 0; i <= s.n_segs; i++) for (j = 0; j < 3; j++) { for (k = 0; k < 4; k++) { bu_strlcpy(tok, strtok(NULL, ","), sizeof(tok)); if (strstr(tok, "P") != NULL) { bu_fgets(line, 81, points); bu_fgets(line, 81, points); bu_strlcpy(tok, strtok(line, ","), sizeof(tok)); } s.k[i].c[j][k] = atof(tok); } s.k[i].pt[j] = s.k[i].c[j][0]; } fclose(points); /* Interpolate link vertices *********************/ for (i = 0; i < s.n_segs; i++) /* determine initial track length */ totlen += DIST_PT_PT(s.k[i].pt, s.k[i+1].pt); len = totlen/(n_verts-1); VMOVE(verts[0], s.k[0].pt); olen = 2*len; for (i = 0; (fabs(olen-len) >= VUNITIZE_TOL) && (i < 250); i++) { /* number of track iterations */ fprintf(stdout, "."); fflush(stdout); for (j = 0; j < n_links; j++) /* set length of each link based on current track length */ links[j].len = len * links[j].pct; min = 0; max = s.t[s.n_segs]; mid = 0; for (j = 0; j < n_verts+1; j++) /* around the track once */ for (k = 0; k < n_links; k++) { /* for each sub-link */ if ((k == 0) && (j == 0)) {continue;} /* the first sub-link of the first link is already in position */ min = mid; max = s.t[s.n_segs]; mid = (min+max)/2; interp_spl(mid, s, pt); dist_to_next = (k > 0) ? links[k-1].len : links[n_links-1].len; /* links[k].len;*/ while (fabs(DIST_PT_PT(verts[n_links*j+k-1], pt) - dist_to_next) >= VUNITIZE_TOL) { if (DIST_PT_PT(verts[n_links*j+k-1], pt) > dist_to_next) { max = mid; mid = (min+max)/2; } else { min = mid; mid = (min+max)/2; } interp_spl(mid, s, pt); if (fabs(min-max) <= VUNITIZE_TOL) {break;} } interp_spl(mid, s, verts[n_links*j+k]); } interp_spl(s.t[s.n_segs], s, verts[n_verts*n_links-1]); totlen = 0.0; for (j = 0; j < n_verts*n_links-1; j++) totlen += DIST_PT_PT(verts[j], verts[j+1]); olen = len; len = totlen/(n_verts-1); } fprintf(stdout, "\n"); /* Write out interpolation info ******************/ fprintf(stdout, "%ld Iterations; Final link lengths:\n", (unsigned long)i); for (i = 0; i < n_links; i++) fprintf(stdout, " %s\t%.15f\n", bu_vls_addr(&links[i].name), links[i].len); fflush(stdin); /* Place links on vertices ***********************/ fprintf(stdout, "Continue? [y/n] "); ret = fscanf(stdin, "%c", &ch); if (ret != 1) perror("fscanf"); if (ch == 'y') { struct clone_state state; struct directory **dps = (struct directory **)NULL; char *vargs[3]; for (i = 0; i < 2; i++) vargs[i] = (char *)bu_calloc(CLONE_BUFSIZE, sizeof(char), "alloc vargs[i]"); vargs[0][0] = 'e'; state.interp = interp; state.incr = inc; state.n_copies = 1; state.draw_obj = 0; state.miraxis = W; dps = (struct directory **)bu_calloc(n_links, sizeof(struct directory *), "alloc dps array"); /* rots = (vect_t *)bu_malloc(sizeof(vect_t)*n_links, "alloc rots");*/ for (i = 0; i < n_links; i++) { /* global dbip */ dps[i] = db_lookup(dbip, bu_vls_addr(&links[i].name), LOOKUP_QUIET); /* VSET(rots[i], 0, 0, 0);*/ } for (i = 0; i < n_verts-1; i++) { for (j = 0; j < n_links; j++) { if (i == 0) { VSCALE(state.trans, verts[n_links*i+j], local2base); } else VSUB2SCALE(state.trans, verts[n_links*(i-1)+j], verts[n_links*i+j], local2base); VSCALE(state.rpnt, verts[n_links*i+j], local2base); VSUB2(pt, verts[n_links*i+j], verts[n_links*i+j+1]); VSET(state.rot, 0, (M_PI - atan2(pt[Z], pt[X])), -atan2(pt[Y], sqrt(pt[X]*pt[X]+pt[Z]*pt[Z]))); VSCALE(state.rot, state.rot, RAD2DEG); /* VSUB2(state.rot, state.rot, rots[j]); VADD2(rots[j], state.rot, rots[j]); */ state.src = dps[j]; /* global dbip */ dps[j] = copy_object(dbip, &rt_uniresource, &state); bu_strlcpy(vargs[1], dps[j]->d_namep, CLONE_BUFSIZE); if (!no_draw || !is_dm_null()) { drawtrees(2, (const char **)vargs, 1); size_reset(); new_mats(); color_soltab(); refresh(); } fprintf(stdout, "."); fflush(stdout); } } fprintf(stdout, "\n"); bu_free(dps, "free dps array"); for (i = 0; i < 2; i++) bu_free(vargs[i], "free vargs[i]"); } free(s.t); free(s.k); free(links); free(verts); (void)signal(SIGINT, SIG_IGN); return TCL_OK; }