| 8 |
|
*/ |
| 9 |
|
|
| 10 |
|
#include <stdlib.h> |
| 11 |
+ |
#include <ctype.h> |
| 12 |
+ |
#include "platform.h" |
| 13 |
|
#include "rtio.h" |
| 14 |
|
#include "rtmath.h" |
| 15 |
|
#include "random.h" |
| 23 |
|
|
| 24 |
|
#define SURF_EPS 0.0005 /* surface testing epsilon */ |
| 25 |
|
|
| 24 |
– |
char *progname; /* global argv[0] */ |
| 25 |
– |
|
| 26 |
|
int nsamps = NSAMPLES; /* number of samples to use */ |
| 27 |
|
|
| 28 |
|
char temp_octree[128]; /* temporary octree */ |
| 39 |
|
#define NAME_FLD 1 /* name field always first? */ |
| 40 |
|
|
| 41 |
|
#define SS_BASE_FLD 4 /* subsurface base surface */ |
| 42 |
< |
#define SS_VERT_FLD 10 /* subsurface vertex count */ |
| 42 |
> |
#define SS_VERT_FLD 9 /* subsurface vertex count */ |
| 43 |
|
|
| 44 |
|
typedef struct { |
| 45 |
|
const char *pname; /* object type name */ |
| 176 |
|
static IDF_FIELD * |
| 177 |
|
get_vlist(IDF_OBJECT *param, const char *zname) |
| 178 |
|
{ |
| 179 |
< |
static const int itm_len = sizeof(IDF_FIELD)+6; |
| 179 |
> |
#define itm_len (sizeof(IDF_FIELD)+6) |
| 180 |
|
static char fld_buf[4*itm_len]; |
| 181 |
|
static char *next_fbp = fld_buf; |
| 182 |
|
int i; |
| 203 |
|
} |
| 204 |
|
res = idf_getfield(param, surf_type[i].vert_fld); |
| 205 |
|
} |
| 206 |
< |
if (!res->val[0]) { /* hack for missing #vert */ |
| 206 |
> |
if (!res->val[0] || tolower(res->val[0]) == 'a') { /* autocalculate */ |
| 207 |
|
IDF_FIELD *fptr; |
| 208 |
|
if (next_fbp >= fld_buf+sizeof(fld_buf)) |
| 209 |
|
next_fbp = fld_buf; |
| 219 |
|
sprintf(res->val, "%d", i/3); |
| 220 |
|
} |
| 221 |
|
return(res); |
| 222 |
+ |
#undef itm_len |
| 223 |
|
} |
| 224 |
|
|
| 225 |
|
/* Get/allocate surface polygon */ |
| 362 |
|
IDF_FIELD *fptr; |
| 363 |
|
int i, j, n; |
| 364 |
|
/* start oconv command */ |
| 365 |
< |
sprintf(cbuf, "oconv - > '%s'", temp_octree); |
| 365 |
> |
sprintf(cbuf, "oconv - > \"%s\"", temp_octree); |
| 366 |
|
if ((ofp = popen(cbuf, "w")) == NULL) { |
| 367 |
|
fputs(progname, stderr); |
| 368 |
|
fputs(": cannot open oconv process\n", stderr); |
| 392 |
|
/* now subsurfaces */ |
| 393 |
|
if (zp->ntotal > zp->nsurf) { |
| 394 |
|
if (zp->area_redu != NULL) |
| 395 |
< |
memset(zp->area_redu, 0, sizeof(float)*zp->nsurf); |
| 396 |
< |
else if ((zp->area_redu = (float *)calloc(zp->nsurf, |
| 395 |
> |
memset(zp->area_redu, 0, sizeof(float)*zp->ntotal); |
| 396 |
> |
else if ((zp->area_redu = (float *)calloc(zp->ntotal, |
| 397 |
|
sizeof(float))) == NULL) |
| 398 |
|
return(0); |
| 399 |
|
} |
| 532 |
|
dv[2]*ps->sdir[2][j] ; |
| 533 |
|
} |
| 534 |
|
/* send to our process */ |
| 535 |
< |
writebuf(ps->wd, (char *)samp, sizeof(float)*6*ns); |
| 535 |
> |
writebuf(ps->wd, samp, sizeof(float)*6*ns); |
| 536 |
|
free(samp); /* that's it! */ |
| 537 |
|
return(1); |
| 538 |
|
} |
| 603 |
|
else /* comp. for subsurface area */ |
| 604 |
|
adj_factor /= adj_factor - zp->area_redu[n]; |
| 605 |
|
/* read results */ |
| 606 |
< |
if (readbuf(pd->r, (char *)uvfa, sizeof(float)*3*zp->ntotal) != |
| 606 |
> |
if (readbuf(pd->r, uvfa, sizeof(float)*3*zp->ntotal) != |
| 607 |
|
sizeof(float)*3*zp->ntotal) { |
| 608 |
|
fputs(progname, stderr); |
| 609 |
|
fputs(": read error from rcontrib process\n", stderr); |
| 653 |
|
for (zptr = zone_list; zptr != NULL; zptr = zptr->next) { |
| 654 |
|
SUBPROC rcproc; |
| 655 |
|
/* start rcontrib process */ |
| 656 |
+ |
rcproc = sp_inactive; |
| 657 |
|
if (!start_rcontrib(&rcproc, zptr)) |
| 658 |
|
return(0); |
| 659 |
|
/* compute+add view factors */ |
| 678 |
|
IDF_OBJECT *pptr; |
| 679 |
|
int i; |
| 680 |
|
|
| 681 |
< |
progname = *argv++; argc--; /* get options if any */ |
| 681 |
> |
fixargv0(*argv++); argc--; /* get options if any */ |
| 682 |
|
while (argc > 1 && argv[0][0] == '-') |
| 683 |
|
switch (argv[0][1]) { |
| 684 |
|
case 'c': /* elide comments */ |
| 709 |
|
fputs("'\n", stderr); |
| 710 |
|
return(1); |
| 711 |
|
} |
| 712 |
+ |
/* check version (warning) */ |
| 713 |
+ |
if ((pptr = idf_getobject(our_idf, "Version")) != NULL && |
| 714 |
+ |
pptr->flist != NULL && pptr->flist->val[0] != '9') { |
| 715 |
+ |
fputs(progname, stderr); |
| 716 |
+ |
fputs(": warning - written for IDF version 9.x, not ", |
| 717 |
+ |
stderr); |
| 718 |
+ |
fputs(pptr->flist->val, stderr); |
| 719 |
+ |
fputc('\n', stderr); |
| 720 |
+ |
} |
| 721 |
|
/* remove existing UVFs */ |
| 722 |
|
if ((pptr = idf_getobject(our_idf, UVF_PNAME)) != NULL) { |
| 723 |
|
IDF_OBJECT *pnext; |
| 726 |
|
do { |
| 727 |
|
pnext = pptr->pnext; |
| 728 |
|
idf_delobject(our_idf, pptr); |
| 729 |
< |
} while (pnext != NULL); |
| 729 |
> |
} while ((pptr = pnext) != NULL); |
| 730 |
|
} |
| 731 |
|
/* add to header */ |
| 732 |
|
if (our_idf->hrem == NULL || |