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

Comparing ray/src/ot/wfconv.c (file contents):
Revision 2.17 by greg, Thu Mar 11 17:00:58 2021 UTC vs.
Revision 2.18 by greg, Fri Apr 30 16:40:10 2021 UTC

# Line 264 | Line 264 | dominant_axis(char *v1, char *v2, char *v3)
264          return(vn[imax]*vn[imax] > FTINY*FTINY*FTINY*FTINY ? imax : -1);
265   }
266  
267 + /* struct needed for triangulation callback */
268 + typedef struct {
269 +        char    **avl;
270 +        int     rev;
271 + } WFpoly;
272 +
273   /* callback for triangle output from polygon */
274   static int
275   tri_out(const Vert2_list *tp, int a, int b, int c)
276   {
277 <        return( puttri( ((char **)tp->p)[a],
278 <                        ((char **)tp->p)[b],
279 <                        ((char **)tp->p)[c] ) );
277 >        WFpoly *        wp = (WFpoly *)tp->p;
278 >
279 >        if (wp->rev)
280 >                return( puttri(wp->avl[c], wp->avl[b], wp->avl[a]) );
281 >
282 >        return( puttri(wp->avl[a], wp->avl[b], wp->avl[c]) );
283   }
284  
285   static int
# Line 280 | Line 289 | putface(                               /* put out an N-sided polygon */
289   )
290   {
291          Vert2_list      *poly;
292 +        WFpoly          myps;
293          int             i, ax, ay;
294  
295          for (i = ac-3; i >= 0; i--)     /* identify dominant axis */
# Line 290 | Line 300 | putface(                               /* put out an N-sided polygon */
300          poly = polyAlloc(ac);
301          if (poly == NULL)
302                  return(0);
303 <        poly->p = (void *)av;
303 >        myps.avl = av;
304 >        poly->p = &myps;
305          if (++ax >= 3) ax = 0;
306          ay = ax;
307          if (++ay >= 3) ay = 0;
# Line 304 | Line 315 | putface(                               /* put out an N-sided polygon */
315                  poly->v[i].mX = vlist[vi[0]][ax];
316                  poly->v[i].mY = vlist[vi[0]][ay];
317          }
318 +                                        /* flag for order reversal */
319 +        myps.rev = (polyArea(poly) < .0);
320                                          /* break into triangles & output */
321          if (!polyTriangulate(poly, &tri_out)) {
322                  sprintf(errmsg, "self-intersecting face with %d vertices", ac);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines