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

Comparing ray/src/hd/sm_ogl.c (file contents):
Revision 3.9 by gwlarson, Wed Nov 11 12:05:39 1998 UTC vs.
Revision 3.10 by gwlarson, Mon Dec 28 18:07:35 1998 UTC

# Line 47 | Line 47 | static QT_LUENT        *qt_htbl = NULL;        /* quadtree cache */
47   static int      qt_hsiz = 0;            /* quadtree cache size */
48  
49  
50 <
51 < mark_active_tris(qtptr,fptr)
52 < QUADTREE *qtptr;
53 < int *fptr;
54 < {
55 <  QUADTREE qt = *qtptr;
56 <  OBJECT *os,*optr;
57 <  register int i,t_id;
58 <  TRI *tri;
59 <
60 <  if(!QT_FLAG_FILL_TRI(*fptr))
61 <     (*fptr)++;
62 <  if(QT_IS_EMPTY(qt) || QT_LEAF_IS_FLAG(qt))
63 <    return;
64 <
65 <  /* For each triangle in the set, set the which flag*/
66 <  os = qtqueryset(qt);
67 <
68 <  for (i = QT_SET_CNT(os), optr = QT_SET_PTR(os); i > 0; i--)
69 <  {
70 <    t_id = QT_SET_NEXT_ELEM(optr);
71 <    /* Set the render flag */
72 <    tri = SM_NTH_TRI(smMesh,t_id);
73 <    if(!T_IS_VALID(tri) || SM_IS_NTH_T_BASE(smMesh,t_id))
74 <        continue;
75 <    SM_SET_NTH_T_ACTIVE(smMesh,t_id);
76 <    /* Set the Active bits of the Vertices */
77 <    S_SET_FLAG(T_NTH_V(tri,0));
78 <    S_SET_FLAG(T_NTH_V(tri,1));
79 <    S_SET_FLAG(T_NTH_V(tri,2));
80 <
81 <  }
82 < }
83 <
84 < #define mark_active_interior mark_active_tris
85 <
86 < mark_tris_in_frustum(view)
87 < VIEW *view;
88 < {
89 <    FVECT nr[4],far[4];
90 <    FPEQ peq;
91 <    int debug=0;
92 <    /* Mark triangles in approx. view frustum as being active:set
93 <       LRU counter: for use in discarding samples when out
94 <       of space
95 <       Radiance often has no far clipping plane: but driver will set
96 <       dev_zmin,dev_zmax to satisfy OGL
97 <    */
98 <
99 <    /* First clear all the quadtree node and triangle active flags */
100 <    qtClearAllFlags();
101 <    smClear_flags(smMesh,T_ACTIVE_FLAG);
102 <    /* Clear all of the active sample flags*/
103 <    sClear_all_flags(SM_SAMP(smMesh));
104 <
105 <
106 <    /* calculate the world space coordinates of the view frustum */
107 <    calculate_view_frustum(view->vp,view->hvec,view->vvec,view->horiz,
108 <                           view->vert, dev_zmin,dev_zmax,nr,far);
109 <
110 < #ifdef TEST_DRIVER
111 <    VCOPY(FrustumFar[0],far[0]);
112 <    VCOPY(FrustumFar[1],far[1]);
113 <    VCOPY(FrustumFar[2],far[2]);
114 <    VCOPY(FrustumFar[3],far[3]);
115 <    VCOPY(FrustumNear[0],nr[0]);
116 <    VCOPY(FrustumNear[1],nr[1]);
117 <    VCOPY(FrustumNear[2],nr[2]);
118 <    VCOPY(FrustumNear[3],nr[3]);
119 < #endif
120 <    /* Project the view frustum onto the spherical quadtree */
121 <    /* For every cell intersected by the projection of the faces
122 <
123 <       of the frustum: mark all triangles in the cell as ACTIVE-
124 <       Also set the triangles LRU clock counter
125 <       */
126 <    
127 <    if(EQUAL_VEC3(view->vp,SM_VIEW_CENTER(smMesh)))
128 <    {/* Near face triangles */
129 <
130 <      smLocator_apply_func(smMesh,nr[0],nr[2],nr[3],mark_active_tris,
131 <                         mark_active_interior,NULL);
132 <      smLocator_apply_func(smMesh,nr[2],nr[0],nr[1],mark_active_tris,
133 <                         mark_active_interior,NULL);
134 <      return;
135 <    }
136 <
137 <    /* Test the view against the planes: and swap orientation if inside:*/
138 <    tri_plane_equation(nr[0],nr[2],nr[3], &peq,FALSE);
139 <    if(PT_ON_PLANE(SM_VIEW_CENTER(smMesh),peq) < 0.0)
140 <    {/* Near face triangles */
141 <      smLocator_apply_func(smMesh,nr[3],nr[2],nr[0],mark_active_tris,
142 <                           mark_active_interior,NULL);
143 <      smLocator_apply_func(smMesh,nr[1],nr[0],nr[2],mark_active_tris,
144 <                         mark_active_interior,NULL);
145 <    }
146 <    else
147 <    {/* Near face triangles */
148 <      smLocator_apply_func(smMesh,nr[0],nr[2],nr[3],mark_active_tris,
149 <                           mark_active_interior,NULL);
150 <      smLocator_apply_func(smMesh,nr[2],nr[0],nr[1],mark_active_tris,
151 <                         mark_active_interior,NULL);
152 <    }
153 <    tri_plane_equation(nr[0],far[3],far[0], &peq,FALSE);
154 <    if(PT_ON_PLANE(SM_VIEW_CENTER(smMesh),peq) < 0.0)
155 <    { /* Right face triangles */
156 <      smLocator_apply_func(smMesh,far[0],far[3],nr[0],mark_active_tris,
157 <                           mark_active_interior,NULL);
158 <      smLocator_apply_func(smMesh,nr[3],nr[0],far[3],mark_active_tris,
159 <                           mark_active_interior,NULL);
160 <    }
161 <    else
162 <    {/* Right face triangles */
163 <      smLocator_apply_func(smMesh,nr[0],far[3],far[0],mark_active_tris,
164 <                           mark_active_interior,NULL);
165 <      smLocator_apply_func(smMesh,far[3],nr[0],nr[3],mark_active_tris,
166 <                           mark_active_interior,NULL);
167 <    }
168 <
169 <    tri_plane_equation(nr[1],far[2],nr[2], &peq,FALSE);
170 <    if(PT_ON_PLANE(SM_VIEW_CENTER(smMesh),peq) < 0.0)
171 <    { /* Left face triangles */
172 <      smLocator_apply_func(smMesh,nr[2],far[2],nr[1],mark_active_tris,
173 <                           mark_active_interior,NULL);
174 <      smLocator_apply_func(smMesh,far[1],nr[1],far[2],mark_active_tris,
175 <                           mark_active_interior,NULL);  
176 <    }
177 <    else
178 <    { /* Left face triangles */
179 <      smLocator_apply_func(smMesh,nr[1],far[2],nr[2],mark_active_tris,
180 <                           mark_active_interior,NULL);
181 <      smLocator_apply_func(smMesh,far[2],nr[1],far[1],mark_active_tris,
182 <                   mark_active_interior,NULL);
183 <
184 <    }
185 <    tri_plane_equation(nr[0],far[0],nr[1], &peq,FALSE);
186 <    if(PT_ON_PLANE(SM_VIEW_CENTER(smMesh),peq) < 0.0)
187 <    {/* Top face triangles */
188 <      smLocator_apply_func(smMesh,nr[1],far[0],nr[0],mark_active_tris,
189 <                           mark_active_interior,NULL);
190 <      smLocator_apply_func(smMesh,far[1],far[0],nr[1],mark_active_tris,
191 <                           mark_active_interior,NULL);
192 <    }
193 <    else
194 <    {/* Top face triangles */
195 <      smLocator_apply_func(smMesh,nr[0],far[0],nr[1],mark_active_tris,
196 <                           mark_active_interior,NULL);
197 <      smLocator_apply_func(smMesh,nr[1],far[0],far[1],mark_active_tris,
198 <                           mark_active_interior,NULL);
199 <    }
200 <    tri_plane_equation(nr[3],nr[2],far[3], &peq,FALSE);
201 <    if(PT_ON_PLANE(SM_VIEW_CENTER(smMesh),peq) < 0.0)
202 <    {/* Bottom face triangles */
203 <      smLocator_apply_func(smMesh,far[3],nr[2],nr[3],mark_active_tris,
204 <                           mark_active_interior,NULL);
205 <      smLocator_apply_func(smMesh,far[3],far[2],nr[2],mark_active_tris,
206 <                           mark_active_interior,NULL);
207 <    }
208 <    else
209 <    { /* Bottom face triangles */
210 <      smLocator_apply_func(smMesh,nr[3],nr[2],far[3],mark_active_tris,
211 <                           mark_active_interior,NULL);
212 <      smLocator_apply_func(smMesh,nr[2],far[2],far[3],mark_active_tris,
213 <                           mark_active_interior,NULL);
214 <    }
215 <     tri_plane_equation(far[2],far[0],far[1], &peq,FALSE);
216 <    if(PT_ON_PLANE(SM_VIEW_CENTER(smMesh),peq) < 0.0)
217 <    {/* Far face triangles */
218 <      smLocator_apply_func(smMesh,far[0],far[2],far[1],mark_active_tris,
219 <                           mark_active_interior,NULL);
220 <      smLocator_apply_func(smMesh,far[2],far[0],far[3],mark_active_tris,
221 <                           mark_active_interior,NULL);
222 <    }
223 <    else
224 <    {/* Far face triangles */
225 <      smLocator_apply_func(smMesh,far[1],far[2],far[0],mark_active_tris,
226 <                           mark_active_interior,NULL);
227 <      smLocator_apply_func(smMesh,far[3],far[0],far[2],mark_active_tris,
228 <                           mark_active_interior,NULL);
229 <    }
230 <
231 < }
232 <
233 < /*
234 < * smClean()            : display has been wiped clean
235 < *
236 < * Called after display has been effectively cleared, meaning that all
237 < * geometry must be resent down the pipeline in the next call to smUpdate().
238 < */
50 > /*
51 >  * smClean()           : display has been wiped clean
52 >  *
53 >  * Called after display has been effectively cleared, meaning that all
54 >  * geometry must be resent down the pipeline in the next call to smUpdate().
55 >  */
56   smClean()
57   {
58      smClean_notify = TRUE;
# Line 322 | Line 139 | register QUADTREE qt;
139      stCount_level_leaves(lcnt+1, QT_NTH_CHILD(qt,3));
140    }
141    else
142 <    lcnt[0]++;
142 >    if(QT_LEAF_IS_FLAG(qt))
143 >      lcnt[0]++;
144   }
145  
146  
# Line 342 | Line 160 | int lvl;
160      return(NULL);
161    if (QT_IS_TREE(qt) && !QT_IS_FLAG(qt))        /* not in our frustum */
162      return(NULL);
163 +  if(QT_IS_LEAF(qt)  && !QT_LEAF_IS_FLAG(qt))   /* not in our frustum */
164 +    return(NULL);
165                                          /* else look up node */
166    if ((le = qtCache_find(qt)) == NULL)
167      error(SYSTEM, "out of memory in qtRender_level");
# Line 434 | Line 254 | smRender_stree_level(sm,lvl)
254   SM *sm;
255   int lvl;
256   {
257 <  QUADTREE root;
257 >  QUADTREE qt;
258    int i;
259    FVECT t0,t1,t2;
260    STREE *st;
# Line 448 | Line 268 | int lvl;
268    glBegin(GL_TRIANGLES);
269    for(i=0; i < ST_NUM_ROOT_NODES; i++)
270    {
271 <    root = ST_NTH_ROOT(st,i);
272 <    qtRender_level(root,ST_NTH_V(st,i,0),ST_NTH_V(st,i,1),ST_NTH_V(st,i,2),
271 >    qt = ST_ROOT_QT(st,i);
272 >    qtRender_level(qt,ST_NTH_V(st,i,0),ST_NTH_V(st,i,1),ST_NTH_V(st,i,2),
273                     sm,lvl-1);
274    }
275    glEnd();
# Line 463 | Line 283 | int qual;
283   {
284    int i, ntarget;
285    int lvlcnt[QT_MAX_LEVELS];
286 +  STREE *st;
287  
288    if (qual <= 0)
289      return;
# Line 475 | Line 296 | int qual;
296      return;
297    for (i = QT_MAX_LEVELS; i--; )
298      lvlcnt[i] = 0;
299 <  stCount_level_leaves(lvlcnt, ST_TOP_ROOT(SM_LOCATOR(sm)));
300 <  stCount_level_leaves(lvlcnt, ST_BOTTOM_ROOT(SM_LOCATOR(sm)));  
299 >  
300 >  st = SM_LOCATOR(sm);
301 >  for(i=0; i < ST_NUM_ROOT_NODES;i++)
302 >    stCount_level_leaves(lvlcnt, ST_ROOT_QT(st,i));
303 >  
304    for (ntarget -= lvlcnt[i=0]; i < QT_MAX_LEVELS-1; ntarget -= lvlcnt[++i])
305      if (ntarget < lvlcnt[i+1])
306        break;
# Line 801 | Line 625 | smUpdate(view,qual)
625  
626    if(!smMesh)
627      return;
628 +
629 +
630 +
631    d = DIST(view->vp,SM_VIEW_CENTER(smMesh));
632    if(qual >= 100 && d > SM_ALLOWED_VIEW_CHANGE(smMesh))
633    {
# Line 823 | Line 650 | smUpdate(view,qual)
650      {
651         tmClearHisto();
652         tmAddHisto(SM_BRT(smMesh),SM_NUM_SAMP(smMesh),1);
653 <       if(tmComputeMapping(0.,0.,0.) != TM_E_OK ||
654 <                   tmMapPixels(SM_RGB(smMesh),SM_BRT(smMesh),SM_CHR(smMesh),
655 <                                SM_NUM_SAMP(smMesh)) != TM_E_OK)
829 <            return;
653 >       tmComputeMapping(0.,0.,0.);
654 >       tmMapPixels(SM_RGB(smMesh),SM_BRT(smMesh),SM_CHR(smMesh),
655 >                   SM_NUM_SAMP(smMesh));
656      }
657   #endif
658      mark_tris_in_frustum(view);
# Line 855 | Line 681 | smUpdate(view,qual)
681          if(tmComputeMapping(0.,0.,0.) != TM_E_OK)
682             return;
683      }
684 <    if(tmMapPixels(SM_NTH_RGB(smMesh,t),&SM_NTH_BRT(smMesh,t),
685 <                   SM_NTH_CHR(smMesh,t), SM_NUM_SAMP(smMesh)-t) != TM_E_OK)
686 <          return;
684 >    tmMapPixels(SM_NTH_RGB(smMesh,t),&SM_NTH_BRT(smMesh,t),
685 >                   SM_NTH_CHR(smMesh,t), SM_NUM_SAMP(smMesh)-t);
686 >        
687   #endif    
688      smUpdate_Rendered_mesh(smMesh,view->vp,last_update);
689      

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines