/* * map() maps a M2 x M1 source image fsource[i][j] onto an N2 x N1 target * image ftarget[i][j] with the mapping * ftarget(r) += fsource(r + d) * where the deflection d = (di, dj) is supplied by function deflection() * * we use the slightly confusing notation (i,j) -> (y, x) */ void map(float **ftarget, int N1, int N2, float **fsource, int M1, int M2, int (*deflection)(float ri, float rj, float *di, float *dj)) { int i, j, index, goodtriangle; float di, dj; vert *point[3], *basevert; /* set source image globals */ gfsource = fsource; gftarget = ftarget; gM1 = M1; gM2 = M2; for (i = 0; i < N2; i++) { gtargeti = i; for (j = 0; j < N1; j++) { gtargetj = j; gfsum = gareasum = 0.0; /* do the upper triangle */ point[0] = makevertex(j, i + 1); point[1] = makevertex(j + 1, i + 1); point[2] = makevertex(j + 1, i); goodtriangle = 1; for (index = 0; index < 3; index++) { goodtriangle *= deflection(point[index]->y, point[index]->x, &di, &dj); point[index]->y += di; point[index]->x += dj; } if (goodtriangle) { makering(&basevert, point, 3); if (globalmapmode == INVERSEMAPMODE) { garea = trianglearea(basevert); } decompose(basevert); } /* do the lower triangle */ point[0] = makevertex(j, i + 1); point[1] = makevertex(j, i); point[2] = makevertex(j + 1, i); goodtriangle = 1; for (index = 0; index < 3; index++) { goodtriangle *= deflection(point[index]->y, point[index]->x, &di, &dj); point[index]->y += di; point[index]->x += dj; } if (goodtriangle) { makering(&basevert, point, 3); if (globalmapmode == INVERSEMAPMODE) { garea = trianglearea(basevert); } decompose(basevert); } /* now add the pixel value */ if ((gareasum > 0.0) && (globalmapmode == FORWARDMAPMODE)) { ftarget[i][j] = gfsum / gareasum; } freeverts(); } } }
void wfreadobj( /* read in .OBJ file and convert */ char *objfn ) { FILE *fp; char *argv[MAXARG]; int argc; int nstats, nunknown; if (objfn == NULL) { inpfile = "<stdin>"; fp = stdin; } else if ((fp = fopen(inpfile=objfn, "r")) == NULL) { sprintf(errmsg, "cannot open \"%s\"", inpfile); error(USER, errmsg); } havemats = (nobjects > 0); nstats = nunknown = 0; material[0] = '\0'; group[0] = '\0'; lineno = 0; faceno = 0; /* scan until EOF */ while ( (argc = getstmt(argv, fp)) ) { switch (argv[0][0]) { case 'v': /* vertex */ switch (argv[0][1]) { case '\0': /* point */ if (badarg(argc-1,argv+1,"fff")) syntax("bad vertex"); newv(atof(argv[1]), atof(argv[2]), atof(argv[3])); break; case 'n': /* normal */ if (argv[0][2]) goto unknown; if (badarg(argc-1,argv+1,"fff")) syntax("bad normal"); if (!newvn(atof(argv[1]), atof(argv[2]), atof(argv[3]))) syntax("zero normal"); break; case 't': /* coordinate */ if (argv[0][2]) goto unknown; if (badarg(argc-1,argv+1,"ff")) goto unknown; newvt(atof(argv[1]), atof(argv[2])); break; default: goto unknown; } break; case 'f': /* face */ if (argv[0][1]) goto unknown; faceno++; switch (argc-1) { case 0: case 1: case 2: syntax("too few vertices"); break; case 3: if (!puttri(argv[1], argv[2], argv[3])) syntax("bad triangle"); break; default: if (!putface(argc-1, argv+1)) syntax("bad face"); break; } break; case 'u': /* usemtl/usemap */ if (!strcmp(argv[0], "usemap")) break; if (strcmp(argv[0], "usemtl")) goto unknown; if (argc > 1) strcpy(material, argv[1]); else material[0] = '\0'; break; case 'o': /* object name */ if (argv[0][1]) goto unknown; break; case 'g': /* group name */ if (argv[0][1]) goto unknown; if (argc > 1) strcpy(group, argv[1]); else group[0] = '\0'; break; case '#': /* comment */ break; default:; /* something we don't deal with */ unknown: nunknown++; break; } nstats++; } /* clean up */ freeverts(); fclose(fp); if (nunknown > 0) { sprintf(errmsg, "%d of %d statements unrecognized", nunknown, nstats); error(WARNING, errmsg); } }