| 7 |
|
/* |
| 8 |
|
* Convert a Wavefront .obj file to Radiance format. |
| 9 |
|
* |
| 10 |
< |
* Currently, we support only polygonal geometry, and faces |
| 11 |
< |
* must be either quads or triangles for smoothing to work. |
| 10 |
> |
* Currently, we support only polygonal geometry. Non-planar |
| 11 |
> |
* faces are broken rather haphazardly into triangles. |
| 12 |
|
* Also, texture map indices only work for triangles, though |
| 13 |
|
* I'm not sure they work correctly. |
| 14 |
|
*/ |
| 465 |
|
} |
| 466 |
|
|
| 467 |
|
|
| 468 |
< |
putface(ac, av) /* put out an N-sided polygon */ |
| 468 |
> |
nonplanar(ac, av) /* are vertices are non-planar? */ |
| 469 |
|
register int ac; |
| 470 |
|
register char **av; |
| 471 |
|
{ |
| 472 |
|
VNDX vi; |
| 473 |
+ |
FLOAT *p0, *p1; |
| 474 |
+ |
FVECT v1, v2, nsum, newn; |
| 475 |
+ |
double d; |
| 476 |
+ |
register int i; |
| 477 |
+ |
|
| 478 |
+ |
if (!cvtndx(vi, av[0])) |
| 479 |
+ |
return(0); |
| 480 |
+ |
if (vi[2] >= 0) |
| 481 |
+ |
return(1); /* has interpolated normals */ |
| 482 |
+ |
if (ac < 4) |
| 483 |
+ |
return(0); /* it's a triangle! */ |
| 484 |
+ |
/* set up */ |
| 485 |
+ |
p0 = vlist[vi[0]]; |
| 486 |
+ |
if (!cvtndx(vi, av[1])) |
| 487 |
+ |
return(0); /* error gets caught later */ |
| 488 |
+ |
nsum[0] = nsum[1] = nsum[2] = 0.; |
| 489 |
+ |
p1 = vlist[vi[0]]; |
| 490 |
+ |
fvsum(v2, p1, p0, -1.0); |
| 491 |
+ |
for (i = 2; i < ac; i++) { |
| 492 |
+ |
VCOPY(v1, v2); |
| 493 |
+ |
if (!cvtndx(vi, av[i])) |
| 494 |
+ |
return(0); |
| 495 |
+ |
p1 = vlist[vi[0]]; |
| 496 |
+ |
fvsum(v2, p1, p0, -1.0); |
| 497 |
+ |
fcross(newn, v1, v2); |
| 498 |
+ |
if (normalize(newn) == 0.0) { |
| 499 |
+ |
if (i < 3) |
| 500 |
+ |
return(1); /* can't deal with this */ |
| 501 |
+ |
fvsum(nsum, nsum, nsum, 1./(i-2)); |
| 502 |
+ |
continue; |
| 503 |
+ |
} |
| 504 |
+ |
d = fdot(newn,nsum); |
| 505 |
+ |
if (d >= 0) { |
| 506 |
+ |
if (d < (1.0-FTINY)*(i-2)) |
| 507 |
+ |
return(1); |
| 508 |
+ |
fvsum(nsum, nsum, newn, 1.0); |
| 509 |
+ |
} else { |
| 510 |
+ |
if (d > -(1.0-FTINY)*(i-2)) |
| 511 |
+ |
return(1); |
| 512 |
+ |
fvsum(nsum, nsum, newn, -1.0); |
| 513 |
+ |
} |
| 514 |
+ |
} |
| 515 |
+ |
return(0); |
| 516 |
+ |
} |
| 517 |
+ |
|
| 518 |
+ |
|
| 519 |
+ |
putface(ac, av) /* put out an N-sided polygon */ |
| 520 |
+ |
int ac; |
| 521 |
+ |
register char **av; |
| 522 |
+ |
{ |
| 523 |
+ |
VNDX vi; |
| 524 |
|
char *mod; |
| 525 |
+ |
register int i; |
| 526 |
|
|
| 527 |
+ |
if (nonplanar(ac, av)) { /* break into quads and triangles */ |
| 528 |
+ |
while (ac > 3) { |
| 529 |
+ |
if (!putquad(av[0], av[1], av[2], av[3])) |
| 530 |
+ |
return(0); |
| 531 |
+ |
ac -= 2; /* remove two vertices */ |
| 532 |
+ |
for (i = 1; i < ac; i++) |
| 533 |
+ |
av[i] = av[i+2]; |
| 534 |
+ |
} |
| 535 |
+ |
if (ac == 3 && !puttri(av[0], av[1], av[2])) |
| 536 |
+ |
return(0); |
| 537 |
+ |
return(1); |
| 538 |
+ |
} |
| 539 |
|
if ((mod = getmtl()) == NULL) |
| 540 |
|
return(-1); |
| 541 |
|
printf("\n%s polygon %s.%d\n", mod, getonm(), faceno); |
| 542 |
|
printf("0\n0\n%d\n", 3*ac); |
| 543 |
< |
while (ac--) { |
| 544 |
< |
if (!cvtndx(vi, *av++)) |
| 543 |
> |
for (i = 0; i < ac; i++) { |
| 544 |
> |
if (!cvtndx(vi, av[i])) |
| 545 |
|
return(0); |
| 546 |
|
pvect(vlist[vi[0]]); |
| 547 |
|
} |
| 691 |
|
axis = norminterp(norm, p0i, p1i, p2i, p3i); |
| 692 |
|
|
| 693 |
|
/* put out quadrilateral? */ |
| 694 |
< |
if (ok1 & ok2 && fdot(vc1,vc2) >= 1.0-FTINY*FTINY) { |
| 694 |
> |
if (ok1 & ok2 && fabs(fdot(vc1,vc2)) >= 1.0-FTINY) { |
| 695 |
|
printf("\n%s ", mod); |
| 696 |
|
if (axis != -1) { |
| 697 |
|
printf("texfunc %s\n", TEXNAME); |