1 /* Copyright (C) 1992-1998 The Geometry Center 2 * Copyright (C) 1998-2000 Stuart Levy, Tamara Munzner, Mark Phillips 3 * 4 * This file is part of Geomview. 5 * 6 * Geomview is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU Lesser General Public License as published 8 * by the Free Software Foundation; either version 2, or (at your option) 9 * any later version. 10 * 11 * Geomview is distributed in the hope that it will be useful, but 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with Geomview; see the file COPYING. If not, write 18 * to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, 19 * USA, or visit http://www.gnu.org. 20 */ 21 #define PICKFUNC(name, body, NDbody) \ 22 static inline LObject *pickbody(char *coordsys, char *id, \ 23 HPoint3 point, int pn, \ 24 HPoint3 vertex, int vn, \ 25 HPoint3 edge[2], int en, \ 26 HPoint3 face[], int fn, \ 27 int ppath[], int ppn, \ 28 int vi, int ei[2], int ein, int fi) \ 29 { \ 30 do { \ 31 body; \ 32 } while (false); \ 33 return Lt; \ 34 } \ 35 static inline LObject *pickNDbody(char *coordsys, char *id, \ 36 float *point, int pn, \ 37 float *vertex, int vn, \ 38 float *edge, int en, \ 39 float *face, int fn, \ 40 int ppath[], int ppn, \ 41 int vi, int ei[2], int ein, int fi) \ 42 { \ 43 do { \ 44 NDbody; \ 45 } while (false); \ 46 return Lt; \ 47 } \ 48 LObject *name(Lake *lake, LList *args) \ 49 { \ 50 char *coordsys = NULL, *id = NULL; \ 51 float *varpoint = NULL; int pn; \ 52 float *varvertex = NULL; int vn; \ 53 float *varedge = NULL; int en; \ 54 float *varface = NULL; int fn; \ 55 int *varppath = NULL; int ppn; \ 56 int vi; \ 57 int ei[2]; int ein = 2; \ 58 int fi; \ 59 LObject *res; \ 60 \ 61 LDECLARE(("pick", LBEGIN, \ 62 LSTRING, &coordsys, \ 63 LSTRING, &id, \ 64 LHOLD, LVARARRAY, LFLOAT, &varpoint, &pn, \ 65 LHOLD, LVARARRAY, LFLOAT, &varvertex, &vn, \ 66 LHOLD, LVARARRAY, LFLOAT, &varedge, &en, \ 67 LHOLD, LVARARRAY, LFLOAT, &varface, &fn, \ 68 LHOLD, LVARARRAY, LINT, &varppath, &ppn, \ 69 LINT, &vi, \ 70 LHOLD, LARRAY, LINT, ei, &ein, \ 71 LINT, &fi, \ 72 LEND)); \ 73 \ 74 if (varpoint == NULL) { \ 75 return Lnil; \ 76 } \ 77 \ 78 if (pn <= 4) { \ 79 HPoint3 point; \ 80 HPoint3 vertex; \ 81 \ 82 if (varpoint) { \ 83 point = *(HPoint3 *)varpoint; \ 84 } \ 85 if (varvertex) { \ 86 vertex = *(HPoint3 *)varvertex; \ 87 } \ 88 res = pickbody(coordsys, id, \ 89 point, pn, \ 90 vertex, vn, \ 91 (HPoint3 *)varedge, en, \ 92 (HPoint3 *)varface, fn, \ 93 varppath, ppn, vi, ei, ein, fi); \ 94 } else { \ 95 res = pickNDbody(coordsys, id, \ 96 varpoint, pn, \ 97 varvertex, vn, varedge, en, varface, fn, \ 98 varppath, ppn, vi, ei, ein, fi); \ 99 } \ 100 \ 101 if (varpoint) OOGLFree(varpoint); \ 102 if (varvertex) OOGLFree(varvertex); \ 103 if (varedge) OOGLFree(varedge); \ 104 if (varface) OOGLFree(varface); \ 105 if (varppath) OOGLFree(varppath); \ 106 \ 107 return res; \ 108 } 109 110 /* 111 Note: the "if (1)" business above is to prevent a warning 112 about the following statement ("return Lt") not being reached 113 if the body itself returns. 114 */ 115 116 /* Note: Don't use DEFPICKFUNC any more. Use the newer PICKFUNC 117 * instead. DEFPICKFUNC is provided for backward compatibility. 118 * 119 * cH: the above comment seemingly is ignored by everybody ... 120 */ 121 #define DEFPICKFUNC(helpstr, \ 122 coordsys, \ 123 id, \ 124 point, pn, \ 125 vertex, vn, \ 126 edge, en, \ 127 face, fn, \ 128 ppath, ppn, \ 129 vi, \ 130 ei, ein, \ 131 fi, \ 132 body, \ 133 NDbody) \ 134 static inline LObject *pickbody(char *coordsys, char *id, \ 135 HPoint3 point, int pn, \ 136 HPoint3 vertex, int vn, \ 137 HPoint3 edge[2], int en, \ 138 HPoint3 face[], int fn, \ 139 int ppath[], int ppn, \ 140 int vi, int ei[2], int ein, int fi) \ 141 { \ 142 do { \ 143 body; \ 144 } while (false); \ 145 return Lt; \ 146 } \ 147 static inline LObject *pickNDbody(char *coordsys, char *id, \ 148 float *point, int pn, \ 149 float *vertex, int vn, \ 150 float *edge, int en, \ 151 float *face, int fn, \ 152 int ppath[], int ppn, \ 153 int vi, int ei[2], int ein, int fi) \ 154 { \ 155 do { \ 156 NDbody; \ 157 } while (false); \ 158 return Lt; \ 159 } \ 160 LDEFINE(pick, LVOID, helpstr) \ 161 { \ 162 char *coordsys = NULL, *id = NULL; \ 163 float *var##point = NULL; int pn; \ 164 float *var##vertex = NULL; int vn; \ 165 float *var##edge = NULL; int en; \ 166 float *var##face = NULL; int fn; \ 167 int *var##ppath = NULL; int ppn; \ 168 int vi; \ 169 int ei[2]; int ein = 2; \ 170 int fi; \ 171 LObject *res; \ 172 \ 173 LDECLARE(("pick", LBEGIN, \ 174 LSTRING, &coordsys, \ 175 LSTRING, &id, \ 176 LHOLD, LVARARRAY, LFLOAT, &var##point, &pn, \ 177 LHOLD, LVARARRAY, LFLOAT, &var##vertex, &vn, \ 178 LHOLD, LVARARRAY, LFLOAT, &var##edge, &en, \ 179 LHOLD, LVARARRAY, LFLOAT, &var##face, &fn, \ 180 LHOLD, LVARARRAY, LINT, &var##ppath, &ppn, \ 181 LINT, &vi, \ 182 LHOLD, LARRAY, LINT, ei, &ein, \ 183 LINT, &fi, \ 184 LEND)); \ 185 \ 186 if (var##point == NULL) { \ 187 return Lnil; \ 188 } \ 189 \ 190 if (pn <= 4) { \ 191 HPoint3 point; \ 192 HPoint3 vertex = { 0.0, 0.0, 0.0 }; \ 193 \ 194 if (var##point) { \ 195 point = *(HPoint3 *)var##point; \ 196 } \ 197 if (var##vertex) { \ 198 vertex = *(HPoint3 *)var##vertex; \ 199 } \ 200 res = pickbody(coordsys, id, \ 201 point, pn, \ 202 vertex, vn, \ 203 (HPoint3 *)var##edge, en, \ 204 (HPoint3 *)var##face, fn, \ 205 var##ppath, ppn, vi, ei, ein, fi); \ 206 } else { \ 207 res = pickNDbody(coordsys, id, \ 208 var##point, pn, \ 209 var##vertex, vn, var##edge, en, var##face, fn, \ 210 var##ppath, ppn, vi, ei, ein, fi); \ 211 } \ 212 \ 213 if (var##point) OOGLFree(var##point); \ 214 if (var##vertex) OOGLFree(var##vertex); \ 215 if (var##edge) OOGLFree(var##edge); \ 216 if (var##face) OOGLFree(var##face); \ 217 if (var##ppath) OOGLFree(var##ppath); \ 218 \ 219 return res; \ 220 } 221 222 /* 223 * Local Variables: *** 224 * mode: c *** 225 * c-basic-offset: 2 *** 226 * End: *** 227 */ 228 229 230