1 |
– |
/* Copyright (c) 1998 Silicon Graphics, Inc. */ |
2 |
– |
|
1 |
|
#ifndef lint |
2 |
< |
static char SCCSid[] = "$SunId$ SGI"; |
2 |
> |
static const char RCSid[] = "$Id$"; |
3 |
|
#endif |
6 |
– |
|
4 |
|
/* |
5 |
|
* Quadtree-specific set operations with unsorted sets. |
6 |
|
*/ |
7 |
|
|
8 |
|
#include "standard.h" |
9 |
|
#include "sm_flag.h" |
10 |
+ |
#include "object.h" |
11 |
|
#include "sm_qtree.h" |
12 |
|
|
13 |
|
|
72 |
|
} |
73 |
|
|
74 |
|
|
75 |
+ |
deletuelem(os, obj) /* delete obj from unsorted os, no questions */ |
76 |
+ |
register OBJECT *os; |
77 |
+ |
OBJECT obj; |
78 |
+ |
{ |
79 |
+ |
register int i,j; |
80 |
+ |
OBJECT *optr; |
81 |
+ |
/* Take 2nd to last and put in position of obj: move last down: |
82 |
+ |
want to preserve last added |
83 |
+ |
*/ |
84 |
+ |
i = (*os)--; |
85 |
+ |
#ifdef DEBUG |
86 |
+ |
if( i <= 0) |
87 |
+ |
error(CONSISTENCY,"deleteuelem():empty set\n"); |
88 |
+ |
#endif |
89 |
+ |
if(i < 3) |
90 |
+ |
{ |
91 |
+ |
if((i == 2) && (*(++os) == obj)) |
92 |
+ |
*os = *(os+1); |
93 |
+ |
return; |
94 |
+ |
} |
95 |
+ |
optr = os + i; |
96 |
+ |
os++; |
97 |
+ |
while (i-- > 1 && *os != obj) |
98 |
+ |
os++; |
99 |
+ |
#ifdef DEBUG |
100 |
+ |
if( *os != obj) |
101 |
+ |
error(CONSISTENCY,"deleteuelem():id not found\n"); |
102 |
+ |
#endif |
103 |
+ |
*os = *(optr-1); |
104 |
+ |
*(optr-1) = *optr; |
105 |
+ |
} |
106 |
|
|
107 |
|
QUADTREE |
108 |
+ |
qtdeletuelem(qt, id) /* delete element from unsorted leaf node */ |
109 |
+ |
QUADTREE qt; |
110 |
+ |
OBJECT id; |
111 |
+ |
{ |
112 |
+ |
register QUADTREE lf; |
113 |
+ |
#ifdef DEBUG |
114 |
+ |
if(id < 0) |
115 |
+ |
eputs("qtdeletuelem():Invalid triangle id\n"); |
116 |
+ |
if (!QT_IS_LEAF(qt) || (lf = QT_SET_INDEX(qt)) >= qtnumsets) |
117 |
+ |
error(CONSISTENCY, "empty/bad node in qtdelelem"); |
118 |
+ |
#else |
119 |
+ |
lf = QT_SET_INDEX(qt); |
120 |
+ |
#endif |
121 |
+ |
if (qtsettab[lf][0] <= 1) { /* blow leaf away */ |
122 |
+ |
free((void *)qtsettab[lf]); |
123 |
+ |
qtsettab[lf] = (OBJECT *)qtfreesets; |
124 |
+ |
qtfreesets = lf; |
125 |
+ |
return(EMPTY); |
126 |
+ |
} |
127 |
+ |
deletuelem(qtsettab[lf], id); |
128 |
+ |
if (QTONTHRESH(qtsettab[lf][0])) |
129 |
+ |
qtsettab[lf] = (OBJECT *)realloc((char *)qtsettab[lf], |
130 |
+ |
QTNODESIZ(qtsettab[lf][0])*sizeof(OBJECT)); |
131 |
+ |
return(qt); |
132 |
+ |
} |
133 |
+ |
|
134 |
+ |
QUADTREE |
135 |
|
qtdelelem(qt, id) /* delete element from leaf node */ |
136 |
|
QUADTREE qt; |
137 |
|
OBJECT id; |
154 |
|
return(qt); |
155 |
|
} |
156 |
|
if (qtsettab[lf][0] <= 1) { /* blow leaf away */ |
157 |
< |
free((char *)qtsettab[lf]); |
157 |
> |
free((void *)qtsettab[lf]); |
158 |
|
qtsettab[lf] = (OBJECT *)qtfreesets; |
159 |
|
qtfreesets = lf; |
160 |
|
return(EMPTY); |
249 |
|
|
250 |
|
#ifdef DEBUG |
251 |
|
if(id < 0) |
252 |
< |
eputs("qtaddelem():Invalid triangle id\n"); |
252 |
> |
eputs("qtadduelem():Invalid sample id\n"); |
253 |
|
#endif |
254 |
|
if (QT_IS_EMPTY(qt)) { /* create new leaf */ |
255 |
|
newset[0] = 1; newset[1] = id; |
312 |
|
osi = QT_SET_INDEX(qt); |
313 |
|
if (osi >= qtnumsets) |
314 |
|
return; |
315 |
< |
free((char *)qtsettab[osi]); |
315 |
> |
free((void *)qtsettab[osi]); |
316 |
|
qtsettab[osi] = (OBJECT *)qtfreesets; |
317 |
|
qtfreesets = osi; |
318 |
|
} |
329 |
|
} |
330 |
|
for (i = qtnumsets; i--; ) |
331 |
|
if (qtsettab[i] != NULL) |
332 |
< |
free((char *)qtsettab[i]); |
333 |
< |
free((char *)qtsettab); |
332 |
> |
free((void *)qtsettab[i]); |
333 |
> |
free((void *)qtsettab); |
334 |
|
qtsettab = NULL; |
335 |
|
if(qtsetflag) |
336 |
|
{ |
337 |
< |
free((char *)qtsetflag); |
337 |
> |
free((void *)qtsetflag); |
338 |
|
qtsetflag=0; |
339 |
|
} |
340 |
|
qtnumsets = 0; |