Revision: 77067
          http://sourceforge.net/p/brlcad/code/77067
Author:   starseeker
Date:     2020-09-04 21:05:55 +0000 (Fri, 04 Sep 2020)
Log Message:
-----------
Merge from trunk: r77032 through r77066

Modified Paths:
--------------
    brlcad/branches/RELEASE/CMakeLists.txt
    brlcad/branches/RELEASE/TODO
    brlcad/branches/RELEASE/doc/README.Windows
    brlcad/branches/RELEASE/include/bn/anim.h
    brlcad/branches/RELEASE/include/bn/complex.h
    brlcad/branches/RELEASE/include/bn/dvec.h
    brlcad/branches/RELEASE/include/bn/noise.h
    brlcad/branches/RELEASE/include/bn/plane.h
    brlcad/branches/RELEASE/include/bn/poly.h
    brlcad/branches/RELEASE/include/bn/rand.h
    brlcad/branches/RELEASE/include/bu/app.h
    brlcad/branches/RELEASE/include/bu/color.h
    brlcad/branches/RELEASE/include/bu/column.h
    brlcad/branches/RELEASE/include/bu/defines.h
    brlcad/branches/RELEASE/include/bu/endian.h
    brlcad/branches/RELEASE/include/bu/glob.h
    brlcad/branches/RELEASE/include/bu/tbl.h
    brlcad/branches/RELEASE/include/common.h
    brlcad/branches/RELEASE/include/gcv/api.h
    brlcad/branches/RELEASE/misc/CMake/CMakeLists.txt
    brlcad/branches/RELEASE/misc/tools/CMakeLists.txt
    brlcad/branches/RELEASE/misc/wix/brlcad_banner.bmp
    brlcad/branches/RELEASE/misc/wix/brlcad_dialog.bmp
    brlcad/branches/RELEASE/src/archer/CMakeLists.txt
    brlcad/branches/RELEASE/src/libbu/realpath_bsd.c
    brlcad/branches/RELEASE/src/libbu/whereami.c
    brlcad/branches/RELEASE/src/libgcv/CMakeLists.txt
    brlcad/branches/RELEASE/src/libged/put_comb/put_comb.c
    brlcad/branches/RELEASE/src/libtclcad/CMakeLists.txt
    brlcad/branches/RELEASE/src/libtclcad/auto_path.c
    brlcad/branches/RELEASE/src/libtclcad/bn.c
    brlcad/branches/RELEASE/src/libtclcad/bu.c
    brlcad/branches/RELEASE/src/libtclcad/cmdhist.c
    brlcad/branches/RELEASE/src/libtclcad/dm.c
    brlcad/branches/RELEASE/src/libtclcad/fb.c
    brlcad/branches/RELEASE/src/libtclcad/fbserv.c
    brlcad/branches/RELEASE/src/libtclcad/rt.c
    brlcad/branches/RELEASE/src/libtclcad/tclcad_private.h
    brlcad/branches/RELEASE/src/libtclcad/view/faceplate.c
    brlcad/branches/RELEASE/src/mged/CMakeLists.txt
    brlcad/branches/RELEASE/src/rtwizard/CMakeLists.txt

Added Paths:
-----------
    brlcad/branches/RELEASE/misc/CMake/FindNSIS.cmake
    brlcad/branches/RELEASE/misc/CMake/FindWix.cmake
    brlcad/branches/RELEASE/misc/tools/inactvhdrs/
    brlcad/branches/RELEASE/src/archer/archer.ico
    brlcad/branches/RELEASE/src/archer/archer.rc
    brlcad/branches/RELEASE/src/libgcv/tests/
    brlcad/branches/RELEASE/src/libtclcad/commands.c
    brlcad/branches/RELEASE/src/libtclcad/eval.c
    brlcad/branches/RELEASE/src/libtclcad/global.c
    brlcad/branches/RELEASE/src/libtclcad/init.c
    brlcad/branches/RELEASE/src/libtclcad/mouse.c
    brlcad/branches/RELEASE/src/libtclcad/polygons.c
    brlcad/branches/RELEASE/src/libtclcad/wrapper.c
    brlcad/branches/RELEASE/src/mged/mged.ico
    brlcad/branches/RELEASE/src/mged/mged.rc
    brlcad/branches/RELEASE/src/rtwizard/rtwizard.ico
    brlcad/branches/RELEASE/src/rtwizard/rtwizard.rc

Removed Paths:
-------------
    brlcad/branches/RELEASE/src/libgcv/test_bottess.c
    brlcad/branches/RELEASE/src/libtclcad/tclcad_eval.c
    brlcad/branches/RELEASE/src/libtclcad/tclcad_global.c
    brlcad/branches/RELEASE/src/libtclcad/tclcad_init.c
    brlcad/branches/RELEASE/src/libtclcad/tclcad_mouse.c
    brlcad/branches/RELEASE/src/libtclcad/tclcad_obj.c
    brlcad/branches/RELEASE/src/libtclcad/tclcad_obj_wrapper.c
    brlcad/branches/RELEASE/src/libtclcad/tclcad_polygons.c

Property Changed:
----------------
    brlcad/branches/RELEASE/
    brlcad/branches/RELEASE/doc/
    brlcad/branches/RELEASE/include/
    brlcad/branches/RELEASE/src/libbu/

Index: brlcad/branches/RELEASE
===================================================================
--- brlcad/branches/RELEASE     2020-09-04 20:52:45 UTC (rev 77066)
+++ brlcad/branches/RELEASE     2020-09-04 21:05:55 UTC (rev 77067)

Property changes on: brlcad/branches/RELEASE
___________________________________________________________________
Modified: svn:mergeinfo
## -7,4 +7,4 ##
 /brlcad/branches/opencl:65867-66137
 /brlcad/branches/osg:62110-62113
 /brlcad/branches/prep-cache:68236-68933
-/brlcad/trunk:36844-37285,37571-38764,38777-38845,41559-43155,43159-43908,44241-44324,44326-44385,44710-45373,45377,45379-47342,47370-68122,68125-75207,75325,75375,75377-75378,75387,75470-75472,75477,75492,75495,75549,75565-75566,75656-75661,75672,75675,75678,75729,75811,76641-76768,76771-76954,76963-76967,76975-76991,76994-77031
\ No newline at end of property
+/brlcad/trunk:36844-37285,37571-38764,38777-38845,41559-43155,43159-43908,44241-44324,44326-44385,44710-45373,45377,45379-47342,47370-68122,68125-75207,75325,75375,75377-75378,75387,75470-75472,75477,75492,75495,75549,75565-75566,75656-75661,75672,75675,75678,75729,75811,76641-76768,76771-76954,76963-76967,76975-76991,76994-77066
\ No newline at end of property
Modified: brlcad/branches/RELEASE/CMakeLists.txt
===================================================================
--- brlcad/branches/RELEASE/CMakeLists.txt      2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/CMakeLists.txt      2020-09-04 21:05:55 UTC (rev 
77067)
@@ -2936,17 +2936,11 @@
   endif(HAVE__SNPRINTF)
 endif(NOT HAVE_SNPRINTF)
 
-# So far I haven't been able to come up with a reliable self contained
-# test for this, but libbu's #2 realpath test triggers a stack smash
-# on some linux systems.  For the moment, fall back on OpenBSD's
-# userspace implementation, which does seem to work.  Once we can
-# get a self-contained reproduction of this failure, put it below
-# and we can use the system realpath again.
 if(HAVE_REALPATH)
-  #check_c_source_runs("#include<limits.h>\n#include <stdlib.h>\nint main() { 
char dir[512]; const char *d = \"/tmp/REALPATH_TEST_PATH\"; d = (const char 
*)realpath(d, dir); return 0; }" HAVE_WORKING_REALPATH)
-  #if(HAVE_WORKING_REALPATH)
-  #  CONFIG_H_APPEND(BRLCAD "#define HAVE_WORKING_REALPATH 1\n")
-  #endif(HAVE_WORKING_REALPATH)
+  check_c_source_runs("#include<limits.h>\n#include <stdlib.h>\nint main() { 
char dir[PATH_MAX]; const char *d = \"/tmp/REALPATH_TEST_PATH\"; d = (const 
char *)realpath(d, dir); return 0; }" HAVE_WORKING_REALPATH)
+  if(HAVE_WORKING_REALPATH)
+    CONFIG_H_APPEND(BRLCAD "#define HAVE_WORKING_REALPATH 1\n")
+  endif(HAVE_WORKING_REALPATH)
 endif(HAVE_REALPATH)
 
 # GetFullPathName
@@ -3570,26 +3564,45 @@
   endif(CPACK_RPM_PACKAGE_RELEASE)
 
   if(WIN32)
-    set(CPACK_GENERATOR NSIS)
-    set(CPACK_NSIS_PACKAGE_NAME "BRL-CAD")
-    set(CPACK_NSIS_INSTALL_DIRECTORY "BRL-CAD ${BRLCAD_VERSION}")
-    set(CPACK_SOURCE_DIR "${CMAKE_SOURCE_DIR}")
-    set(CPACK_DATA_DIR "${DATA_DIR}")
-    set(CPACK_DOC_DIR "${DOC_DIR}")
-    # There is a bug in NSI that does not handle full unix paths properly. Make
-    # sure there is at least one set of four (4) backslashes.
-    set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/misc/nsis\\\\brlcad.ico")
-    set(CPACK_NSIS_MUI_UNIICON 
"${CMAKE_SOURCE_DIR}/misc/nsis\\\\uninstall.ico")
-    set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
-    set(CPACK_NSIS_DISPLAY_NAME "BRL-CAD")
-    set(CPACK_NSIS_MODIFY_PATH ON)
-    if(BRLCAD_ENABLE_WIX)
+    find_package(NSIS)
+    if (NSIS_FOUND)
+      set(CPACK_GENERATOR ${CPACK_GENERATOR} NSIS)
+      set(CPACK_NSIS_PACKAGE_NAME "BRL-CAD")
+      set(CPACK_NSIS_INSTALL_DIRECTORY "BRL-CAD ${BRLCAD_VERSION}")
+      set(CPACK_SOURCE_DIR "${CMAKE_SOURCE_DIR}")
+      set(CPACK_DATA_DIR "${DATA_DIR}")
+      set(CPACK_DOC_DIR "${DOC_DIR}")
+      # There is a bug in NSIS that does not handle full unix paths properly. 
Make
+      # sure there is at least one set of four (4) backslashes.
+      set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/misc/nsis\\\\brlcad.ico")
+      set(CPACK_NSIS_MUI_UNIICON 
"${CMAKE_SOURCE_DIR}/misc/nsis\\\\uninstall.ico")
+      set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
+      set(CPACK_NSIS_DISPLAY_NAME "BRL-CAD")
+      set(CPACK_NSIS_MODIFY_PATH ON)
+    endif (NSIS_FOUND)
+    find_package(Wix)
+    if (Wix_FOUND)
+      # User report that this version of the installer also supports
+      # non-graphical installation with the /passive option.
+      #
+      # Note: for WiX, start menu shortcuts and desktop icons are handled with
+      # properties set on targets.  (At the moment, this is not true for NSIS -
+      # it uses entries in the misc/CMake/NSIS.template.in file.)
+      #
+      # If we need to get fancier about this, look at the following:
+      # 
https://github.com/Kitware/CMake/blob/master/CMakeCPackOptions.cmake.in#L216
+      # https://github.com/Kitware/CMake/tree/master/Utilities/Release/WiX
       set(CPACK_GENERATOR ${CPACK_GENERATOR} WIX)
       set(CPACK_WIX_LICENSE_RTF "${CMAKE_SOURCE_DIR}/misc/wix/License.rtf")
       set(CPACK_WIX_PRODUCT_ICON 
"${CMAKE_SOURCE_DIR}/misc/wix/brlcad_product.ico")
+      set(CPACK_WIX_PROGRAM_MENU_FOLDER "BRL-CAD ${BRLCAD_VERSION}")
       set(CPACK_WIX_UI_BANNER "${CMAKE_SOURCE_DIR}/misc/wix/brlcad_banner.bmp")
       set(CPACK_WIX_UI_DIALOG "${CMAKE_SOURCE_DIR}/misc/wix/brlcad_dialog.bmp")
-    endif(BRLCAD_ENABLE_WIX)
+    endif (Wix_FOUND)
+    if (NOT CPACK_GENERATOR)
+      # If nothing else, make a zip file
+      set(CPACK_GENERATOR ZIP)
+    endif (NOT CPACK_GENERATOR)
     if(CMAKE_CL_64)
       set(CPACK_PACKAGE_FILE_NAME "BRL-CAD_${BRLCAD_VERSION}_win64")
       set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "BRL-CAD ${BRLCAD_VERSION} win64")

Modified: brlcad/branches/RELEASE/TODO
===================================================================
--- brlcad/branches/RELEASE/TODO        2020-09-04 20:52:45 UTC (rev 77066)
+++ brlcad/branches/RELEASE/TODO        2020-09-04 21:05:55 UTC (rev 77067)
@@ -170,7 +170,12 @@
 THESE ARE UNSCHEDULED BACKLOG TASKS
 -----------------------------------
 
+* rtwizard's reopening of the database is causing db_dircheck
+  "Duplicate of..." errors when opening read-only .g files.
 
+* procedural studio box generation allowing for specification of size,
+  shape, material, and lighting characteristics
+
 * verify all of the src/util utilities behave correctly on Windows
   with respect to mode (i.e. correctly using setmode/O_BINARY when
   performing file I/O.)
@@ -2439,6 +2444,18 @@
 * write and use kdtree - make traversal cache coherent
 
 
+GEOMETRY MODELS
+---------------
+
+* CSG shaderball
+
+* solid teapot
+
+* studio box
+
+* CSG lightcycle
+
+
 DOCUMENTATION
 -------------
 

Index: brlcad/branches/RELEASE/doc
===================================================================
--- brlcad/branches/RELEASE/doc 2020-09-04 20:52:45 UTC (rev 77066)
+++ brlcad/branches/RELEASE/doc 2020-09-04 21:05:55 UTC (rev 77067)

Property changes on: brlcad/branches/RELEASE/doc
___________________________________________________________________
Modified: svn:mergeinfo
## -7,4 +7,4 ##
 /brlcad/branches/osg/doc:62110-62113
 /brlcad/branches/prep-cache/doc:68236-68933
 /brlcad/branches/tcltk86/doc:68300-75257
-/brlcad/trunk/doc:76645-76726,76795-76858,76862-76954,76980-76991
\ No newline at end of property
+/brlcad/trunk/doc:76645-76726,76795-76858,76862-76954,76980-76991,77032-77065
\ No newline at end of property
Modified: brlcad/branches/RELEASE/doc/README.Windows
===================================================================
--- brlcad/branches/RELEASE/doc/README.Windows  2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/doc/README.Windows  2020-09-04 21:05:55 UTC (rev 
77067)
@@ -3,18 +3,23 @@
 
 The usual way to build BRL-CAD for Windows is to use the CMake build
 system generator and the Microsoft Visual Studio C++ (MSVC) compiler.
-Recent versions of both (as of this writing, MSVC 2013 and CMake
-2.8.12+) are recommended.  If generating an installer, the Nullsoft
-Scriptable Install System (NSIS) tool is also required.
+Recent versions of both are recommended.  If generating an installer,
+the following options are available and supported:
 
-In principle, BRL-CAD can be built using CMake and environments like
-Cygwin and/or Mingw/Msys, but the latter is largely untested and
+Nullsoft Scriptable Install System (NSIS) - generates a. .exe installer
+
+WiX Toolset - generates an MSI installer.
+
+These tools must be installed separately - they are not included with
+CMake or Visual Studio.
+
+Note:  In principle BRL-CAD can be built using CMake and environments
+like Cygwin and/or Mingw/Msys, but they are largely untested and
 infrequently supported.  Enhancements or bug reports are welcome.
 
 Visual Studio
 -------------
 
-
 To build with CMake and Visual Studio, the first step is to obtain the
 BRL-CAD sources and create a build directory.  In principle, it is not
 *required* to have a separate build directory, but with Windows and
@@ -54,6 +59,18 @@
 named PACKAGE and run it.  The end result should be an .exe file
 capable of installing BRL-CAD.
 
+Working with MSI files
+----------------------
+
+The WiX Toolset's MSI file, in addition to the standard interactive
+graphical install, also supports a command line based silent
+install. (See, for example, https://stackoverflow.com/a/25230485)
+
+msiexec.exe /i c:\BRL-CAD-7.32.0_win64.msi /QN /L*V 
"C:\Temp\brlcad_install.log"
+
+The logging step is not required but is recommended to allow for
+easier understanding of any issues that might arise.
+
 ===========================================
 
 === Setting a specific SDK version ===

Index: brlcad/branches/RELEASE/include
===================================================================
--- brlcad/branches/RELEASE/include     2020-09-04 20:52:45 UTC (rev 77066)
+++ brlcad/branches/RELEASE/include     2020-09-04 21:05:55 UTC (rev 77067)

Property changes on: brlcad/branches/RELEASE/include
___________________________________________________________________
Modified: svn:mergeinfo
## -7,4 +7,4 ##
 /brlcad/branches/opencl/include:65867-66137
 /brlcad/branches/osg/include:62110-62113
 /brlcad/branches/prep-cache/include:68236-68933
-/brlcad/trunk/include:36844-37285,37571-38764,38777-38845,41559-43155,43159-43908,44241-44324,44326-44385,44710-45373,45377,45379-47342,47370-68122,68125-75207,75325,75375,75377-75378,75387,75470-75472,75477,75492,75495,75549,75565-75566,75656-75661,75672,75675,75678,75729,75811,76641-76726,76729-76730,76748-76764,76771-76858,76862-76954,76994-77031
\ No newline at end of property
+/brlcad/trunk/include:36844-37285,37571-38764,38777-38845,41559-43155,43159-43908,44241-44324,44326-44385,44710-45373,45377,45379-47342,47370-68122,68125-75207,75325,75375,75377-75378,75387,75470-75472,75477,75492,75495,75549,75565-75566,75656-75661,75672,75675,75678,75729,75811,76641-76726,76729-76730,76748-76764,76771-76858,76862-76954,76994-77065
\ No newline at end of property
Modified: brlcad/branches/RELEASE/include/bn/anim.h
===================================================================
--- brlcad/branches/RELEASE/include/bn/anim.h   2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bn/anim.h   2020-09-04 21:05:55 UTC (rev 
77067)
@@ -127,13 +127,13 @@
        (o)[7] = (i)[9];\
        (o)[8] = (i)[10];}
 
-/* tilde matrix: [M]a = v X a */
+/** tilde matrix: [M]a = v X a */
 #define MAKE_TILDE(m, v)        {\
        MAT3ZERO(m);\
        m[1]= -v[2];    m[2]=v[1];      m[3]= v[2];\
        m[5]= -v[0];    m[6]= -v[1];    m[7]= v[0];}
 
-/* a = Ix Iy Iz    b = Ixy Ixz Iyz*/
+/** a = Ix Iy Iz    b = Ixy Ixz Iyz*/
 #define INERTIAL_MAT3(m, a, b)  {\
        (m)[0] =  (a)[0]; (m)[1] = -(b)[0]; (m)[2] = -(b)[1];\
        (m)[3] = -(b)[0]; (m)[4] =  (a)[1]; (m)[5] = -(b)[2];\

Modified: brlcad/branches/RELEASE/include/bn/complex.h
===================================================================
--- brlcad/branches/RELEASE/include/bn/complex.h        2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/include/bn/complex.h        2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -34,7 +34,7 @@
 
 __BEGIN_DECLS
 
-/* "complex number" data type: */
+/** "complex number" data type */
 typedef struct bn_complex {
     double re;         /**< @brief real part */
     double im;         /**< @brief imaginary part */

Modified: brlcad/branches/RELEASE/include/bn/dvec.h
===================================================================
--- brlcad/branches/RELEASE/include/bn/dvec.h   2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bn/dvec.h   2020-09-04 21:05:55 UTC (rev 
77067)
@@ -26,10 +26,10 @@
 #include <math.h>
 extern "C++" {
 /* Hide iostream from Doxygen with cond */
-/* @cond */
+/** @cond */
 #include <iostream>
 #include <ostream>
-/* @endcond */
+/** @endcond */
 }
 
 /* Needed for fastf_t definition */
@@ -131,7 +131,7 @@
 #define VEC_ALIGN
 
 /* Doxygen doesn't like these includes... */
-/* @cond */
+/** @cond */
 /*#undef __SSE2__*/ // Test FPU version
 #if defined(__SSE2__) && defined(__GNUC__) && defined(HAVE_EMMINTRIN_H) && 
defined(HAVE_EMMINTRIN)
 #  define __x86_vector__
@@ -741,7 +741,7 @@
 }
 
 #endif
-/* @endcond */
+/** @endcond */
 
 inline bool vequals(const vec2d& a, const vec2d& b) {
     return
@@ -753,12 +753,12 @@
 typedef fastf_t mat2d_t[4] VEC_ALIGN;
 
 /* Hide from Doxygen with cond */
-/* @cond */
+/** @cond */
 
 // 2d point
 typedef fastf_t pt2d_t[2] VEC_ALIGN;
 
-/* @endcond */
+/** @endcond */
 
 
//--------------------------------------------------------------------------------
 // MATH / VECTOR ops

Modified: brlcad/branches/RELEASE/include/bn/noise.h
===================================================================
--- brlcad/branches/RELEASE/include/bn/noise.h  2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bn/noise.h  2020-09-04 21:05:55 UTC (rev 
77067)
@@ -18,9 +18,9 @@
  * information.
  */
 
-/*----------------------------------------------------------------------*/
 
-/** @addtogroup noise
+/**
+ * @addtogroup noise
  *
  * @brief
  * These noise functions provide mostly random noise at the integer
@@ -137,7 +137,6 @@
                                      double octaves);
 
 /**
- *
  * From "Texturing and Modeling, A Procedural Approach" 2nd ed
  */
 BN_EXPORT extern double bn_noise_mf(point_t point,

Modified: brlcad/branches/RELEASE/include/bn/plane.h
===================================================================
--- brlcad/branches/RELEASE/include/bn/plane.h  2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bn/plane.h  2020-09-04 21:05:55 UTC (rev 
77067)
@@ -43,51 +43,51 @@
 __BEGIN_DECLS
 
 
-#define MAXPTS 4                       /* All we need are 4 points */
-#define pl_A pl_points[0]              /* Synonym for A point */
+#define MAXPTS 4                       /**< All we need are 4 points */
+#define pl_A pl_points[0]              /**< Synonym for A point */
 
 struct plane_specific  {
-    size_t pl_npts;                    /* number of points on plane */
-    point_t pl_points[MAXPTS];         /* Actual points on plane */
-    vect_t pl_Xbasis;                  /* X (B-A) vector (for 2d coords) */
-    vect_t pl_Ybasis;                  /* Y (C-A) vector (for 2d coords) */
-    vect_t pl_N;                       /* Unit-length Normal (outward) */
-    fastf_t pl_NdotA;                  /* Normal dot A */
-    fastf_t pl_2d_x[MAXPTS];           /* X 2d-projection of points */
-    fastf_t pl_2d_y[MAXPTS];           /* Y 2d-projection of points */
-    fastf_t pl_2d_com[MAXPTS];         /* pre-computed common-term */
-    struct plane_specific *pl_forw;    /* Forward link */
-    char pl_code[MAXPTS+1];            /* Face code string.  Decorative. */
+    size_t pl_npts;                    /**< number of points on plane */
+    point_t pl_points[MAXPTS];         /**< Actual points on plane */
+    vect_t pl_Xbasis;                  /**< X (B-A) vector (for 2d coords) */
+    vect_t pl_Ybasis;                  /**< Y (C-A) vector (for 2d coords) */
+    vect_t pl_N;                       /**< Unit-length Normal (outward) */
+    fastf_t pl_NdotA;                  /**< Normal dot A */
+    fastf_t pl_2d_x[MAXPTS];           /**< X 2d-projection of points */
+    fastf_t pl_2d_y[MAXPTS];           /**< Y 2d-projection of points */
+    fastf_t pl_2d_com[MAXPTS];         /**< pre-computed common-term */
+    struct plane_specific *pl_forw;    /**< Forward link */
+    char pl_code[MAXPTS+1];            /**< Face code string.  Decorative. */
 };
 
-/*
+/**
  * Describe the tri_specific structure.
  */
 struct tri_specific  {
-    point_t tri_A;                     /* triangle vertex (A) */
-    vect_t tri_BA;                     /* B - A (second point) */
-    vect_t tri_CA;                     /* C - A (third point) */
-    vect_t tri_wn;                     /* facet normal (non-unit) */
-    vect_t tri_N;                      /* unit normal vector */
-    fastf_t *tri_normals;              /* unit vertex normals A, B, C  (this 
is malloced storage) */
-    int tri_surfno;                    /* solid specific surface number */
-    struct tri_specific *tri_forw;     /* Next facet */
+    point_t tri_A;                     /**< triangle vertex (A) */
+    vect_t tri_BA;                     /**< B - A (second point) */
+    vect_t tri_CA;                     /**< C - A (third point) */
+    vect_t tri_wn;                     /**< facet normal (non-unit) */
+    vect_t tri_N;                      /**< unit normal vector */
+    fastf_t *tri_normals;              /**< unit vertex normals A, B, C  (this 
is malloced storage) */
+    int tri_surfno;                    /**< solid specific surface number */
+    struct tri_specific *tri_forw;     /**< Next facet */
 };
 
 typedef struct tri_specific tri_specific_double;
 
-/*
+/**
  * A more memory conservative version
  */
 struct tri_float_specific  {
-    float tri_A[3];                    /* triangle vertex (A) */
-    float tri_BA[3];                   /* B - A (second point) */
-    float tri_CA[3];                   /* C - A (third point) */
-    float tri_wn[3];                   /* facet normal (non-unit) */
-    float tri_N[3];                    /* unit normal vector */
-    signed char *tri_normals;          /* unit vertex normals A, B, C  (this 
is malloced storage) */
-    int tri_surfno;                    /* solid specific surface number */
-    struct tri_float_specific *tri_forw;/* Next facet */
+    float tri_A[3];                    /**< triangle vertex (A) */
+    float tri_BA[3];                   /**< B - A (second point) */
+    float tri_CA[3];                   /**< C - A (third point) */
+    float tri_wn[3];                   /**< facet normal (non-unit) */
+    float tri_N[3];                    /**< unit normal vector */
+    signed char *tri_normals;          /**< unit vertex normals A, B, C  (this 
is malloced storage) */
+    int tri_surfno;                    /**< solid specific surface number */
+    struct tri_float_specific *tri_forw;/**< Next facet */
 };
 
 typedef struct tri_float_specific tri_specific_float;

Modified: brlcad/branches/RELEASE/include/bn/poly.h
===================================================================
--- brlcad/branches/RELEASE/include/bn/poly.h   2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bn/poly.h   2020-09-04 21:05:55 UTC (rev 
77067)
@@ -41,7 +41,7 @@
 __BEGIN_DECLS
 
 /* This could be larger, or even dynamic... */
-#define BN_MAX_POLY_DEGREE 6   /* Maximum Poly Order */
+#define BN_MAX_POLY_DEGREE 6   /**< Maximum Poly Order */
 
 /**
  * Polynomial data type

Modified: brlcad/branches/RELEASE/include/bn/rand.h
===================================================================
--- brlcad/branches/RELEASE/include/bn/rand.h   2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bn/rand.h   2020-09-04 21:05:55 UTC (rev 
77067)
@@ -76,7 +76,7 @@
 #define BN_RANDHALF(_i) (bn_rand_table[ _i = (_i+1) % BN_RAND_TABSIZE ]-0.5)
 #define BN_RANDHALF_INIT(_p) _p = bn_rand_table
 
-#define BN_RANDHALFTABSIZE 16535       /* Powers of two give streaking */
+#define BN_RANDHALFTABSIZE 16535       /**< Powers of two give streaking */
 BN_EXPORT extern int bn_randhalftabsize;
 
 /**

Modified: brlcad/branches/RELEASE/include/bu/app.h
===================================================================
--- brlcad/branches/RELEASE/include/bu/app.h    2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bu/app.h    2020-09-04 21:05:55 UTC (rev 
77067)
@@ -228,22 +228,22 @@
 
 
 typedef enum {
-    BU_DIR_CURR=1,  /* (unknown) current working directory */
-    BU_DIR_INIT,    /* (unknown) initial working directory */
-    BU_DIR_BIN,     /* (read-only) user executables (bin) */
-    BU_DIR_LIB,     /* (read-only) object libraries (lib) */
-    BU_DIR_LIBEXEC, /* (read-only) object libraries (libexec) */
-    BU_DIR_INCLUDE, /* (read-only) C/C++ header files (include) */
-    BU_DIR_DATA,    /* (read-only) data files (share) */
-    BU_DIR_DOC,     /* (read-only) documentation, (DATA/doc) */
-    BU_DIR_MAN,     /* (read-only) manual pages, (DATA/man) */
-    BU_DIR_TEMP,    /* (read/write) temporary files (TEMP) */
-    BU_DIR_HOME,    /* (read/write) user home directory (HOME) */
-    BU_DIR_CACHE,   /* (read/write) user cache directory (BU_CACHE_DIR) */
-    BU_DIR_CONFIG,  /* (read/write) user config directory (HOME/.app) */
-    BU_DIR_EXT,     /* (n/a) optional executable extension */
-    BU_DIR_LIBEXT,  /* (n/a) optional library extension */
-    BU_DIR_END
+    BU_DIR_CURR=1,  /**< (unknown) current working directory */
+    BU_DIR_INIT,    /**< (unknown) initial working directory */
+    BU_DIR_BIN,     /**< (read-only) user executables (bin) */
+    BU_DIR_LIB,     /**< (read-only) object libraries (lib) */
+    BU_DIR_LIBEXEC, /**< (read-only) object libraries (libexec) */
+    BU_DIR_INCLUDE, /**< (read-only) C/C++ header files (include) */
+    BU_DIR_DATA,    /**< (read-only) data files (share) */
+    BU_DIR_DOC,     /**< (read-only) documentation, (DATA/doc) */
+    BU_DIR_MAN,     /**< (read-only) manual pages, (DATA/man) */
+    BU_DIR_TEMP,    /**< (read/write) temporary files (TEMP) */
+    BU_DIR_HOME,    /**< (read/write) user home directory (HOME) */
+    BU_DIR_CACHE,   /**< (read/write) user cache directory (BU_CACHE_DIR) */
+    BU_DIR_CONFIG,  /**< (read/write) user config directory (HOME/.app) */
+    BU_DIR_EXT,     /**< (n/a) optional executable extension */
+    BU_DIR_LIBEXT,  /**< (n/a) optional library extension */
+    BU_DIR_END      /**< always the last entry, for iterators */
 } bu_dir_t;
 
 

Modified: brlcad/branches/RELEASE/include/bu/color.h
===================================================================
--- brlcad/branches/RELEASE/include/bu/color.h  2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bu/color.h  2020-09-04 21:05:55 UTC (rev 
77067)
@@ -30,8 +30,6 @@
 
 __BEGIN_DECLS
 
-/*----------------------------------------------------------------------*/
-
 /** @addtogroup bu_color
  * @brief
  * Support for storing and manipulating color data.
@@ -74,7 +72,7 @@
 
 
 
-/* random color generating methods */
+/** random color generating methods */
 typedef enum {
     BU_COLOR_RANDOM = 0,
     BU_COLOR_RANDOM_LIGHTENED
@@ -94,7 +92,7 @@
 
 #if 0
 
-/*
+/**
  * Refactoring points:
  * color command (set specified color)
  *     src/libged/color.c

Modified: brlcad/branches/RELEASE/include/bu/column.h
===================================================================
--- brlcad/branches/RELEASE/include/bu/column.h 2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bu/column.h 2020-09-04 21:05:55 UTC (rev 
77067)
@@ -53,7 +53,8 @@
 
 #define BU_COLUMN_ALL -1
 
-/* Generate an output string based on the specified layout and contents in the
+/**
+ * Generate an output string based on the specified layout and contents in the
  * bu_column_state s.  Return the number of items printed, or -1 if there is
  * an error.
  *
@@ -74,7 +75,8 @@
  * Row suffix:       none
  * Fill order:       column first
  *
- * */
+ *
+ */
 BU_EXPORT extern int bu_column_print(struct bu_vls *o, struct bu_column_state 
*s);
 
 /**

Modified: brlcad/branches/RELEASE/include/bu/defines.h
===================================================================
--- brlcad/branches/RELEASE/include/bu/defines.h        2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/include/bu/defines.h        2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -69,22 +69,6 @@
 #endif  /* DIR_SEPARATOR */
 
 /**
- * Maximum length of a filesystem path.  Typically defined in a system
- * file but if it isn't set, we create it.
- */
-#ifndef MAXPATHLEN
-#  ifdef PATH_MAX
-#    define MAXPATHLEN PATH_MAX
-#  else
-#    ifdef _MAX_PATH
-#      define MAXPATHLEN _MAX_PATH
-#    else
-#      define MAXPATHLEN 1024
-#    endif
-#  endif
-#endif
-
-/**
  * set to the path list separator character
  */
 #if defined(PATH_SEPARATOR)

Modified: brlcad/branches/RELEASE/include/bu/endian.h
===================================================================
--- brlcad/branches/RELEASE/include/bu/endian.h 2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bu/endian.h 2020-09-04 21:05:55 UTC (rev 
77067)
@@ -36,9 +36,9 @@
 
 
 typedef enum {
-    BU_LITTLE_ENDIAN = 1234, /* LSB first: i386, VAX order */
-    BU_BIG_ENDIAN    = 4321, /* MSB first: 68000, IBM, network order */
-    BU_PDP_ENDIAN    = 3412  /* LSB first in word, MSW first in long */
+    BU_LITTLE_ENDIAN = 1234, /**< LSB first: i386, VAX order */
+    BU_BIG_ENDIAN    = 4321, /**< MSB first: 68000, IBM, network order */
+    BU_PDP_ENDIAN    = 3412  /**< LSB first in word, MSW first in long */
 } bu_endian_t;
 
 

Modified: brlcad/branches/RELEASE/include/bu/glob.h
===================================================================
--- brlcad/branches/RELEASE/include/bu/glob.h   2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bu/glob.h   2020-09-04 21:05:55 UTC (rev 
77067)
@@ -67,10 +67,10 @@
  */
 struct bu_glob_context {
 
-#define BU_GLOB_APPEND     0x0001  /* Append to output from previous call. */
-#define BU_GLOB_NOSORT     0x0020  /* Don't sort. */
-#define BU_GLOB_NOESCAPE   0x2000  /* Disable backslash escaping. */
-#define BU_GLOB_ALTDIRFUNC 0x0040  /* use alternate functions. */
+#define BU_GLOB_APPEND     0x0001  /**< Append to output from previous call. */
+#define BU_GLOB_NOSORT     0x0020  /**< Don't sort. */
+#define BU_GLOB_NOESCAPE   0x2000  /**< Disable backslash escaping. */
+#define BU_GLOB_ALTDIRFUNC 0x0040  /**< use alternate functions. */
     int gl_flags;                /**< flags customizing globbing behavior */
 
     /* Return values */
@@ -88,8 +88,8 @@
     int (*gl_lstat)(const char *, struct bu_stat *, struct bu_glob_context *);
     int (*gl_stat)(const char *, struct bu_stat *, struct bu_glob_context *);
 
-#define BU_GLOB_NOMATCH (-1)     /* No match. */
-#define BU_GLOB_ABORTED (-2)     /* Unignored error. */
+#define BU_GLOB_NOMATCH (-1)     /**< No match. */
+#define BU_GLOB_ABORTED (-2)     /**< Unignored error. */
     int (*gl_errfunc)(const char *, int, struct bu_glob_context *);
 
     /* For caller use */

Modified: brlcad/branches/RELEASE/include/bu/tbl.h
===================================================================
--- brlcad/branches/RELEASE/include/bu/tbl.h    2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/bu/tbl.h    2020-09-04 21:05:55 UTC (rev 
77067)
@@ -38,7 +38,7 @@
 /** @{ */
 /** @file bu/tbl.h */
 
-/*
+/**
  * this is pulled from num.c where the guts to the table printer
  * currently resides, moved here for easy reference.
  *

Modified: brlcad/branches/RELEASE/include/common.h
===================================================================
--- brlcad/branches/RELEASE/include/common.h    2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/common.h    2020-09-04 21:05:55 UTC (rev 
77067)
@@ -227,6 +227,23 @@
 #endif
 
 /**
+ * Maximum length of a filesystem path.  Typically defined in a system
+ * file but if it isn't set, we create it.
+ */
+#ifndef MAXPATHLEN
+#  include <limits.h> // Consistently define (or not) PATH_MAX
+#  ifdef PATH_MAX
+#    define MAXPATHLEN PATH_MAX
+#  elif defined(MAX_PATH)
+#    define MAXPATHLEN MAX_PATH
+#  elif defined(_MAX_PATH)
+#    define MAXPATHLEN _MAX_PATH
+#  else
+#    define MAXPATHLEN 2048
+#  endif
+#endif
+
+/**
  * Provide a means to conveniently test the version of the GNU
  * compiler.  Use it like this:
  *
@@ -466,8 +483,10 @@
 /**
  * Provide canonical preprocessor stringification.
  *
+ @code
  *     #define abc 123
  *     CPP_STR(abc) => "abc"
+ @endcode
  */
 #ifndef CPP_STR
 #  define CPP_STR(x) # x
@@ -476,8 +495,10 @@
 /**
  * Provide canonical preprocessor expanded stringification.
  *
+ @code
  *     #define abc 123
  *     CPP_XSTR(abc) => "123"
+ @endcode
  */
 #ifndef CPP_XSTR
 #  define CPP_XSTR(x) CPP_STR(x)
@@ -486,6 +507,7 @@
 /**
  * Provide canonical preprocessor concatenation.
  *
+ @code
  *     #define abc 123
  *     CPP_GLUE(abc, 123) => abc123
  *     CPP_STR(CPP_GLUE(abc, 123)) => "CPP_GLUE(abc, 123)"
@@ -492,6 +514,7 @@
  *     CPP_XSTR(CPP_GLUE(abc, 123)) => "abc123"
  *     #define abc123 "xyz"
  *     CPP_GLUE(abc, 123) => abc123 => "xyz"
+ @endcode
  */
 #ifndef CPP_GLUE
 #  define CPP_GLUE(a, b) a ## b
@@ -500,10 +523,12 @@
 /**
  * Provide canonical preprocessor expanded concatenation.
  *
+ @code
  *     #define abc 123
  *     CPP_XGLUE(abc, 123) => 123123
  *     CPP_STR(CPP_XGLUE(abc, 123)) => "CPP_XGLUE(abc, 123)"
  *     CPP_XSTR(CPP_XGLUE(abc, 123)) => "123123"
+ @endcode
  */
 #ifndef CPP_XGLUE
 #  define CPP_XGLUE(a, b) CPP_GLUE(a, b)
@@ -512,9 +537,11 @@
 /**
  * Provide format specifier string tied to a size (e.g., "%123s")
  *
+ @code
  *     #define STR_LEN 10+1
  *     char str[STR_LEN] = {0};
  *     scanf(CPP_SCANSIZE(STR_LEN) "\n", str);
+ @endcode
  */
 #ifndef CPP_SCAN
 #  define CPP_SCAN(sz) "%" CPP_XSTR(sz) "s"

Modified: brlcad/branches/RELEASE/include/gcv/api.h
===================================================================
--- brlcad/branches/RELEASE/include/gcv/api.h   2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/include/gcv/api.h   2020-09-04 21:05:55 UTC (rev 
77067)
@@ -139,10 +139,14 @@
     /* operation type */
     const enum gcv_filter_type filter_type;
 
-    /* If we have a definite type this converter is known to handle, call
-     * it out here.
-     * MIME_MODEL_UNKNOWN if 'filter_type' is GCV_FILTER_FILTER or
-     * if the plugin is a multi-format I/O plugin */
+    /* If we have a specific model type this converter is known to
+     * handle, call it out here.  Use BU_MIME_MODEL_UNKNOWN if
+     * 'filter_type' is GCV_FILTER_FILTER or if the plugin is a
+     * multi-format I/O plugin.
+     *
+     * FIXME: input/output plugins conceivably could be something
+     * other than geometry (e.g., png input or csv output).
+     */
     const bu_mime_model_t mime_type;
 
     /* For plugins supporting multiple file types, call this to

Modified: brlcad/branches/RELEASE/misc/CMake/CMakeLists.txt
===================================================================
--- brlcad/branches/RELEASE/misc/CMake/CMakeLists.txt   2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/misc/CMake/CMakeLists.txt   2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -28,6 +28,7 @@
   FindIlmBase.cmake
   FindLEMON.cmake
   FindNETPBM.cmake
+  FindNSIS.cmake
   FindOPENNURBS.cmake
   FindOSL.cmake
   FindOpenCL.cmake
@@ -46,6 +47,7 @@
   FindUTAHRLE.cmake
   FindUUID.cmake
   FindVDS.cmake
+  FindWix.cmake
   FindX11.cmake
   FindXMLLINT.cmake
   FindXSLTPROC.cmake

Copied: brlcad/branches/RELEASE/misc/CMake/FindNSIS.cmake (from rev 77065, 
brlcad/trunk/misc/CMake/FindNSIS.cmake)
===================================================================
--- brlcad/branches/RELEASE/misc/CMake/FindNSIS.cmake                           
(rev 0)
+++ brlcad/branches/RELEASE/misc/CMake/FindNSIS.cmake   2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -0,0 +1,32 @@
+#-------------------------------------------------------------------
+# This file is based on the Wix module from the CMake build system
+# for OGRE (Object-oriented Graphics Rendering Engine)
+# For the latest info, see http://www.ogre3d.org/
+#
+# The contents of this file are placed in the public domain. Feel
+# free to make use of it in any way you like.
+#-------------------------------------------------------------------
+
+# - Try to find Nullsoft Scriptable Install System (NSIS)
+# You can help this by defining NSIS_HOME in the environment / CMake
+# Once done, this will define
+#
+#  NSIS_FOUND - system has NSIS
+#  NSIS_BINARY_DIR - location of the NSIS binaries
+
+include(FindPkgMacros)
+
+# Get path, convert backslashes as ${ENV_${var}}
+getenv_path(NSIS_HOME)
+
+# construct search paths
+set(NSIS_PREFIX_PATH ${NSIS_HOME} ${ENV_NSIS_HOME}
+       "C:/Program Files (x86)/NSIS"
+)
+find_path(NSIS_BINARY_DIR NAMES makensis.exe HINTS ${NSIS_PREFIX_PATH} 
PATH_SUFFIXES bin)
+
+if(NSIS_BINARY_DIR)
+       set (NSIS_FOUND TRUE)
+endif()
+
+mark_as_advanced(NSIS_BINARY_DIR NSIS_FOUND)

Copied: brlcad/branches/RELEASE/misc/CMake/FindWix.cmake (from rev 77065, 
brlcad/trunk/misc/CMake/FindWix.cmake)
===================================================================
--- brlcad/branches/RELEASE/misc/CMake/FindWix.cmake                            
(rev 0)
+++ brlcad/branches/RELEASE/misc/CMake/FindWix.cmake    2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -0,0 +1,34 @@
+#-------------------------------------------------------------------
+# This file is part of the CMake build system for OGRE
+#     (Object-oriented Graphics Rendering Engine)
+# For the latest info, see http://www.ogre3d.org/
+#
+# The contents of this file are placed in the public domain. Feel
+# free to make use of it in any way you like.
+#-------------------------------------------------------------------
+
+# - Try to find Wix
+# You can help this by defining WIX_HOME in the environment / CMake
+# Once done, this will define
+#
+#  Wix_FOUND - system has Wix
+#  Wix_BINARY_DIR - location of the Wix binaries
+
+include(FindPkgMacros)
+
+# Get path, convert backslashes as ${ENV_${var}}
+getenv_path(WIX_HOME)
+
+# Find version specific paths
+file(GLOB WIX_PATHS LIST_DIRECTORIES TRUE "C:/Program Files*/WiX Toolset*")
+
+# construct search paths
+set(WIX_PREFIX_PATH ${WIX_HOME} ${ENV_WIX_HOME} ${WIX_PATHS})
+
+find_path(Wix_BINARY_DIR NAMES candle.exe HINTS ${WIX_PREFIX_PATH} 
PATH_SUFFIXES bin)
+
+if(Wix_BINARY_DIR)
+       set (Wix_FOUND TRUE)
+endif()
+
+mark_as_advanced(Wix_BINARY_DIR Wix_FOUND)

Modified: brlcad/branches/RELEASE/misc/tools/CMakeLists.txt
===================================================================
--- brlcad/branches/RELEASE/misc/tools/CMakeLists.txt   2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/misc/tools/CMakeLists.txt   2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -192,6 +192,10 @@
 SetTargetFolder(debug2c "Compilation Utilities")
 DISTCLEAN(${CMAKE_CURRENT_BINARY_DIR}/debug2c/Makefile)
 
+# inactvhdrs - utility that tries to find local headers unused by other
+# source code in a file hierarchy
+CMAKEFILES(inactvhdrs/inactvhdrs.cpp)
+
 CMAKEFILES(README)
 CMAKEFILES(CMakeLists.txt)
 

Modified: brlcad/branches/RELEASE/misc/wix/brlcad_banner.bmp
===================================================================
(Binary files differ)

Modified: brlcad/branches/RELEASE/misc/wix/brlcad_dialog.bmp
===================================================================
(Binary files differ)

Modified: brlcad/branches/RELEASE/src/archer/CMakeLists.txt
===================================================================
--- brlcad/branches/RELEASE/src/archer/CMakeLists.txt   2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/src/archer/CMakeLists.txt   2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -16,7 +16,14 @@
 # If/when we add MGED's ability to work in "classic" mode, Archer will have
 # to be built as a non-GUI application (or we'll have to build two executables)
 if(BRLCAD_ENABLE_TK)
-  BRLCAD_ADDEXEC(archer archer.c "${archer_libs}" GUI)
+  set(archer_srcs archer.c)
+  if (HAVE_WINDOWS_H)
+    # To associate an icon with the application for Windows (needed
+    # for the WiX installer) we must use an rc file.
+    enable_language(RC)
+    set(archer_srcs ${archer_srcs} archer.rc)
+  endif (HAVE_WINDOWS_H)
+  BRLCAD_ADDEXEC(archer "${archer_srcs}" "${archer_libs}" GUI)
   add_dependencies(archer archer_launch_tcl_cp)
   add_dependencies(archer rtwizard)
   ADD_TARGET_DEPS(archer Tkhtml Tktable itcl_pkgIndex itk_pkgIndex dm_plugins)
@@ -24,6 +31,14 @@
   foreach(item ${tclindex_target_list})
     add_dependencies(archer ${item})
   endforeach(item ${tclindex_target_list})
+
+  # Archer is one of the programs that gets a start menu entry
+  set_property(INSTALL "${BIN_DIR}/$<TARGET_FILE_NAME:archer>"
+    PROPERTY CPACK_START_MENU_SHORTCUTS "Archer ${BRLCAD_VERSION}"
+    )
+  set_property(INSTALL "${BIN_DIR}/$<TARGET_FILE_NAME:archer>"
+    PROPERTY CPACK_DESKTOP_SHORTCUTS "Archer ${BRLCAD_VERSION}"
+    )
 endif(BRLCAD_ENABLE_TK)
 
 
@@ -65,6 +80,8 @@
   CMakeLists.txt
   TODO
   archer.c
+  archer.rc
+  archer.ico
   )
 CMAKEFILES(${archer_ignore_files})
 

Copied: brlcad/branches/RELEASE/src/archer/archer.ico (from rev 77065, 
brlcad/trunk/src/archer/archer.ico)
===================================================================
(Binary files differ)

Copied: brlcad/branches/RELEASE/src/archer/archer.rc (from rev 77065, 
brlcad/trunk/src/archer/archer.rc)
===================================================================
--- brlcad/branches/RELEASE/src/archer/archer.rc                                
(rev 0)
+++ brlcad/branches/RELEASE/src/archer/archer.rc        2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -0,0 +1,11 @@
+#include <windows.h>
+
+//
+// Icon
+//
+//   The icon whose name or resource ID is lexigraphically first, is used
+//   as the application's icon.
+//
+
+app                      ICON    DISCARDABLE     "archer.ico"
+

Index: brlcad/branches/RELEASE/src/libbu
===================================================================
--- brlcad/branches/RELEASE/src/libbu   2020-09-04 20:52:45 UTC (rev 77066)
+++ brlcad/branches/RELEASE/src/libbu   2020-09-04 21:05:55 UTC (rev 77067)

Property changes on: brlcad/branches/RELEASE/src/libbu
___________________________________________________________________
Modified: svn:mergeinfo
## -1,2 +1,2 ##
 /brlcad/branches/bioh/src/libbu:75720-75728
-/brlcad/trunk/src/libbu:72518-74373,74376-75207,75729,76645-76726,76771-76788,76795-76858,76862-76954
\ No newline at end of property
+/brlcad/trunk/src/libbu:72518-74373,74376-75207,75729,76645-76726,76771-76788,76795-76858,76862-76954,77032-77065
\ No newline at end of property
Modified: brlcad/branches/RELEASE/src/libbu/realpath_bsd.c
===================================================================
--- brlcad/branches/RELEASE/src/libbu/realpath_bsd.c    2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/src/libbu/realpath_bsd.c    2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -60,7 +60,7 @@
     unsigned symlinks;
     int serrno, mem_allocated;
     ssize_t slen;
-    char left[PATH_MAX], next_token[PATH_MAX], symlink[PATH_MAX];
+    char left[MAXPATHLEN], next_token[MAXPATHLEN], symlink[MAXPATHLEN];
 
     if (path == NULL) {
        errno = EINVAL;
@@ -75,7 +75,7 @@
     serrno = errno;
 
     if (resolved == NULL) {
-       resolved = (char *)bu_malloc(PATH_MAX, "alloc PATH_MAX");
+       resolved = (char *)bu_malloc(MAXPATHLEN, "alloc MAXPATHLEN");
        if (resolved == NULL)
            return (NULL);
        mem_allocated = 1;
@@ -91,11 +91,11 @@
        resolved_len = 1;
        left_len = bu_strlcpy(left, path + 1, sizeof(left));
     } else {
-       if (getcwd(resolved, PATH_MAX) == NULL) {
+       if (getcwd(resolved, MAXPATHLEN) == NULL) {
            if (mem_allocated)
                free(resolved);
            else
-               bu_strlcpy(resolved, ".", PATH_MAX);
+               bu_strlcpy(resolved, ".", MAXPATHLEN);
            return (NULL);
        }
        resolved_len = strlen(resolved);
@@ -129,7 +129,7 @@
        }
 
        if (resolved[resolved_len - 1] != '/') {
-           if (resolved_len + 1 >= PATH_MAX) {
+           if (resolved_len + 1 >= MAXPATHLEN) {
                errno = ENAMETOOLONG;
                goto err;
            }
@@ -160,8 +160,8 @@
         * it exists but isn't a symlink, or if there are no more
         * path components left.
         */
-       resolved_len = bu_strlcat(resolved, next_token, PATH_MAX);
-       if (resolved_len >= PATH_MAX) {
+       resolved_len = bu_strlcat(resolved, next_token, MAXPATHLEN);
+       if (resolved_len >= MAXPATHLEN) {
            errno = ENAMETOOLONG;
            goto err;
        }

Modified: brlcad/branches/RELEASE/src/libbu/whereami.c
===================================================================
--- brlcad/branches/RELEASE/src/libbu/whereami.c        2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/src/libbu/whereami.c        2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -275,13 +275,13 @@
 WAI_FUNCSPEC
 int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length)
 {
-  char buffer[PATH_MAX];
+  char buffer[MAXPATHLEN];
   char* resolved = NULL;
   int length = -1;
 
   for (;;)
   {
-    resolved = realpath(WAI_PROC_SELF_EXE, buffer);
+    resolved = bu_file_realpath(WAI_PROC_SELF_EXE, buffer);
     if (!resolved)
       break;
 
@@ -347,12 +347,12 @@
 
     for (;;)
     {
-      char buffer[PATH_MAX < 1024 ? 1024 : PATH_MAX];
+      char buffer[MAXPATHLEN < 1024 ? 1024 : MAXPATHLEN];
       uint64_t low, high;
       char perms[5];
       uint64_t offset;
       uint32_t major, minor;
-      char path[PATH_MAX];
+      char path[MAXPATHLEN];
       uint32_t inode;
 
       if (!bu_fgets(buffer, sizeof(buffer), maps))
@@ -366,7 +366,7 @@
         {
           char* resolved;
 
-          resolved = realpath(path, buffer);
+          resolved = bu_file_realpath(path, buffer);
           if (!resolved)
             break;
 
@@ -458,8 +458,8 @@
 WAI_FUNCSPEC
 int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length)
 {
-  char buffer1[PATH_MAX];
-  char buffer2[PATH_MAX];
+  char buffer1[MAXPATHLEN];
+  char buffer2[MAXPATHLEN];
   char* path = buffer1;
   char* resolved = NULL;
   int length = -1;
@@ -474,7 +474,7 @@
         break;
     }
 
-    resolved = realpath(path, buffer2);
+    resolved = bu_file_realpath(path, buffer2);
     if (!resolved)
       break;
 
@@ -514,7 +514,7 @@
 WAI_NOINLINE WAI_FUNCSPEC
 int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length)
 {
-  char buffer[PATH_MAX];
+  char buffer[MAXPATHLEN];
   char* resolved = NULL;
   int length = -1;
 
@@ -524,7 +524,7 @@
 
     if (dladdr(WAI_RETURN_ADDRESS(), &info))
     {
-      resolved = realpath(info.dli_fname, buffer);
+      resolved = bu_file_realpath(info.dli_fname, buffer);
       if (!resolved)
         break;
 
@@ -570,8 +570,8 @@
 WAI_FUNCSPEC
 int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length)
 {
-  char buffer1[PATH_MAX];
-  char buffer2[PATH_MAX];
+  char buffer1[MAXPATHLEN];
+  char buffer2[MAXPATHLEN];
   char* resolved = NULL;
   FILE* self_exe = NULL;
   int length = -1;
@@ -585,7 +585,7 @@
     if (!bu_fgets(buffer1, sizeof(buffer1), self_exe))
       break;
 
-    resolved = realpath(buffer1, buffer2);
+    resolved = bu_file_realpath(buffer1, buffer2);
     if (!resolved)
       break;
 
@@ -624,7 +624,7 @@
 WAI_FUNCSPEC
 int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length)
 {
-  char buffer[PATH_MAX];
+  char buffer[MAXPATHLEN];
   char* resolved = NULL;
   int length = -1;
 
@@ -634,7 +634,7 @@
 
     if (dladdr(WAI_RETURN_ADDRESS(), &info))
     {
-      resolved = realpath(info.dli_fname, buffer);
+      resolved = bu_file_realpath(info.dli_fname, buffer);
       if (!resolved)
         break;
 
@@ -678,8 +678,8 @@
 WAI_FUNCSPEC
 int WAI_PREFIX(getExecutablePath)(char* out, int capacity, int* dirname_length)
 {
-  char buffer1[PATH_MAX];
-  char buffer2[PATH_MAX];
+  char buffer1[MAXPATHLEN];
+  char buffer2[MAXPATHLEN];
   char* path = buffer1;
   char* resolved = NULL;
   int length = -1;
@@ -696,7 +696,7 @@
     if (sysctl(mib, (u_int)(sizeof(mib) / sizeof(mib[0])), path, &size, NULL, 
0) != 0)
         break;
 
-    resolved = realpath(path, buffer2);
+    resolved = bu_file_realpath(path, buffer2);
     if (!resolved)
       break;
 
@@ -736,7 +736,7 @@
 WAI_NOINLINE WAI_FUNCSPEC
 int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length)
 {
-  char buffer[PATH_MAX];
+  char buffer[MAXPATHLEN];
   char* resolved = NULL;
   int length = -1;
 
@@ -746,7 +746,7 @@
 
     if (dladdr(WAI_RETURN_ADDRESS(), &info))
     {
-      resolved = realpath(info.dli_fname, buffer);
+      resolved = bu_file_realpath(info.dli_fname, buffer);
       if (!resolved)
         break;
 

Modified: brlcad/branches/RELEASE/src/libgcv/CMakeLists.txt
===================================================================
--- brlcad/branches/RELEASE/src/libgcv/CMakeLists.txt   2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/src/libgcv/CMakeLists.txt   2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -33,14 +33,8 @@
 set_property(SOURCE gcv.c APPEND PROPERTY COMPILE_DEFINITIONS 
"LIBGCV_PLUGINS_PATH=\"${LIBGCV_PLUGINS_PATH}\"")
 set_property(SOURCE gcv.c APPEND PROPERTY COMPILE_DEFINITIONS 
"LIBGCV_PLUGIN_SUFFIX=\"${CMAKE_SHARED_LIBRARY_SUFFIX}\"")
 
-enable_testing()
-BRLCAD_ADDEXEC(test_bottess test_bottess.c libgcv NO_INSTALL)
-if(HIDE_INTERNAL_SYMBOLS)
-  set_property(TARGET test_bottess APPEND PROPERTY COMPILE_DEFINITIONS 
"BOTTESS_DLL_IMPORTS")
-endif(HIDE_INTERNAL_SYMBOLS)
-add_test(NAME bottess_test COMMAND test_bottess)
+add_subdirectory(tests)
 
-
 set(GCV_IGNORE_FILES
   CMakeLists.txt
   NOTES

Deleted: brlcad/branches/RELEASE/src/libgcv/test_bottess.c
===================================================================
--- brlcad/branches/RELEASE/src/libgcv/test_bottess.c   2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/src/libgcv/test_bottess.c   2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -1,343 +0,0 @@
-/*                  T E S T _ B O T T E S S . C
- * BRL-CAD
- *
- * Copyright (c) 2011-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- */
-/** @file libgcv/bottess_tester.c
- *
- * Test things in the bottess routines...
- */
-
-#include "common.h"
-
-#include "vmath.h"
-#include "bu/app.h"
-#include "bn.h"
-#include "raytrace.h"
-#include "nmg.h"
-#include "gcv.h"
-
-#include "./soup.h"
-#include "./tri_intersect.h"
-
-int
-test_intersection(int should, point_t *t1, point_t *t2, point_t p1, point_t p2)
-{
-    int coplanar = 0;
-    point_t i[2] = {VINIT_ZERO, VINIT_ZERO};
-    vect_t tmp[2] = {VINIT_ZERO, VINIT_ZERO};
-    struct face_s f[2];
-    struct bn_tol tol;
-
-    BN_TOL_INIT(&tol);
-    tol.dist = 0.005;
-    tol.dist_sq = tol.dist*tol.dist;
-
-    VMOVE(f[0].vert[0], t1[0]);
-    VMOVE(f[0].vert[1], t1[1]);
-    VMOVE(f[0].vert[2], t1[2]);
-    VSUB2(tmp[0], t1[1], t1[0]);
-    VSUB2(tmp[1], t1[2], t1[0]);
-    VCROSS(f[0].plane, tmp[0], tmp[1]);
-    f[0].foo = 0;
-
-    VMOVE(f[1].vert[0], t2[0]);
-    VMOVE(f[1].vert[1], t2[1]);
-    VMOVE(f[1].vert[2], t2[2]);
-    VSUB2(tmp[0], t2[1], t2[0]);
-    VSUB2(tmp[1], t2[2], t2[0]);
-    VCROSS(f[1].plane, tmp[0], tmp[1]);
-    f[1].foo = 0;
-
-    if (gcv_tri_tri_intersect_with_isectline(NULL, NULL, f, f+1, &coplanar, i, 
&tol) == 0 && should == 0)
-       return 0;
-    return !(VNEAR_EQUAL(i[0], p1, tol.dist) && VNEAR_EQUAL(i[1], p2, 
tol.dist));
-}
-
-
-int
-test_tri_intersections()
-{
-    int count = 0;
-#define TRY(suc, t00x, t00y, t00z, t01x, t01y, t01z, t02x, t02y, t02z, t10x, 
t10y, t10z, t11x, t11y, t11z, t12x, t12y, t12z, p0x, p0y, p0z, p1x, p1y, p1z) { 
\
-       point_t t0[3], t1[3], p0, p1; \
-       VSET(t0[0], t00x, t00y, t00z); VSET(t0[1], t01x, t01y, t01z); 
VSET(t0[2], t02x, t02y, t02z); \
-       VSET(t1[0], t10x, t10y, t10z); VSET(t1[1], t11x, t11y, t11z); 
VSET(t1[2], t12x, t12y, t12z); \
-       VSET(p0, p0x, p0y, p0z); VSET(p1, p1x, p1y, p1z); \
-       count += test_intersection(suc, t0, t1, p0, p1); }
-
-    TRY(1, 0, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 0.5, 0, 1, 0.5, 1, 0, 0.5, 0, 0, 
.5, 0, .5, .5);  /* ep ef */
-    TRY(0, 0, 0, 0, 0, 1, 0, 0, 0, 1, -1, 2, 0.5, 0, 3, 0.5, 1, 2, 0.5, 0, 0, 
.5, 0, .5, .5);  /* no intersect */
-
-#undef TRY
-    return count;
-}
-
-
-static int
-find_tri(struct soup_s *s, struct face_s *f, struct bn_tol *t) {
-    unsigned int i, j, k;
-    for (i=0;i<s->nfaces;i++) {
-       int found[3] = {0, 0, 0};
-       struct face_s *wf = s->faces+i;
-
-       for (j=0;j<3;j++) for (k=0;k<3;k++) if (VNEAR_EQUAL(wf->vert[j], 
f->vert[k], t->dist)) found[j] = 1;
-       if (found[0] == 1 && found[1] == 1 && found[2] == 1) return i;
-    }
-    return -1;
-}
-
-
-int
-test_face_split_single()
-{
-    unsigned long int i, tcount = 0, count = 0, nsplt;
-    struct soup_s s;
-    struct face_s f;
-    struct bn_tol t;
-
-    BN_TOL_INIT(&t);
-    t.dist = 0.005;
-    t.dist_sq = t.dist * t.dist;
-
-    /* evil macros to do a lot of scaffolding, setup, execution, etc... */
-    /* prep take: the triangle to split (9 fastf_t), the intersection line (6
-     * fastf_t), and the number of expected resulting triangles. */
-
-    /* NOTE THE "PREP" AND "POST" MACROS MUST BE USED IN PAIRS DUE TO THE 
SPLIT ENCLOSING CURLY BRACES */
-#define PREP(t00, t01, t02, t10, t11, t12, t20, t21, t22,                      
 \
-            ispt00, ispt01, ispt02, ispt10, ispt11, ispt12, _nsplt)          \
-    {                                                             \
-       point_t isectpt[2];                                         \
-       int urf[_nsplt+1];                                          \
-       unsigned long int failure = 0, numsplit = _nsplt;           \
-       for (i = 0; i < _nsplt + 1; ++i) urf[i] = 0;                \
-       tcount++;                                                   \
-       VSET(isectpt[0], ispt00, ispt01, ispt02);                      \
-       VSET(isectpt[1], ispt10, ispt11, ispt12);                      \
-       s.magic = SOUP_MAGIC;                                       \
-       s.faces = NULL;                                             \
-       s.maxfaces = 0;                                             \
-       s.nfaces = 0;                                               \
-       VSET(f.vert[0], t00, t01, t02);                                \
-       VSET(f.vert[1], t10, t11, t12);                                \
-       VSET(f.vert[2], t20, t21, t22);                                \
-       soup_add_face(&s, V3ARGS(f.vert), &t);                        \
-       VSET(f.plane, 0, 0, 1);                                        \
-       nsplt = split_face_single(&s, 0, isectpt, &f, &t);              \
-       if (nsplt != s.nfaces) {                                    \
-           printf("Error, nsplit %lu != s.nfaces %lu ?\n", numsplit, 
s.nfaces); \
-       }
-
-    /* the _splits is an array of expected triangles, as 9 fastf_t tuples */
-    /* fastf_t _splits[nsplt][9] = {{...}, {...}} */
-    /* post tests to see if the resulting triangles match and cleans up */
-#define POST(name)                                                      \
-    for (i = 0; i < numsplit; i++) {                                    \
-       VSET(f.vert[0], _splits[i][0], _splits[i][1], _splits[i][2]);        \
-       VSET(f.vert[1], _splits[i][3], _splits[i][4], _splits[i][5]);        \
-       VSET(f.vert[2], _splits[i][6], _splits[i][7], _splits[i][8]);        \
-       urf[i] = find_tri(&s, &f, &t);                                      \
-       if (urf[i] == -1) failure++;                                      \
-    }                                                                   \
-    if (nsplt != 2 && urf[0] == -1 && urf[1] == -1) {                   \
-       printf("\033[1;31mFAILURE "name"\033[m\n");                       \
-       printf("%lu faces now\n", s.nfaces);                               \
-       for (i = 0; i < s.nfaces; i++)                                    \
-           printf("%03lu: % 2g, % 2g, % 2g | % 2g, % 2g, % 2g | % 2g, % 2g, % 
2g\n", \
-                  i, V3ARGS(s.faces[i].vert[0]), V3ARGS(s.faces[i].vert[1]), 
V3ARGS(s.faces[i].vert[2])); \
-       count++;                                                          \
-    }                                                                   \
-    free(s.faces);                                                      \
-} /* NOTE THIS IS THE CLOSING BRACE FROM THE OPENING BRACE IN THE PREVIOUS 
MACRO!! */
-
-
-    /* VERT/VERT */
-    PREP(0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1); {fastf_t 
_splits[1][9] = {{0, 0, 0, 0, 1, 0, 1, 0, 0}}; POST("VERT/VERT");}
-
-    /* VERT/EDGE */
-    PREP(-1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2); {fastf_t 
_splits[2][9] = {{0, 0, 0, 0, 1, 0, -1, 0, 0}, {0, 0, 0, 0, 1, 0, 1, 0, 0}}; 
POST("VERT/EDGE");}
-
-#if 0 /* known to be broken right now.  */
-    /* EDGE/EDGE */
-    PREP(-2, 0, 0, 0, 2, 0, 2, 0, 0, 1, 1, 0, -1, 1, 0, 3); {fastf_t 
_splits[3][9] = { { 1, 1, 0,  0, 2, 0, -1, 1, 0}, { 1, 1, 0, -2, 0, 0,  2, 0, 
0}, {-1, 1, 0,  1, 1, 0, -2, 0, 0}}; POST("EDGE/EDGE");}
-#endif
-
-    /* VERT/FACE */
-    PREP(-2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0, 1, 0, 3); {fastf_t 
_splits[4][9]={ {-2, 0, 0, 2, 0, 0, 0, 1, 0}, {-2, 0, 0, 0, 2, 0, 0, 1, 0}, {2, 
0, 0, 0, 2, 0, 0, 1, 0}}; POST("VERT/FACE");}
-
-    /* EDGE/FACE */
-    PREP(-2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 4); {fastf_t 
_splits[4][9]={{0, 0, 0, -2, 0, 0, 0, 1, 0}, {0, 0, 0, 2, 0, 0, 0, 1, 0}, {-2, 
0, 0, 0, 2, 0, 0, 1, 0}, {2, 0, 0, 0, 2, 0, 0, 1, 0}}; POST("EDGE/FACE");}
-
-#if 0 /* known to be broken right now */
-    /* FACE/FACE */
-    PREP(-2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 4); fastf_t 
_splits[4][9]={{0, 0, 0, -2, 0, 0, 0, 1, 0}, {0, 0, 0, 2, 0, 0, 0, 1, 0}, {-2, 
0, 0, 0, 2, 0, 0, 1, 0}, {2, 0, 0, 0, 2, 0, 0, 1, 0}}; POST("EDGE/FACE");
-#endif
-
-#undef PREP
-#undef POST
-
-    return count;
-}
-
-
-int
-test_face_splits()
-{
-    int count = 0;
-
-    int rval;
-    struct soup_s l, r;
-    struct bn_tol t;
-    point_t p[3];
-
-
-    BN_TOL_INIT(&t);
-    t.dist = 0.005;
-    t.dist_sq = t.dist * t.dist;
-
-    l.magic = r.magic = SOUP_MAGIC;
-    l.faces = r.faces = NULL;
-    l.maxfaces = l.nfaces = r.maxfaces = r.nfaces = 0;
-    VSET(p[0], -1, 0, 0); VSET(p[1], 0, 1, 0); VSET(p[2], 1, 0, 0); 
soup_add_face(&l, p[0], p[1], p[2], &t);
-    VSET(p[0], 0, 0, -1); VSET(p[1], 0, 1, 0); VSET(p[2], 0, 0, 1); 
soup_add_face(&r, p[0], p[1], p[2], &t);
-
-    rval = split_face(&l, 0, &r, 0, &t);
-    if (rval != 3 || l.nfaces != 2 || r.nfaces != 2) {
-       printf("\033[1;31mFAILURE\033[m\n");
-       count++;
-    }
-    {
-       struct face_s f;
-       int tri;
-#define ZORF(XVAL, ZVAL, LR, FU) VSET(f.vert[0], 0, 0, 0); VSET(f.vert[1], 0, 
1, 0); VSET(f.vert[2], XVAL, 0, ZVAL); tri = find_tri(&LR, &f, &t); if (tri==-1 
|| l.faces[tri].foo != FU) { count++; printf("\033[1;31mFAILURE\033[m\n"); }
-       ZORF(1, 0, l, INSIDE);
-       ZORF(-1, 0, l, OUTSIDE);
-       ZORF(0, -1, r, OUTSIDE);
-       ZORF(0, 1, r, INSIDE);
-#undef ZORF
-    }
-
-    /* TODO: add more cases */
-
-    return count;
-}
-
-
-int test_invert()
-{
-    return -1;
-}
-
-
-int test_compose()
-{
-    int rval = 0;
-    unsigned int i;
-    union tree l, *r;
-    struct soup_s ls, *rs;
-    struct model lm, rm;
-    struct nmgregion lnr, rnr;
-    struct bn_tol t;
-    point_t p[3];
-
-    BN_TOL_INIT(&t);
-    t.dist = 0.005;
-    t.dist_sq = t.dist * t.dist;
-
-    /* assembly tree linkages */
-#define PREP l.magic = RT_TREE_MAGIC; ls.magic = SOUP_MAGIC; lm.magic = 
NMG_MODEL_MAGIC; lnr.m_p = &lm; ls.faces = NULL; ls.nfaces = ls.maxfaces = 0; 
l.tr_d.td_r = &lnr; l.tr_d.td_r->m_p = (struct model *)&ls; BU_ALLOC(r, union 
tree); BU_ALLOC(rs, struct soup_s); r->magic = RT_TREE_MAGIC; rs->magic = 
SOUP_MAGIC; rm.magic = NMG_MODEL_MAGIC; rnr.m_p = &rm; rs->faces = NULL; 
rs->nfaces = rs->maxfaces = 0; r->tr_d.td_r = &rnr; r->tr_d.td_r->m_p = (struct 
model *)rs;
-
-    /* test empty tree */
-    PREP;
-    compose(&l, r, 0, 0, 0);   /* r is destroyed */
-    if (ls.nfaces != 0) { printf("Erm, 0+0=%lu?\n", ls.nfaces); rval++; }
-
-    /* test no moves, all deleted */
-    PREP;
-    VSET(p[0], 0, 0, 0); VSET(p[1], 0, 1, 0); VSET(p[0], 0, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    VSET(p[0], 1, 0, 0); VSET(p[1], 1, 1, 0); VSET(p[0], 1, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    VSET(p[0], 2, 0, 0); VSET(p[1], 2, 1, 0); VSET(p[0], 2, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    for (i=0;i<rs->nfaces;i++) rs->faces[i].foo = OUTSIDE;
-    compose(&l, r, INSIDE, OUTSIDE, INSIDE);
-    if (ls.nfaces != 0) { rval++; printf("Missing faces\n"); }
-
-    /* test all moves, all kept */
-    PREP;
-    VSET(p[0], 0, 0, 0); VSET(p[1], 0, 1, 0); VSET(p[0], 0, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    VSET(p[0], 1, 0, 0); VSET(p[1], 1, 1, 0); VSET(p[0], 1, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    VSET(p[0], 2, 0, 0); VSET(p[1], 2, 1, 0); VSET(p[0], 2, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    for (i=0;i<rs->nfaces;i++) rs->faces[i].foo = OUTSIDE;
-    compose(&l, r, INSIDE, OUTSIDE, OUTSIDE);
-    if (ls.nfaces != 3) { rval++; printf("Missing faces\n"); }
-
-    /* test partial moves */
-    PREP;
-    VSET(p[0], 0, 0, 0); VSET(p[1], 0, 1, 0); VSET(p[0], 0, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    VSET(p[0], 1, 0, 0); VSET(p[1], 1, 1, 0); VSET(p[0], 1, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    VSET(p[0], 2, 0, 0); VSET(p[1], 2, 1, 0); VSET(p[0], 2, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    rs->faces[0].foo = OUTSIDE;
-    rs->faces[1].foo = INSIDE;
-    rs->faces[2].foo = OUTSIDE;
-    compose(&l, r, INSIDE, OUTSIDE, OUTSIDE);
-    if (ls.nfaces != 2) { rval++; printf("Missing faces\n"); }
-
-    PREP;
-    VSET(p[0], 0, 0, 0); VSET(p[1], 0, 1, 0); VSET(p[0], 0, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    VSET(p[0], 1, 0, 0); VSET(p[1], 1, 1, 0); VSET(p[0], 1, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    VSET(p[0], 2, 0, 0); VSET(p[1], 2, 1, 0); VSET(p[0], 2, 0, 1); 
soup_add_face(rs, V3ARGS(p), &t);
-    rs->faces[0].foo = OUTSIDE;
-    rs->faces[1].foo = INSIDE;
-    rs->faces[2].foo = OUTSIDE;
-    compose(&l, r, INSIDE, OUTSIDE, INSIDE);
-    if (ls.nfaces != 1) { rval++; printf("Missing faces\n"); }
-#undef PREP
-    return rval;
-}
-
-
-int test_evaluate()
-{
-    return -1;
-}
-
-
-int
-main(int UNUSED(argc), const char **argv)
-{
-    bu_setprogname(argv[0]);
-#define TRY(STR, FNC) { int rval = FNC(); printf("RESULT:%18s: \033[1;", STR); 
if (rval) printf("31m%d\033[m failures\n",  rval); else 
printf("32mOK\033[m\n"); }
-    TRY("tri intersection", test_tri_intersections);
-    TRY("single face split", test_face_split_single);
-    TRY("face splitting", test_face_splits);
-    TRY("invert", test_invert);
-    TRY("compose", test_compose);
-    TRY("evaluate", test_evaluate);
-#undef TRY
-    return 0;
-}
-
-
-/*
- * Local Variables:
- * tab-width: 8
- * mode: C
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */

Modified: brlcad/branches/RELEASE/src/libged/put_comb/put_comb.c
===================================================================
--- brlcad/branches/RELEASE/src/libged/put_comb/put_comb.c      2020-09-04 
20:52:45 UTC (rev 77066)
+++ brlcad/branches/RELEASE/src/libged/put_comb/put_comb.c      2020-09-04 
21:05:55 UTC (rev 77067)
@@ -472,7 +472,6 @@
 ged_put_comb_core(struct ged *gedp, int argc, const char *argv[])
 {
     static const char *usage = "comb_name color shader inherit boolean_expr 
is_region [ regionID airID materialID los% ]";
-    static const char *noregionusage = "comb_name color shader inherit 
boolean_expr n";
     static const char *regionusage = "comb_name color shader inherit 
boolean_expr y regionID airID materialID los%";
 
     const char *cmd_name = argv[0];
@@ -561,12 +560,6 @@
        comb->GIFTmater = atoi(argv[9]);
        comb->los = atoi(argv[10]);
     } else {
-       if (argc != 7) {
-           bu_vls_printf(gedp->ged_result_str, "region_flag not set, incorrect 
number of arguments supplied.\n");
-           bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", cmd_name, 
noregionusage);
-           return GED_ERROR;
-       }
-
        comb->region_flag = 0;
     }
 

Modified: brlcad/branches/RELEASE/src/libtclcad/CMakeLists.txt
===================================================================
--- brlcad/branches/RELEASE/src/libtclcad/CMakeLists.txt        2020-09-04 
20:52:45 UTC (rev 77066)
+++ brlcad/branches/RELEASE/src/libtclcad/CMakeLists.txt        2020-09-04 
21:05:55 UTC (rev 77067)
@@ -2,18 +2,18 @@
   auto_path.c
   bn.c
   bu.c
+  commands.c
   cmdhist.c
   dm.c
+  eval.c
   fb.c
   fbserv.c
+  global.c
+  init.c
+  mouse.c
+  polygons.c
   rt.c
-  tclcad_eval.c
-  tclcad_global.c
-  tclcad_init.c
-  tclcad_mouse.c
-  tclcad_obj.c
-  tclcad_obj_wrapper.c
-  tclcad_polygons.c
+  tkImgFmtPIX.c
   view/arrows.c
   view/autoview.c
   view/axes.c
@@ -23,7 +23,7 @@
   view/lines.c
   view/refresh.c
   view/util.c
-  tkImgFmtPIX.c
+  wrapper.c
   )
 
 if (BRLCAD_ENABLE_TCL)

Modified: brlcad/branches/RELEASE/src/libtclcad/auto_path.c
===================================================================
--- brlcad/branches/RELEASE/src/libtclcad/auto_path.c   2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/src/libtclcad/auto_path.c   2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -1,4 +1,4 @@
-/*                T C L C A D A U T O P A T H . C
+/*                       A U T O _ P A T H . C
  * BRL-CAD
  *
  * Copyright (c) 2004-2020 United States Government as represented by
@@ -18,7 +18,7 @@
  * information.
  *
  */
-/** @file libtclcad/tclcadAutoPath.c
+/**
  *
  * Locate the BRL-CAD tclscripts
  *

Modified: brlcad/branches/RELEASE/src/libtclcad/bn.c
===================================================================
--- brlcad/branches/RELEASE/src/libtclcad/bn.c  2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/src/libtclcad/bn.c  2020-09-04 21:05:55 UTC (rev 
77067)
@@ -1,4 +1,4 @@
-/*                        B N _ F U N C S . C
+/*                             B N . C
  * BRL-CAD
  *
  * Copyright (c) 2004-2020 United States Government as represented by
@@ -18,7 +18,7 @@
  * information.
  *
  */
-/** @file libtclcad/bn_funcs.c
+/**
  *
  * BRL-CAD's Tcl wrappers for libbn.
  *
@@ -42,8 +42,9 @@
 
 /* Private headers */
 #include "brlcad_version.h"
-#include "tclcad_private.h"
+#include "./tclcad_private.h"
 
+
 void
 bn_quat_distance_wrapper(double *dp, mat_t q1, mat_t q2)
 {

Modified: brlcad/branches/RELEASE/src/libtclcad/bu.c
===================================================================
--- brlcad/branches/RELEASE/src/libtclcad/bu.c  2020-09-04 20:52:45 UTC (rev 
77066)
+++ brlcad/branches/RELEASE/src/libtclcad/bu.c  2020-09-04 21:05:55 UTC (rev 
77067)
@@ -1,4 +1,4 @@
-/*                      B U _ F U N C S . C
+/*                            B U . C
  * BRL-CAD
  *
  * Copyright (c) 2004-2020 United States Government as represented by
@@ -18,7 +18,7 @@
  * information.
  *
  */
-/** @file libtclcad/bu_funcs.c
+/**
  *
  * BRL-CAD's Tcl wrappers for libbu.
  *
@@ -42,8 +42,9 @@
 
 /* Private headers */
 #include "brlcad_version.h"
-#include "tclcad_private.h"
+#include "./tclcad_private.h"
 
+
 static int
 lwrapper_func(ClientData data, Tcl_Interp *interp, int argc, const char 
*argv[])
 {

Modified: brlcad/branches/RELEASE/src/libtclcad/cmdhist.c
===================================================================
--- brlcad/branches/RELEASE/src/libtclcad/cmdhist.c     2020-09-04 20:52:45 UTC 
(rev 77066)
+++ brlcad/branches/RELEASE/src/libtclcad/cmdhist.c     2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -1,4 +1,4 @@
-/*                   C M D H I S T _ O B J . C
+/*                       C M D H I S T . C
  * BRL-CAD
  *
  * Copyright (c) 1998-2020 United States Government as represented by
@@ -30,9 +30,10 @@
 #include "bu/malloc.h"
 #include "bu/str.h"
 #include "tclcad.h"
-#include "tclcad_private.h"
 
+#include "./tclcad_private.h"
 
+
 /* FIXME: this is apparently used by src/tclscripts/lib/Command.tcl so
  * it needs to migrate elsewhere if mged/archer is to continue using
  * it as it doesn't belong in libbu.  if it can be fully decoupled

Copied: brlcad/branches/RELEASE/src/libtclcad/commands.c (from rev 77065, 
brlcad/trunk/src/libtclcad/commands.c)
===================================================================
--- brlcad/branches/RELEASE/src/libtclcad/commands.c                            
(rev 0)
+++ brlcad/branches/RELEASE/src/libtclcad/commands.c    2020-09-04 21:05:55 UTC 
(rev 77067)
@@ -0,0 +1,6540 @@
+/*                       T C L C A D _ O B J . C
+ * BRL-CAD
+ *
+ * Copyright (c) 2000-2020 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this file; see the file named COPYING for more
+ * information.
+ */
+/** @addtogroup libtclcad */
+/** @{ */
+/** @file libtclcad/tclcad_obj.c
+ *
+ * A quasi-object-oriented database interface.
+ *
+ * A GED object contains the attributes and methods for controlling a
+ * BRL-CAD geometry edit object.
+ *
+ */
+/** @} */
+
+#include "common.h"
+
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <math.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "png.h"
+
+#include "tcl.h"
+#ifdef HAVE_TK
+#  include "tk.h"
+#endif
+
+#include "bio.h"
+
+#include "bn.h"
+#include "bu/cmd.h"
+#include "bu/path.h"
+#include "bu/process.h"
+#include "bu/units.h"
+#include "vmath.h"
+#include "rt/db4.h"
+#include "rt/geom.h"
+#include "wdb.h"
+#include "raytrace.h"
+#include "ged.h"
+#include "tclcad.h"
+
+#include "rt/solid.h"
+#include "dm.h"
+#include "dm/bview_util.h"
+
+#include "icv/io.h"
+#include "icv/ops.h"
+#include "icv/crop.h"
+#include "dm.h"
+
+#if defined(HAVE_WINDOWS_H)
+#  include <tkwinport.h>
+#endif
+#ifdef HAVE_GL_GL_H
+#  include <GL/gl.h>
+#endif
+
+/* For the moment call internal libged functions - a cleaner
+ * solution will be needed eventually */
+#include "../libged/ged_private.h"
+
+/* Private headers */
+#include "brlcad_version.h"
+#include "./tclcad_private.h"
+#include "./view/view.h"
+
+
+HIDDEN int to_base2local(struct ged *gedp,
+                        int argc,
+                        const char *argv[],
+                        ged_func_ptr func,
+                        const char *usage,
+                        int maxargs);
+HIDDEN int to_bg(struct ged *gedp,
+                int argc,
+                const char *argv[],
+                ged_func_ptr func,
+                const char *usage,
+                int maxargs);
+HIDDEN int to_bounds(struct ged *gedp,
+                    int argc,
+                    const char *argv[],
+                    ged_func_ptr func,
+                    const char *usage,
+                    int maxargs);
+HIDDEN int to_configure(struct ged *gedp,
+                       int argc,
+                       const char *argv[],
+                       ged_func_ptr func,
+                       const char *usage,
+                       int maxargs);
+HIDDEN int to_constrain_rmode(struct ged *gedp,
+                             int argc,
+                             const char *argv[],
+                             ged_func_ptr func,
+                             const char *usage,
+                             int maxargs);
+HIDDEN int to_constrain_tmode(struct ged *gedp,
+                             int argc,
+                             const char *argv[],
+                             ged_func_ptr func,
+                             const char *usage,
+                             int maxargs);
+HIDDEN int to_copy(struct ged *gedp,
+                  int argc,
+                  const char *argv[],
+                  ged_func_ptr func,
+                  const char *usage,
+                  int maxargs);
+HIDDEN int to_data_move(struct ged *gedp,
+                       int argc,
+                       const char *argv[],
+                       ged_func_ptr func,
+                       const char *usage,
+                       int maxargs);
+HIDDEN int to_data_move_func(struct ged *gedp,
+                            struct bview *gdvp,
+                            int argc,
+                            const char *argv[],
+                            const char *usage);
+HIDDEN int to_data_move_object_mode(struct ged *gedp,
+                                   int argc,
+                                   const char *argv[],
+                                   ged_func_ptr func,
+                                   const char *usage,
+                                   int maxargs);
+HIDDEN int to_data_move_object_mode_func(struct ged *gedp,
+                                        struct bview *gdvp,
+                                        int argc,
+                                        const char *argv[],
+                                        const char *usage);
+HIDDEN int to_data_move_point_mode(struct ged *gedp,
+                                  int argc,
+                                  const char *argv[],
+                                  ged_func_ptr func,
+                                  const char *usage,
+                                  int maxargs);
+HIDDEN int to_data_move_point_mode_func(struct ged *gedp,
+                                       struct bview *gdvp,
+                                       int argc,
+                                       const char *argv[],
+                                       const char *usage);
+HIDDEN int to_data_pick(struct ged *gedp,
+                       int argc,
+                       const char *argv[],
+                       ged_func_ptr func,
+                       const char *usage,
+                       int maxargs);
+HIDDEN int
+to_data_pick_func(struct ged *gedp,
+                 struct bview *gdvp,
+                 int argc,
+                 const char *argv[],
+                 const char *usage);
+HIDDEN int to_data_vZ(struct ged *gedp,
+                     int argc,
+                     const char *argv[],
+                     ged_func_ptr func,
+                     const char *usage,
+                     int maxargs);
+HIDDEN int to_dlist_on(struct ged *gedp,
+                      int argc,
+                      const char *argv[],
+                      ged_func_ptr func,
+                      const char *usage,
+                      int maxargs);
+HIDDEN int to_bot_edge_split(struct ged *gedp,
+                            int argc,
+                            const char *argv[],
+                            ged_func_ptr func,
+                            const char *usage,
+                            int maxargs);
+HIDDEN int to_bot_face_split(struct ged *gedp,
+                            int argc,
+                            const char *argv[],
+                            ged_func_ptr func,
+                            const char *usage,
+                            int maxargs);
+HIDDEN int to_fontsize(struct ged *gedp,
+                      int argc,
+                      const char *argv[],
+                      ged_func_ptr func,
+                      const char *usage,
+                      int maxargs);
+HIDDEN int to_fit_png_image(struct ged *gedp,
+                           int argc,
+                           const char *argv[],
+                           ged_func_ptr func,
+                           const char *usage,
+                           int maxargs);
+HIDDEN int to_init_view_bindings(struct ged *gedp,
+                                int argc,
+                                const char *argv[],
+                                ged_func_ptr func,
+                                const char *usage,
+                                int maxargs);
+HIDDEN int to_delete_view(struct ged *gedp,
+                         int argc,
+                         const char *argv[],
+                         ged_func_ptr func,
+                         const char *usage,
+                         int maxargs);
+HIDDEN int to_handle_expose(struct ged *gedp,
+                           int argc,
+                           const char *argv[],
+                           ged_func_ptr func,
+                           const char *usage,
+                           int maxargs);
+HIDDEN int to_hide_view(struct ged *gedp,
+                       int argc,
+                       const char *argv[],
+                       ged_func_ptr func,
+                       const char *usage,
+                       int maxargs);
+HIDDEN int to_idle_mode(struct ged *gedp,
+                       int argc,
+                       const char *argv[],
+                       ged_func_ptr func,
+                       const char *usage,
+                       int maxargs);
+HIDDEN int to_light(struct ged *gedp,
+                   int argc,
+                   const char *argv[],
+                   ged_func_ptr func,
+                   const char *usage,
+                   int maxargs);
+HIDDEN int to_list_views(struct ged *gedp,
+                        int argc,
+                        const char *argv[],
+                        ged_func_ptr func,
+                        const char *usage,
+                        int maxargs);
+HIDDEN int to_local2base(struct ged *gedp,
+                        int argc,
+                        const char *argv[],
+                        ged_func_ptr func,
+                        const char *usage,
+                        int maxargs);
+HIDDEN int to_lod(struct ged *gedp,
+                 int argc,
+                 const char *argv[],
+                 ged_func_ptr func,
+                 const char *usage,
+                 int maxargs);
+HIDDEN int to_make(struct ged *gedp,
+                  int argc,
+                  const char *argv[],
+                  ged_func_ptr func,
+                  const char *usage,
+                  int maxargs);
+HIDDEN int to_mirror(struct ged *gedp,
+                    int argc,
+                    const char *argv[],
+                    ged_func_ptr func,
+                    const char *usage,
+                    int maxargs);
+HIDDEN int to_edit_motion_delta_callback(struct ged *gedp,
+                                        int argc,
+                                        const char *argv[],
+                                        ged_func_ptr func,
+                                        const char *usage,
+                                        int maxargs);
+HIDDEN int to_more_args_callback(struct ged *gedp,
+                                int argc,
+                                const char *argv[],
+                                ged_func_ptr func,
+                                const char *usage,
+                                int maxargs);
+HIDDEN int to_move_arb_edge_mode(struct ged *gedp,
+                                int argc,
+                                const char *argv[],
+                                ged_func_ptr func,
+                                const char *usage,
+                                int maxargs);
+HIDDEN int to_move_arb_face_mode(struct ged *gedp,
+                                int argc,
+                                const char *argv[],
+                                ged_func_ptr func,
+                                const char *usage,
+                                int maxargs);
+HIDDEN int to_bot_move_pnt(struct ged *gedp,
+                          int argc,
+                          const char *argv[],
+                          ged_func_ptr func,
+                          const char *usage,
+                          int maxargs);
+HIDDEN int to_bot_move_pnts(struct ged *gedp,
+                           int argc,
+                           const char *argv[],
+                           ged_func_ptr func,
+                           const char *usage,
+                           int maxargs);
+HIDDEN int to_bot_move_pnt_mode(struct ged *gedp,
+                               int argc,
+                               const char *argv[],
+                               ged_func_ptr func,
+                               const char *usage,
+                               int maxargs);
+HIDDEN int to_bot_move_pnts_mode(struct ged *gedp,
+                                int argc,
+                                const char *argv[],
+                                ged_func_ptr func,
+                                const char *usage,
+                                int maxargs);
+HIDDEN int to_metaball_move_pnt_mode(struct ged *gedp,
+                                    int argc,
+                                    const char *argv[],
+                                    ged_func_ptr func,
+                                    const char *usage,
+                                    int maxargs);
+HIDDEN int to_pipe_move_pnt_mode(struct ged *gedp,
+                                int argc,
+                                const char *argv[],
+                                ged_func_ptr func,
+                                const char *usage,
+                                int maxargs);
+HIDDEN int to_move_pnt_common(struct ged *gedp,
+                             int argc,
+                             const char *argv[],
+                             ged_func_ptr func,
+                             const char *usage,
+                             int maxargs);
+HIDDEN int to_new_view(struct ged *gedp,
+                      int argc,
+                      const char *argv[],
+                      ged_func_ptr func,
+                      const char *usage,
+                      int maxargs);
+HIDDEN int to_orotate_mode(struct ged *gedp,
+                          int argc,
+                          const char *argv[],
+                          ged_func_ptr func,
+                          const char *usage,
+                          int maxargs);
+HIDDEN int to_oscale_mode(struct ged *gedp,
+                         int argc,
+                         const char *argv[],
+                         ged_func_ptr func,
+                         const char *usage,
+                         int maxargs);
+HIDDEN int to_otranslate_mode(struct ged *gedp,
+                             int argc,
+                             const char *argv[],
+                             ged_func_ptr func,
+                             const char *usage,
+                             int maxargs);
+HIDDEN int to_paint_rect_area(struct ged *gedp,
+                             int argc,
+                             const char *argv[],
+                             ged_func_ptr func,
+                             const char *usage,
+                             int maxargs);
+#ifdef HAVE_GL_GL_H
+HIDDEN int to_pix(struct ged *gedp,
+                 int argc,
+                 const char *argv[],
+                 ged_func_ptr func,
+                 const char *usage,
+                 int maxargs);
+HIDDEN int to_png(struct ged *gedp,
+                 int argc,
+                 const char *argv[],
+                 ged_func_ptr func,
+                 const char *usage,
+                 int maxargs);
+#endif
+HIDDEN int to_rect_mode(struct ged *gedp,
+                       int argc,
+                       const char *argv[],
+                       ged_func_ptr func,
+                       const char *usage,
+                       int maxargs);
+HIDDEN int to_rotate_arb_face_mode(struct ged *gedp,
+                                  int argc,
+                                  const char *argv[],
+                                  ged_func_ptr func,
+                                  const char *usage,
+                                  int maxargs);
+HIDDEN int to_rotate_mode(struct ged *gedp,
+                         int argc,
+                         const char *argv[],
+                         ged_func_ptr func,
+                         const char *usage,
+                         int maxargs);
+HIDDEN int to_rt_end_callback(struct ged *gedp,
+                             int argc,
+                             const char *argv[],
+                             ged_func_ptr func,
+                             const char *usage,
+                             int maxargs);
+HIDDEN int to_rt_gettrees(struct ged *gedp,
+                         int argc,
+                         const char *argv[],
+                         ged_func_ptr func,
+                         const char *usage,
+                         int maxargs);
+HIDDEN int to_protate_mode(struct ged *gedp,
+                          int argc,
+                          const char *argv[],
+                          ged_func_ptr func,
+                          const char *usage,
+                          int maxargs);
+HIDDEN int to_pscale_mode(struct ged *gedp,
+                         int argc,
+                         const char *argv[],
+                         ged_func_ptr func,
+                         const char *usage,
+                         int maxargs);
+HIDDEN int to_ptranslate_mode(struct ged *gedp,
+                             int argc,
+                             const char *argv[],
+                             ged_func_ptr func,
+                             const char *usage,
+                             int maxargs);
+HIDDEN int to_data_scale_mode(struct ged *gedp,
+                             int argc,
+                             const char *argv[],
+                             ged_func_ptr func,
+                             const char *usage,
+                             int maxargs);
+HIDDEN int to_scale_mode(struct ged *gedp,
+                        int argc,
+                        const char *argv[],
+                        ged_func_ptr func,
+                        const char *usage,
+                        int maxargs);
+HIDDEN int to_screen2model(struct ged *gedp,
+                          int argc,
+                          const char *argv[],
+                          ged_func_ptr func,
+                          const char *usage,
+                          int maxargs);
+HIDDEN int to_screen2view(struct ged *gedp,
+                         int argc,
+                         const char *argv[],
+                         ged_func_ptr func,
+                         const char *usage,
+                         int maxargs);
+HIDDEN int to_set_coord(struct ged *gedp,
+                       int argc,
+                       const char *argv[],
+                       ged_func_ptr func,
+                       const char *usage,
+                       int maxargs);
+HIDDEN int to_snap_view(struct ged *gedp,
+                       int argc,
+                       const char *argv[],
+                       ged_func_ptr func,
+                       const char *usage,
+                       int maxargs);
+HIDDEN int to_translate_mode(struct ged *gedp,
+                            int argc,
+                            const char *argv[],
+                            ged_func_ptr func,
+                            const char *usage,
+                            int maxargs);
+HIDDEN int to_transparency(struct ged *gedp,
+                          int argc,
+                          const char *argv[],
+                          ged_func_ptr func,
+                          const char *usage,
+                          int maxargs);
+HIDDEN int to_view_callback(struct ged *gedp,
+                           int argc,
+                           const char *argv[],
+                           ged_func_ptr func,
+                           const char *usage,
+                           int maxargs);
+HIDDEN int to_view_win_size(struct ged *gedp,
+                           int argc,
+                           const char *argv[],
+                           ged_func_ptr func,
+                           const char *usage,
+                           int maxargs);
+HIDDEN int to_view2screen(struct ged *gedp,
+                         int argc,
+                         const char *argv[],
+                         ged_func_ptr func,
+                         const char *usage,
+                         int maxargs);
+HIDDEN int to_vmake(struct ged *gedp,
+                   int argc,
+                   const char *argv[],
+                   ged_func_ptr func,
+                   const char *usage,
+                   int maxargs);
+HIDDEN int to_vslew(struct ged *gedp,
+                   int argc,
+                   const char *argv[],
+                   ged_func_ptr func,
+                   const char *usage,
+                   int maxargs);
+HIDDEN int to_zbuffer(struct ged *gedp,
+                     int argc,
+                     const char *argv[],
+                     ged_func_ptr func,
+                     const char *usage,
+                     int maxargs);
+HIDDEN int to_zclip(struct ged *gedp,
+                   int argc,
+                   const char *argv[],
+                   ged_func_ptr func,
+                   const char *usage,
+                   int maxargs);
+
+/* Utility Functions */
+
+HIDDEN void to_create_vlist_callback_solid(struct solid *gdlp);
+HIDDEN void to_create_vlist_callback(struct display_list *gdlp);
+HIDDEN void to_destroy_vlist_callback(unsigned int dlist, int range);
+HIDDEN void to_rt_end_callback_internal(int aborted);
+
+HIDDEN void to_output_handler(struct ged *gedp, char *line);
+
+typedef int (*to_wrapper_func_ptr)(struct ged *, int, const char *[], 
ged_func_ptr, const char *, int);
+#define TO_WRAPPER_FUNC_PTR_NULL (to_wrapper_func_ptr)0
+
+
+struct to_cmdtab {
+    char *to_name;
+    char *to_usage;
+    int to_maxargs;
+    to_wrapper_func_ptr to_wrapper_func;
+    ged_func_ptr to_func;
+};
+
+
+static struct to_cmdtab ged_cmds[] = {
+    {"3ptarb", (char *)0, TO_UNLIMITED, to_more_args_func, ged_3ptarb},
+    {"adc",    "args", 7, to_view_func, ged_adc},
+    {"adjust", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_adjust},
+    {"ae2dir", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_ae2dir},
+    {"aet",    "[[-i] az el [tw]]", 6, to_view_func_plus, ged_aet},
+    {"analyze",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_analyze},
+    {"annotate", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_annotate},
+    {"pipe_append_pnt",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_pipe_append_pnt},
+    {"arb",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_arb},
+    {"arced",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_arced},
+    {"arot",   "x y z angle", 6, to_view_func_plus, ged_arot},
+    {"attr",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_attr},
+    {"bb",     (char *)0, TO_UNLIMITED, to_pass_through_func, ged_bb},
+    {"bev",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_bev},
+    {"bo",     (char *)0, TO_UNLIMITED, to_pass_through_func, ged_bo},
+    {"bot",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_bot},
+    {"bot_condense",   (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_condense},
+    {"bot_decimate",   (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_decimate},
+    {"bot_dump",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_dump},
+    {"bot_face_fuse",  (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_face_fuse},
+    {"bot_face_sort",  (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_face_sort},
+    {"bot_flip",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_flip},
+    {"bot_fuse",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_fuse},
+    {"bot_merge",      (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_merge},
+    {"bot_smooth",     (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_smooth},
+    {"bot_split",      (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_split},
+    {"bot_sync",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_sync},
+    {"bot_vertex_fuse",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_bot_vertex_fuse},
+    {"brep",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_brep},
+    {"c",      (char *)0, TO_UNLIMITED, to_pass_through_func, ged_comb_std},
+    {"cat",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_cat},
+    {"center", "[x y z]", 5, to_view_func_plus, ged_center},
+    {"check",  (char *)0, TO_UNLIMITED, to_view_func, ged_check},
+    {"clear",  (char *)0, TO_UNLIMITED, to_pass_through_and_refresh_func, 
ged_zap},
+    {"clone",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_clone},
+    {"coil",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_coil},
+    {"color",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_color},
+    {"comb",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_comb},
+    {"comb_color",     (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_comb_color},
+    {"combmem",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_combmem},
+    {"constraint", (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_constraint},
+    {"copyeval",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_copyeval},
+    {"copymat",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_copymat},
+    {"cpi",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_cpi},
+    {"d",      (char *)0, TO_UNLIMITED, to_pass_through_and_refresh_func, 
ged_erase},
+    {"dbconcat",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_concat},
+    {"dbfind", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_find},
+    {"dbip",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_dbip},
+    {"dbot_dump",      (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_dbot_dump},
+    {"debug",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_debug},
+    {"debugbu",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_debugbu},
+    {"debugdir",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_debugdir},
+    {"debuglib",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_debuglib},
+    {"debugnmg",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_debugnmg},
+    {"decompose",      (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_decompose},
+    {"delay",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_delay},
+    {"metaball_delete_pnt",    (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_metaball_delete_pnt},
+    {"pipe_delete_pnt",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_pipe_delete_pnt},
+    {"dir2ae", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_dir2ae},
+    {"draw",   (char *)0, TO_UNLIMITED, to_autoview_func, ged_draw},
+    {"dump",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_dump},
+    {"dup",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_dup},
+    {"E",      (char *)0, TO_UNLIMITED, to_autoview_func, ged_E},
+    {"e",      (char *)0, TO_UNLIMITED, to_autoview_func, ged_draw},
+    {"eac",    (char *)0, TO_UNLIMITED, to_autoview_func, ged_eac},
+    {"echo",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_echo},
+    {"edarb",  (char *)0, TO_UNLIMITED, to_more_args_func, ged_edarb},
+    {"edcodes",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_edcodes},
+    {"edcolor",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_edcolor},
+    {"edcomb", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_edcomb},
+    {"edit",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_edit},
+    {"edmater",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_edmater},
+    {"env",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_env},
+    {"erase",  (char *)0, TO_UNLIMITED, to_pass_through_and_refresh_func, 
ged_erase},
+    {"ev",     (char *)0, TO_UNLIMITED, to_autoview_func, ged_ev},
+    {"expand", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_expand},
+    {"eye",    "[x y z]", 5, to_view_func_plus, ged_eye},
+    {"eye_pos",        "[x y z]", 5, to_view_func_plus, ged_eye_pos},
+    {"eye_pt", "[x y z]", 5, to_view_func_plus, ged_eye},
+    {"exists", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_exists},
+    {"facetize",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_facetize},
+    {"voxelize",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_voxelize},
+    {"fb2pix",         "[-h -i -c] [-s squaresize] [-w width] [-n height] 
[file.pix]", TO_UNLIMITED, to_view_func, ged_fb2pix},
+    {"fbclear",        "[r g b]", TO_UNLIMITED, to_view_func, ged_fbclear},
+    {"find_arb_edge",  "arb vx vy ptol", 5, to_view_func, 
ged_find_arb_edge_nearest_pnt},
+    {"find_bot_edge",  "bot vx vy", 5, to_view_func, 
ged_find_bot_edge_nearest_pnt},
+    {"find_bot_pnt",   "bot vx vy", 5, to_view_func, 
ged_find_bot_pnt_nearest_pnt},
+    {"find_pipe_pnt",  "pipe x y z", 6, to_view_func, 
ged_find_pipe_pnt_nearest_pnt},
+    {"form",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_form},
+    {"fracture",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_fracture},
+    {"g",      (char *)0, TO_UNLIMITED, to_pass_through_func, ged_group},
+    {"gdiff",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_gdiff},
+    {"get",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_get},
+    {"get_autoview",   (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_get_autoview},
+    {"get_bot_edges",  (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_get_bot_edges},
+    {"get_comb",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_get_comb},
+    {"get_eyemodel",   "vname", 2, to_view_func, ged_get_eyemodel},
+    {"get_type",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_get_type},
+    {"glob",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_glob},
+    {"gqa",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_gqa},
+    {"graph",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_graph},
+    {"grid",   "args", 6, to_view_func, ged_grid},
+    {"grid2model_lu",  "x y", 4, to_view_func_less, ged_grid2model_lu},
+    {"grid2view_lu",   "x y", 4, to_view_func_less, ged_grid2view_lu},
+    {"heal",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_heal},
+    {"hide",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_hide},
+    {"how",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_how},
+    {"human",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_human},
+    {"i",      (char *)0, TO_UNLIMITED, to_pass_through_func, ged_instance},
+    {"idents", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_tables},
+    {"illum",  (char *)0, TO_UNLIMITED, to_pass_through_and_refresh_func, 
ged_illum},
+    {"importFg4Section",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_importFg4Section},
+    {"in",     (char *)0, TO_UNLIMITED, to_more_args_func, ged_in},
+    {"inside", (char *)0, TO_UNLIMITED, to_more_args_func, ged_inside},
+    {"isize",  "vname", 2, to_view_func, ged_isize},
+    {"item",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_item},
+    {"joint",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_joint},
+    {"joint2", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_joint2},
+    {"keep",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_keep},
+    {"keypoint",       "[x y z]", 5, to_view_func, ged_keypoint},
+    {"kill",   (char *)0, TO_UNLIMITED, to_pass_through_and_refresh_func, 
ged_kill},
+    {"killall",        (char *)0, TO_UNLIMITED, 
to_pass_through_and_refresh_func, ged_killall},
+    {"killrefs",       (char *)0, TO_UNLIMITED, 
to_pass_through_and_refresh_func, ged_killrefs},
+    {"killtree",       (char *)0, TO_UNLIMITED, 
to_pass_through_and_refresh_func, ged_killtree},
+    {"l",      (char *)0, TO_UNLIMITED, to_pass_through_func, ged_list},
+    {"lc",      "[-d|-s|-r] [-z] [-0|-1|-2|-3|-4|-5] [-f {FileName}] 
{GroupName}", TO_UNLIMITED, to_pass_through_func, ged_lc},
+    {"listeval",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_pathsum},
+    {"loadview",       "filename", 3, to_view_func, ged_loadview},
+    {"lod",    (char *)0, TO_UNLIMITED, to_lod, ged_lod},
+    {"log",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_log},
+    {"lookat", "x y z", 5, to_view_func_plus, ged_lookat},
+    {"ls",     (char *)0, TO_UNLIMITED, to_pass_through_func, ged_ls},
+    {"lt",     (char *)0, TO_UNLIMITED, to_pass_through_func, ged_lt},
+    {"m2v_point",      "x y z", 5, to_view_func, ged_m2v_point},
+    {"make_name",      (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_make_name},
+    {"make_pnts",      (char *)0, TO_UNLIMITED, to_more_args_func, 
ged_make_pnts},
+    {"mat4x3pnt",      (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_mat4x3pnt},
+    {"match",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_match},
+    {"mater",  (char *)0, TO_UNLIMITED, to_more_args_func, ged_mater},
+    {"model2grid_lu",  "x y z", 5, to_view_func_less, ged_model2grid_lu},
+    {"model2view",     "vname", 2, to_view_func, ged_model2view},
+    {"model2view_lu",  "x y z", 5, to_view_func_less, ged_model2view_lu},
+    {"move_arb_edge",  (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_move_arb_edge},
+    {"move_arb_face",  (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_move_arb_face},
+    {"metaball_move_pnt",      (char *)0, TO_UNLIMITED, to_move_pnt_common, 
ged_metaball_move_pnt},
+    {"pipe_move_pnt",  (char *)0, TO_UNLIMITED, to_move_pnt_common, 
ged_pipe_move_pnt},
+    {"mouse_add_metaball_pnt", "obj mx my", TO_UNLIMITED, 
to_mouse_append_pnt_common, ged_metaball_add_pnt},
+    {"mouse_append_pipe_pnt",  "obj mx my", TO_UNLIMITED, 
to_mouse_append_pnt_common, ged_pipe_append_pnt},
+    {"mouse_move_metaball_pnt",        "obj i mx my", TO_UNLIMITED, 
to_mouse_move_pnt_common, ged_metaball_move_pnt},
+    {"mouse_move_pipe_pnt",    "obj i mx my", TO_UNLIMITED, 
to_mouse_move_pnt_common, ged_pipe_move_pnt},
+    {"mouse_prepend_pipe_pnt", "obj mx my", TO_UNLIMITED, 
to_mouse_append_pnt_common, ged_pipe_prepend_pnt},
+    {"mv",     (char *)0, TO_UNLIMITED, to_pass_through_func, ged_move},
+    {"mvall",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_move_all},
+    {"nirt",   "[args]", TO_UNLIMITED, to_view_func, ged_nirt},
+    {"nmg_collapse",   (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_nmg_collapse},
+    {"nmg_fix_normals",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_nmg_fix_normals},
+    {"nmg_simplify",   (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_nmg_simplify},
+    {"ocenter",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_ocenter},
+    {"open",   (char *)0, TO_UNLIMITED, to_pass_through_and_refresh_func, 
ged_reopen},
+    {"orient", "quat", 6, to_view_func_plus, ged_orient},
+    {"orientation",    "quat", 6, to_view_func_plus, ged_orient},
+    {"orotate",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_orotate},
+    {"oscale", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_oscale},
+    {"otranslate",     (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_otranslate},
+    {"overlay",        (char *)0, TO_UNLIMITED, to_autoview_func, ged_overlay},
+    {"pathlist",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_pathlist},
+    {"paths",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_pathsum},
+    {"perspective",    "[angle]", 3, to_view_func_plus, ged_perspective},
+    {"pix2fb",         "[options] [file.pix]", TO_UNLIMITED, to_view_func, 
ged_pix2fb},
+    {"plot",   "[options] file.pl", 16, to_view_func, ged_plot},
+    {"pmat",   "[mat]", 3, to_view_func, ged_pmat},
+    {"pmodel2view",    "vname", 2, to_view_func, ged_pmodel2view},
+    {"png2fb",  "[options] [file.png]", TO_UNLIMITED, to_view_func, 
ged_png2fb},
+    {"pngwf",  "[options] file.png", 16, to_view_func, ged_png},
+    {"prcolor",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_prcolor},
+    {"prefix", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_prefix},
+    {"pipe_prepend_pnt",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_pipe_prepend_pnt},
+    {"preview",        "[options] script", TO_UNLIMITED, to_dm_func, 
ged_preview},
+    {"protate",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_protate},
+    {"postscript", "[options] file.ps", 16, to_view_func, ged_ps},
+    {"pscale", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_pscale},
+    {"pset",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_pset},
+    {"ptranslate",     (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_ptranslate},
+    {"push",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_push},
+    {"put",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_put},
+    {"put_comb",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_put_comb},
+    {"putmat", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_putmat},
+    {"qray",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_qray},
+    {"quat",   "a b c d", 6, to_view_func_plus, ged_quat},
+    {"qvrot",  "x y z angle", 6, to_view_func_plus, ged_qvrot},
+    {"r",      (char *)0, TO_UNLIMITED, to_pass_through_func, ged_region},
+    {"rcodes", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_rcodes},
+    {"rect",   "args", 6, to_view_func, ged_rect},
+    {"red",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_red},
+    {"regdef", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_regdef},
+    {"regions",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_tables},
+    {"solid_report",   (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_solid_report},
+    {"rfarb",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_rfarb},
+    {"rm",     (char *)0, TO_UNLIMITED, to_pass_through_and_refresh_func, 
ged_remove},
+    {"rmap",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_rmap},
+    {"rmat",   "[mat]", 3, to_view_func, ged_rmat},
+    {"rmater", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_rmater},
+    {"rot",    "[-m|-v] x y z", 6, to_view_func_plus, ged_rot},
+    {"rot_about",      "[e|k|m|v]", 3, to_view_func, ged_rotate_about},
+    {"rot_point",      "x y z", 5, to_view_func, ged_rot_point},
+    {"rotate_arb_face",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_rotate_arb_face},
+    {"rrt",    "[args]", TO_UNLIMITED, to_view_func, ged_rrt},
+    {"rselect",                (char *)0, TO_UNLIMITED, to_view_func, 
ged_rselect},
+    {"rt",     "[args]", TO_UNLIMITED, to_view_func, ged_rt},
+    {"rtabort",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_rtabort},
+    {"rtarea", "[args]", TO_UNLIMITED, to_view_func, ged_rt},
+    {"rtcheck",        "[args]", TO_UNLIMITED, to_view_func, ged_rtcheck},
+    {"rtedge", "[args]", TO_UNLIMITED, to_view_func, ged_rt},
+    {"rtweight", "[args]", TO_UNLIMITED, to_view_func, ged_rt},
+    {"rtwizard", "[args]", TO_UNLIMITED, to_view_func, ged_rtwizard},
+    {"savekey",        "filename", 3, to_view_func, ged_savekey},
+    {"saveview", (char *)0, TO_UNLIMITED, to_view_func, ged_saveview},
+    {"sca",    "sf", 3, to_view_func_plus, ged_scale},
+    {"screengrab",     "imagename.ext", TO_UNLIMITED, to_dm_func, 
ged_screen_grab},
+    {"search",         (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_search},
+    {"select",         (char *)0, TO_UNLIMITED, to_view_func, ged_select},
+    {"set_output_script",      "[script]", TO_UNLIMITED, to_pass_through_func, 
ged_set_output_script},
+    {"set_transparency",       (char *)0, TO_UNLIMITED, 
to_pass_through_and_refresh_func, ged_set_transparency},
+    {"set_uplotOutputMode",    (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_set_uplotOutputMode},
+    {"setview",        "x y z", 5, to_view_func_plus, ged_setview},
+    {"shaded_mode",    (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_shaded_mode},
+    {"shader", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_shader},
+    {"shells", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_shells},
+    {"showmats",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_showmats},
+    {"size",   "[size]", 3, to_view_func_plus, ged_size},
+    {"slew",   "x y [z]", 5, to_view_func_plus, ged_slew},
+    {"solids", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_tables},
+    {"solids_on_ray",  (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_solids_on_ray},
+    {"summary",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_summary},
+    {"sv",     "x y [z]", 5, to_view_func_plus, ged_slew},
+    {"sync",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_sync},
+    {"t",      (char *)0, TO_UNLIMITED, to_pass_through_func, ged_ls},
+    {"tire",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_tire},
+    {"title",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_title},
+    {"tol",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_tol},
+    {"tops",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_tops},
+    {"tra",    "[-m|-v] x y z", 6, to_view_func_plus, ged_tra},
+    {"track",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_track},
+    {"tree",   (char *)0, TO_UNLIMITED, to_pass_through_func, ged_tree},
+    {"unhide", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_unhide},
+    {"units",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_units},
+    {"v2m_point",      "x y z", 5, to_view_func, ged_v2m_point},
+    {"vdraw",  (char *)0, TO_UNLIMITED, to_pass_through_and_refresh_func, 
ged_vdraw},
+    {"version",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_version},
+    {"view",   "quat|ypr|aet|center|eye|size [args]", 7, to_view_func_plus, 
ged_view_func},
+    {"view2grid_lu",   "x y z", 5, to_view_func_less, ged_view2grid_lu},
+    {"view2model",     "", 2, to_view_func_less, ged_view2model},
+    {"view2model_lu",  "x y z", 5, to_view_func_less, ged_view2model_lu},
+    {"view2model_vec", "x y z", 5, to_view_func_less, ged_view2model_vec},
+    {"viewdir",        "[-i]", 3, to_view_func_less, ged_viewdir},
+    {"vnirt",  "[args]", TO_UNLIMITED, to_view_func, ged_vnirt},
+    {"wcodes", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_wcodes},
+    {"whatid", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_whatid},
+    {"which_shader",   (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_which_shader},
+    {"whichair",       (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_which},
+    {"whichid",        (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_which},
+    {"who",    (char *)0, TO_UNLIMITED, to_pass_through_func, ged_who},
+    {"wmater", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_wmater},
+    {"x",      (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_solid_report},
+    {"xpush",  (char *)0, TO_UNLIMITED, to_pass_through_func, ged_xpush},
+    {"ypr",    "yaw pitch roll", 5, to_view_func_plus, ged_ypr},
+    {"zap",    (char *)0, TO_UNLIMITED, to_pass_through_and_refresh_func, 
ged_zap},
+    {"zoom",   "sf", 3, to_view_func_plus, ged_zoom},
+    {(char *)0,        (char *)0, 0, TO_WRAPPER_FUNC_PTR_NULL, 
GED_FUNC_PTR_NULL}
+};
+
+
+static struct to_cmdtab to_cmds[] = {
+    {"autoview",       "vname", TO_UNLIMITED, to_autoview, GED_FUNC_PTR_NULL},
+    {"base2local",     (char *)0, TO_UNLIMITED, to_base2local, 
GED_FUNC_PTR_NULL},
+    {"bg",     "[r g b]", TO_UNLIMITED, to_bg, GED_FUNC_PTR_NULL},
+    {"blast",  (char *)0, TO_UNLIMITED, to_blast, GED_FUNC_PTR_NULL},
+    {"bot_edge_split", "bot face", TO_UNLIMITED, to_bot_edge_split, 
GED_FUNC_PTR_NULL},
+    {"bot_face_split", "bot face", TO_UNLIMITED, to_bot_face_split, 
GED_FUNC_PTR_NULL},
+    {"bounds", "[\"minX maxX minY maxY minZ maxZ\"]", TO_UNLIMITED, to_bounds, 
GED_FUNC_PTR_NULL},
+    {"configure",      "vname", TO_UNLIMITED, to_configure, GED_FUNC_PTR_NULL},
+    {"constrain_rmode",        "x|y|z x y", TO_UNLIMITED, to_constrain_rmode, 
GED_FUNC_PTR_NULL},
+    {"constrain_tmode",        "x|y|z x y", TO_UNLIMITED, to_constrain_tmode, 
GED_FUNC_PTR_NULL},
+    {"cp",     "[-f] from to", TO_UNLIMITED, to_copy, GED_FUNC_PTR_NULL},
+    {"data_arrows",    "???", TO_UNLIMITED, to_data_arrows, GED_FUNC_PTR_NULL},
+    {"data_axes",      "???", TO_UNLIMITED, to_data_axes, GED_FUNC_PTR_NULL},
+    {"data_labels",    "???", TO_UNLIMITED, to_data_labels, GED_FUNC_PTR_NULL},
+    {"data_lines",     "???", TO_UNLIMITED, to_data_lines, GED_FUNC_PTR_NULL},
+    {"data_polygons",  "???", TO_UNLIMITED, to_data_polygons, 
GED_FUNC_PTR_NULL},
+    {"data_move",      "???", TO_UNLIMITED, to_data_move, GED_FUNC_PTR_NULL},
+    {"data_move_object_mode",  "x y", TO_UNLIMITED, to_data_move_object_mode, 
GED_FUNC_PTR_NULL},
+    {"data_move_point_mode",   "x y", TO_UNLIMITED, to_data_move_point_mode, 
GED_FUNC_PTR_NULL},
+    {"data_pick",      "???", TO_UNLIMITED, to_data_pick, GED_FUNC_PTR_NULL},
+    {"data_scale_mode",        "x y", TO_UNLIMITED, to_data_scale_mode, 
GED_FUNC_PTR_NULL},
+    {"data_vZ",        "[z]", TO_UNLIMITED, to_data_vZ, GED_FUNC_PTR_NULL},
+    {"delete_view",    "vname", TO_UNLIMITED, to_delete_view, 
GED_FUNC_PTR_NULL},
+    {"dlist_on",       "[0|1]", TO_UNLIMITED, to_dlist_on, GED_FUNC_PTR_NULL},
+    {"faceplate",      "center_dot|prim_labels|view_params|view_scale 
color|draw [val(s)]", TO_UNLIMITED, to_faceplate, GED_FUNC_PTR_NULL},
+    {"fit_png_image",  "image_file_in req_width req_height scale 
image_file_out", 6, to_fit_png_image, GED_FUNC_PTR_NULL},
+    {"fontsize",       "[fontsize]", 3, to_fontsize, GED_FUNC_PTR_NULL},
+    {"get_prev_mouse", "vname", TO_UNLIMITED, to_get_prev_mouse, 
GED_FUNC_PTR_NULL},
+    {"handle_expose",  "vname count", TO_UNLIMITED, to_handle_expose, 
GED_FUNC_PTR_NULL},
+    {"hide_view",      "vname [0|1]", 3, to_hide_view, GED_FUNC_PTR_NULL},
+    {"idle_mode",      "vname", TO_UNLIMITED, to_idle_mode, GED_FUNC_PTR_NULL},
+    {"init_view_bindings",     "vname", TO_UNLIMITED, to_init_view_bindings, 
GED_FUNC_PTR_NULL},
+    {"light",  "[0|1]", TO_UNLIMITED, to_light, GED_FUNC_PTR_NULL},
+    {"list_views",     (char *)0, TO_UNLIMITED, to_list_views, 
GED_FUNC_PTR_NULL},
+    {"listen", "[port]", TO_UNLIMITED, to_listen, GED_FUNC_PTR_NULL},
+    {"local2base",     (char *)0, TO_UNLIMITED, to_local2base, 
GED_FUNC_PTR_NULL},
+    {"make",   (char *)0, TO_UNLIMITED, to_make, GED_FUNC_PTR_NULL},
+    {"mirror", (char *)0, TO_UNLIMITED, to_mirror, GED_FUNC_PTR_NULL},

@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to