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

Comparing ray/src/common/tmesh.c (file contents):
Revision 2.1 by greg, Mon Mar 10 19:38:19 2003 UTC vs.
Revision 2.6 by greg, Thu Apr 15 23:51:04 2021 UTC

# Line 6 | Line 6 | static const char RCSid[] = "$Id$";
6   */
7  
8   #include <stdio.h>
9
9   #include "fvect.h"
11
10   #include "tmesh.h"
11  
14 #define ABS(x)          ((x) >= 0 ? (x) : -(x))
12  
16
13   int
14 < flat_tri(v1, v2, v3, n1, n2, n3)        /* determine if triangle is flat */
15 < FVECT   v1, v2, v3, n1, n2, n3;
14 > flat_tri(                       /* determine if triangle is flat */
15 >        FVECT   v1,
16 >        FVECT   v2,
17 >        FVECT   v3,
18 >        FVECT   n1,
19 >        FVECT   n2,
20 >        FVECT   n3
21 > )
22   {
23          double  d1, d2, d3;
24          FVECT   vt1, vt2, vn;
25                                          /* compute default normal */
26 <        vt1[0] = v2[0] - v1[0]; vt1[1] = v2[1] - v1[1]; vt1[2] = v2[2] - v1[2];
27 <        vt2[0] = v3[0] - v2[0]; vt2[1] = v3[1] - v2[1]; vt2[2] = v3[2] - v2[2];
28 <        fcross(vn, vt1, vt2);
26 >        VSUB(vt1, v2, v1);
27 >        VSUB(vt2, v3, v2);
28 >        VCROSS(vn, vt1, vt2);
29          if (normalize(vn) == 0.0)
30                  return(DEGEN);
31                                          /* compare to supplied normals */
# Line 40 | Line 42 | FVECT  v1, v2, v3, n1, n2, n3;
42  
43  
44   int
45 < comp_baryc(bcm, v1, v2, v3)             /* compute barycentric vectors */
46 < register BARYCCM        *bcm;
47 < FLOAT   *v1, *v2, *v3;
45 > comp_baryc(                     /* compute barycentric vectors */
46 >        BARYCCM *bcm,
47 >        RREAL   *v1,
48 >        RREAL   *v2,
49 >        RREAL   *v3
50 > )
51   {
52 <        FLOAT   *vt;
52 >        RREAL   *vt;
53          FVECT   va, vab, vcb;
54          double  d;
55          int     ax0, ax1;
56 <        register int    i;
56 >        int     i;
57                                          /* compute major axis */
58 <        for (i = 0; i < 3; i++) {
59 <                vab[i] = v1[i] - v2[i];
60 <                vcb[i] = v3[i] - v2[i];
61 <        }
62 <        fcross(va, vab, vcb);
63 <        bcm->ax = ABS(va[0]) > ABS(va[1]) ? 0 : 1;
64 <        bcm->ax = ABS(va[bcm->ax]) > ABS(va[2]) ? bcm->ax : 2;
60 <        ax0 = (bcm->ax + 1) % 3;
61 <        ax1 = (bcm->ax + 2) % 3;
58 >        VSUB(vab, v1, v2);
59 >        VSUB(vcb, v3, v2);
60 >        VCROSS(va, vab, vcb);
61 >        bcm->ax = (va[1]*va[1] > va[0]*va[0]);
62 >        if (va[2]*va[2] > va[bcm->ax]*va[bcm->ax]) bcm->ax = 2;
63 >        ax0 = (bcm->ax + 1)%3;
64 >        ax1 = (bcm->ax + 2)%3;
65          for (i = 0; i < 2; i++) {
66                  vab[0] = v1[ax0] - v2[ax0];
67                  vcb[0] = v3[ax0] - v2[ax0];
# Line 67 | Line 70 | FLOAT  *v1, *v2, *v3;
70                  d = vcb[0]*vcb[0] + vcb[1]*vcb[1];
71                  if (d <= FTINY*FTINY)
72                          return(-1);
73 <                d = (vcb[0]*vab[0]+vcb[1]*vab[1])/d;
73 >                d = (vcb[0]*vab[0] + vcb[1]*vab[1])/d;
74                  va[0] = vab[0] - vcb[0]*d;
75                  va[1] = vab[1] - vcb[1]*d;
76                  d = va[0]*va[0] + va[1]*va[1];
# Line 76 | Line 79 | FLOAT  *v1, *v2, *v3;
79                  d = 1.0/d;
80                  bcm->tm[i][0] = va[0] *= d;
81                  bcm->tm[i][1] = va[1] *= d;
82 <                bcm->tm[i][2] = -(v2[ax0]*va[0]+v2[ax1]*va[1]);
82 >                bcm->tm[i][2] = -(v2[ax0]*va[0] + v2[ax1]*va[1]);
83                                          /* rotate vertices */
84                  vt = v1;
85                  v1 = v2;
# Line 87 | Line 90 | FLOAT  *v1, *v2, *v3;
90   }
91  
92  
93 < put_baryc(bcm, com, n)                  /* put barycentric coord. vectors */
94 < register BARYCCM        *bcm;
95 < register FLOAT  com[][3];
96 < int     n;
93 > void
94 > eval_baryc(                     /* evaluate barycentric weights at p */
95 >        RREAL   wt[3],
96 >        FVECT   p,
97 >        BARYCCM *bcm
98 > )
99   {
100 +        double  u, v;
101 +        int     i;
102 +        
103 +        if ((i = bcm->ax + 1) >= 3) i -= 3;
104 +        u = p[i];
105 +        if (++i >= 3) i -= 3;
106 +        v = p[i];
107 +        wt[0] = u*bcm->tm[0][0] + v*bcm->tm[0][1] + bcm->tm[0][2];
108 +        wt[1] = u*bcm->tm[1][0] + v*bcm->tm[1][1] + bcm->tm[1][2];
109 +        wt[2] = 1. - wt[1] - wt[0];
110 + }
111 +
112 +
113 + int
114 + get_baryc(              /* compute barycentric weights at p */
115 +        RREAL   wt[3],
116 +        FVECT   p,
117 +        FVECT   v1,
118 +        FVECT   v2,
119 +        FVECT   v3
120 + )
121 + {
122 +        BARYCCM bcm;
123 +        
124 +        if (comp_baryc(&bcm, v1, v2, v3) < 0)
125 +                return(-1);
126 +        eval_baryc(wt, p, &bcm);
127 +        return(0);
128 + }
129 +
130 +
131 + #if 0
132 + int
133 + get_baryc(wt, p, v1, v2, v3)    /* compute barycentric weights at p */
134 + RREAL   wt[3];
135 + FVECT   p;
136 + FVECT   v1, v2, v3;
137 + {
138 +        FVECT   ac, bc, pc, cros;
139 +        double  normf;
140 +                                /* area formula w/o 2-D optimization */
141 +        VSUB(ac, v1, v3);
142 +        VSUB(bc, v2, v3);
143 +        VSUB(pc, p, v3);
144 +        VCROSS(cros, ac, bc);
145 +        normf = DOT(cros,cros)
146 +        if (normf <= 0.0)
147 +                return(-1);
148 +        normf = 1./sqrt(normf);
149 +        VCROSS(cros, bc, pc);
150 +        wt[0] = VLEN(cros) * normf;
151 +        VCROSS(cros, ac, pc);
152 +        wt[1] = VLEN(cros) * normf;
153 +        wt[2] = 1. - wt[1] - wt[0];
154 +        return(0);
155 + }
156 + #endif
157 +
158 +
159 + void
160 + fput_baryc(                     /* put barycentric coord. vectors */
161 +        BARYCCM *bcm,
162 +        RREAL   com[][3],
163 +        int     n,
164 +        FILE    *fp
165 + )
166 + {
167          double  a, b;
168 <        register int    i, j;
168 >        int     i;
169  
170 <        printf("%d\t%d\n", 1+3*n, bcm->ax);
170 >        fprintf(fp, "%d\t%d\n", 1+3*n, bcm->ax);
171          for (i = 0; i < n; i++) {
172                  a = com[i][0] - com[i][2];
173                  b = com[i][1] - com[i][2];
174 <                printf("%14.8f %14.8f %14.8f\n",
174 >                fprintf(fp, "%14.8f %14.8f %14.8f\n",
175                          bcm->tm[0][0]*a + bcm->tm[1][0]*b,
176                          bcm->tm[0][1]*a + bcm->tm[1][1]*b,
177                          bcm->tm[0][2]*a + bcm->tm[1][2]*b + com[i][2]);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines