--- ray/src/hd/sm_stree.c 1998/09/11 11:52:27 3.4 +++ ray/src/hd/sm_stree.c 1998/09/16 18:16:29 3.5 @@ -125,7 +125,7 @@ stPoint_locate(st,npt) { /* Find the first triangle that pt falls */ id = QT_SET_NEXT_ELEM(optr); - qtTri_from_id(id,NULL,NULL,NULL,p0,p1,p2,NULL,NULL,NULL); + qtTri_from_id(id,p0,p1,p2,NULL,NULL,NULL,NULL,NULL,NULL); d = point_in_stri(p0,p1,p2,npt); if(d) return(id); @@ -228,113 +228,19 @@ FVECT v0,v1,v2; } int -stVisit_tri_edges(st,t0,t1,t2,func,arg1,arg2) +stVisit_tri_edges(st,t0,t1,t2,func,arg1,arg2,arg3) STREE *st; FVECT t0,t1,t2; int (*func)(); - int *arg1,arg2; + int *arg1,arg2,*arg3; { int id,i,w; QUADTREE *rootptr; - FVECT q0,q1,q2,n,v[3],sdir[3],dir[3],tv,d; - double pd,t; - - VCOPY(v[0],t0); VCOPY(v[1],t1); VCOPY(v[2],t2); - VSUB(dir[0],t1,t0); VSUB(dir[1],t2,t1);VSUB(dir[2],t0,t2); - VCOPY(sdir[0],dir[0]);VCOPY(sdir[1],dir[1]);VCOPY(sdir[2],dir[2]); - w = 0; - for(i=0; i < 4; i++) - { -#ifdef TEST_DRIVER -Pick_cnt = 0; -#endif - rootptr = ST_NTH_ROOT_PTR(st,i); - stNth_base_verts(st,i,q0,q1,q2); - /* Return quadtree tri that p falls in */ - if(!point_in_stri(q0,q1,q2,v[w])) - continue; - id = qtRoot_visit_tri_edges(rootptr,q0,q1,q2,v,dir,&w,func,arg1,arg2); - if(id == INVALID) - { -#ifdef DEBUG - eputs("stVisit_tri_edges(): Unable to trace edges\n"); -#endif - return(INVALID); - } - if(id == QT_DONE) - return(*arg1); - - /* Crossed over to next cell: id = nbr */ - while(1) - { - /* test if ray crosses plane between this quadtree triangle and - its neighbor- if it does then find intersection point with - ray and plane- this is the new origin - */ - if(id==0) - VCROSS(n,q1,q2); - else - if(id==1) - VCROSS(n,q2,q0); - else - VCROSS(n,q0,q1); - - if(w==0) - VCOPY(tv,t0); - else - if(w==1) - VCOPY(tv,t1); - else - VCOPY(tv,t2); - if(!intersect_ray_plane(tv,sdir[w],n,0.0,&t,v[w])) - return(INVALID); - - VSUM(v[w],v[w],sdir[w],10.0*FTINY); - - t = (1.0-t-10.0*FTINY); - if(t <= 0.0) - { - t = FTINY; -#if 0 - eputs("stVisit_tri_edges(): edge end on plane\n"); -#endif - } - dir[w][0] = sdir[w][0] * t; - dir[w][1] = sdir[w][1] * t; - dir[w][2] = sdir[w][2] * t; - i = stTri_nbrs[i][id]; - rootptr = ST_NTH_ROOT_PTR(st,i); - stNth_base_verts(st,i,q0,q1,q2); - id=qtRoot_visit_tri_edges(rootptr,q0,q1,q2,v,dir,&w,func,arg1,arg2); - if(id == QT_DONE) - return(*arg1); - if(id == INVALID) - { -#if 0 - eputs("stVisit_tri_edges(): point not found\n"); -#endif - return(INVALID); - } - - } - } /* Point not found */ - return(INVALID); -} - - -int -stVisit_tri_edges2(st,t0,t1,t2,func,arg1,arg2) - STREE *st; - FVECT t0,t1,t2; - int (*func)(); - int *arg1,arg2; -{ - int id,i,w; - QUADTREE *rootptr; FVECT q0,q1,q2,v[3],i_pt; VCOPY(v[0],t0); VCOPY(v[1],t1); VCOPY(v[2],t2); w = -1; + QT_SET_FLAG(ST_ROOT(st)); for(i=0; i < 4; i++) { #ifdef TEST_DRIVER @@ -345,8 +251,13 @@ Pick_cnt = 0; /* Return quadtree tri that p falls in */ if(!point_in_stri(q0,q1,q2,v[0])) continue; - id = qtRoot_visit_tri_edges2(rootptr,q0,q1,q2,v,i_pt,&w, - func,arg1,arg2); +#ifdef TEST_DRIVER + id = qtRoot_visit_tri_edges(rootptr,q0,q1,q2,v,i_pt,&w, + func,arg1,arg2,arg3); +#else + id = qtRoot_visit_tri_edgesi(rootptr,q0,q1,q2,v,i_pt,&w, + func,arg1,arg2,arg3); +#endif if(id == INVALID) { #ifdef DEBUG @@ -367,8 +278,13 @@ Pick_cnt = 0; i = stTri_nbrs[i][id]; rootptr = ST_NTH_ROOT_PTR(st,i); stNth_base_verts(st,i,q0,q1,q2); - id=qtRoot_visit_tri_edges2(rootptr,q0,q1,q2,v,i_pt,&w, - func,arg1,arg2); +#ifdef TEST_DRIVER + id=qtRoot_visit_tri_edges(rootptr,q0,q1,q2,v,i_pt,&w, + func,arg1,arg2,arg3); +#else + id=qtRoot_visit_tri_edgesi(rootptr,q0,q1,q2,v,i_pt,&w, + func,arg1,arg2,arg3); +#endif if(id == QT_DONE) return(*arg1); if(id == INVALID) @@ -385,87 +301,6 @@ Pick_cnt = 0; } int -stTrace_edge(st,orig,dir,max_t,func,arg1,arg2) - STREE *st; - FVECT orig,dir; - double max_t; - int (*func)(); - int *arg1,arg2; -{ - int id,i; - QUADTREE *rootptr; - FVECT q0,q1,q2,o,n,d; - double pd,t; - -#if DEBUG - if(max_t > 1.0 || max_t < 0.0) - { - eputs("stTrace_edge(): max_t must be in [0,1]:adjusting\n"); - max_t = 1.0; - } -#endif - - VCOPY(o,orig); - for(i=0; i < 4; i++) - { -#ifdef TEST_DRIVER -Pick_cnt = 0; -#endif - rootptr = ST_NTH_ROOT_PTR(st,i); - stNth_base_verts(st,i,q0,q1,q2); - /* Return quadtree tri that p falls in */ - id= qtRoot_trace_edge(rootptr,q0,q1,q2,o,dir,max_t,func,arg1,arg2); - if(id == INVALID) - continue; - if(id == QT_DONE) - return(*arg1); - - /* Crossed over to next cell: id = nbr */ - while(1) - { - /* test if ray crosses plane between this quadtree triangle and - its neighbor- if it does then find intersection point with - ray and plane- this is the new origin - */ - if(id==0) - VCROSS(n,q1,q2); - else - if(id==1) - VCROSS(n,q2,q0); - else - VCROSS(n,q0,q1); - - /* Ray does not cross into next cell: done and tri not found*/ - if(!intersect_ray_plane(orig,dir,n,0.0,&t,o)) - return(INVALID); - - VSUM(o,o,dir,10*FTINY); - - d[0] = dir[0]*(1-t-10*FTINY); - d[1] = dir[1]*(1-t-10*FTINY); - d[2] = dir[2]*(1-t-10*FTINY); - i = stTri_nbrs[i][id]; - rootptr = ST_NTH_ROOT_PTR(st,i); - stNth_base_verts(st,i,q0,q1,q2); - id = qtRoot_trace_edge(rootptr,q0,q1,q2,o,d,max_t,func,arg1,arg2); - if(id == QT_DONE) - return(*arg1); - if(id == INVALID) - { -#if 0 - eputs("stTrace_edges(): point not found\n"); -#endif - return(INVALID); - } - - } - } /* Point not found */ - return(INVALID); -} - - - -int stTrace_ray(st,orig,dir,func,arg1,arg2) STREE *st; FVECT orig,dir; @@ -528,11 +363,11 @@ Pick_cnt = 0; -stVisit_tri_interior(st,t0,t1,t2,func,arg1,arg2) +stVisit_tri_interior(st,t0,t1,t2,func,arg1,arg2,arg3) STREE *st; FVECT t0,t1,t2; int (*func)(); - int *arg1,arg2; + int *arg1,arg2,*arg3; { int i; QUADTREE *rootptr; @@ -542,46 +377,17 @@ stVisit_tri_interior(st,t0,t1,t2,func,arg1,arg2) { rootptr = ST_NTH_ROOT_PTR(st,i); stNth_base_verts(st,i,q0,q1,q2); - qtVisit_tri_interior(rootptr,q0,q1,q2,t0,t1,t2,0,func,arg1,arg2); + qtVisit_tri_interior(rootptr,q0,q1,q2,t0,t1,t2,0,func,arg1,arg2,arg3); } } int -stApply_to_tri(st,t0,t1,t2,func,arg1,arg2) +stApply_to_tri(st,t0,t1,t2,edge_func,interior_func,arg1,arg2) STREE *st; FVECT t0,t1,t2; - int (*func)(); - int *arg1,arg2; -{ - int f; - FVECT dir; - - /* First add all of the leaf cells lying on the triangle perimeter: - mark all cells seen on the way - */ - qtClearAllFlags(); /* clear all quadtree branch flags */ - f = 0; - VSUB(dir,t1,t0); - stTrace_edge(st,t0,dir,1.0,func,arg1,arg2); - VSUB(dir,t2,t1); - stTrace_edge(st,t1,dir,1.0,func,arg1,arg2); - VSUB(dir,t0,t2); - stTrace_edge(st,t2,dir,1.0,func,arg1,arg2); - /* Now visit interior */ - stVisit_tri_interior(st,t0,t1,t2,func,arg1,arg2); -} - - - - - -int -stUpdate_tri(st,t_id,t0,t1,t2,edge_func,interior_func) - STREE *st; - int t_id; - FVECT t0,t1,t2; int (*edge_func)(),(*interior_func)(); + int arg1,*arg2; { int f; FVECT dir; @@ -589,16 +395,16 @@ stUpdate_tri(st,t_id,t0,t1,t2,edge_func,interior_func) /* First add all of the leaf cells lying on the triangle perimeter: mark all cells seen on the way */ - ST_CLEAR_FLAGS(st); f = 0; /* Visit cells along edges of the tri */ - stVisit_tri_edges2(st,t0,t1,t2,edge_func,&f,t_id); + stVisit_tri_edges(st,t0,t1,t2,edge_func,&f,arg1,arg2); /* Now visit interior */ if(QT_FLAG_FILL_TRI(f) || QT_FLAG_UPDATE(f)) - stVisit_tri_interior(st,t0,t1,t2,interior_func,&f,t_id); + stVisit_tri_interior(st,t0,t1,t2,interior_func,&f,arg1,arg2); } +