| 34 |  |  | 
| 35 |  | #define  pvect(p)       printf(vformat, (p)[0], (p)[1], (p)[2]) | 
| 36 |  |  | 
| 37 | < | char  vformat[] = "%15.9g %15.9g %15.9g\n"; | 
| 38 | < | char  tsargs[] = "4 surf_dx surf_dy surf_dz surf.cal\n"; | 
| 37 | > | char  vformat[] = "%18.12g %18.12g %18.12g\n"; | 
| 38 | > | char  tsargs[] = "4 surf_dx surf_dy surf_dz surf.cal"; | 
| 39 |  | char  texname[] = "Phong"; | 
| 40 |  |  | 
| 41 |  | int  smooth = 0;                /* apply smoothing? */ | 
| 58 |  |  | 
| 59 |  | typedef struct { | 
| 60 |  | int  valid;     /* point is valid (vertex number) */ | 
| 61 | + | int  nvalid;    /* normal is valid */ | 
| 62 |  | FVECT  p;       /* vertex position */ | 
| 63 |  | FVECT  n;       /* average normal */ | 
| 64 |  | RREAL  uv[2];   /* (u,v) position */ | 
| 183 |  |  | 
| 184 |  | userror: | 
| 185 |  | fprintf(stderr, "Usage: %s material name ", argv[0]); | 
| 186 | < | fprintf(stderr, "x(s,t) y(s,t) z(s,t) m n [-s][-e expr][-f file]\n"); | 
| 186 | > | fprintf(stderr, "x(s,t) y(s,t) z(s,t) m n [-s][-o][-e expr][-f file]\n"); | 
| 187 |  | return 1; | 
| 188 |  | } | 
| 189 |  |  | 
| 198 |  | { | 
| 199 |  | FILE  *fp; | 
| 200 |  | char  word[64]; | 
| 201 | < | register int  size; | 
| 202 | < | register RREAL  *dp; | 
| 201 | > | int  size; | 
| 202 | > | RREAL  *dp; | 
| 203 |  |  | 
| 204 |  | datarec.flags = HASBORDER;              /* assume border values */ | 
| 205 |  | datarec.m = m+1; | 
| 230 |  | size--; | 
| 231 |  | } | 
| 232 |  | if (size == (m+n+1)*pointsize) {        /* no border after all */ | 
| 233 | < | dp = (RREAL *)realloc((void *)datarec.data, | 
| 233 | > | dp = (RREAL *)realloc(datarec.data, | 
| 234 |  | m*n*pointsize*sizeof(RREAL)); | 
| 235 |  | if (dp != NULL) | 
| 236 |  | datarec.data = dp; | 
| 255 |  | ) | 
| 256 |  | { | 
| 257 |  | double  u, v; | 
| 258 | < | register int  i, j; | 
| 259 | < | register RREAL  *dp; | 
| 258 | > | int  i, j; | 
| 259 | > | RREAL  *dp; | 
| 260 |  | double  d00, d01, d10, d11; | 
| 261 |  | /* compute coordinates */ | 
| 262 |  | u = argument(1); v = argument(2); | 
| 294 |  |  | 
| 295 |  | void | 
| 296 |  | putobjrow(                      /* output vertex row to .OBJ */ | 
| 297 | < | register POINT  *rp, | 
| 297 | > | POINT  *rp, | 
| 298 |  | int  n | 
| 299 |  | ) | 
| 300 |  | { | 
| 301 |  | static int      nverts = 0; | 
| 302 | + | static int      nnorms = 0; | 
| 303 |  |  | 
| 304 |  | for ( ; n-- >= 0; rp++) { | 
| 305 |  | if (!rp->valid) | 
| 306 |  | continue; | 
| 307 |  | fputs("v ", stdout); | 
| 308 |  | pvect(rp->p); | 
| 309 | < | if (smooth && !ZEROVECT(rp->n)) | 
| 309 | > | if (smooth && !ZEROVECT(rp->n)) { | 
| 310 |  | printf("\tvn %.9g %.9g %.9g\n", | 
| 311 |  | rp->n[0], rp->n[1], rp->n[2]); | 
| 312 | + | rp->nvalid = ++nnorms; | 
| 313 | + | } else | 
| 314 | + | rp->nvalid = 0; | 
| 315 |  | printf("\tvt %.9g %.9g\n", rp->uv[0], rp->uv[1]); | 
| 316 |  | rp->valid = ++nverts; | 
| 317 |  | } | 
| 349 |  | if (!(ok1 | ok2)) | 
| 350 |  | return; | 
| 351 |  | if (objout) {                   /* output .OBJ faces */ | 
| 347 | – | int     p0n=0, p1n=0, p2n=0, p3n=0; | 
| 348 | – | if (smooth) { | 
| 349 | – | if (!ZEROVECT(p0->n)) | 
| 350 | – | p0n = p0->valid; | 
| 351 | – | if (!ZEROVECT(p1->n)) | 
| 352 | – | p1n = p1->valid; | 
| 353 | – | if (!ZEROVECT(p2->n)) | 
| 354 | – | p2n = p2->valid; | 
| 355 | – | if (!ZEROVECT(p3->n)) | 
| 356 | – | p3n = p3->valid; | 
| 357 | – | } | 
| 352 |  | if (ok1 & ok2 && fdot(vc1,vc2) >= 1.0-FTINY*FTINY) { | 
| 353 |  | printf("f %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d\n", | 
| 354 | < | p0->valid, p0->valid, p0n, | 
| 355 | < | p1->valid, p1->valid, p1n, | 
| 356 | < | p3->valid, p3->valid, p3n, | 
| 357 | < | p2->valid, p2->valid, p2n); | 
| 354 | > | p0->valid, p0->valid, p0->nvalid, | 
| 355 | > | p1->valid, p1->valid, p1->nvalid, | 
| 356 | > | p3->valid, p3->valid, p3->nvalid, | 
| 357 | > | p2->valid, p2->valid, p2->nvalid); | 
| 358 |  | return; | 
| 359 |  | } | 
| 360 |  | if (ok1) | 
| 361 |  | printf("f %d/%d/%d %d/%d/%d %d/%d/%d\n", | 
| 362 | < | p0->valid, p0->valid, p0n, | 
| 363 | < | p1->valid, p1->valid, p1n, | 
| 364 | < | p2->valid, p2->valid, p2n); | 
| 362 | > | p0->valid, p0->valid, p0->nvalid, | 
| 363 | > | p1->valid, p1->valid, p1->nvalid, | 
| 364 | > | p2->valid, p2->valid, p2->nvalid); | 
| 365 |  | if (ok2) | 
| 366 |  | printf("f %d/%d/%d %d/%d/%d %d/%d/%d\n", | 
| 367 | < | p2->valid, p2->valid, p2n, | 
| 368 | < | p1->valid, p1->valid, p1n, | 
| 369 | < | p3->valid, p3->valid, p3n); | 
| 367 | > | p2->valid, p2->valid, p2->nvalid, | 
| 368 | > | p1->valid, p1->valid, p1->nvalid, | 
| 369 | > | p3->valid, p3->valid, p3->nvalid); | 
| 370 |  | return; | 
| 371 |  | } | 
| 372 |  | /* compute normal interpolation */ | 
| 376 |  | if (ok1 & ok2 && fdot(vc1,vc2) >= 1.0-FTINY*FTINY) { | 
| 377 |  | printf("\n%s ", modname); | 
| 378 |  | if (axis != -1) { | 
| 379 | < | printf("texfunc %s\n", texname); | 
| 386 | < | printf(tsargs); | 
| 379 | > | printf("texfunc %s\n%s\n", texname, tsargs); | 
| 380 |  | printf("0\n13\t%d\n", axis); | 
| 381 |  | pvect(norm[0]); | 
| 382 |  | pvect(norm[1]); | 
| 398 |  | if (ok1) { | 
| 399 |  | printf("\n%s ", modname); | 
| 400 |  | if (axis != -1) { | 
| 401 | < | printf("texfunc %s\n", texname); | 
| 409 | < | printf(tsargs); | 
| 401 | > | printf("texfunc %s\n%s\n", texname, tsargs); | 
| 402 |  | printf("0\n13\t%d\n", axis); | 
| 403 |  | pvect(norm[0]); | 
| 404 |  | pvect(norm[1]); | 
| 416 |  | if (ok2) { | 
| 417 |  | printf("\n%s ", modname); | 
| 418 |  | if (axis != -1) { | 
| 419 | < | printf("texfunc %s\n", texname); | 
| 428 | < | printf(tsargs); | 
| 419 | > | printf("texfunc %s\n%s\n", texname, tsargs); | 
| 420 |  | printf("0\n13\t%d\n", axis); | 
| 421 |  | pvect(norm[0]); | 
| 422 |  | pvect(norm[1]); | 
| 437 |  | void | 
| 438 |  | comprow(                        /* compute row of values */ | 
| 439 |  | double  s, | 
| 440 | < | register POINT  *row, | 
| 440 | > | POINT  *row, | 
| 441 |  | int  siz | 
| 442 |  | ) | 
| 443 |  | { | 
| 444 |  | double  st[2]; | 
| 445 |  | int  end; | 
| 446 |  | int  checkvalid; | 
| 447 | < | register int  i; | 
| 447 | > | int  i; | 
| 448 |  |  | 
| 449 |  | if (smooth) { | 
| 450 |  | i = -1;                 /* compute one past each end */ | 
| 478 |  |  | 
| 479 |  | void | 
| 480 |  | compnorms(              /* compute row of averaged normals */ | 
| 481 | < | register POINT  *r0, | 
| 482 | < | register POINT  *r1, | 
| 483 | < | register POINT  *r2, | 
| 481 | > | POINT  *r0, | 
| 482 | > | POINT  *r1, | 
| 483 | > | POINT  *r2, | 
| 484 |  | int  siz | 
| 485 |  | ) | 
| 486 |  | { | 
| 521 |  |  | 
| 522 |  | int | 
| 523 |  | norminterp(     /* compute normal interpolation */ | 
| 524 | < | register FVECT  resmat[4], | 
| 524 | > | FVECT  resmat[4], | 
| 525 |  | POINT  *p0, | 
| 526 |  | POINT  *p1, | 
| 527 |  | POINT  *p2, | 
| 531 |  | #define u  ((ax+1)%3) | 
| 532 |  | #define v  ((ax+2)%3) | 
| 533 |  |  | 
| 534 | < | register int  ax; | 
| 534 | > | int  ax; | 
| 535 |  | MAT4  eqnmat; | 
| 536 |  | FVECT  v1; | 
| 537 | < | register int  i, j; | 
| 537 | > | int  i, j; | 
| 538 |  |  | 
| 539 |  | if (!smooth)                    /* no interpolation if no smoothing */ | 
| 540 |  | return(-1); |