void initcontours(contour **ci_ptr, float **rgbptr, int ncontours,float constval, int idir, float level_min, float level_max, int nlevels){ int i; contour *cont; float dval; dval = 0.0; if(nlevels>1){ dval = (level_max-level_min)/(float)(nlevels); } NewMemory((void **)&cont,ncontours*sizeof(contour)); *ci_ptr=cont; for(i=0;i<ncontours;i++){ contour *ci; int j; ci = cont+i; initcontour(ci,rgbptr,nlevels); ci->xyzval=constval; ci->idir=idir; for(j=0;j<nlevels+1;j++){ ci->levels[j]=level_min+j*dval; } } }
int process_contour(Image *img, Rect clipr, uchar *cimg, int w, int h, int st, uchar *colors) { int i; short *pt; int npt, apt; Contour contr; apt = 32768; pt = malloc(2 * apt * sizeof pt[0]); uchar color[4]; enum { MaxError = 5 }; /* highlight cracks */ drawrect(img, clipr, color(0x00, 0xff, 0x00, 0xff)); Tess tess[16]; for(i = 0; i < nelem(tess); i++) inittess(tess+i); initcontour(&contr, cimg, w, h, st); int fid; while((npt = nextcontour(&contr, pt, apt, 0, &fid)) != -1){ short orig[2] = { -1, -1 }; int area; int poly[4096]; int npoly; if(npt == apt){ fprintf(stderr, "out of points!\n"); continue; } area = ptarea(pt, npt, orig); if(area > 0){ if((npoly = fitpoly(poly, nelem(poly), pt, npt, MaxError)) == -1) continue; /* not enough points */ if(npoly == nelem(poly) || npoly < 3) continue; if(polyarea(pt, poly, npoly, orig) < 0){ continue; } tessaddpoly(tess+fid, pt, poly, npoly); } else { ptreverse(pt, npt); npoly = fitpoly(poly, nelem(poly), pt, npt, MaxError); if(npoly == nelem(poly) || npoly < 3) continue; if(polyarea(pt, poly, npoly, orig) < 0){ continue; } polyreverse(poly, npoly); tessaddpoly(tess+fid, pt, poly, npoly); } } free(pt); int ntris; int j; for(j = 0; j < nelem(tess); j++){ if((ntris = tesstris(tess+j, &pt)) != -1){ memcpy(color, colors+4*j, sizeof color); for(i = 0; i < ntris; i++){ //idx2color(j, color); //memcpy(color, poscolor, sizeof color); pt[6*i+0+0] += clipr.u0; pt[6*i+0+1] += clipr.v0; pt[6*i+2+0] += clipr.u0; pt[6*i+2+1] += clipr.v0; pt[6*i+4+0] += clipr.u0; pt[6*i+4+1] += clipr.v0; drawtri(img, clipr, pt+6*i+0, pt+6*i+2, pt+6*i+4, color); } free(pt); } freetess(tess+j); } return 0; }
void Init(void){ int i; FREEMEMORY(plotiso); NewMemory((void **)&plotiso,mxplot3dvars*sizeof(int)); for(i=0;i<16;i++){ if(i%5==0){ modelview_identity[i]=1.0; } else{ modelview_identity[i]=0.0; } } for(i=0;i<mxplot3dvars;i++){ plotiso[i]=nrgb/2; } for(i=0;i<16;i++){ modelview_setup[i]=0.0; } for(i=0;i<4;i++){ modelview_setup[i+4*i]=1.0; } for(i=0;i<nmeshes;i++){ mesh *meshi; meshi=meshinfo+i; initcontour(&meshi->plot3dcontour1,rgb_plot3d_contour,nrgb); initcontour(&meshi->plot3dcontour2,rgb_plot3d_contour,nrgb); initcontour(&meshi->plot3dcontour3,rgb_plot3d_contour,nrgb); } for(i=0;i<nmeshes;i++){ mesh *meshi; meshi=meshinfo+i; meshi->currentsurf.defined=0; meshi->currentsurf2.defined=0; } /* initialize box sizes, lighting parameters */ xyzbox = MAX(MAX(xbar,ybar),zbar); { char name_external[32]; strcpy(name_external,"external"); init_camera(camera_external,name_external); camera_external->view_id=EXTERNAL_LIST_ID; } if(camera_ini->defined==1){ copy_camera(camera_current,camera_ini); } else{ camera_external->zoom=zoom; copy_camera(camera_current,camera_external); } strcpy(camera_label,camera_current->name); update_camera_label(); { char name_internal[32]; strcpy(name_internal,"internal"); init_camera(camera_internal,name_internal); } camera_internal->eye[0]=0.5*xbar; camera_internal->eye[1]=0.5*ybar; camera_internal->eye[2]=0.5*zbar; camera_internal->view_id=0; copy_camera(camera_save,camera_current); copy_camera(camera_last,camera_current); init_camera_list(); add_default_views(); copy_camera(camera_external_save,camera_external); update_view_gluilist(); //reset_glui_view(i_view_list); glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); if(cullfaces==1)glEnable(GL_CULL_FACE); glClearColor(backgroundcolor[0],backgroundcolor[1],backgroundcolor[2], 0.0f); glShadeModel(GL_SMOOTH); glDisable(GL_DITHER); thistime=0; lasttime=0; /* define color bar */ UpdateRGBColors(COLORBAR_INDEX_NONE); block_ambient2[3] = 1.0; mat_ambient2[3] = 1.0; mat_specular2[3] = 1.0; reset_glui_view(startup_view_ini); Update_Show(); }