table.c

Go to the documentation of this file.
00001 /*                         T A B L E . C
00002  * BRL-CAD
00003  *
00004  * Copyright (c) 1989-2006 United States Government as represented by
00005  * the U.S. Army Research Laboratory.
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public License
00009  * as published by the Free Software Foundation; either version 2 of
00010  * the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful, but
00013  * WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Library General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this file; see the file named COPYING for more
00019  * information.
00020  */
00021 
00022 /** @addtogroup g_ */
00023 /*@{*/
00024 /** @file table.c
00025  *  Tables for the BRL-CAD Package ray-tracing library "librt".
00026  *
00027  *  Author -
00028  *      Michael John Muuss
00029  *
00030  *  Source -
00031  *      SECAD/VLD Computing Consortium, Bldg 394
00032  *      The U. S. Army Ballistic Research Laboratory
00033  *      Aberdeen Proving Ground, Maryland  21005
00034  *
00035  */
00036 /*@}*/
00037 
00038 #ifndef lint
00039 static const char RCStree[] = "@(#)$Header: /cvsroot/brlcad/brlcad/src/librt/table.c,v 14.14 2006/09/16 02:04:26 lbutler Exp $ (BRL)";
00040 #endif
00041 
00042 #include "common.h"
00043 
00044 #include <stdio.h>
00045 #ifdef HAVE_STRING_H
00046 #include <string.h>
00047 #endif
00048 #include <math.h>
00049 
00050 #include "tcl.h"
00051 
00052 #include "machine.h"
00053 #include "bu.h"
00054 #include "vmath.h"
00055 #include "db.h"
00056 #include "nmg.h"
00057 #include "raytrace.h"
00058 #include "rtgeom.h"
00059 #include "./debug.h"
00060 
00061 
00062 const struct bu_structparse rt_nul_parse[] = {
00063         {""}
00064 };
00065 
00066 #if __STDC__ && !defined(alliant)
00067 # define RT_DECLARE_INTERFACE(name)     \
00068         BU_EXTERN(int rt_##name##_prep, (struct soltab *stp, \
00069                         struct rt_db_internal *ip, struct rt_i *rtip )); \
00070         BU_EXTERN(int rt_##name##_shot, (struct soltab *stp,\
00071                         register struct xray *rp, \
00072                         struct application *ap, struct seg *seghead )); \
00073         BU_EXTERN(int rt_##name##_piece_shot, (\
00074                         struct rt_piecestate *psp, \
00075                         struct rt_piecelist *plp, \
00076                         double dist_corr, \
00077                         struct xray *rp, \
00078                         struct application *ap, \
00079                         struct seg *seghead )); \
00080         BU_EXTERN(void rt_##name##_piece_hitsegs, (\
00081                         struct rt_piecestate *psp, \
00082                         struct seg *seghead, \
00083                         struct application *ap)); \
00084         BU_EXTERN(void rt_##name##_print, (const struct soltab *stp)); \
00085         BU_EXTERN(void rt_##name##_norm, (struct hit *hitp, \
00086                         struct soltab *stp, struct xray *rp)); \
00087         BU_EXTERN(void rt_##name##_uv, (struct application *ap, \
00088                         struct soltab *stp, struct hit *hitp, \
00089                         struct uvcoord *uvp)); \
00090         BU_EXTERN(void rt_##name##_curve, (struct curvature *cvp, \
00091                         struct hit *hitp, struct soltab *stp)); \
00092         BU_EXTERN(int rt_##name##_class, ()); \
00093         BU_EXTERN(void rt_##name##_free, (struct soltab *stp)); \
00094         BU_EXTERN(int rt_##name##_plot, (struct bu_list *vhead, \
00095                         struct rt_db_internal *ip, \
00096                         const struct rt_tess_tol *ttol, \
00097                         const struct bn_tol *tol)); \
00098         BU_EXTERN(void rt_##name##_vshot, (struct soltab *stp[], \
00099                         struct xray *rp[], \
00100                         struct seg segp[], int n, struct application *ap )); \
00101         BU_EXTERN(int rt_##name##_tess, (struct nmgregion **r, \
00102                         struct model *m, struct rt_db_internal *ip, \
00103                         const struct rt_tess_tol *ttol, \
00104                         const struct bn_tol *tol)); \
00105         BU_EXTERN(int rt_##name##_tnurb, (struct nmgregion **r, \
00106                         struct model *m, struct rt_db_internal *ip, \
00107                         const struct bn_tol *tol)); \
00108         BU_EXTERN(int rt_##name##_import5, (struct rt_db_internal *ip, \
00109                         const struct bu_external *ep, const mat_t mat, \
00110                         const struct db_i *dbip, struct resource *resp, const int minor_type )); \
00111         BU_EXTERN(int rt_##name##_export5, (struct bu_external *ep, \
00112                         const struct rt_db_internal *ip, \
00113                         double local2mm, const struct db_i *dbip, \
00114                         struct resource *resp, \
00115                         const int minor_type)); \
00116         BU_EXTERN(int rt_##name##_import, (struct rt_db_internal *ip, \
00117                         const struct bu_external *ep, const mat_t mat, \
00118                         const struct db_i *dbip, struct resource *resp )); \
00119         BU_EXTERN(int rt_##name##_export, (struct bu_external *ep, \
00120                         const struct rt_db_internal *ip, \
00121                         double local2mm, const struct db_i *dbip, \
00122                         struct resource *resp )); \
00123         BU_EXTERN(void rt_##name##_ifree, (struct rt_db_internal *ip, \
00124                         struct resource *resp)); \
00125         BU_EXTERN(int rt_##name##_describe, (struct bu_vls *str, \
00126                         const struct rt_db_internal *ip, \
00127                         int verbose, \
00128                         double mm2local, \
00129                         struct resource *resp, \
00130                         struct db_i *db_i)); \
00131         BU_EXTERN(int rt_##name##_xform, (struct rt_db_internal *op, \
00132                         const mat_t mat, struct rt_db_internal *ip, \
00133                         int free, struct db_i *dbip, \
00134                         struct resource *resp)); \
00135         extern const struct bu_structparse rt_##name##_parse[];
00136 #else
00137 # define RT_DECLARE_INTERFACE(name)     \
00138         BU_EXTERN(int rt_/**/name/**/_prep, (struct soltab *stp, \
00139                         struct rt_db_internal *ip, struct rt_i *rtip )); \
00140         BU_EXTERN(int rt_/**/name/**/_shot, (struct soltab *stp, struct xray *rp, \
00141                         struct application *ap, struct seg *seghead )); \
00142         BU_EXTERN(int rt_/**/name/**/_piece_shot, (\
00143                         struct rt_piecestate *psp, \
00144                         struct rt_piecelist *plp, \
00145                         double dist_corr, \
00146                         struct xray *rp, \
00147                         struct application *ap, \
00148                         struct seg *seghead )); \
00149         BU_EXTERN(void rt_/**/name/**/_piece_hitsegs, (\
00150                         struct rt_piecestate *psp, \
00151                         struct seg *seghead, \
00152                         struct application *ap)); \
00153         BU_EXTERN(void rt_/**/name/**/_print, (const struct soltab *stp)); \
00154         BU_EXTERN(void rt_/**/name/**/_norm, (struct hit *hitp, \
00155                         struct soltab *stp, struct xray *rp)); \
00156         BU_EXTERN(void rt_/**/name/**/_uv, (struct application *ap, \
00157                         struct soltab *stp, struct hit *hitp, \
00158                         struct uvcoord *uvp)); \
00159         BU_EXTERN(void rt_/**/name/**/_curve, (struct curvature *cvp, \
00160                         struct hit *hitp, struct soltab *stp)); \
00161         BU_EXTERN(int rt_/**/name/**/_class, ()); \
00162         BU_EXTERN(void rt_/**/name/**/_free, (struct soltab *stp)); \
00163         BU_EXTERN(int rt_/**/name/**/_plot, (struct bu_list *vhead, \
00164                         struct rt_db_internal *ip, \
00165                         const struct rt_tess_tol *ttol, \
00166                         const struct bn_tol *tol)); \
00167         BU_EXTERN(void rt_/**/name/**/_vshot, (struct soltab *stp[], \
00168                         struct xray *rp[], \
00169                         struct seg segp[], int n, struct application *ap )); \
00170         BU_EXTERN(int rt_/**/name/**/_tess, (struct nmgregion **r, \
00171                         struct model *m, struct rt_db_internal *ip, \
00172                         const struct rt_tess_tol *ttol, \
00173                         const struct bn_tol *tol)); \
00174         BU_EXTERN(int rt_/**/name/**/_tnurb, (struct nmgregion **r, \
00175                         struct model *m, struct rt_db_internal *ip, \
00176                         const struct bn_tol *tol)); \
00177         BU_EXTERN(int rt_/**/name/**/_import5, (struct rt_db_internal *ip, \
00178                         const struct bu_external *ep, const mat_t mat, \
00179                         const struct db_i *dbip, struct resource *resp, const int minor_type )); \
00180         BU_EXTERN(int rt_/**/name/**/_export5, (struct bu_external *ep, \
00181                         const struct rt_db_internal *ip, \
00182                         double local2mm, const struct db_i *dbip, struct resource *resp, \
00183                         const int minor_type )); \
00184         BU_EXTERN(int rt_/**/name/**/_import, (struct rt_db_internal *ip, \
00185                         const struct bu_external *ep, const mat_t mat, \
00186                         const struct db_i *dbip, struct resource *resp )); \
00187         BU_EXTERN(int rt_/**/name/**/_export, (struct bu_external *ep, \
00188                         const struct rt_db_internal *ip, \
00189                         double local2mm, const struct db_i *dbip, struct resource *resp )); \
00190         BU_EXTERN(void rt_/**/name/**/_ifree, (struct rt_db_internal *ip, \
00191                         struct resource *resp)); \
00192         BU_EXTERN(int rt_/**/name/**/_describe, (struct bu_vls *str, \
00193                         const struct rt_db_internal *ip, int verbose, \
00194                         double mm2local, struct resource *resp, \
00195                                                  struct db_i *db_i)); \
00196         BU_EXTERN(int rt_/**/name/**/_xform, (struct rt_db_internal *op, \
00197                         const mat_t mat, struct rt_db_internal *ip, \
00198                         int free, struct db_i *dbip, \
00199                         struct resource *resp)); \
00200         extern const struct bu_structparse rt_/**/name/**/_parse[];
00201 #endif
00202 
00203 /* Note:  no semi-colons at the end of these, please */
00204 RT_DECLARE_INTERFACE(nul)
00205 
00206 #define rt_tor_xform rt_generic_xform
00207 RT_DECLARE_INTERFACE(tor)
00208 
00209 #define rt_tgc_xform rt_generic_xform
00210 RT_DECLARE_INTERFACE(tgc)
00211 
00212 #define rt_ell_xform rt_generic_xform
00213 RT_DECLARE_INTERFACE(ell)
00214 
00215 #define rt_arb_xform rt_generic_xform
00216 RT_DECLARE_INTERFACE(arb)
00217 
00218 #define rt_ars_xform rt_generic_xform
00219 RT_DECLARE_INTERFACE(ars)
00220 
00221 RT_DECLARE_INTERFACE(hlf)
00222 
00223 #define rt_rec_xform rt_generic_xform
00224 RT_DECLARE_INTERFACE(rec)
00225 
00226 #define rt_pg_xform rt_generic_xform
00227 RT_DECLARE_INTERFACE(pg)
00228 
00229 #define rt_nurb_xform rt_generic_xform
00230 RT_DECLARE_INTERFACE(nurb)
00231 
00232 #define rt_sph_xform rt_generic_xform
00233 RT_DECLARE_INTERFACE(sph)
00234 
00235 #define rt_ebm_xform rt_generic_xform
00236 RT_DECLARE_INTERFACE(ebm)
00237 
00238 #define rt_vol_xform rt_generic_xform
00239 RT_DECLARE_INTERFACE(vol)
00240 
00241 #define rt_arbn_xform rt_generic_xform
00242 RT_DECLARE_INTERFACE(arbn)
00243 
00244 #define rt_pipe_xform rt_generic_xform
00245 RT_DECLARE_INTERFACE(pipe)
00246 
00247 #define rt_part_xform rt_generic_xform
00248 RT_DECLARE_INTERFACE(part)
00249 
00250 #define rt_nmg_xform rt_generic_xform
00251 RT_DECLARE_INTERFACE(nmg)
00252 
00253 #define rt_rpc_xform rt_generic_xform
00254 RT_DECLARE_INTERFACE(rpc)
00255 
00256 #define rt_rhc_xform rt_generic_xform
00257 RT_DECLARE_INTERFACE(rhc)
00258 
00259 #define rt_epa_xform rt_generic_xform
00260 RT_DECLARE_INTERFACE(epa)
00261 
00262 #define rt_ehy_xform rt_generic_xform
00263 RT_DECLARE_INTERFACE(ehy)
00264 
00265 #define rt_eto_xform rt_generic_xform
00266 RT_DECLARE_INTERFACE(eto)
00267 
00268 #define rt_grp_xform rt_generic_xform
00269 RT_DECLARE_INTERFACE(grp)
00270 
00271 #define rt_hf_xform rt_generic_xform
00272 RT_DECLARE_INTERFACE(hf)
00273 
00274 #define rt_dsp_xform rt_generic_xform
00275 RT_DECLARE_INTERFACE(dsp)
00276 
00277 #define rt_sketch_xform rt_generic_xform
00278 RT_DECLARE_INTERFACE(sketch)
00279 
00280 RT_DECLARE_INTERFACE(extrude)
00281 
00282 #define rt_submodel_xform rt_generic_xform
00283 RT_DECLARE_INTERFACE(submodel)
00284 
00285 #define rt_cline_xform rt_generic_xform
00286 RT_DECLARE_INTERFACE(cline)
00287 
00288 RT_DECLARE_INTERFACE(bot)
00289 
00290 #define rt_superell_xform rt_generic_xform
00291 RT_DECLARE_INTERFACE(superell)
00292 
00293 #define rt_metaball_xform rt_generic_xform
00294 RT_DECLARE_INTERFACE(metaball)
00295 
00296 /* from db5_comb.c */
00297 int rt_comb_export5(
00298         struct bu_external              *ep,
00299         const struct rt_db_internal     *ip,
00300         double                          local2mm,
00301         const struct db_i               *dbip,
00302         struct resource                 *resp,
00303         const int                       minor_type);
00304 int rt_comb_import5(
00305         struct rt_db_internal   *ip,
00306         const struct bu_external *ep,
00307         const mat_t             mat,
00308         const struct db_i       *dbip,
00309         struct resource         *resp,
00310         const int               minor_type);
00311 
00312 /* from db5_bin.c */
00313 BU_EXTERN(int rt_binexpm_import5, (struct rt_db_internal * ip,
00314                         const struct bu_external *ep,
00315                         const mat_t mat,
00316                         const struct db_i *dbip,
00317                               struct resource *resp,
00318                         const int minor_type));
00319 BU_EXTERN(int rt_binunif_import5, (struct rt_db_internal * ip,
00320                         const struct bu_external *ep,
00321                         const mat_t mat,
00322                         const struct db_i *dbip,
00323                               struct resource *resp,
00324                         const int minor_type));
00325 BU_EXTERN(int rt_binmime_import5, (struct rt_db_internal * ip,
00326                         const struct bu_external *ep,
00327                         const mat_t mat,
00328                         const struct db_i *dbip,
00329                               struct resource *resp,
00330                         const int minor_type));
00331 
00332 BU_EXTERN(int rt_binexpm_export5, (struct bu_external *ep,
00333                         const struct rt_db_internal *ip,
00334                         double local2mm,
00335                         const struct db_i *dbip,
00336                         struct resource *resp,
00337                         const int minor_type));
00338 
00339 BU_EXTERN(int rt_binunif_export5, (struct bu_external *ep,
00340                         const struct rt_db_internal *ip,
00341                         double local2mm,
00342                         const struct db_i *dbip,
00343                         struct resource *resp,
00344                         const int minor_type));
00345 
00346 BU_EXTERN(void rt_binunif_ifree, (struct rt_db_internal *ip,
00347                 struct resource *resp));
00348 BU_EXTERN(int rt_binunif_describe, (struct bu_vls *str,
00349                 const struct rt_db_internal *ip, int verbose,
00350                 double mm2local, struct resource *resp, struct db_i *db_i));
00351 BU_EXTERN( void rt_binunif_make, (const struct rt_functab *ftp,
00352                                   struct rt_db_internal *intern,
00353                                   double diameter ) );
00354 BU_EXTERN( int rt_binunif_tclget, (Tcl_Interp *interp,
00355                                    const struct rt_db_internal *intern,
00356                                    const char *attr ) );
00357 BU_EXTERN(int rt_binunif_tcladjust, (Tcl_Interp *interp,
00358                                      struct rt_db_internal *intern,
00359                                      int argc,
00360                                      char **argv,
00361                                      struct resource *resp ) );
00362 
00363 /* from tcl.c */
00364 BU_EXTERN(int rt_comb_tclget, (Tcl_Interp *interp,
00365                 const struct rt_db_internal *intern, const char *item));
00366 BU_EXTERN(int rt_comb_tcladjust, (Tcl_Interp *interp,
00367                 struct rt_db_internal *intern, int argc, char **argv,
00368                 struct resource *resp));
00369 BU_EXTERN(int rt_comb_tclform, (const struct rt_functab *ftp,
00370                 Tcl_Interp *interp));
00371 BU_EXTERN(void rt_comb_make, (const struct rt_functab *ftp,
00372                 struct rt_db_internal *intern, double diameter));
00373 
00374 /* generics for solid */
00375 BU_EXTERN(int rt_parsetab_tclget, (Tcl_Interp *interp,
00376                 const struct rt_db_internal *intern, const char *attr));
00377 BU_EXTERN(int rt_parsetab_tcladjust, (Tcl_Interp *interp,
00378                 struct rt_db_internal *intern, int argc, char **argv,
00379                 struct resource *));
00380 BU_EXTERN(int rt_parsetab_tclform, (const struct rt_functab *ftp,
00381                 Tcl_Interp *interp));
00382 BU_EXTERN(void rt_generic_make, (const struct rt_functab *ftp,
00383                 struct rt_db_internal *intern, double diameter));
00384 
00385 /* EBM solid */
00386 BU_EXTERN(int rt_ebm_tclget, (Tcl_Interp *interp,
00387                 const struct rt_db_internal *intern, const char *attr));
00388 BU_EXTERN(int rt_ebm_tcladjust, (Tcl_Interp *interp,
00389                 struct rt_db_internal *intern, int argc, char **argv,
00390                 struct resource *resp));
00391 BU_EXTERN(int rt_ebm_tclform, (const struct rt_functab *ftp,
00392                 Tcl_Interp *interp));
00393 BU_EXTERN(void rt_ebm_make, (const struct rt_functab *, struct rt_db_internal *,
00394                              double /*diameter*/));
00395 
00396 /* ARBN solid */
00397 BU_EXTERN(int rt_arbn_tclget, (Tcl_Interp *interp,
00398                 const struct rt_db_internal *intern, const char *attr));
00399 BU_EXTERN(int rt_arbn_tcladjust, (Tcl_Interp *interp,
00400                 struct rt_db_internal *intern, int argc, char **argv,
00401                 struct resource *resp));
00402 
00403 /* ARS solid */
00404 BU_EXTERN(int rt_ars_tclget, (Tcl_Interp *interp,
00405                 const struct rt_db_internal *intern, const char *attr));
00406 BU_EXTERN(int rt_ars_tcladjust, (Tcl_Interp *interp,
00407                 struct rt_db_internal *intern, int argc, char **argv,
00408                 struct resource *resp));
00409 
00410 /* DSP solid */
00411 extern int rt_dsp_tclget(Tcl_Interp *interp,
00412                          const struct rt_db_internal *intern,
00413                          const char                  *attr);
00414 
00415 extern int rt_dsp_tcladjust(Tcl_Interp *interp,
00416                             struct rt_db_internal *intern,
00417                             int         argc,
00418                             char        **argv,
00419                             struct resource *resp);
00420 BU_EXTERN(void rt_dsp_make, (const struct rt_functab *, struct rt_db_internal *,
00421                              double /*diameter*/));
00422 
00423 /* PIPE solid */
00424 BU_EXTERN(int rt_pipe_tclget, (Tcl_Interp *interp,
00425                 const struct rt_db_internal *intern, const char *attr));
00426 BU_EXTERN(int rt_pipe_tcladjust, (Tcl_Interp *interp,
00427                 struct rt_db_internal *intern, int argc, char **argv,
00428                 struct resource *resp));
00429 
00430 /* BSPLINE solid */
00431 BU_EXTERN(int rt_nurb_tclget, (Tcl_Interp *interp,
00432                 const struct rt_db_internal *intern, const char *attr));
00433 BU_EXTERN(int rt_nurb_tcladjust, (Tcl_Interp *interp,
00434                 struct rt_db_internal *intern, int argc, char **argv,
00435                 struct resource *resp));
00436 
00437 /* NMG solid */
00438 BU_EXTERN(int rt_nmg_tclget, (Tcl_Interp *interp,
00439                 const struct rt_db_internal *intern, const char *attr));
00440 BU_EXTERN(int rt_nmg_tcladjust, (Tcl_Interp *interp,
00441                 struct rt_db_internal *intern, int argc, char **argv,
00442                 struct resource *resp));
00443 BU_EXTERN(void rt_nmg_make, (const struct rt_functab *, struct rt_db_internal *,
00444                              double /*diameter*/));
00445 
00446 /* BOT solid */
00447 BU_EXTERN(int rt_bot_tclget, (Tcl_Interp *interp,
00448                 const struct rt_db_internal *intern, const char *attr));
00449 BU_EXTERN(int rt_bot_tcladjust, (Tcl_Interp *interp,
00450                 struct rt_db_internal *intern, int argc, char **argv,
00451                 struct resource *resp));
00452 BU_EXTERN(int rt_bot_tclform, (const struct rt_functab *ftp, Tcl_Interp *interp));
00453 
00454 /* SKETCH */
00455 BU_EXTERN(int rt_sketch_tclget, (Tcl_Interp *interp,
00456                 const struct rt_db_internal *intern, const char *attr));
00457 BU_EXTERN(int rt_sketch_tcladjust, (Tcl_Interp *interp,
00458                 struct rt_db_internal *intern, int argc, char **argv,
00459                 struct resource *resp));
00460 BU_EXTERN(int rt_sketch_tclform, (const struct rt_functab *ftp, Tcl_Interp *interp));
00461 
00462 /* CLINE */
00463 BU_EXTERN(int rt_cline_tclget, (Tcl_Interp *interp,
00464                 const struct rt_db_internal *intern, const char *attr));
00465 BU_EXTERN(int rt_cline_tcladjust, (Tcl_Interp *interp,
00466                 struct rt_db_internal *intern, int argc, char **argv,
00467                 struct resource *resp));
00468 BU_EXTERN(int rt_cline_tclform, (const struct rt_functab *ftp, Tcl_Interp *interp));
00469 
00470 /* EXTRUSION */
00471 BU_EXTERN(int rt_extrude_tclget, (Tcl_Interp *interp,
00472                 const struct rt_db_internal *intern, const char *attr));
00473 BU_EXTERN(int rt_extrude_tcladjust, (Tcl_Interp *interp,
00474                 struct rt_db_internal *intern, int argc, char **argv,
00475                 struct resource *resp));
00476 BU_EXTERN(int rt_extrude_tclform, (const struct rt_functab *ftp, Tcl_Interp *interp));
00477 
00478 /* XXX from shoot.c / vshoot.c */
00479 BU_EXTERN(void rt_vstub, (struct soltab *stp[], struct xray *rp[],
00480         struct seg segp[], int n, struct application *ap ));
00481 
00482 /* From here in table.c */
00483 BU_EXTERN(int rt_generic_xform, (struct rt_db_internal *op,
00484         const mat_t mat, struct rt_db_internal *ip,
00485         int free, struct db_i *dbip, struct resource *resp));
00486 
00487 /* Stub Tcl interfaces */
00488 #if __STDC__
00489 int rt_nul_tclget(Tcl_Interp *interp, const struct rt_db_internal *intern, const char *attr)  {
00490         Tcl_AppendResult(interp, "rt_nul_tclget", (char *)NULL);
00491         return TCL_ERROR;
00492 }
00493 int rt_nul_tcladjust(Tcl_Interp *interp, struct rt_db_internal *intern, int argc, char **argv, struct resource *resp)  {
00494         RT_CK_RESOURCE(resp);
00495         Tcl_AppendResult(interp, "rt_nul_tcladjust", (char *)NULL);
00496         return TCL_ERROR;
00497 }
00498 int rt_nul_tclform(const struct rt_functab *ftp, Tcl_Interp *interp) {
00499         Tcl_AppendResult(interp, "rt_nul_tclform", (char *)NULL);
00500         return TCL_ERROR;
00501 }
00502 void rt_nul_make(const struct rt_functab *ftp, struct rt_db_internal *intern, double diameter) {
00503         bu_bomb("rt_nul_make invoked\n");
00504 }
00505 #else
00506 int rt_nul_tclget(interp, intern, attr)
00507 Tcl_Interp *interp;
00508 const struct rt_db_internal *intern;
00509 const char *attr;
00510 {
00511         Tcl_AppendResult(interp, "rt_nul_tclget", (char *)NULL);
00512         return TCL_ERROR;
00513 }
00514 int rt_nul_tcladjust(interp, intern, argc, argv)
00515 Tcl_Interp *interp;
00516 struct rt_db_internal *intern;
00517 int argc;
00518 char **argv;
00519 {
00520         Tcl_AppendResult(interp, "rt_nul_tcladjust", (char *)NULL);
00521         return TCL_ERROR;
00522 }
00523 int rt_nul_tclform(ftp, interp)
00524 const struct rt_functab *ftp;
00525 Tcl_Interp *interp;
00526 {
00527         Tcl_AppendResult(interp, "rt_nul_tclform", (char *)NULL);
00528         return TCL_ERROR;
00529 }
00530 void rt_nul_make(ftp, intern, diameter)
00531 const struct rt_functab *ftp;
00532 struct rt_db_internal *intern;
00533 double diameter;
00534 {
00535         bu_bomb("rt_nul_make invoked\n");
00536 }
00537 #endif
00538 
00539 const struct rt_functab rt_functab[] = {
00540         {RT_FUNCTAB_MAGIC, "ID_NULL", "NULL",
00541                 0,              /* 0: unused, for sanity checking. */
00542                 rt_nul_prep,    rt_nul_shot,    rt_nul_print,   rt_nul_norm,
00543                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00544                 rt_nul_uv,      rt_nul_curve,   rt_nul_class,   rt_nul_free,
00545                 rt_nul_plot,    rt_nul_vshot,   rt_nul_tess,    rt_nul_tnurb,
00546                 rt_nul_import5, rt_nul_export5,
00547                 rt_nul_import,  rt_nul_export,  rt_nul_ifree,
00548                 rt_nul_describe,rt_nul_xform,   rt_nul_parse,
00549                 0,                              0,
00550                 rt_nul_tclget,  rt_nul_tcladjust, rt_nul_tclform,
00551                 rt_nul_make,
00552         },
00553 
00554         {RT_FUNCTAB_MAGIC, "ID_TOR", "tor",
00555                 1,              /* 1 */
00556                 rt_tor_prep,    rt_tor_shot,    rt_tor_print,   rt_tor_norm,
00557                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00558                 rt_tor_uv,      rt_tor_curve,   rt_tor_class,   rt_tor_free,
00559                 rt_tor_plot,    rt_tor_vshot,   rt_tor_tess,    rt_nul_tnurb,
00560                 rt_tor_import5, rt_tor_export5,
00561                 rt_tor_import,  rt_tor_export,  rt_tor_ifree,
00562                 rt_tor_describe,rt_tor_xform,   rt_tor_parse,
00563                 sizeof(struct rt_tor_internal), RT_TOR_INTERNAL_MAGIC,
00564                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00565                 NULL,
00566         },
00567 
00568         {RT_FUNCTAB_MAGIC, "ID_TGC", "tgc",
00569                 1,              /* 2 */
00570                 rt_tgc_prep,    rt_tgc_shot,    rt_tgc_print,   rt_tgc_norm,
00571                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00572                 rt_tgc_uv,      rt_tgc_curve,   rt_tgc_class,   rt_tgc_free,
00573                 rt_tgc_plot,    rt_tgc_vshot,   rt_tgc_tess,    rt_tgc_tnurb,
00574                 rt_tgc_import5, rt_tgc_export5,
00575                 rt_tgc_import,  rt_tgc_export,  rt_tgc_ifree,
00576                 rt_tgc_describe,rt_tgc_xform,   rt_tgc_parse,
00577                 sizeof(struct rt_tgc_internal), RT_TGC_INTERNAL_MAGIC,
00578                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00579                 NULL,
00580         },
00581 
00582         {RT_FUNCTAB_MAGIC, "ID_ELL", "ell",
00583                 1,              /* 3 */
00584                 rt_ell_prep,    rt_ell_shot,    rt_ell_print,   rt_ell_norm,
00585                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00586                 rt_ell_uv,      rt_ell_curve,   rt_ell_class,   rt_ell_free,
00587                 rt_ell_plot,    rt_ell_vshot,   rt_ell_tess,    rt_ell_tnurb,
00588                 rt_ell_import5, rt_ell_export5,
00589                 rt_ell_import,  rt_ell_export,  rt_ell_ifree,
00590                 rt_ell_describe,rt_ell_xform,   rt_ell_parse,
00591                 sizeof(struct rt_ell_internal), RT_ELL_INTERNAL_MAGIC,
00592                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00593                 NULL,
00594         },
00595 
00596         {RT_FUNCTAB_MAGIC, "ID_ARB8", "arb8",
00597                 0,              /* 4 */
00598                 rt_arb_prep,    rt_arb_shot,    rt_arb_print,   rt_arb_norm,
00599                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00600                 rt_arb_uv,      rt_arb_curve,   rt_arb_class,   rt_arb_free,
00601                 rt_arb_plot,    rt_arb_vshot,   rt_arb_tess,    rt_arb_tnurb,
00602                 rt_arb_import5, rt_arb_export5,
00603                 rt_arb_import,  rt_arb_export,  rt_arb_ifree,
00604                 rt_arb_describe,rt_arb_xform,   rt_arb_parse,
00605                 sizeof(struct rt_arb_internal), RT_ARB_INTERNAL_MAGIC,
00606                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00607                 NULL,
00608         },
00609 
00610         {RT_FUNCTAB_MAGIC, "ID_ARS", "ars",
00611                 1,              /* 5 */
00612                 rt_ars_prep,    rt_bot_shot,    rt_ars_print,   rt_bot_norm,
00613                 rt_bot_piece_shot, rt_bot_piece_hitsegs,
00614                 rt_ars_uv,      rt_bot_curve,   rt_bot_class,   rt_bot_free,
00615                 rt_ars_plot,    rt_vstub,       rt_ars_tess,    rt_nul_tnurb,
00616                 rt_ars_import5, rt_ars_export5,
00617                 rt_ars_import,  rt_ars_export,  rt_ars_ifree,
00618                 rt_ars_describe,rt_ars_xform,   NULL,
00619                 sizeof(struct rt_ars_internal), RT_ARS_INTERNAL_MAGIC,
00620                 rt_ars_tclget, rt_ars_tcladjust, rt_parsetab_tclform,
00621                 NULL,
00622         },
00623 
00624         {RT_FUNCTAB_MAGIC, "ID_HALF", "half",
00625                 0,              /* 6 */
00626                 rt_hlf_prep,    rt_hlf_shot,    rt_hlf_print,   rt_hlf_norm,
00627                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00628                 rt_hlf_uv,      rt_hlf_curve,   rt_hlf_class,   rt_hlf_free,
00629                 rt_hlf_plot,    rt_hlf_vshot,   rt_hlf_tess,    rt_nul_tnurb,
00630                 rt_hlf_import5, rt_hlf_export5,
00631                 rt_hlf_import,  rt_hlf_export,  rt_hlf_ifree,
00632                 rt_hlf_describe,rt_generic_xform, rt_hlf_parse,
00633                 sizeof(struct rt_half_internal), RT_HALF_INTERNAL_MAGIC,
00634                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00635                 NULL,
00636         },
00637 
00638         {RT_FUNCTAB_MAGIC, "ID_REC", "rec",
00639                 1,              /* 7 */
00640                 rt_rec_prep,    rt_rec_shot,    rt_rec_print,   rt_rec_norm,
00641                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00642                 rt_rec_uv,      rt_rec_curve,   rt_rec_class,   rt_rec_free,
00643                 rt_tgc_plot,    rt_rec_vshot,   rt_tgc_tess,    rt_nul_tnurb,
00644                 rt_tgc_import5, rt_tgc_export5,
00645                 rt_tgc_import,  rt_tgc_export,  rt_tgc_ifree,
00646                 rt_tgc_describe,rt_rec_xform,   rt_tgc_parse,
00647                 sizeof(struct rt_tgc_internal), RT_TGC_INTERNAL_MAGIC,
00648                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00649                 NULL,
00650         },
00651 
00652         {RT_FUNCTAB_MAGIC, "ID_POLY", "poly",
00653                 1,              /* 8 */
00654                 rt_pg_prep,     rt_pg_shot,     rt_pg_print,    rt_pg_norm,
00655                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00656                 rt_pg_uv,       rt_pg_curve,    rt_pg_class,    rt_pg_free,
00657                 rt_pg_plot,     rt_vstub,       rt_pg_tess,     rt_nul_tnurb,
00658                 rt_nul_import5, rt_nul_export5,
00659                 rt_pg_import,   rt_pg_export,   rt_pg_ifree,
00660                 rt_pg_describe, rt_pg_xform,    NULL,
00661                 sizeof(struct rt_pg_internal), RT_PG_INTERNAL_MAGIC,
00662                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00663                 NULL,
00664         },
00665 
00666         {RT_FUNCTAB_MAGIC, "ID_BSPLINE", "bspline",
00667                 1,              /* 9 */
00668                 rt_nurb_prep,   rt_nurb_shot,   rt_nurb_print,  rt_nurb_norm,
00669                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00670                 rt_nurb_uv,     rt_nurb_curve,  rt_nurb_class,  rt_nurb_free,
00671                 rt_nurb_plot,   rt_vstub,       rt_nurb_tess,   rt_nul_tnurb,
00672                 rt_nurb_import5, rt_nurb_export5,
00673                 rt_nurb_import, rt_nurb_export, rt_nurb_ifree,
00674                 rt_nurb_describe,rt_nurb_xform, NULL,
00675                 sizeof(struct rt_nurb_internal), RT_NURB_INTERNAL_MAGIC,
00676                 rt_nurb_tclget, rt_nurb_tcladjust, rt_parsetab_tclform,
00677                 NULL,
00678         },
00679 
00680         {RT_FUNCTAB_MAGIC, "ID_SPH", "sph",
00681                 0,              /* 10 */
00682                 rt_sph_prep,    rt_sph_shot,    rt_sph_print,   rt_sph_norm,
00683                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00684                 rt_sph_uv,      rt_sph_curve,   rt_sph_class,   rt_sph_free,
00685                 rt_ell_plot,    rt_sph_vshot,   rt_ell_tess,    rt_ell_tnurb,
00686                 rt_ell_import5, rt_ell_export5,
00687                 rt_ell_import,  rt_ell_export,  rt_ell_ifree,
00688                 rt_ell_describe,rt_sph_xform,   rt_ell_parse,
00689                 sizeof(struct rt_ell_internal), RT_ELL_INTERNAL_MAGIC,
00690                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00691                 NULL,
00692         },
00693 
00694         {RT_FUNCTAB_MAGIC, "ID_NMG", "nmg",
00695                 1,              /* 11 */
00696                 rt_nmg_prep,    rt_nmg_shot,    rt_nmg_print,   rt_nmg_norm,
00697                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00698                 rt_nmg_uv,      rt_nmg_curve,   rt_nmg_class,   rt_nmg_free,
00699                 rt_nmg_plot,    rt_nmg_vshot,   rt_nmg_tess,    rt_nul_tnurb,
00700                 rt_nmg_import5, rt_nmg_export5,
00701                 rt_nmg_import,  rt_nmg_export,  rt_nmg_ifree,
00702                 rt_nmg_describe,rt_nmg_xform,   NULL,
00703                 sizeof(struct model), NMG_MODEL_MAGIC,
00704                 rt_nmg_tclget, rt_nmg_tcladjust, rt_parsetab_tclform,
00705                 rt_nmg_make,
00706         },
00707 
00708         {RT_FUNCTAB_MAGIC, "ID_EBM", "ebm",
00709                 1,              /* 12 */
00710                 rt_ebm_prep,    rt_ebm_shot,    rt_ebm_print,   rt_ebm_norm,
00711                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00712                 rt_ebm_uv,      rt_ebm_curve,   rt_ebm_class,   rt_ebm_free,
00713                 rt_ebm_plot,    rt_vstub,       rt_ebm_tess,    rt_nul_tnurb,
00714                 rt_ebm_import5, rt_ebm_export5,
00715                 rt_ebm_import,  rt_ebm_export,  rt_ebm_ifree,
00716                 rt_ebm_describe,rt_ebm_xform,   rt_ebm_parse,
00717                 sizeof(struct rt_ebm_internal), RT_EBM_INTERNAL_MAGIC,
00718                 rt_ebm_tclget, rt_ebm_tcladjust, rt_ebm_tclform,
00719                 rt_ebm_make,
00720         },
00721 
00722         {RT_FUNCTAB_MAGIC, "ID_VOL", "vol",
00723                 1,              /* 13 */
00724                 rt_vol_prep,    rt_vol_shot,    rt_vol_print,   rt_vol_norm,
00725                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00726                 rt_vol_uv,      rt_vol_curve,   rt_vol_class,   rt_vol_free,
00727                 rt_vol_plot,    rt_vstub,       rt_vol_tess,    rt_nul_tnurb,
00728                 rt_vol_import5, rt_vol_export5,
00729                 rt_vol_import,  rt_vol_export,  rt_vol_ifree,
00730                 rt_vol_describe,rt_vol_xform,   rt_vol_parse,
00731                 sizeof(struct rt_vol_internal), RT_VOL_INTERNAL_MAGIC,
00732                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00733                 NULL,
00734         },
00735 
00736         {RT_FUNCTAB_MAGIC, "ID_ARBN", "arbn",
00737                 0,              /* 14 */
00738                 rt_arbn_prep,   rt_arbn_shot,   rt_arbn_print,  rt_arbn_norm,
00739                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00740                 rt_arbn_uv,     rt_arbn_curve,  rt_arbn_class,  rt_arbn_free,
00741                 rt_arbn_plot,   rt_arbn_vshot,  rt_arbn_tess,   rt_nul_tnurb,
00742                 rt_arbn_import5, rt_arbn_export5,
00743                 rt_arbn_import, rt_arbn_export, rt_arbn_ifree,
00744                 rt_arbn_describe,rt_arbn_xform, NULL,
00745                 sizeof(struct rt_arbn_internal), RT_ARBN_INTERNAL_MAGIC,
00746                 rt_arbn_tclget, rt_arbn_tcladjust, rt_parsetab_tclform,
00747                 NULL,
00748         },
00749 
00750         {RT_FUNCTAB_MAGIC, "ID_PIPE", "pipe",
00751                 1,              /* 15 */
00752                 rt_pipe_prep,   rt_pipe_shot,   rt_pipe_print,  rt_pipe_norm,
00753                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00754                 rt_pipe_uv,     rt_pipe_curve,  rt_pipe_class,  rt_pipe_free,
00755                 rt_pipe_plot,   rt_pipe_vshot,  rt_pipe_tess,   rt_nul_tnurb,
00756                 rt_pipe_import5, rt_pipe_export5,
00757                 rt_pipe_import, rt_pipe_export, rt_pipe_ifree,
00758                 rt_pipe_describe,rt_pipe_xform, NULL,
00759                 sizeof(struct rt_pipe_internal), RT_PIPE_INTERNAL_MAGIC,
00760                 rt_pipe_tclget,
00761                 rt_pipe_tcladjust,
00762                 rt_parsetab_tclform,
00763                 NULL,
00764         },
00765 
00766         {RT_FUNCTAB_MAGIC, "ID_PARTICLE", "part",
00767                 0,              /* 16 */
00768                 rt_part_prep,   rt_part_shot,   rt_part_print,  rt_part_norm,
00769                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00770                 rt_part_uv,     rt_part_curve,  rt_part_class,  rt_part_free,
00771                 rt_part_plot,   rt_part_vshot,  rt_part_tess,   rt_nul_tnurb,
00772                 rt_part_import5, rt_part_export5,
00773                 rt_part_import, rt_part_export, rt_part_ifree,
00774                 rt_part_describe,rt_part_xform, rt_part_parse,
00775                 sizeof(struct rt_part_internal), RT_PART_INTERNAL_MAGIC,
00776                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00777                 NULL,
00778         },
00779 
00780         {RT_FUNCTAB_MAGIC, "ID_RPC", "rpc",
00781                 0,              /* 17 */
00782                 rt_rpc_prep,    rt_rpc_shot,    rt_rpc_print,   rt_rpc_norm,
00783                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00784                 rt_rpc_uv,      rt_rpc_curve,   rt_rpc_class,   rt_rpc_free,
00785                 rt_rpc_plot,    rt_rpc_vshot,   rt_rpc_tess,    rt_nul_tnurb,
00786                 rt_rpc_import5, rt_rpc_export5,
00787                 rt_rpc_import,  rt_rpc_export,  rt_rpc_ifree,
00788                 rt_rpc_describe,rt_rpc_xform,   rt_rpc_parse,
00789                 sizeof(struct rt_rpc_internal), RT_RPC_INTERNAL_MAGIC,
00790                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00791                 NULL,
00792         },
00793 
00794         {RT_FUNCTAB_MAGIC, "ID_RHC", "rhc",
00795                 0,              /* 18 */
00796                 rt_rhc_prep,    rt_rhc_shot,    rt_rhc_print,   rt_rhc_norm,
00797                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00798                 rt_rhc_uv,      rt_rhc_curve,   rt_rhc_class,   rt_rhc_free,
00799                 rt_rhc_plot,    rt_rhc_vshot,   rt_rhc_tess,    rt_nul_tnurb,
00800                 rt_rhc_import5, rt_rhc_export5,
00801                 rt_rhc_import,  rt_rhc_export,  rt_rhc_ifree,
00802                 rt_rhc_describe,rt_rhc_xform,   rt_rhc_parse,
00803                 sizeof(struct rt_rhc_internal), RT_RHC_INTERNAL_MAGIC,
00804                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00805                 NULL,
00806         },
00807 
00808         {RT_FUNCTAB_MAGIC, "ID_EPA", "epa",
00809                 0,              /* 19 */
00810                 rt_epa_prep,    rt_epa_shot,    rt_epa_print,   rt_epa_norm,
00811                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00812                 rt_epa_uv,      rt_epa_curve,   rt_epa_class,   rt_epa_free,
00813                 rt_epa_plot,    rt_epa_vshot,   rt_epa_tess,    rt_nul_tnurb,
00814                 rt_epa_import5, rt_epa_export5,
00815                 rt_epa_import,  rt_epa_export,  rt_epa_ifree,
00816                 rt_epa_describe,rt_epa_xform,   rt_epa_parse,
00817                 sizeof(struct rt_epa_internal), RT_EPA_INTERNAL_MAGIC,
00818                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00819                 NULL,
00820         },
00821 
00822         {RT_FUNCTAB_MAGIC, "ID_EHY", "ehy",
00823                 0,              /* 20 */
00824                 rt_ehy_prep,    rt_ehy_shot,    rt_ehy_print,   rt_ehy_norm,
00825                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00826                 rt_ehy_uv,      rt_ehy_curve,   rt_ehy_class,   rt_ehy_free,
00827                 rt_ehy_plot,    rt_ehy_vshot,   rt_ehy_tess,    rt_nul_tnurb,
00828                 rt_ehy_import5, rt_ehy_export5,
00829                 rt_ehy_import,  rt_ehy_export,  rt_ehy_ifree,
00830                 rt_ehy_describe,rt_ehy_xform,   rt_ehy_parse,
00831                 sizeof(struct rt_ehy_internal), RT_EHY_INTERNAL_MAGIC,
00832                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00833                 NULL,
00834         },
00835 
00836         {RT_FUNCTAB_MAGIC, "ID_ETO", "eto",
00837                 1,              /* 21 */
00838                 rt_eto_prep,    rt_eto_shot,    rt_eto_print,   rt_eto_norm,
00839                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00840                 rt_eto_uv,      rt_eto_curve,   rt_eto_class,   rt_eto_free,
00841                 rt_eto_plot,    rt_eto_vshot,   rt_eto_tess,    rt_nul_tnurb,
00842                 rt_eto_import5, rt_eto_export5,
00843                 rt_eto_import,  rt_eto_export,  rt_eto_ifree,
00844                 rt_eto_describe,rt_eto_xform,   rt_eto_parse,
00845                 sizeof(struct rt_eto_internal), RT_ETO_INTERNAL_MAGIC,
00846                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00847                 NULL,
00848         },
00849 
00850         {RT_FUNCTAB_MAGIC, "ID_GRIP", "grip",
00851                 1,              /* 22 */
00852                 rt_grp_prep,    rt_grp_shot,    rt_grp_print,   rt_grp_norm,
00853                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00854                 rt_grp_uv,      rt_grp_curve,   rt_grp_class,   rt_grp_free,
00855                 rt_grp_plot,    rt_grp_vshot,   rt_grp_tess,    rt_nul_tnurb,
00856                 rt_grp_import5, rt_grp_export5,
00857                 rt_grp_import,  rt_grp_export,  rt_grp_ifree,
00858                 rt_grp_describe,rt_grp_xform,   rt_grp_parse,
00859                 sizeof(struct rt_grip_internal), RT_GRIP_INTERNAL_MAGIC,
00860                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00861                 NULL,
00862         },
00863 
00864         {RT_FUNCTAB_MAGIC, "ID_JOINT", "joint",
00865                 0,              /* 23 -- XXX unimplemented */
00866                 rt_nul_prep,    rt_nul_shot,    rt_nul_print,   rt_nul_norm,
00867                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00868                 rt_nul_uv,      rt_nul_curve,   rt_nul_class,   rt_nul_free,
00869                 rt_nul_plot,    rt_nul_vshot,   rt_nul_tess,    rt_nul_tnurb,
00870                 rt_nul_import5, rt_nul_export5,
00871                 rt_nul_import,  rt_nul_export,  rt_nul_ifree,
00872                 rt_nul_describe,rt_nul_xform,   NULL,
00873                 0,                              0,
00874                 rt_nul_tclget,  rt_nul_tcladjust, rt_nul_tclform,
00875                 rt_nul_make,
00876         },
00877 
00878         {RT_FUNCTAB_MAGIC, "ID_HF", "hf",
00879                 0,              /* 24 */
00880                 rt_hf_prep,     rt_hf_shot,     rt_hf_print,    rt_hf_norm,
00881                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00882                 rt_hf_uv,       rt_hf_curve,    rt_hf_class,    rt_hf_free,
00883                 rt_hf_plot,     rt_vstub,       rt_hf_tess,     rt_nul_tnurb,
00884                 rt_hf_import5,  rt_hf_export5,
00885                 rt_hf_import,   rt_hf_export,   rt_hf_ifree,
00886                 rt_hf_describe,rt_hf_xform,     rt_hf_parse,
00887                 sizeof(struct rt_hf_internal), RT_HF_INTERNAL_MAGIC,
00888                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00889                 NULL,
00890         },
00891 
00892         {RT_FUNCTAB_MAGIC, "ID_DSP", "dsp",
00893                 1,              /* 25 Displacement Map (alt. height field) */
00894                 rt_dsp_prep,    rt_dsp_shot,    rt_dsp_print,   rt_dsp_norm,
00895                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00896                 rt_dsp_uv,      rt_dsp_curve,   rt_dsp_class,   rt_dsp_free,
00897                 rt_dsp_plot,    rt_vstub,       rt_nul_tess,    rt_nul_tnurb,
00898                 rt_dsp_import5, rt_dsp_export5,
00899                 rt_dsp_import,  rt_dsp_export,  rt_dsp_ifree,
00900                 rt_dsp_describe,rt_dsp_xform,   rt_dsp_parse,
00901                 sizeof(struct rt_dsp_internal), RT_DSP_INTERNAL_MAGIC,
00902                 rt_dsp_tclget,  rt_dsp_tcladjust, rt_nul_tclform,
00903                 rt_dsp_make,
00904         },
00905 
00906         {RT_FUNCTAB_MAGIC, "ID_SKETCH", "sketch",
00907                 0,              /* 26 2D sketch */
00908                 rt_sketch_prep, rt_sketch_shot, rt_sketch_print, rt_sketch_norm,
00909                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00910                 rt_sketch_uv,   rt_sketch_curve, rt_sketch_class,rt_sketch_free,
00911                 rt_sketch_plot, rt_vstub,       rt_nul_tess,    rt_nul_tnurb,
00912                 rt_sketch_import5, rt_sketch_export5,
00913                 rt_sketch_import, rt_sketch_export, rt_sketch_ifree,
00914                 rt_sketch_describe,rt_sketch_xform, NULL,
00915                 sizeof(struct rt_sketch_internal), RT_SKETCH_INTERNAL_MAGIC,
00916                 rt_sketch_tclget, rt_sketch_tcladjust, rt_sketch_tclform,
00917                 NULL,
00918         },
00919 
00920         {RT_FUNCTAB_MAGIC, "ID_EXTRUDE", "extrude",
00921                 1,              /* 27 Solid of extrusion */
00922                 rt_extrude_prep,        rt_extrude_shot,        rt_extrude_print,       rt_extrude_norm,
00923                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00924                 rt_extrude_uv,          rt_extrude_curve,       rt_extrude_class,       rt_extrude_free,
00925                 rt_extrude_plot,        rt_extrude_vshot,       rt_extrude_tess,        rt_nul_tnurb,
00926                 rt_extrude_import5, rt_extrude_export5,
00927                 rt_extrude_import,      rt_extrude_export,      rt_extrude_ifree,
00928                 rt_extrude_describe,rt_extrude_xform, NULL,
00929                 sizeof(struct rt_extrude_internal), RT_EXTRUDE_INTERNAL_MAGIC,
00930                 rt_extrude_tclget, rt_extrude_tcladjust, rt_extrude_tclform,
00931                 NULL,
00932         },
00933 
00934         {RT_FUNCTAB_MAGIC, "ID_SUBMODEL", "submodel",
00935                 1,              /* 28 Instanced submodel */
00936                 rt_submodel_prep,       rt_submodel_shot,       rt_submodel_print,      rt_submodel_norm,
00937                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00938                 rt_submodel_uv,         rt_submodel_curve,      rt_submodel_class,      rt_submodel_free,
00939                 rt_submodel_plot,       rt_vstub,               rt_submodel_tess,       rt_nul_tnurb,
00940                 rt_submodel_import5, rt_submodel_export5,
00941                 rt_submodel_import,     rt_submodel_export,     rt_submodel_ifree,
00942                 rt_submodel_describe,   rt_submodel_xform,      rt_submodel_parse,
00943                 sizeof(struct rt_submodel_internal), RT_SUBMODEL_INTERNAL_MAGIC,
00944                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
00945                 NULL,
00946         },
00947 
00948         {RT_FUNCTAB_MAGIC, "ID_CLINE", "cline",
00949                 0,              /* 29 Fastgen cline solid */
00950                 rt_cline_prep,  rt_cline_shot,  rt_cline_print, rt_cline_norm,
00951                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00952                 rt_cline_uv,    rt_cline_curve, rt_cline_class, rt_cline_free,
00953                 rt_cline_plot,  rt_cline_vshot, rt_cline_tess,  rt_cline_tnurb,
00954                 rt_cline_import5, rt_cline_export5,
00955                 rt_cline_import,        rt_cline_export,        rt_cline_ifree,
00956                 rt_cline_describe,rt_cline_xform,       rt_cline_parse,
00957                 sizeof(struct rt_cline_internal), RT_CLINE_INTERNAL_MAGIC,
00958                 rt_cline_tclget, rt_cline_tcladjust, rt_cline_tclform,
00959                 NULL,
00960         },
00961 
00962         {RT_FUNCTAB_MAGIC, "ID_BOT", "bot",
00963                 0,              /* 30  Bag o' Triangles */
00964                 rt_bot_prep,    rt_bot_shot,    rt_bot_print,   rt_bot_norm,
00965                 rt_bot_piece_shot, rt_bot_piece_hitsegs,
00966                 rt_bot_uv,      rt_bot_curve,   rt_bot_class,   rt_bot_free,
00967                 rt_bot_plot,    rt_bot_vshot,   rt_bot_tess,    rt_bot_tnurb,
00968                 rt_bot_import5, rt_bot_export5,
00969                 rt_bot_import,  rt_bot_export,  rt_bot_ifree,
00970                 rt_bot_describe,rt_bot_xform,   NULL,
00971                 sizeof(struct rt_bot_internal), RT_BOT_INTERNAL_MAGIC,
00972                 rt_bot_tclget, rt_bot_tcladjust, rt_bot_tclform,
00973                 NULL,
00974         },
00975 
00976         /* ID_MAX_SOLID.  Add new solids _above_ this point */
00977 
00978         {RT_FUNCTAB_MAGIC, "ID_COMBINATION", "comb",
00979                 0,
00980                 rt_nul_prep,    rt_nul_shot,    rt_nul_print,   rt_nul_norm,
00981                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00982                 rt_nul_uv,      rt_nul_curve,   rt_nul_class,   rt_nul_free,
00983                 rt_nul_plot,    rt_nul_vshot,   rt_nul_tess,    rt_nul_tnurb,
00984                 rt_comb_import5, rt_comb_export5,
00985                 rt_comb_import4, rt_comb_export4, rt_comb_ifree,
00986                 rt_comb_describe,rt_generic_xform, NULL,
00987                 0,                              0,
00988                 rt_comb_tclget, rt_comb_tcladjust, rt_comb_tclform,
00989                 rt_comb_make,
00990         },
00991 
00992         {RT_FUNCTAB_MAGIC, "ID_BINEXPM", "binexpm",
00993                 0,
00994                 rt_nul_prep,    rt_nul_shot,    rt_nul_print,   rt_nul_norm,
00995                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
00996                 rt_nul_uv,      rt_nul_curve,   rt_nul_class,   rt_nul_free,
00997                 rt_nul_plot,    rt_nul_vshot,   rt_nul_tess,    rt_nul_tnurb,
00998                 rt_binexpm_import5,
00999          rt_nul_export5,
01000                 rt_nul_import,  rt_nul_export,  rt_nul_ifree,
01001                 rt_nul_describe,rt_generic_xform, NULL,
01002                 0,                              0,
01003                 rt_nul_tclget,  rt_nul_tcladjust, rt_nul_tclform,
01004                 rt_nul_make,
01005         },
01006 
01007         {RT_FUNCTAB_MAGIC, "ID_BINUNIF", "binunif",
01008                 0,
01009                 rt_nul_prep,    rt_nul_shot,    rt_nul_print,   rt_nul_norm,
01010                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
01011                 rt_nul_uv,      rt_nul_curve,   rt_nul_class,   rt_nul_free,
01012                 rt_nul_plot,    rt_nul_vshot,   rt_nul_tess,    rt_nul_tnurb,
01013                 rt_binunif_import5,
01014          rt_binunif_export5,
01015                 rt_nul_import,  rt_nul_export,  rt_binunif_ifree,
01016                 rt_binunif_describe, rt_generic_xform, NULL,
01017                 0,                              0,
01018                 rt_binunif_tclget,      rt_binunif_tcladjust, rt_nul_tclform,
01019                 rt_binunif_make,
01020         },
01021 
01022         {RT_FUNCTAB_MAGIC, "ID_BINMIME", "binmime",
01023                 0,
01024                 rt_nul_prep,    rt_nul_shot,    rt_nul_print,   rt_nul_norm,
01025                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
01026                 rt_nul_uv,      rt_nul_curve,   rt_nul_class,   rt_nul_free,
01027                 rt_nul_plot,    rt_nul_vshot,   rt_nul_tess,    rt_nul_tnurb,
01028                 rt_binmime_import5, rt_nul_export5,
01029                 rt_nul_import,  rt_nul_export,  rt_nul_ifree,
01030                 rt_nul_describe,rt_generic_xform, NULL,
01031                 0,                              0,
01032                 rt_nul_tclget,  rt_nul_tcladjust, rt_nul_tclform,
01033                 rt_nul_make,
01034         },
01035 
01036         {RT_FUNCTAB_MAGIC, "ID_SUPERELL", "superell",
01037                 1,              /* 35 but "should" be 31 Superquadratic Ellipsoid  */
01038                 rt_superell_prep,       rt_superell_shot,       rt_superell_print,      rt_superell_norm,
01039                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
01040                 rt_superell_uv, rt_superell_curve,      rt_superell_class,      rt_superell_free,
01041                 rt_superell_plot,       rt_superell_vshot,      rt_superell_tess,       rt_superell_tnurb,
01042                 rt_superell_import5, rt_superell_export5,
01043                 rt_superell_import,     rt_superell_export,     rt_superell_ifree,
01044                 rt_superell_describe,rt_superell_xform, rt_superell_parse,
01045                 sizeof(struct rt_superell_internal), RT_SUPERELL_INTERNAL_MAGIC,
01046                 rt_parsetab_tclget, rt_parsetab_tcladjust, rt_parsetab_tclform,
01047                 NULL,
01048         },
01049 
01050         {RT_FUNCTAB_MAGIC, "ID_METABALL", "metaball",
01051                 1,              /* 36 but "should" be 32 Metaball  */
01052                 rt_metaball_prep,       rt_metaball_shot,       rt_metaball_print,      rt_metaball_norm,
01053                 rt_nul_piece_shot,      rt_nul_piece_hitsegs,
01054                 rt_metaball_uv,         rt_metaball_curve,      rt_metaball_class,      rt_metaball_free,
01055                 rt_metaball_plot,       rt_nul_vshot,           rt_metaball_tess,       rt_metaball_tnurb,
01056                 rt_metaball_import5,    rt_metaball_export5,
01057                 rt_nul_import,          rt_nul_export,  rt_metaball_ifree,
01058                 rt_metaball_describe,   rt_metaball_xform,      rt_nul_parse,
01059                 sizeof(struct rt_metaball_internal),            RT_METABALL_INTERNAL_MAGIC,
01060                 rt_parsetab_tclget,     rt_parsetab_tcladjust,  rt_parsetab_tclform,
01061                 NULL,
01062         },
01063 
01064         {0L, ">ID_MAXIMUM", ">id_max",
01065                 0,              /* this entry for sanity only */
01066                 rt_nul_prep,    rt_nul_shot,    rt_nul_print,   rt_nul_norm,
01067                 rt_nul_piece_shot, rt_nul_piece_hitsegs,
01068                 rt_nul_uv,      rt_nul_curve,   rt_nul_class,   rt_nul_free,
01069                 rt_nul_plot,    rt_nul_vshot,   rt_nul_tess,    rt_nul_tnurb,
01070                 rt_nul_import5, rt_nul_export5,
01071                 rt_nul_import,  rt_nul_export,  rt_nul_ifree,
01072                 rt_nul_describe,rt_nul_xform,   NULL,
01073                 0,                              0,
01074                 rt_nul_tclget,  rt_nul_tcladjust, rt_nul_tclform,
01075                 rt_nul_make,
01076         }
01077 };
01078 const int rt_nfunctab = sizeof(rt_functab)/sizeof(struct rt_functab);
01079 
01080 /*
01081  *  Hooks for unimplemented routines
01082  */
01083 #if __STDC__
01084 #define DEF(func,args)  func BU_ARGS(args) { \
01085         bu_log(#func " unimplemented\n"); return; }
01086 #define IDEF(func,args) func BU_ARGS(args) { \
01087         bu_log(#func " unimplemented\n"); return(0); }
01088 #define NDEF(func,args) func BU_ARGS(args) { \
01089         bu_log(#func " unimplemented\n"); return(-1); }
01090 #else
01091 #define DEF(func,args)  func BU_ARGS(args) { \
01092         bu_log("func unimplemented\n"); return; }
01093 #define IDEF(func,args) func BU_ARGS(args) { \
01094         bu_log("func unimplemented\n"); return(0); }
01095 #define NDEF(func,args) func BU_ARGS(args) { \
01096         bu_log("func unimplemented\n"); return(-1); }
01097 #endif
01098 
01099 int IDEF(rt_nul_prep,(struct soltab *stp,
01100                         struct rt_db_internal *ip,
01101                         struct rt_i *rtip))
01102 int IDEF(rt_nul_shot,(struct soltab *stp,
01103                         struct xray *rp,
01104                         struct application *ap,
01105                         struct seg *seghead))
01106 int IDEF(rt_nul_piece_shot,(struct rt_piecestate *psp,
01107                         struct rt_piecelist *plp,
01108                         double dist_corr,
01109                         struct xray *rp,
01110                         struct application *ap,
01111                         struct seg *seghead))
01112 void DEF(rt_nul_piece_hitsegs,(struct rt_piecestate *psp,
01113                         struct seg *seghead,
01114                         struct application *ap))
01115 void DEF(rt_nul_print,(const struct soltab *stp))
01116 void DEF(rt_nul_norm,(struct hit *hitp,
01117                         struct soltab *stp,
01118                         struct xray *rp))
01119 void DEF(rt_nul_uv,(struct application *ap,
01120                         struct soltab *stp,
01121                         struct hit *hitp,
01122                         struct uvcoord *uvp))
01123 void DEF(rt_nul_curve,(struct curvature *cvp,
01124                         struct hit *hitp,
01125                         struct soltab *stp))
01126 int IDEF(rt_nul_class,())
01127 void DEF(rt_nul_free,(struct soltab *stp))
01128 int NDEF(rt_nul_plot,(struct bu_list *vhead,
01129                         struct rt_db_internal *ip,
01130                         const struct rt_tess_tol *ttol,
01131                         const struct bn_tol *tol))
01132 void DEF(rt_nul_vshot,(struct soltab *stp[],
01133                         struct xray *rp[],
01134                         struct seg segp[], int n,
01135                         struct application *ap))
01136 int NDEF(rt_nul_tess,(struct nmgregion **r,
01137                         struct model *m,
01138                         struct rt_db_internal *ip,
01139                         const struct rt_tess_tol *ttol,
01140                         const struct bn_tol *tol))
01141 int NDEF(rt_nul_tnurb,(struct nmgregion **r,
01142                         struct model *m,
01143                         struct rt_db_internal *ip,
01144                         const struct bn_tol *tol))
01145 int NDEF(rt_nul_import5,(struct rt_db_internal *ip,
01146                         const struct bu_external *ep,
01147                         const mat_t mat, const struct db_i *dbip,
01148                         struct resource *resp,
01149                          const int minot_type))
01150 int NDEF(rt_nul_export5,(struct bu_external *ep,
01151                         const struct rt_db_internal *ip,
01152                         double local2mm, const struct db_i *dbip,
01153                         struct resource *resp,
01154                         const int minor_type ))
01155 int NDEF(rt_nul_import,(struct rt_db_internal *ip,
01156                         const struct bu_external *ep,
01157                         const mat_t mat, const struct db_i *dbip,
01158                         struct resource *resp ))
01159 int NDEF(rt_nul_export,(struct bu_external *ep,
01160                         const struct rt_db_internal *ip,
01161                         double local2mm, const struct db_i *dbip,
01162                         struct resource *resp ))
01163 void DEF(rt_nul_ifree,(struct rt_db_internal *ip, struct resource *resp))
01164 int NDEF(rt_nul_describe,(struct bu_vls *str,
01165                         const struct rt_db_internal *ip,
01166                         int verbose, double mm2local, struct resource *resp,
01167                           struct db_i *db_i))
01168 int NDEF(rt_nul_xform, (struct rt_db_internal *op,
01169                         const mat_t mat, struct rt_db_internal *ip,
01170                         int free, struct db_i *dbip, struct resource *resp))
01171 
01172 /* Map for database solidrec objects to internal objects */
01173 static char idmap[] = {
01174         ID_NULL,        /* undefined, 0 */
01175         ID_NULL,        /* RPP  1 axis-aligned rectangular parallelopiped */
01176         ID_NULL,        /* BOX  2 arbitrary rectangular parallelopiped */
01177         ID_NULL,        /* RAW  3 right-angle wedge */
01178         ID_NULL,        /* ARB4 4 tetrahedron */
01179         ID_NULL,        /* ARB5 5 pyramid */
01180         ID_NULL,        /* ARB6 6 extruded triangle */
01181         ID_NULL,        /* ARB7 7 weird 7-vertex shape */
01182         ID_NULL,        /* ARB8 8 hexahedron */
01183         ID_NULL,        /* ELL  9 ellipsoid */
01184         ID_NULL,        /* ELL1 10 another ellipsoid ? */
01185         ID_NULL,        /* SPH  11 sphere */
01186         ID_NULL,        /* RCC  12 right circular cylinder */
01187         ID_NULL,        /* REC  13 right elliptic cylinder */
01188         ID_NULL,        /* TRC  14 truncated regular cone */
01189         ID_NULL,        /* TEC  15 truncated elliptic cone */
01190         ID_TOR,         /* TOR  16 toroid */
01191         ID_NULL,        /* TGC  17 truncated general cone */
01192         ID_TGC,         /* GENTGC 18 supergeneralized TGC; internal form */
01193         ID_ELL,         /* GENELL 19: V,A,B,C */
01194         ID_ARB8,        /* GENARB8 20:  V, and 7 other vectors */
01195         ID_NULL,        /* HACK: ARS 21: arbitrary triangular-surfaced polyhedron */
01196         ID_NULL,        /* HACK: ARSCONT 22: extension record type for ARS solid */
01197         ID_NULL,        /* ELLG 23:  gift-only */
01198         ID_HALF,        /* HALFSPACE 24:  halfspace */
01199         ID_NULL,        /* HACK: SPLINE 25 */
01200         ID_RPC,         /* HACK: RPC 26: right parabolic cylinder */
01201         ID_RHC,         /* HACK: RHC 27: right hyperbolic cylinder */
01202         ID_EPA,         /* HACK: EPA 28: elliptical paraboloid */
01203         ID_EHY,         /* HACK: EHY 29: elliptical hyperboloid */
01204         ID_ETO,         /* HACK: ETO 29: elliptical torus */
01205         ID_GRIP,        /* HACK: GRP 30: grip pseudo solid */
01206         ID_NULL         /* n+1 */
01207 };
01208 
01209 /*
01210  *                      R T _ I D _ S O L I D
01211  *
01212  *  Given a database record, determine the proper rt_functab subscript.
01213  *  Used by MGED as well as internally to librt.
01214  *
01215  *  Returns ID_xxx if successful, or ID_NULL upon failure.
01216  */
01217 int
01218 rt_id_solid(struct bu_external *ep)
01219 {
01220         register union record *rec;
01221         register int id;
01222 
01223         BU_CK_EXTERNAL( ep );
01224         rec = (union record *)ep->ext_buf;
01225 
01226         switch( rec->u_id )  {
01227         case ID_SOLID:
01228                 id = idmap[(int)(rec->s.s_type)];
01229                 break;
01230         case ID_ARS_A:
01231                 id = ID_ARS;
01232                 break;
01233         case ID_P_HEAD:
01234                 id = ID_POLY;
01235                 break;
01236         case ID_BSOLID:
01237                 id = ID_BSPLINE;
01238                 break;
01239         case DBID_STRSOL:
01240                 /* XXX This really needs to be some kind of table */
01241                 if( strcmp( rec->ss.ss_keyword, "ebm" ) == 0 )  {
01242                         id = ID_EBM;
01243                         break;
01244                 } else if( strcmp( rec->ss.ss_keyword, "vol" ) == 0 )  {
01245                         id = ID_VOL;
01246                         break;
01247                 } else if( strcmp( rec->ss.ss_keyword, "hf" ) == 0 )  {
01248                         id = ID_HF;
01249                         break;
01250                 } else if( strcmp( rec->ss.ss_keyword, "dsp" ) == 0 )  {
01251                         id = ID_DSP;
01252                         break;
01253                 } else if( strcmp( rec->ss.ss_keyword, "submodel" ) == 0 )  {
01254                         id = ID_SUBMODEL;
01255                         break;
01256                 }
01257                 bu_log("rt_id_solid(%s):  String solid type '%s' unknown\n",
01258                         rec->ss.ss_name, rec->ss.ss_keyword );
01259                 id = ID_NULL;           /* BAD */
01260                 break;
01261         case DBID_ARBN:
01262                 id = ID_ARBN;
01263                 break;
01264         case DBID_PIPE:
01265                 id = ID_PIPE;
01266                 break;
01267         case DBID_PARTICLE:
01268                 id = ID_PARTICLE;
01269                 break;
01270         case DBID_NMG:
01271                 id = ID_NMG;
01272                 break;
01273         case DBID_SKETCH:
01274                 id = ID_SKETCH;
01275                 break;
01276         case DBID_EXTR:
01277                 id = ID_EXTRUDE;
01278                 break;
01279         case DBID_CLINE:
01280                 id = ID_CLINE;
01281                 break;
01282         case DBID_BOT:
01283                 id = ID_BOT;
01284                 break;
01285         default:
01286                 bu_log("rt_id_solid:  u_id=x%x unknown\n", rec->u_id);
01287                 id = ID_NULL;           /* BAD */
01288                 break;
01289         }
01290         if( id < ID_NULL || id > ID_MAX_SOLID )  {
01291                 bu_log("rt_id_solid: internal error, id=%d?\n", id);
01292                 id = ID_NULL;           /* very BAD */
01293         }
01294         return(id);
01295 }
01296 
01297 /*
01298  *              R T _ G E T _ F U N C T A B _ B Y _ L A B E L
01299  *
01300  *  Given the Tcl 'label' for a given solid type,
01301  *  find the appropriate entry in rt_functab[].
01302  */
01303 const struct rt_functab *
01304 rt_get_functab_by_label(const char *label)
01305 {
01306         register const struct rt_functab        *ftp;
01307 
01308         for( ftp = rt_functab; ftp->magic != 0; ftp++ )  {
01309                 if( strncmp( label, ftp->ft_label, 8 ) == 0 )
01310                         return ftp;
01311         }
01312         return NULL;
01313 }
01314 
01315 /*
01316  *                      R T _ G E N E R I C _ X F O R M
01317  *
01318  *  Apply a 4x4 transformation matrix to the internal form of a solid.
01319  *
01320  *  If "free" flag is non-zero, storage for the original solid is released.
01321  *  If "os" is same as "is", storage for the original solid is
01322  *  overwritten with the new, transformed solid.
01323  *
01324  *
01325  *  Returns -
01326  *      -1      FAIL
01327  *       0      OK
01328  */
01329 int
01330 rt_generic_xform(
01331         struct rt_db_internal   *op,
01332         const mat_t             mat,
01333         struct rt_db_internal   *ip,
01334         int                     free,
01335         struct db_i             *dbip,
01336         struct resource         *resp)
01337 {
01338         struct bu_external      ext;
01339         int                     id;
01340         struct bu_attribute_value_set avs;
01341 
01342 
01343         RT_CK_DB_INTERNAL( ip );
01344         RT_CK_DBI(dbip);
01345         RT_CK_RESOURCE(resp);
01346 
01347         id = ip->idb_type;
01348         BU_INIT_EXTERNAL(&ext);
01349         /* Scale change on export is 1.0 -- no change */
01350         switch (dbip->dbi_version) {
01351         case 4:
01352             if( rt_functab[id].ft_export( &ext, ip, 1.0, dbip, resp ) < 0 )  {
01353                 bu_log("rt_generic_xform():  %s export failure\n",
01354                         rt_functab[id].ft_name);
01355                 return -1;                      /* FAIL */
01356             }
01357             if( (free || op == ip) )  rt_db_free_internal(ip, resp);
01358 
01359             RT_INIT_DB_INTERNAL(op);
01360             if( rt_functab[id].ft_import( op, &ext, mat, dbip, resp ) < 0 )  {
01361                 bu_log("rt_generic_xform():  solid import failure\n");
01362                 return -1;                      /* FAIL */
01363             }
01364             break;
01365         case 5:
01366             avs.magic = -1;
01367 
01368             if( rt_functab[id].ft_export5( &ext, ip, 1.0, dbip, resp, 0 ) < 0 )  {
01369                 bu_log("rt_generic_xform():  %s export failure\n",
01370                         rt_functab[id].ft_name);
01371                 return -1;                      /* FAIL */
01372             }
01373 
01374             if( (free || op == ip) ) {
01375                     if( ip->idb_avs.magic == BU_AVS_MAGIC ) {
01376                             /* grab the attributes before they are lost
01377                              * by rt_db_free_internal or RT_INIT_DB_INTERNAL
01378                              */
01379                             bu_avs_init( &avs, ip->idb_avs.count, "avs" );
01380                             bu_avs_merge( &avs, &ip->idb_avs );
01381                     }
01382                     rt_db_free_internal(ip, resp);
01383             }
01384 
01385             RT_INIT_DB_INTERNAL(op);
01386 
01387             if( !free && op != ip ) {
01388                     /* just copy the attributes from ip to op */
01389                     if( ip->idb_avs.magic == BU_AVS_MAGIC ) {
01390                             bu_avs_init( &op->idb_avs, ip->idb_avs.count, "avs" );
01391                             bu_avs_merge( &op->idb_avs, &ip->idb_avs );
01392                     }
01393             } else if( avs.magic == BU_AVS_MAGIC ) {
01394                     /* put the saved attributes in the output */
01395                     bu_avs_init( &op->idb_avs, avs.count, "avs" );
01396                     bu_avs_merge( &op->idb_avs, &avs );
01397                     bu_avs_free( &avs );
01398             }
01399 
01400             if( rt_functab[id].ft_import5( op, &ext, mat, dbip, resp, 0 ) < 0 )  {
01401                 bu_log("rt_generic_xform():  solid import failure\n");
01402                 return -1;                      /* FAIL */
01403             }
01404             break;
01405         }
01406 
01407         bu_free_external( &ext );
01408 
01409         RT_CK_DB_INTERNAL( op );
01410         return 0;                               /* OK */
01411 }
01412 
01413 /*
01414  * Local Variables:
01415  * mode: C
01416  * tab-width: 8
01417  * c-basic-offset: 4
01418  * indent-tabs-mode: t
01419  * End:
01420  * ex: shiftwidth=4 tabstop=8
01421  */

Generated on Mon Sep 18 01:24:57 2006 for BRL-CAD by  doxygen 1.4.6