ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/gensurf.c
(Generate patch)

Comparing ray/src/gen/gensurf.c (file contents):
Revision 2.5 by greg, Tue Apr 12 15:16:15 1994 UTC vs.
Revision 2.6 by greg, Sat Feb 22 02:07:23 2003 UTC

# Line 1 | Line 1
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
4
5 /* Copyright (c) 1989 Regents of the University of California */
6
4   /*
5   *  gensurf.c - program to generate functional surfaces
6   *
# Line 14 | Line 11 | static char SCCSid[] = "$SunId$ LBL";
11   *  rule applied to (s,t).
12   *
13   *      4/3/87
14 + *
15 + *      4/16/02 Added conditional vertex output
16   */
17  
18   #include  "standard.h"
19  
20 < char  XNAME[] =         "X`SYS`";               /* x function name */
21 < char  YNAME[] =         "Y`SYS`";               /* y function name */
22 < char  ZNAME[] =         "Z`SYS`";               /* z function name */
20 > char  XNAME[] =         "X`SYS";                /* x function name */
21 > char  YNAME[] =         "Y`SYS";                /* y function name */
22 > char  ZNAME[] =         "Z`SYS";                /* z function name */
23  
24 + char  VNAME[] =         "valid";                /* valid vertex name */
25 +
26   #define  ABS(x)         ((x)>=0 ? (x) : -(x))
27  
28   #define  pvect(p)       printf(vformat, (p)[0], (p)[1], (p)[2])
# Line 48 | Line 49 | double  l_hermite(), l_bezier(), l_bspline(), l_datava
49   extern double  funvalue(), argument();
50  
51   typedef struct {
52 +        int  valid;     /* point is valid */
53          FVECT  p;       /* vertex position */
54          FVECT  n;       /* average normal */
55   } POINT;
# Line 134 | Line 136 | char  *argv[];
136                  compnorms(row0, row1, row2, n);
137  
138                  for (j = 0; j < n; j++) {
139 +                        int  orient = (j & 1);
140                                                          /* put polygons */
141 <                        if ((i+j) & 1)
141 >                        if (!(row0[j].valid & row1[j+1].valid))
142 >                                orient = 1;
143 >                        else if (!(row1[j].valid & row0[j+1].valid))
144 >                                orient = 0;
145 >                        if (orient)
146                                  putsquare(&row0[j], &row1[j],
147                                                  &row0[j+1], &row1[j+1]);
148                          else
# Line 158 | Line 165 | char  *file;
165   int  m, n;
166   int  pointsize;
167   {
161        extern char  *fgetword();
168          FILE  *fp;
169          char  word[64];
170          register int  size;
# Line 263 | Line 269 | POINT  *p0, *p1, *p2, *p3;
269          FVECT  v1, v2, vc1, vc2;
270          int  ok1, ok2;
271                                          /* compute exact normals */
272 <        fvsum(v1, p1->p, p0->p, -1.0);
273 <        fvsum(v2, p2->p, p0->p, -1.0);
274 <        fcross(vc1, v1, v2);
275 <        ok1 = normalize(vc1) != 0.0;
276 <        fvsum(v1, p2->p, p3->p, -1.0);
277 <        fvsum(v2, p1->p, p3->p, -1.0);
278 <        fcross(vc2, v1, v2);
279 <        ok2 = normalize(vc2) != 0.0;
272 >        ok1 = (p0->valid & p1->valid & p2->valid);
273 >        if (ok1) {
274 >                fvsum(v1, p1->p, p0->p, -1.0);
275 >                fvsum(v2, p2->p, p0->p, -1.0);
276 >                fcross(vc1, v1, v2);
277 >                ok1 = (normalize(vc1) != 0.0);
278 >        }
279 >        ok2 = (p1->valid & p2->valid & p3->valid);
280 >        if (ok2) {
281 >                fvsum(v1, p2->p, p3->p, -1.0);
282 >                fvsum(v2, p1->p, p3->p, -1.0);
283 >                fcross(vc2, v1, v2);
284 >                ok2 = (normalize(vc2) != 0.0);
285 >        }
286          if (!(ok1 | ok2))
287                  return;
288                                          /* compute normal interpolation */
# Line 348 | Line 360 | int  siz;
360   {
361          double  st[2];
362          int  end;
363 +        int  checkvalid;
364          register int  i;
365          
366          if (smooth) {
# Line 360 | Line 373 | int  siz;
373                  end = siz;
374          }
375          st[0] = s;
376 +        checkvalid = (fundefined(VNAME) == 2);
377          while (i <= end) {
378                  st[1] = (double)i/siz;
379 <                row[i].p[0] = funvalue(XNAME, 2, st);
380 <                row[i].p[1] = funvalue(YNAME, 2, st);
381 <                row[i].p[2] = funvalue(ZNAME, 2, st);
379 >                if (checkvalid && funvalue(VNAME, 2, st) <= 0.0) {
380 >                        row[i].valid = 0;
381 >                        row[i].p[0] = row[i].p[1] = row[i].p[2] = 0.0;
382 >                } else {
383 >                        row[i].valid = 1;
384 >                        row[i].p[0] = funvalue(XNAME, 2, st);
385 >                        row[i].p[1] = funvalue(YNAME, 2, st);
386 >                        row[i].p[2] = funvalue(ZNAME, 2, st);
387 >                }
388                  i++;
389          }
390   }
# Line 378 | Line 398 | int  siz;
398  
399          if (!smooth)                    /* not needed if no smoothing */
400                  return;
401 <                                        /* compute middle points */
401 >                                        /* compute row 1 normals */
402          while (siz-- >= 0) {
403 <                fvsum(v1, r2[0].p, r0[0].p, -1.0);
404 <                fvsum(v2, r1[1].p, r1[-1].p, -1.0);
403 >                if (!r1[0].valid)
404 >                        continue;
405 >                if (!r0[0].valid) {
406 >                        if (!r2[0].valid) {
407 >                                r1[0].n[0] = r1[0].n[1] = r1[0].n[2] = 0.0;
408 >                                continue;
409 >                        }
410 >                        fvsum(v1, r2[0].p, r1[0].p, -1.0);
411 >                } else if (!r2[0].valid)
412 >                        fvsum(v1, r1[0].p, r0[0].p, -1.0);
413 >                else
414 >                        fvsum(v1, r2[0].p, r0[0].p, -1.0);
415 >                if (!r1[-1].valid) {
416 >                        if (!r1[1].valid) {
417 >                                r1[0].n[0] = r1[0].n[1] = r1[0].n[2] = 0.0;
418 >                                continue;
419 >                        }
420 >                        fvsum(v2, r1[1].p, r1[0].p, -1.0);
421 >                } else if (!r1[1].valid)
422 >                        fvsum(v2, r1[0].p, r1[-1].p, -1.0);
423 >                else
424 >                        fvsum(v2, r1[1].p, r1[-1].p, -1.0);
425                  fcross(r1[0].n, v1, v2);
426                  normalize(r1[0].n);
427                  r0++; r1++; r2++;
# Line 445 | Line 485 | POINT  *p0, *p1, *p2, *p3;
485   }
486  
487  
488 + void
489   eputs(msg)
490   char  *msg;
491   {
# Line 452 | Line 493 | char  *msg;
493   }
494  
495  
496 + void
497   wputs(msg)
498   char  *msg;
499   {
# Line 459 | Line 501 | char  *msg;
501   }
502  
503  
504 + void
505   quit(code)
506   int  code;
507   {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines