Example #1
0
/*
 * 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();
    }
  }
}
Example #2
0
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);
	}
}