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

Comparing ray/src/hd/sm_del.c (file contents):
Revision 3.2 by gwlarson, Mon Aug 24 12:38:57 1998 UTC vs.
Revision 3.4 by gwlarson, Mon Sep 14 10:33:46 1998 UTC

# Line 16 | Line 16 | static char SCCSid[] = "$SunId$ SGI";
16   static EDGE Edges[MAX_EDGES];
17   static int Ecnt=0;
18  
19 + int
20 + remove_tri(qtptr,fptr,t_id)
21 +   QUADTREE *qtptr;
22 +   int *fptr;
23 +   int t_id;
24 + {
25 +    OBJECT tset[QT_MAXSET+1];  
26 +    int n;
27  
28 +   if(QT_IS_EMPTY(*qtptr))
29 +     return(FALSE);
30 +   /* remove id from set */
31 +      else
32 +      {
33 +         if(!qtinset(*qtptr,t_id))
34 +           return(FALSE);
35 +         n = QT_SET_CNT(qtqueryset(*qtptr))-1;
36 +         *qtptr = qtdelelem(*qtptr,t_id);
37 +          if(n  == 0)
38 +             (*fptr) |= QT_COMPRESS;
39 +        if(!QT_FLAG_FILL_TRI(*fptr))
40 +          (*fptr)++;
41 +      }
42 +    return(TRUE);
43 + }
44 +
45 + int
46 + remove_tri_compress(qtptr,q0,q1,q2,t0,t1,t2,n,arg,t_id)
47 + QUADTREE *qtptr;
48 + FVECT q0,q1,q2;
49 + FVECT t0,t1,t2;
50 + int n;
51 + int *arg;
52 + int t_id;
53 + {
54 +    int f = 0;
55 +    /* NOTE compress */
56 +    return(remove_tri(qtptr,&f,t_id));
57 + }
58 +
59 +
60 +
61 + int
62 + stDelete_tri(st,t_id,t0,t1,t2)
63 +   STREE *st;
64 +   int t_id;
65 +   FVECT t0,t1,t2;
66 + {
67 +    int f;
68 +    FVECT dir;
69 +    
70 +  /* First add all of the leaf cells lying on the triangle perimeter:
71 +     mark all cells seen on the way
72 +   */
73 +    ST_CLEAR_FLAGS(st);
74 +    f = 0;
75 +    VSUB(dir,t1,t0);
76 +    stTrace_edge(st,t0,dir,1.0,remove_tri,&f,t_id);
77 +    VSUB(dir,t2,t1);
78 +    stTrace_edge(st,t1,dir,1.0,remove_tri,&f,t_id);
79 +    VSUB(dir,t0,t2);
80 +    stTrace_edge(st,t2,dir,1.0,remove_tri,&f,t_id);
81 +    /* Now visit interior */
82 +    if(QT_FLAG_FILL_TRI(f) || QT_FLAG_UPDATE(f))
83 +       stVisit_tri_interior(st,t0,t1,t2,remove_tri_compress,&f,t_id);
84 + }
85 +
86 +
87   smLocator_remove_tri(sm,t_id)
88   SM *sm;
89   int t_id;
# Line 24 | Line 91 | int t_id;
91    STREE *st;
92    char found;
93    TRI *t;
94 <  FVECT p0,p1,p2;
94 >  FVECT v0,v1,v2;
95  
96    st = SM_LOCATOR(sm);
97  
98    t = SM_NTH_TRI(sm,t_id);
99  
100 <  smDir(sm,p0,T_NTH_V(t,0));
101 <  smDir(sm,p1,T_NTH_V(t,1));
102 <  smDir(sm,p2,T_NTH_V(t,2));
103 <
37 <  found = stRemove_tri(st,t_id,p0,p1,p2);
38 <
100 >  VSUB(v0,SM_T_NTH_WV(sm,t,0),SM_VIEW_CENTER(sm));
101 >  VSUB(v1,SM_T_NTH_WV(sm,t,1),SM_VIEW_CENTER(sm));
102 >  VSUB(v2,SM_T_NTH_WV(sm,t,2),SM_VIEW_CENTER(sm));
103 >  found = stUpdate_tri(st,t_id,v0,v1,v2,remove_tri,remove_tri_compress);
104    return(found);
105   }
106  
# Line 168 | Line 233 | LIST *l;
233        e = (int)LIST_DATA(el);
234        id_e0 = E_NTH_VERT(e,0);
235        id_e1 = E_NTH_VERT(e,1);
236 <
237 <      smDir(sm,e0,id_e0);
238 <      smDir(sm,e1,id_e1);
239 <      if(spherical_polygon_edge_intersect(v0,v1,e0,e1))
236 >      /* NOTE: DO these need to be normalized? Just subtract center? */
237 >      /*
238 >        smDir(sm,e0,id_e0);
239 >        smDir(sm,e1,id_e1);
240 >        */
241 >      VSUB(e0,SM_NTH_WV(sm,id_e0),SM_VIEW_CENTER(sm));
242 >      VSUB(e1,SM_NTH_WV(sm,id_e1),SM_VIEW_CENTER(sm));
243 >      if(sedge_intersect(v0,v1,e0,e1))
244          return(TRUE);
245  
246        el = LIST_NEXT(el);
# Line 284 | Line 353 | LIST **l,**lnew;
353   }
354  
355  
356 <
357 < LIST
289 < *smTriangulate_convex(sm,plist)
356 > int
357 > smTriangulate_convex(sm,plist)
358   SM *sm;
359   LIST *plist;
360   {
# Line 328 | Line 396 | LIST *plist;
396  
397          e_id0 = -e_id2;
398      }
399 +    
400      free_list(plist);
401 +    return(TRUE);
402   }
403 <
403 > int
404   smTriangulate_elist(sm,plist)
405   SM *sm;
406   LIST *plist;
# Line 339 | Line 409 | LIST *plist;
409      FVECT v0,v1,v2;
410      int id0,id1,id2,e,id_next;
411      char flipped;
412 <    int debug = TRUE;
412 >    int done;
413  
414      l = plist;
415      
# Line 371 | Line 441 | LIST *plist;
441   #ifdef DEBUG
442            eputs("smTriangulate_elist():Unable to find convex vertex\n");
443   #endif
444 <          return;
444 >          return(FALSE);
445        }
446        /* add edge */
447        el1 = NULL;
448        /* Split edge list l into two lists: one from id1-id_next-id1,
449           and the next from id2-id_next-id2
450        */
451 <      debug = split_edge_list(id1,id_next,&l,&el1);
451 >      split_edge_list(id1,id_next,&l,&el1);
452        /* Recurse and triangulate the two edge lists */
453 <      if(debug)
454 <        debug = smTriangulate_elist(sm,l);
455 <      if(debug)
456 <        debug = smTriangulate_elist(sm,el1);
387 <
388 <      return(debug);
453 >      done = smTriangulate_elist(sm,l);
454 >      if(done)
455 >        done = smTriangulate_elist(sm,el1);
456 >      return(done);
457      }
458 <    smTriangulate_convex(sm,plist);
459 <    return(TRUE);
458 >    done = smTriangulate_convex(sm,plist);
459 >    return(done);
460   }
461  
462   int
463 < smTriangulate_polygon(sm,plist)
463 > smTriangulate(sm,plist)
464   SM *sm;
465   LIST *plist;
466   {
# Line 400 | Line 468 | LIST *plist;
468      TRI *t0,*t1;
469      int test;
470      
471 <    test = smTriangulate_elist(sm,plist,NULL);
471 >    test = smTriangulate_elist(sm,plist);
472  
473      if(!test)
474         return(test);
# Line 411 | Line 479 | LIST *plist;
479          if((id_t0==SM_INVALID) || (id_t1==SM_INVALID))
480          {
481   #ifdef DEBUG
482 <           eputs("smTriangulate_polygon(): Unassigned edge neighbor\n");
482 >           eputs("smTriangulate(): Unassigned edge neighbor\n");
483   #endif
484              continue;
485          }
# Line 534 | Line 602 | smMesh_remove_vertex(sm,id)
602         return(FALSE);
603  
604      /* Triangulate spherical polygon */
605 <    debug = smTriangulate_polygon(sm,elist);
605 >    smTriangulate(sm,elist);
606  
607  
608      /* Fix up new triangles to be Delaunay */
609 <    if(debug)
542 <       smFix_edges(sm);
609 >    smFix_edges(sm);
610  
611      return(TRUE);
612   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines