"Fossies" - the Fresh Open Source Software Archive

Member "brlcad-7.32.4/TODO" (29 Jul 2021, 113212 Bytes) of package /linux/misc/brlcad-7.32.4.tar.bz2:


As a special service "Fossies" has tried to format the requested text file into HTML format (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. See also the last Fossies "Diffs" side-by-side code changes report for "TODO": 7.32.0_vs_7.32.2.

A hint: This file contains one or more very long lines, so maybe it is better readable using the pure text view mode that shows the contents as wrapped lines within the browser window.


    1 						 -*- coding: utf-8 -*-
    2 BRL-CAD To Do List
    3 ==================
    4 
    5 This document contains a collection of desirable BRL-CAD development
    6 tasks.  Included is a list of the tasks expected for the current
    7 monthly development release iteration, tasks that will hopefully be
    8 completed within two iterations, and a remaining "backlog" of
    9 unscheduled development tasks.
   10 
   11 This is not an official list of tasks that will be completed.  Instead
   12 it's more like a developer scratch pad for recording ideas and
   13 coordinating release tasks.  At the beginning of each month,
   14 developers add the tasks they expect to complete and then remove those
   15 tasks as they are completed.
   16 
   17 
   18 THESE TASKS SHOULD HAPPEN BEFORE THE NEXT RELEASE
   19 -------------------------------------------------
   20 
   21 
   22 THESE TASKS SHOULD HAPPEN WITHIN TWO RELEASE ITERATIONS
   23 -------------------------------------------------------
   24 
   25 * dbconcat corrupted database / failed. created a top-level comb with
   26   invalid "1_[subcomb]/" to be created that result in error messages
   27   during any db listing (e.g., tops).  workaround was to manually edit
   28   the comb and remove the 1_ and / on the entries.
   29 
   30 * The following will be removed from MGED's menu bar (unused
   31   features, can be accomplished another way, or will be exposed
   32   only as lower level settings when there are sensible defaults
   33   that are seldom changed.)
   34 
   35   Modes->Display Lists
   36   Misc->Keystroke Forwarding
   37   Misc->Depth Cueing
   38   Misc->Z Buffer
   39   Misc->Lighting
   40 
   41 * implement uv-mapping callback so we can texture-map BoT, NMG, and
   42   NURBS geometry
   43 
   44 * modify libfb's default memory buffer allocation to be dynamic
   45 
   46 * create a BRL-CAD .g with all possible object types embedded.
   47   integrate into testing. e.g., scene with all object types plus a
   48   lookup check to ensure none are missing.
   49 
   50 * fix pipe subtractions shaded display issue in archer
   51 
   52 * attribute normalization is drastically slowing down
   53   region creation - need to fix or back out
   54 
   55 * add regression test for directional light sources
   56 
   57 * bundle primary rays in rt front end into postage stamps, shoot via
   58   rt_shootrays(), modify to pass all rays down through the spatial
   59   partitioning simultaneously
   60 
   61 * readd support for vrml v1 to g-vrml so that users can select whether
   62   they want v2 (default) or previous v1 output format via a
   63   command-line switch.  see http://brlcad.svn.sf.net/viewvc/brlcad/brlcad/trunk/conv/g-vrml.c?view=diff&pathrev=22798&r1=16900&r2=16901
   64 
   65 * metaball in command input needs sanity checks and better validation.
   66 
   67 * integrate gen-registered-attributes-html output into website
   68 
   69 * brlcad-config build helper script is not working (not reporting
   70   -llibs, reporting semicolon list for 'brlcad' lib).  Example working output:
   71   $ /usr/brlcad/rel-7.18.0/bin/brlcad-config brlcad
   72   -L/usr/brlcad/rel-7.18.0/lib -m64 -L/usr/local/lib64 -L/usr/local/lib -pipe -fno-strict-aliasing -fno-common -fexceptions -ggdb3 -D_FORTIFY_SOURCE=2 -O3 -w -L/usr/brlcad/rel-7.18.0/lib -lbrlcad -lged -lwdb -lrt -lbn -lbu -ltcl8.5 -ldl -lm -lpng14 -lz -lc -lpthread -lregex -lsysv -lopenNURBS -lanalyze
   73 
   74   $ /usr/brlcad/rel-7.18.0/bin/brlcad-config rt
   75   -L/usr/brlcad/rel-7.18.0/lib -m64 -L/usr/local/lib64 -L/usr/local/lib -pipe -fno-strict-aliasing -fno-common -fexceptions -ggdb3 -D_FORTIFY_SOURCE=2 -O3 -w -L/usr/brlcad/rel-7.18.0/lib -lrt -lbn -lbu -ltcl8.5 -ldl -lm -lpng14 -lz -lc -lpthread -lregex -lsysv -lopenNURBS
   76 
   77 * OpenCL for enhanced performance boolweave sorting
   78 
   79 * create boolweave+boolfinal unit tests to validate weaving behavior
   80   and performance.
   81 
   82 * make sure we can run db_dirbuild() multiple times without creating
   83   duplicate entries.
   84 
   85 * tree command shouldn't infinite loop when encountering a cyclic
   86   path - need to print a warning and stop walking.  Requries full
   87   path awareness in tree command walk.
   88 
   89   Consider implementing a corollary to FTS instead of dirent for
   90   simplified tree traversal with cyclic awareness.
   91 
   92   https://keramida.wordpress.com/2009/07/05/fts3-or-avoiding-to-reinvent-the-wheel/
   93 
   94 * bounding box reduction command
   95 
   96 * consolidate dbconcat, clone, make_name, and any other .g I/O
   97   routines that need to autogenerate names to use the new
   98   bu_vls_incr/bu_vls_simplify functions.
   99 
  100 * g-obj not exporting colors
  101 
  102 * heap unit test needs to actually compare performance against system
  103   allocation, not just do some work
  104 
  105 * mged> nirt -? needs to provide help
  106 
  107 * mged> nirt -f fmt doesn't seem to work at all
  108 
  109 * move the rt_*_timer timing facilities to libbu and rework to allow
  110   contexts, allowing for more than one timer to be active.  Make sure
  111   the old librt API can be obsoleted cleanly.
  112 
  113 * investigate problems with struct parsing running the MGED
  114   "vars" command - most visible on OpenBSD, but Linux valgrind can
  115   also see issues.
  116 
  117 
  118 THESE ARE UNSCHEDULED BACKLOG TASKS
  119 -----------------------------------
  120 
  121 * gdiff in mged appears to be broken?  get "no primitives found" on
  122   second comb when specifying two combs (gdiff comb1 comb2).
  123   UPDATE - this appears to be a consequence of how gdiff internally
  124   implements its raytrace diffing.  The "fix" would be to separately
  125   raytrace each object and post-process the line segments, rather
  126   than drawing up everything at once - the latter has problems if
  127   part or all of comb2 is shared with comb1.  A workaround is to
  128   keep out comb2 and dbconcat it back in, then gdiff comb1 with the
  129   imported tree.
  130 
  131 * pixscale doesn't seem to handle stdin (due to bu_seek) for very
  132   long
  133 
  134 * The embedded framebuffer for the X display manager is not working
  135   with Tcl/Tk 8.6 - it brings down mged with an Xerror when it tries
  136   to XFlush after X24_blit.  Better solution is to replace the X
  137   dm/fb with a cross platform software rasterizing solution of some
  138   sort.
  139 
  140 * extract a skin or other exterior surface for a given model.  3 options:
  141   1. Implement a "shrinkwrap" feature that calculates a concave hull
  142   2. Shoot rays from outside, construct exterior mesh based on hits
  143      (akin to marching cubes, a surface reconstruction)
  144   3. Shoot rays from outside at exterior vertices, retain all mesh faces
  145      and objects encountered (i.e., not reconstructed, but extracted)
  146 
  147 * RTAREA
  148 
  149   * add an option to rtarea for onehit.  this is probably best as an
  150     option that reports the requested objects only and then has a
  151     verbose option for the more detailed hiearchical report that is
  152     currently produced.
  153 
  154   * verify rtarea.  There are reports that the rtarea
  155     command may have a bug in its calculations.  This needs to be
  156     investigated.
  157 
  158   * review and fix rtarea's taxonomy for describing
  159     presented/projected areas.  users expect presented area to
  160     represent what is currently referred to as exposed area.  may make
  161     more sense to introduce a different terms for other shotline
  162     encounters.
  163 
  164   * make rtarea display a cross-hair and perhaps coordinates for the
  165     center of area if run from within mged.
  166 
  167   * add an option to rtarea for onehit.  this is probably best as an
  168     option that reports the requested objects only and then has a
  169     verbose option for the more detailed hiearchical report that is
  170     currently produced.
  171 
  172   * verify rtarea.  There are reports that the rtarea
  173     command may have a bug in its calculations.  This needs to be
  174     investigated.
  175 
  176   * review and fix rtarea's taxonomy for describing
  177     presented/projected areas.  users expect presented area to
  178     represent what is currently referred to as exposed area.  may make
  179     more sense to introduce a different terms for other shotline
  180     encounters.
  181 
  182   * make rtarea display a cross-hair and perhaps coordinates for the
  183     center of area if run from within mged.
  184 
  185 * bot -V check solid bot.s visualizations don't show up if bot.s is
  186   first drawn in MGED - should properly "overlay" them so the user
  187   doesn't have to first erase the solid from the scene visual.
  188 
  189 * MGED's startup directory is inconsistent and sometimes problematic.
  190   If the current working directory is read-only (e.g., a default
  191   system install and opening one of the sample .g files), then
  192   numerous commands the write out to the current path will fail (e.g.,
  193   "idents file.log").  Review startup path behavior and consider using
  194   $HOME or some other system path, unless started on the command-line.
  195 
  196 * rtwizard's reopening of the database is causing db_dircheck
  197   "Duplicate of..." errors when opening read-only .g files.
  198 
  199 * procedural studio box generation allowing for specification of size,
  200   shape, material, and lighting characteristics
  201 
  202 * verify all of the src/util utilities behave correctly on Windows
  203   with respect to mode (i.e. correctly using setmode/O_BINARY when
  204   performing file I/O.)
  205 
  206 * the osgl libdm backend has what appears to be an off-by-one-pixel
  207   error in the x and y directions with respect to mouse placement.
  208   Using kmag, can see tha putting the mouse cursor over the center
  209   yellow dot and center clicking (which should be a no-op, and is
  210   with ogl) results in the scene shifting slightly.
  211 
  212 * replace los references/terminology with span, len, dist, factor, etc
  213   accordingly since los is ambiguous and a source of user confusion.
  214 
  215 * enhance env command to handle debug variables, use sysctl style
  216   groupings of variables, and in general make the setup simpler
  217   and more uniform (ideally we'll fold the debug command's
  218   capabilities into env in some form.)  Need to have a usability
  219   brainstorming session, but after discussion with Sean general
  220   outlines are to:
  221   Switch all debug variable management to staging through
  222   environment variables rather than directly setting hex values
  223   on the globals, but leave the globals as the low level mechanism
  224   for performance reasons (getenv is much more expensive, don't
  225   want it in core code.)  Something like:
  226 
  227   LIBRT_DEBUG_HF (env variable) -> debug.rt_hf (env cmd) -> rt_debug hex val (library)
  228 
  229 * overlay command needs to accept multiple file arguments
  230 
  231 * Bounding Boxes
  232 
  233   * make the bb command default to calculating a tighter-fitting
  234     bounding box using plot points and knowledge of the subtraction
  235     objects (e.g., perform inside/outside test against arb8s).
  236 
  237   * implement a faster raytraced AABB function that calls ft_plot(),
  238     shoots a ray through each point, and computes the resulting box.
  239 
  240   * g-shell-rect appears to be the only command that will give a
  241     raytraced AABB.  we need to refactor that feature into either the
  242     gqa -Ab (which merely reports the prep box) or the analyze command
  243     (or both).
  244 
  245   * add option(s) to 'bb' for reporting different types of boxes:
  246 
  247     1) unevaluated, without subtractions (current fast result)
  248     2) unevaluated, with subtractions
  249     3) evaluated, coarse (use plot points)
  250     4) evaluated, precise (use ray tracing)
  251     5) evaluated, exact (requires Implicit+CSG->BREP+CSG->BREP-CSG)
  252 
  253     option dimensionality #1: sphere v aabb v obb v 8dop v cxhull
  254                           #2: unevaluated v evaluated booleans
  255                           #3: without v with subtractions
  256                           #4: coarse v precise v exact
  257 
  258   * investigate why the new bbox() routines for ARS and BoT result in
  259     bounding boxes that are way too big.
  260 
  261   * implement prep optimzation to the default fast bbox approximation
  262     specifically for arb8/rpp since we know the exact extent of their
  263     bounds and can chop away at a box with a box.
  264 
  265   * make gqa -Ab use sample points for reporting an evaluated AABB.
  266 
  267   * make bb report an evaluated AABB by default.
  268 
  269   * provide option for displaying object bounding boxes while
  270     rotating.  visualization feature to help with rotation operations,
  271     showing global object alignment with respect to its own coordinate
  272     space.
  273 
  274   * Extract bounding box code from both autoview.c and get_autoview.c
  275     into a general bounding rpp function in librt and use accordingly
  276     (particularly in libged).  Should combine autoview.c with
  277     get_autoview.c (perhaps as a flag) and utilize the general
  278     function in lots of places (e.g., the ged_arb() function).
  279 
  280 * add unit tests for primitive callback routines (e.g., bbox).
  281 
  282 * put bu_num_print() to use
  283 
  284 * use bu_gettime() in rt -l8 heatgraph visualization mode
  285 
  286 * fully implement analyze for all geometry objects
  287 
  288 * implement general analyze estimate (perhaps just raytrace it) for
  289   primitives where values like surface area, volume, or bb are very
  290   difficult to calculate.
  291 
  292 * move analyze logic into libanalyze (with respective primitive logic
  293   into src/librt/primitives/*).
  294 
  295 * extend analyze output formatting to user-specified formats ala nirt
  296 
  297 * calculate products of inertia in 'analyze' and/or gqa output
  298 
  299 * calculate radii of gyration in 'analyze' and/or gqa output
  300 
  301 * implement make, ted, edsol, mirror, and analyze for revolve
  302   primitive.  implement tess() too.
  303 
  304 * go_open inmem to db command
  305 
  306 * optimize mged interactive loop command processing.  creating 10k
  307   objects: 40 sec, via inmem: 2 sec
  308 
  309 * rtwizard unit test legitimately failing on mac/windows
  310 
  311 * implement a bu_exec wrapper and investigate something like capnproto
  312   to build up a process-isolated command execution system for libged.
  313   Possibly useful resources:
  314 
  315   - https://github.com/s-u/multicore/blob/master/src/forknt.c
  316   - https://github.com/diacritic/BoxFort
  317   - https://yuhui-lin.github.io/blog/2017/08/01/serialization
  318 
  319 * Implement a bu alarm(2)-style interface so we can abort library
  320   routines gracefully from application code. A quick initial attempt
  321   at this didn't succeed very well (r71644 has what was tried).
  322 
  323 * cppclean audit
  324 
  325 * add a multiview rt script to regression testing (e.g., see rtwalk output)
  326 
  327 * finish implementing pnts:
  328   - ray trace pnts
  329   - make color and vectors on pnts work
  330 
  331 * handling of geometry with names like "--_25" fails in archer
  332 
  333 * drawing with origin, axes, and overall dimensions for rt/rtedge/etc.
  334 
  335 * gather v&v docs on configuration management process, user manuals,
  336   process documentation, software documentation, model descriptions.
  337 
  338 * STIX 2.0 fonts are released, using OpenType - check to see whether
  339   we can upgrade to these for our DocBook processing
  340 
  341 * Fedora doesn't have the old fonts mged assumes: dm-X: Can't open font '9x15' or '-adobe-courier-medium-r-normal--10-100-75-75-m-60-iso8859-1'
  342 
  343 * Investigate using https://github.com/weiss/c99-snprintf to guarantee
  344   snprintf cross-platform.  There are potential drawbacks to the current
  345   MSVC approach pre Visual Studio 2015 (_snprintf doesn't null terminate
  346   on overflow, and _snprintf_s returns -1 on overflow...)
  347 
  348 * lay out filesystem and URI models for database storage and access -
  349   these design decisions are fundamental and have broad implications for many
  350   other design decisions.  Issues to consider include where and how versioning,
  351   how to access attribute data from URIs, what the filesystem analogies are
  352   (combs -> directories, objects -> hard links, etc...), where they break down
  353   (comb boolean expressions don't map cleanly to the notion of directory
  354    contents, for example) and how to handle the various cases, how to present
  355   a "db_glob" API etc.  Need a proper document laying all of this out.
  356 
  357   Potentially relevant/useful links:
  358   URI specification:  https://tools.ietf.org/html/rfc3986
  359   Minimal URI parser:  https://github.com/cloderic/curi
  360   Larger URI parser: https://github.com/bnoordhuis/uriparser2
  361   Fast parser, has deps: https://github.com/toffaletti/libguri
  362   OpenBSD glob with function callbacks (rework/simplify
  363      to be *only* a callback API to make this properly generic,
  364      then have OS or .g specific functions...):
  365   https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/include/glob.h
  366   https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gen/glob.c
  367 
  368 * look at components of the Screened Poisson code and figure out where/how
  369   they would map into BRL-CAD components. (this is partially to see whether
  370   we can (re)implement this logic in our framework and partially an exercise
  371   in BRL-CAD library scoping)
  372 
  373 * replace guts of bu_ptbl to see if we can improve performance -
  374   implications for removal if an appropriate substitute is found,
  375   needs to be deprecated if we remove all API but we can update guts.
  376   Try moodycamel https://github.com/cameron314/concurrentqueue
  377 
  378 * check state of adaptagrams work - turn on? if not, delete?
  379 
  380 * brlman - need remote text display in MGED, maybe run non-graphical brlman
  381   in MGED console mode?  A last resort fallback could be console text output
  382   via mandoc...
  383 
  384 * add ability to capture any command's output to a file, ideally with
  385   options for specifying stdout and/or stderr.  of priority are the
  386   attr and rtcheck/gqa commands.  this should probably be handled by a
  387   libged command wrapper so it's consistent and available to any
  388   command.
  389 
  390 * mater command does not validate its arguments - fix that.  Also
  391   properly document using "." to skip specifying something - not in
  392   the man page currently.
  393 
  394 * bullet integration - need to expose restitution as an
  395   object parameter so we can configure behavior:
  396   http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=&f=&t=3248
  397 
  398 * afl on libged/mged/rt/...
  399 
  400 * moodycamel as libbu queue/list/ptbl implementation
  401 
  402 * define geometry URL and VFS behavior
  403 
  404 * change _mged_ command prefix to a simple '.' prefix to hide/protect
  405   the built-in commands.
  406 
  407 * sync tgc/rec shot() behavior, sort results for proper normal.
  408   inspect t62 grazing with r653,r735 (tgc on an arb8) looking at ae0,0
  409   and z=1524 (was hit/overlap, now misses).
  410 
  411 * havoc.g s.nos5g reliably exhibits the grazing edge bug where only
  412   one hit point is being returned.  to reproduce:
  413   e s.nos5g ; ae 35 25 ; units mm ; center 26912.4 7089.08 7168.96 ; nirt
  414 
  415 * obsd stack crashers
  416 
  417 * closing the graphics window brings down X11 on Mac due to a bad
  418   context.  fix or revert recent close window behavior.
  419 
  420 * evaluate OpenMesh (http://www.openmesh.org) and OpenFlipper
  421   (http://www.openflipper.org) for smoothing, decimation, and
  422   additional GCV conversion formats.
  423 
  424 * GCT decimation assumes no edge is shared by two triangles except
  425   once in the reversed order (AB, BA).  Needs basic check to avoid
  426   failures/crashing.
  427 
  428 * V&V bwcrop, pixembed are behaving correctly, as documented
  429 
  430 * need routine that returns a color given a path, similar to
  431   rt_comb_get_color() but full path so that inheritance is taken into
  432   account and colors set correctly.
  433 
  434 * implement unit tests for bu dirent / stat API
  435 
  436 * convert src/util/terrain.c to src/shapes/terrain.c writing out the
  437   datafile to a binunif along with a referencing dsp.  perhaps add
  438   command line option to skip .g to retain prior datafile capability.
  439   need to review command line options to simplify complexity and
  440   control randomization better.
  441 
  442 * get_eyemodel returns an eye_pt entry, but feeding the results to
  443   archer's eye_pt command results in get_eyemodel returning a different
  444   eye_pt, even when the units are all in mm.  is this expected?
  445   intuitively, I would expected feeding the results of get_eyemodel to
  446   eye_pt to result in no change, modulo unit conversions.
  447 
  448 * make rt -b accept a pixel index in addition to x,y pixel coordinates
  449 
  450 * teach pixdiff and other tools that can/should support the capability
  451   to read/write (as appropriate) pixel index values or x,y coordinates
  452   and reproduce the ray fired to create that pixel. currently does -l
  453   index but not xy coordinates.
  454 
  455 * make mged work without a batch script
  456 
  457 * Need to rethink libbu hash API - ideally should be much simpler and
  458   expose much less to the user.
  459 
  460 * The current libbu mime API needs to be retired in favor of something
  461   more powerful.  It was a mistake to use enums generated from the
  462   mime types - they are static, cannot be enriched at runtime (say,
  463   by icv plugins) and the separation of the context from the type
  464   itself (image/png -> BU_MIME_IMAGE and BU_MIME_IMAGE_PNG for example)
  465   is both cumbersome and unnecessary.  Instead, grab a subset of the
  466   capabilities of libmagic (https://github.com/file/file) and define
  467   a new libbu mime/data-typing subsystem that is runtime populated by
  468   a default set of pseudo-libmagic style file definitions (may want
  469   to adjust their format slightly, to require a mime type for each
  470   entry, and we need an way to define entries where we don't (yet)
  471   know how to inspect the file contents to identify them...)
  472 
  473   This approach will let us define the types that are of interest to
  474   BRL-CAD, while also letting plugins "educate" the system to support
  475   processing of formats the base system (and the "standard" mime type
  476   lists) know nothing about.
  477 
  478 * investigate merging functionality from the sig tools into libicv
  479   and removing the tools themselves.  Also, need some documentation
  480   for the sig functionality (currently none??)
  481 
  482 * investigate updating our fnmatch code to use OpenBSD's non-recursive
  483   implementation, added starting at revision 1.16:
  484   http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gen/fnmatch.c
  485 
  486 * start making use of the CMakePushCheckState macros - we are doing
  487   this manually in several places
  488 
  489 * expand libbu parallelism with thread-level control, i.e., the
  490   ability to start/stop/wait on individual threads in addition to the
  491   existing bu_parallel() call.  bu_parallel() gets updated to call the
  492   new thread-level control under the hood, but allows for more
  493   expressive threading structures (e.g., a function similar to
  494   bu_parallel() that is non-blocking).
  495 
  496   One consideration would be to implement something similar to Intel's
  497   Cilk API:
  498 
  499   + bu_spawn() specifies that a function call to execute
  500   asynchronously, without requiring the caller to wait for it to
  501   return.  This allows for parallelism but does not mandate it (so
  502   code will function as expected if it does block).
  503 
  504   + bu_sync() specifies that all spawned calls must complete before
  505   execution continues.  This allows for synchronization of data at
  506   different phases of a computation.
  507 
  508   + bu_for() specifies iterations of a loop body to be executed in
  509   parallel.  This would be a way to easily parallelize existing code
  510   without needing to create wrapper functions for bu_parallel().
  511 
  512 * convert usages of Tcl_InitHashTable() and friends to libbu
  513   containers (see src/conv/enf-g.c for example usage)
  514 
  515 * importer for LS-DYNA .k keyword files.  they support a variety of
  516   geometry constructs.  their spec is freely available online.  no
  517   existing libs are known.
  518 
  519 * implement gdiff support for reporting the amount of spatial
  520   difference between two objects.  primarily for calculating amount of
  521   error introduced via bot, nmg, and brep nurbs format
  522   conversion. also useful for knowing relative difference between two
  523   versions (e.g., which is bigger).
  524 
  525 * air regions (aircode > 0) are removed/skipped during prep, but there
  526   is no message to the user that this has occurred.  this can result
  527   in unexpected behavior (bad usability) if/when air regions are the
  528   only geometry being displayed (or are a substantial portion of the
  529   current display.  prep needs to return a catalog so summary
  530   reporting can be facilitated (of all objects, successful or not).
  531 
  532 * look into whether db_dirbuild should call db_update_nref
  533 
  534 * evaluate replacing libfft with the KISS FFT library
  535   (http://kissfft.sourceforge.net, BSD) or the OpenCL-based clFFT
  536   (https://github.com/clMathLibraries/clFFT, Apache2).  we need to
  537   test correctness, precision, and performance via dfft.
  538 
  539   May also be worth looking at https://github.com/anthonix/ffts (has a
  540   CMakeified version at https://github.com/henrygouk/ffts)
  541 
  542   Priit Laes converted our tools to FFTW (circa 2010, see
  543   brlcad-devel), but FFTW is not license-compatible.  there is an sf
  544   patch containing this conversion, untested.
  545 
  546 * import CTRI material information in fast4-g as per-face data.
  547 
  548 * Integrate ADRT into Archer as a visualization mode.
  549 
  550 * Document a GUI feature list (prioritized).
  551 
  552 * Document a CLI feature list (prioritized).
  553 
  554 * high-performance VOL for medical data visualization.  consider
  555   leveraging OpenVDB, PCL, Paraview/VTK, etc.
  556 
  557 * establish the Basic Application Runtime (BAR), only consisting of
  558   libbu and libbn, as a stand-alone self-contained project.  provide
  559   an API that supports most C/C++ application development and
  560   documents our facilities that help simplify code portability,
  561   performance, and maintainability.  the scope is basic application
  562   utility and numerics only.  this scope is particularly tailored
  563   towards 3D and scientific application development.
  564 
  565   the basic utility routines encapsulate platform-specific constructs
  566   portably.  the basic numeric routines provide general math
  567   facilities common to scientific application development with a
  568   particular emphasis on being platform agnostic, high performance,
  569   and validated.
  570 
  571   the Apache Portable Runtime (APR) and GIMP Toolkit (GTK) are similar
  572   alternatives (particularly to BAR's basic utility routines) but have
  573   different emphases, scope, and development philosophies.
  574 
  575   BAR API design aims to be minimally intrusive on application
  576   developers, not requiring them to be aware of or adapt types or
  577   functions until it provides some clear advantage (e.g., portability,
  578   performance, and/or maintainability).
  579 
  580 * rename the "joint2" articulation command (possibly also rename the
  581   "joint" command) worked on when joint objects were implemented.
  582   joint2 interfaces with the old text-file based articulation
  583   interface, but conceivably should get updated when joint objects can
  584   describe everything in the old text files.
  585 
  586 * create a joint articulation (manually is good, automatic is better)
  587   for the tin woodsman so he can move his arms, legs, neck, and head.
  588 
  589 * create a joint articulation (manually is good, automatic is probably
  590   impossible) for ktank so the turret can spin and the gun barrel may
  591   be raised up/down within a given range.
  592 
  593 * need ability to report the smallest feature in a given hierarchy
  594   (smallest edge?) and/or largest error in a given boundary model
  595   (largest edge gap or distance between two points that should be
  596   coincident).
  597 
  598 * geometry compiler.  provides different levels of "optimization"
  599   (ways of reducing the geometry complexity with or without
  600   introducing 3D changes.  provides different stages of compilation
  601   (e.g., similar to preprocessing, compilation, AST reduction,
  602   optimization, encoding transformation, etc.).  name ideas: bcg, cg
  603 
  604 * geometry debugger.  low-level geometry database tool with minimal/no
  605   run-time dependencies on our own libraries.  the idea is a tool that
  606   can inspect/repair a potentially corrupted/invalid .g file or help
  607   debug library robustness issues.  using headers for identifiers and
  608   codes in the implementation is okay (as are library functions, but
  609   just don't rely on any).  name ideas: gdbg, dbadmin, dbtool, dbmaint
  610 
  611 * BU_SETJUMP/BU_UNSETJUMP into macros
  612 
  613 * convert all calls to BU_SETJUMP/BU_UNSETJUMP into familiar try/catch
  614   logic layout using if/else.
  615 
  616 * re-do the sh/enumerate.sh script for CMake
  617 
  618 * get bu_extern out of bu/parse.h into its own header file.
  619 
  620 * geometry symbolic links (hard and soft links)
  621 
  622 * investigate INFINITY spatial partitioning issue.
  623 
  624 * kill material_head static global in src/librt/mater.c
  625 
  626 * add an mk_extrude() routine to libwdb.
  627 
  628 * Teach CMake to respect and use user-defined CMAKE_C_FLAGS and
  629   other options supplied at the command line and in environment
  630   variables.  See whether we can pass a variable into CMAKE_C_FLAGS
  631   that will allow specification of build flags at make time.
  632   Relevant link: https://cmake.org/Bug/view.php?id=12928
  633 
  634 * investigate the possibility of allowing functions to define
  635   their own custom filters for some version of the db_search API.
  636   If we can figure out a programmatic approach of some kind, why
  637   not allow code to define their own "filters" that don't have
  638   a corresponding mapping to the MGED command string?  As long
  639   as the functions satisfy the API templates used by the db_plan
  640   structures, wouldn't custom functions work?
  641 
  642 * implement rt_volume() API for computing geometry volume (gqa style
  643   for complex, direct for primitives)
  644 
  645 * rework fbcolor, fbzoom, and fbpoint to not use termlib, instead just
  646   using regular printing and input reading in a loop.
  647 
  648 * See if it is possible to simplify btclsh/bwish code when it comes
  649   to relying on libtermio - linenoise can do the basics, and for fancier
  650   keybinding/word based navigation see if launching in Emacs can suffice:
  651 
  652   ;; per https://emacs.stackexchange.com/q/18672
  653   (defun btclsh ()
  654     (interactive)
  655     (require 'term)
  656     (let* ((cmd "btclsh")
  657            (termbuf (apply 'make-term "btclsh console" cmd nil nil)))
  658       (set-buffer termbuf)
  659       (term-mode)
  660       (term-line-mode)
  661       (switch-to-buffer termbuf))) 
  662 
  663 * Need to mark or otherwise disambiguate grazing hit segments so we
  664   can consistently retain or remove hits without introducing overlaps.
  665   Consider the case of a tgc stacked on top of an arb8, perfectly
  666   tangent, and shoot a ray at that point:
  667 
  668                                    -----   z=2.0
  669                                    |tgc|
  670   shoot a ray through here --->   -------- z=1.0   <--- or here
  671                                   | arb8 |
  672                                   -------- z=0.0
  673 
  674   Here are the primary concerns:
  675 
  676   A) solidity: a ray should never pass through the two without one or
  677   both evaluating to a hit,
  678 
  679   B) usability: a convention that precludes forcing the user to
  680   "nudge" them apart by some arbitrary epsilon is desired (it's
  681   intuitive and common for users to model two objects with "perfect
  682   tangency"),
  683 
  684   C) deterministic: firing a ray should give the same result every
  685   time that same ray is fired, and,
  686 
  687   D) bidirectional: a ray fired in one direction should evaluate to
  688   the same result if fired from the opposite direction along the same
  689   path (view independence).
  690 
  691   If we hit both, an overlap will ensue unless these objects are
  692   unioned.  This is undesirable.  If we miss both, slipping through
  693   the hairline "crack", it can be devastating for analysis and result
  694   in raytrace speckling.
  695 
  696   In order to only hit one, a consistent grazing policy must be
  697   applied such that grazing points on one "side" of an object are
  698   always kept and grazing hits on the other "side" are always thrown
  699   away.  The proposed method, similar to handling special case
  700   grazings with a Breseham line painter algorithm, is to consistently
  701   consider grazes with a procedure:
  702 
  703   1) Calculate the ray intersection, detect whether the hit is grazing
  704   (defined as a hit being barely in/on the surface either through a
  705   point, edge or even down a surface).
  706 
  707   2) Calculate a hit normal.  It may be desirable to average both the
  708   in/out hit points to get more of a "practical" surface normal.
  709 
  710   3) Calculate the ray of reflection.  Use the surface normal and ray
  711   of intersection to calculate our reflection direction.
  712 
  713   4) Determine which plane of a globally bounding rpp the reflected
  714   ray would intersect with.
  715 
  716   5) If the reflected ray hits the front, right, or bottom face, the
  717   grazing is kept, but if it reflects onto the back, left, or top
  718   face, the grazing is ignored.  In ray-view projected 2D, this
  719   corresponds with keeping the grazing if the reflection is pointing
  720   up or to the left and discarding if pointing down or to the right.
  721 
  722                                    discard top/left/rear
  723                 rear              keep bottom/right/front
  724             .____________.
  725             |\           |\ t              discard
  726             | \          | \ o           ._________.
  727           l |  \         |  \ p          |/////////|
  728           e |   o____________o          d|//view// |
  729           f |   |        |   |          i|//of///  |
  730           t |   |        |   | r        s|//ray/   |k
  731         b   .___|________.   | i        c|////+    |e
  732          o  \   |         \  | g        a|////     |e
  733           t  \  |          \ | h        r|///      |p
  734            t  \ |           \| t        d|//       |
  735             o  \o____________o           ./________.
  736              m     front                     keep
  737 
  738   This should result in consistent grazing behavior that addresses the
  739   above case: we consistently hit the tgc but not the arb8 and there
  740   are no overlaps requiring modeler intervention.  The main problem
  741   with this approach, however, is calculating an appropriate surface
  742   normal for edge and face grazings can be difficult for some objects.
  743 
  744   In the case above, we do not get a hit on the tgc's bottom ellipse,
  745   for example, instead getting two hits near the edge of the side.
  746   Similarly, we hit the left and right arb8 faces, not the top face
  747   even though that is what we are conceptually grazing through.
  748 
  749   One possibility to address that difficulty is to simply report all
  750   grazing hits, but mark them as grazing, and let rt_shootray() sort
  751   it out by sampling a 3x3 pattern that determines if we're grazing
  752   the "top/left" or "bottom/right" side of a surface.
  753 
  754 * fix the redblack tree callback function signatures.  they're
  755   declared and handled as taking (void) but they actually take a
  756   pointer and an int.  need to create a proper void* data parameter or
  757   change the interface to not require so much cast spagettery.
  758 
  759 * decouple libwdb from librt, particularly the headers and relevant
  760   structures that cross over to both such as the rtgeom.h types.
  761 
  762 * Translate logic from clipper polygon clipping library
  763   (http://www.angusj.com/delphi/clipper.php) into libbg and use it
  764   as a pre-processing step for poly2tri's algorithm along the lines
  765   of what bitfighter did:  https://github.com/raptor/clip2tri
  766   Some useful notes here: http://stackoverflow.com/a/16115775
  767 
  768 * Translate the poly2tri routines into libbg C code
  769 
  770 * Implement Shamos-Hoey test for checking whether a polygon is simple
  771   in libbg: http://geomalgorithms.com/a09-_intersect-3.html
  772 
  773 * figure out what in f_matpick (or possibly some other related function)
  774   is causing ipathpos to get incremented to a number larger than the
  775   number of objects in the full path it's supposed to be referencing.
  776 
  777 * refactor rt_mirror (src/librt/primitives/mirror.c) into the functab
  778 
  779 * refactor rt_functab accessors to go through an api call or calls so
  780   that the array is not accessed directly.  either an rt_eval() style
  781   interface with data-driven keys to tell it with function(s) to call,
  782   or simply have an rt_*() for each function (e.g., rt_mirror(),
  783   rt_shot(), rt_describe(), etc.).
  784 
  785 * review proc-db for promotion to src/shapes
  786 
  787 * provide a viable FindBRLCAD.cmake
  788 
  789 * fix nurbs_ssi and nurbs_tester unit tests
  790 
  791 * get rid of the -P#processors user option (except rt* tools) common
  792   on utilities.  call bu_avail_cpus() and provide an environment
  793   variable override used by the library.
  794 
  795 * In tree.c line 531, the initialization of the local storage of the
  796   full path in stp->st_path is conditionalized on the specifics of
  797   the tree structure.  Why?  Could we get away with always initializing
  798   (or never initializing, if it is not used) the st_path?  Current
  799   behavior is odd - if a region has a solid unioned under it the st_path
  800   is not set, but if it has a comb unioned in the path is set - is this
  801   an optimization, and if so is it necessary?
  802 
  803 * investigate integrating Blender's (OSL-based) Cycles engine:
  804   http://code.blender.org/index.php/2013/08/cycles-render-engine-released-with-permissive-license/
  805 
  806 * investigate integrating Pixar's OpenSubdiv for subdivision surfaces:
  807   http://graphics.pixar.com/opensubdiv/
  808 
  809 * investigate the possibility of using Appleseed (http://appleseedhq.net/)
  810   to perform visual image rendering using librt shotline data for input.
  811 
  812 * the scale structure in bn_cmd_noise_slice (bn_tcl.c) was never
  813   initialized. it looks like somebody has planned to extend the
  814   function but never carried out
  815 
  816 * implement a null spatial partitioning method so we can determine
  817   what other intersection hits are being masked (and what impact a
  818   given method has on performance)
  819 
  820 * [hn]to[hn]* conversion functions were usurped by windows 8 so we
  821   need to either wrap them or undeprecate our xdr API or see if a
  822   simple config header fix might work (ideal)
  823 
  824 * The sph wireframe drawing routine doesn't seem to like drawing very
  825   small spheres far from the origin:
  826 
  827   in test_2.s sph 1, 2, 1 0.0007  (draws a sphere wireframe correctly)
  828   in test_1.s sph 10000 -15000 3000 0.0007 (incorrect wireframe)
  829 
  830 * use spatial partitioning during boolean processing of polygonal
  831   meshes.  good approach might be to generalize TIE's kd-tree to
  832   polygons or even create a new scheme (e.g., an integer-indexed grid
  833   layout).  data coherence would be nice (but not essential).  current
  834   approach is at least O(N^2) with large constant time.  New should be
  835   O(N*log(N)).
  836 
  837 * rework the database object hash to push the iteration up into librt
  838   as API instead of expecting callers to use RT_DBNHASH and
  839   RT_DBHASH() manually.  consider using bu_hash or other container.
  840 
  841 * temp colors and temp matrices during ray tracing, rt, rtwizard.
  842   need a command-line and mged method to override parameters.
  843 
  844 * fix 64b detection across platforms. Fix rhel 32/64 confusion
  845 
  846 * test/fix patch-g on windows.  the input file read loops assume
  847   unix-style files resulting in parser errors.
  848 
  849 * merge conv-vg2g into dbupgrade
  850 
  851 * add option to rtedge to also show back-facing hidden edges
  852 
  853 * add option to push/xpush to stop at the region level, to stop before
  854   primitives, to stop after N levels, to stop before N levels.
  855 
  856 * make rt_dirbuild()+rt_dirbuild() work without vomiting error
  857   messages about duplicate geometry.  should be able to open the same
  858   database multiple times without running into rt_uniresource
  859   directory duplication
  860 
  861 * convert teapot to use nurbs surfaces instead of bspline
  862 
  863 * create a FASTGEN sample geometry with all entities defined and a
  864   corresponding regression test to make sure outputs don't change.
  865 
  866 * investigate bu_vls_encode/decode failures on g-dot.c (see that
  867   file for FIXME note); add tests for both functions (note only
  868   g-dot.c wants to use the functions at the moment)
  869 
  870 * eliminate dbi_filepath (perhaps replace with dbi_filedir) as we
  871   shouldn't need to search.  we were told where the database was.
  872 
  873 * check libbu implementation of red-black trees (see note in bu.h
  874   referencing an error in the Cormen book used as a basis)
  875 
  876 * make libfb parallel-safe.  use bu memory management.  remove
  877   semaphore locks in src/rt/main.c and elsewhere.
  878 
  879 * eliminate the need for bu_semaphore_init().  allocate up to the
  880   index requested on demand (so we can retain O(1) lookups) and
  881   reserve the first N semaphores for BRL-CAD library use.  change
  882   index to a uint8_t or uint16_t type.
  883 
  884 * make libbn/plot3.c functions parallel-safe so callers do not have to
  885   manually wrap with bu_semaphore_acquire().
  886 
  887 * rendering of the 'part' primitive is wrong for cases where H is less
  888   than r1 (i.e., smaller cap is partially or fully within the larger
  889   cap's radius).  It ends up rendering the larger sphere.
  890 
  891 * update mged to not call wdb_init_obj and wdb_create_cmd, trace down
  892   other vestiges of wdb_obj for removal
  893 
  894 * add support to rt tools and gtools for specifying az/el in radians
  895   or degrees, propagate throughout mged commands that take angles too.
  896   probably best implemented as a general libbn string to val function.
  897   perhaps an explicit 'rad' suffix and an implicit 'deg' suffix, e.g.
  898   rt -a 0.3rad -e 0.5rad and aet 0.3rad 45deg 0
  899 
  900 * change fbserv usage to require a flag for its non-daemon mode, make
  901   the device type optional for both daemon and non-daemon mode
  902 
  903 * work on vdeck/comgeom-g converters needed:
  904   - primitives recognized by comgeom-g but not vdeck:
  905       ehy, epa, eto, rhc, rpc
  906   - primitives recognized by comgeom-g (but not vdeck) but
  907     with possible equivalent versions in BRL-CAD:
  908       haf (half), rvw (right vertical wedge), raw (arb8), wed (DoE name
  909       for 'raw'), wir (pipe), arw (arbitrary wedge [ERIM?])
  910   - generate new comgeom-g tests with tgms from old GIFT docs
  911 
  912 * test tgf-g conversion with "ring-mode" geometry
  913 
  914 * fix metaball/adjust.. wipes out all metaball values with:
  915   adjust metaball 1 1 1
  916   just gives usage with:
  917   adjust metaball 1 1
  918 
  919 * test for -msse3 requirement for __SSE.*__ definition
  920 
  921 * improve sse run-time detection so illegal instruction crashes are
  922   avoided.  presently, adding -msse* to compilation will result in a
  923   crash if that binary is run on non-sse hardware (e.g., Pentium M)
  924 
  925 * add support for a zoom/viewsize and twist options to rt so you can
  926   adjust the image without having to feed a view script.
  927 
  928 * provide pkgIndex.tcl files for bu, bn, rt, fb, dm so we can properly
  929   package require the libs without an explicit 'load'
  930 
  931 * struct rt_bot_internal should be using "size_t *" instead of "int *"
  932   for the faces and face_normals members
  933 
  934 * fix the "(type)(size_t)val" hacks (using ints like ptrs, etc.)
  935 
  936 * pixdiff reports bytes, but reports incorrect (off-by-one) bytes for
  937   .bw input files.  cause is due to tool assuming input is rgb triplets
  938   (even though output is bytes, wtf?).  should probably report pixels
  939   and/or have a -b option for handling byte/bw input.
  940 
  941 * investigate why epa primitive is so sensitive to coarse absolute
  942   value changes (run csgbrep, tol abs=1, facetize and get 321k poly)
  943 
  944 * implement http network transfer tool for crash reports and benchmark
  945   analyses (via libfetch)
  946 
  947 * reimplement benchmark suite in C/C++
  948 
  949 * include defaults about the compiler in the benchmark suite output
  950   including the compiler name and version at a minimum, plus hopefully
  951   describing the CFLAGS that were used too.  ideally would include all
  952   of the versioning details (such as described from "gcc -v" if we
  953   compiled with gcc) too.
  954 
  955 * make bu_dirname not allocation memory.  have caller pass
  956   buffer in as a parameter with size ala snprintf/memcpy.
  957 
  958 * make mged not have a garbled display manager window if the
  959   framebuffer is enabled and the window is resized.  initialize and
  960   refresh the new memory and zap the framebuffer.
  961 
  962 * make the right-hand path to oed optional
  963 
  964 * deprecate dbcp and merge functionality (and improved
  965   double-buffering) with the buffer tool.
  966 
  967 * vls name wrapping (reversible argv-to-vls, vls-to-argv).  look at
  968   src/libged/glob.c code, very similar.
  969 
  970 * update g-xxx_facets to use libgcv
  971 
  972 * bu_cv_optimize() should be using bu_byteorder().
  973 
  974 * render annotated images to the OpenDocument format.  this is
  975   particularly useful for rtedge-style renderings with object
  976   annotations where we can leverage layout components and scalable
  977   vector graphics.
  978 
  979 * investigate OpenEXR (BSD licensed HDE image format)
  980 
  981 * usage statistics.  similar to the eclipse Usage Data Collector, keep
  982   track of which BRL-CAD command-line commands and MGED/libged
  983   commands are run.  Give the user the option of uploading those
  984   statistics (now, always, later, off).  Provide terms of use
  985   explaining the ways that their data will be used and shared.
  986   aggregate, this can help us focus development resources towards
  987   improving workflows, documentation, robustness, and new development
  988   areas.
  989 
  990 * automatic anti-aliasing as a second render pass on the edges
  991   encountered (possibly using bilinear filtering scheme, improve upon
  992   rtedge's current simple filter)
  993 
  994 * make loadview still load the view if the database doesn't match the
  995   currently open database, only load geometry as an option (and then
  996   just ignore the db).
  997 
  998 * add a force option to the tracers to support overwriting the current
  999   output file (so long as we're going to make it read-only by default).
 1000 
 1001 * convert non-planar arb's to brep objects for ray-tracing.  see how
 1002   well it works to see if we can remove an arb limitation.
 1003 
 1004 * clean up new rt -l8 heat graph lighting model so that it works in
 1005   parallel and with no "splotches"
 1006 
 1007 * separation of stderr from stdout within libbu, particularly for
 1008   MGED, so that there is a clean separation of result output from
 1009   diagnostic output.  this is a fairly separate idea from having log
 1010   levels (ala syslog) but is somewhat related to the concept of having
 1011   definable output streams.  idea in mind is to have a bu facility to
 1012   obtain a bu_log()-style callback function returned from a
 1013   logger registration function.
 1014 
 1015 * investigate impact of using lookup tables for root solving.
 1016   implement lookup tables for a range of linear, quadratic, cubic, and
 1017   quartic polynomial coefficients.  compare performance to root
 1018   solving without lookups.  evaluate memory use.  non-imaginary roots
 1019   are relatively sparse, may need to consider linked lists, hash
 1020   tables, or some hybrid storage arrangement.  Idea inspired by:
 1021   http://math.ucr.edu/home/baez/roots/
 1022 
 1023 * make fbclear and raytrace control panel obey a -F advanced option,
 1024   i.e., better remote framebuffer support.
 1025 
 1026 * MINOR: add tolerance parameters to the bn_*() functions that have
 1027   near-zero tests.
 1028 
 1029 * add an option to bot_dump for outputting surface normals.  Make sure
 1030   all supported dump formats (obj, dxf, etc.) optionally write out
 1031   normals.  Consider adding an option to smoothly interpolate normals
 1032   (per face or vertex).
 1033 
 1034 * refactor and manage libbn tolerance uses by providing an interface
 1035   default (e.g., an init macro) and making everyone use that where it
 1036   is hardcoded to 0.0005 presently (and a few places where it's
 1037   inconsistently/incorrectly 0.005).
 1038 
 1039 * add a default phong 'metal' shader.  annoying to keep making plastic
 1040   more reflective or mirror less reflective when it's such a common
 1041   material appearance to want.
 1042 
 1043 * consider adding an option to reid/remat and edcodes (and others?) to
 1044   ignore negative regions (regions subtracted from regions or
 1045   intersected with them) since, while bad practice, are valid
 1046   geometrically.
 1047 
 1048 * make sure there are no getenv() non-NULL assumptions within the
 1049   code.  might want to see if there's a pattern of variables being
 1050   checked such that a libbu interface would be warranted (e.g.,
 1051   instead of checking HOME, having a bu_find_directory(BU_USER_HOME)
 1052   routine or similar facility) for finding common resource locations.
 1053 
 1054 * make db_open modes behave the same as the fopen() modes (i.e.,
 1055   create the .g if one doesn't exist when write mode)
 1056 
 1057 * inside support for ARS
 1058 
 1059 * add support to 'rtxray' for outputting inverted pixel values so that
 1060   we have pixel values that are directly related to material thickness
 1061 
 1062 * mged inconsistently ignores signals.  initially allowing mged to be
 1063   backgrounded, but then later ignores them.  needs to consistently
 1064   ignore or not ignore them, ideally the latter.
 1065 
 1066 * libfb needs to have the fb_open/close_existing functions refactored
 1067   into the function table and have the #ifdef sections removed.
 1068 
 1069 * integrate library tester into regression suite that validates
 1070   exported library symbols published in headers.  make sure they at
 1071   least exist and maybe even try to ensure they will run with null
 1072   arguments without crashing.  make sure headers compile as c++ (with
 1073   proper extern "C" wrapping).
 1074 
 1075 * make _plot() callbacks fill in plot objects instead of returning
 1076   line segments.
 1077 
 1078 * implement a jitter-style option to rt that makes it average the ray
 1079   results to take a weighted light contribution for a given
 1080   resolution.  saves more memory over rendering at 2x/4x/8x/whatever
 1081   with or without jitter and then scaling down.  present jitter option
 1082   doesn't average.
 1083 
 1084 * refactor mged/bwish/g_diff initialization to all use the same routine
 1085 
 1086 * deprecate either orot or rotobj
 1087 
 1088 * refactor mged's signal handling to make it possible to safely
 1089   interrupt long-running commands
 1090 
 1091 * make Mac OS X universal binaries actually work.
 1092 
 1093 * fix/change naming convention for presented/exposed area
 1094 
 1095 * re-enable RISE client in ADRT
 1096 
 1097 * test homovulgaris' root solver patch that puts coefficients in the
 1098   right order
 1099 
 1100 * review librt polynomial root solver (cubic and quadratic case)
 1101 
 1102 * give bot-bldxf the axe (reconcile and merge with bot_dump)
 1103 
 1104 * come up with a new tool that automatically generates "inside"
 1105   regions for a given model as a way to automatically model air.
 1106   particularly useful for bot models where the inside air compartment
 1107   is predominantly (but not entirely) a complex bot structure in
 1108   itself.  idea is to use some sort of marching cubes/tets to find
 1109   those volumes, perhaps use a libified gqa.
 1110 
 1111 * extend metaball control info beyond simple points (e.g., line
 1112   segments)
 1113 
 1114 * address the TODO items in src/mged/clone.c
 1115 
 1116 * fix rt parallel crash
 1117   (true ; while [ $? -eq 0 ] ; do rt -o /dev/null moss.g all.g ; done)
 1118 
 1119 * fix parallel crash report generation (multiple BU_MAPPED_FILE's
 1120   getting acquired)
 1121 
 1122 * make only closing BOTH the command window and graphics window shut
 1123   down mged (i.e., fix unintentional behavior), not either alone.
 1124 
 1125 * add keybinding to restore a command window if only the graphics
 1126   window remains.
 1127 
 1128 * remove hit_normal and hit_point from struct hit.  add RT_HIT_POINT
 1129   macro.  refactor all callers as needed.
 1130 
 1131 * make bombardier actually send the report somewhere
 1132 
 1133 * hook bombardier in for crash reporting
 1134 
 1135 * modify the new tree traversal code to be generic
 1136 
 1137 * add high dynamic range image support to the framebuffers
 1138 
 1139 * add alpha channel support to the framebuffers
 1140 
 1141 * remote framebuffer timeout support (perhaps as ::key=val;key=val)
 1142 
 1143 * develop a tool that applies a text overlay to a given rendered image
 1144   (e.g., as an rt option) for things like adding an image title, the
 1145   az/el, and objects displayed.
 1146 
 1147 * bezier extrusions need to be optimized, really should not be
 1148   performing dynamic memory allocation in the root solver
 1149 
 1150 * better/consistent argument processing supporting both long and short
 1151   option names, perhaps using argtable
 1152 
 1153 * Implement an optical shader for the new "pixelated" military
 1154   camouflage style
 1155 
 1156 * preserve an arb8 as an arb8 (instead of writing as arb6 or arb5) and
 1157   similarly for the other arb# sizes
 1158 
 1159 * enhance dxf-g to create more than just one combination per layer,
 1160   creating multiple objects for the individual objects in the dxf file
 1161   (instead of one conglomerate BoT)
 1162 
 1163 * Generate plain .zip files for Windows binary releases
 1164 
 1165 * fix the variety of ami.tcl and ampi.tcl tclscript warnings/errors
 1166 
 1167 * run indent.sh on directories (one at a time, validating results)
 1168 
 1169 * configure support to enable/disable framebuffers, display
 1170   managers, geometry converters, and image converters.  consider
 1171   apache's module management as an example.
 1172 
 1173 * review and merge in the rest of the GSI modifications
 1174 
 1175 * display the current mode in mged graphics window
 1176 
 1177 * Optional compile-time support for using GMP or CLN for arbitrary
 1178   exact precision arithmetic computation support
 1179 
 1180 * inside/outside point and voxel testing capability in librt
 1181 
 1182 * automatic geometry voxelizer (perhaps using arbs or vol primitive)
 1183 
 1184 * implement support for raw voxel data (g-voxel) where each position
 1185   in the binary array (unsigned 8-bit integer) corresponds to a voxel
 1186   coordinate given by X + Y x Nx + Z x Nx * Ny where Nx = grid width
 1187   and Ny = grid height.  this consequently happens to match our bw
 1188   format if you concatenated N bw image slices into one file.  for a
 1189   2x2 example, position=>coordinate: 0=>0,0,0; 1=>1,0,0; 2=>0,1,0;
 1190   3=>1,1,0; 4=>0,0,1; 5=>1,0,1; 6=>0,1,1; 7=>1,1,1. See
 1191   http://support.echoview.com/WebHelp/Reference/File_formats/
 1192     Export_file_formats/Volume_data_set_file_formats.htm
 1193 
 1194 * add support for querying geometry properties to library including
 1195   computing surface area and weight/mass.
 1196 
 1197 * add verification and validation tests confirming behavior of the
 1198   ray-tracer and computations of area, mass, volume, etc.
 1199 
 1200 * testing suite for all binaries:
 1201 
 1202      for cmd2 in $(for cmd in `find . -name Makefile.am | xargs cat |\
 1203        perl -pi -e 's/\\\\\n//g'| grep -E "PROGRAMS ?=" | \
 1204        sed 's/.*=//g'` ; do echo $cmd ; done | sort | uniq ) ; \
 1205        do echo command: $cmd2 ; done
 1206 
 1207 * add geometry example of building 238
 1208 
 1209 * Mac OS X SGI dial knobs support
 1210   - Note that we might do better here to focus on the 3Dconnexion
 1211     space navigator mouse, which is a lot more commonly available
 1212     nowadays...  spacenav.sourceforge.net is something to bear in
 1213     mind in this context.
 1214 
 1215 * ability to "unpush" objects, translating them to a new position and
 1216   applying the correct matrix (using either bounding box or center of
 1217   mass, for example).  would be useful to optionally allow the
 1218   creation of a parent combination that contains the unpushed matrix
 1219   so you could return primitives to local coordinates.  See sf feature
 1220   request 2826720 from cericole.
 1221 
 1222 * optimize CSG structures automatically: automatic simplification,
 1223   tree contraction, null object detection.
 1224 
 1225 * have libbu report memory allocation statistics so the exact amount
 1226   of memory requirements for a geometry database can be computed on
 1227   the fly via a pre-prep phase.
 1228 
 1229 * libfb + font rendering (perhaps through libbn's plot interface) for
 1230   a posix terminal.
 1231 
 1232 * getexecname, "/proc/self/cmdline", program_invocation_short_name.
 1233   separate out into new file.
 1234 
 1235 * geometry viewing commands/visualizations of exploded levels
 1236 
 1237 * librt-based path tracer
 1238 
 1239 * system identifier application with sysctl-style information
 1240   database, with some back-end functionality placed into libbu.
 1241 
 1242 * add callback data parameters to libpkg hook functions
 1243 
 1244 * rtedge-style tracer that outputs tool paths (splines/segments, etc.)
 1245   for CNC/CAM style toolpath cutting descriptions (g-code files).
 1246 
 1247 * rtedge shoots twice as many rays as it needs to (shoots the 'below'
 1248   ray for each primary, only reusing current scanline cells).
 1249 
 1250 * make the DSP primitive use less memory when data is coming from
 1251   a binunif. allocating 160 times binunif size is a bit extravagant
 1252   (which comes from sizeof(struct dsp_bb)).
 1253 
 1254 * add dynamic geometry support. i.e. the ability to modify the parsed
 1255   in-memory geometry tree on the fly via api calls (e.g. to add holes)
 1256 
 1257 * investigate why g-iges followed by iges-g on a single box results in
 1258   permuted vertex lists
 1259 
 1260 * add support for filesystem-based geometry collections
 1261 
 1262 * design plugin system to allow domain specific tools (say, for
 1263   example, a tool to create propeller parts) to identify themselves
 1264   and their features to BRL-CAD, and to allow BRL-CAD to incorporate
 1265   those features as an integrated part of interaction environments.
 1266 
 1267 * see if it is possible to use tec/ehy primitives to create a proc-db
 1268   for airfoil/wing shapes.  Interesting possibilities with boolean
 1269   combinations of these primitives, provided their continuity at the
 1270   ends ensures continuity all along "seams" - something to consider.
 1271 
 1272 * we need to define a libbu api for option handling that supports more
 1273   features than getopt:
 1274 
 1275   - need support for long options (e.g. --help and --color, not just -h
 1276     and -C)
 1277 
 1278   - need a way to consolidate documentation for options into one place
 1279     (DRY) that supports all of our various documentation styles.
 1280     Discussed with Sean in the past - initial thoughts:
 1281 
 1282     + should be in C code - will be needed there, and easier to get it
 1283       from there to other formats than vice versa.
 1284 
 1285     + should support printing out the options and documentation in
 1286       formatted structures that allow our build system to build the
 1287       command and have the command itself supply a generated snippit
 1288       of text or markup that could be incorporated into the final
 1289       document - e.g. the DocBook man page for a command would be set
 1290       up to expect the <command>_options.xml file generated by
 1291       <command> --print-options DocBook (or some other mechanism,
 1292       that's just an idea) and the CMake build could first build and
 1293       then run the command at compilation time to provide the absolute
 1294       most current option listing and short descriptions for the other
 1295       docs.
 1296 
 1297   - need to allow order dependent options (e.g. <command> inputfile
 1298     outputfile) that become order independent if enough information is
 1299     available, e.g. the above would work and <command> <opt1> -i
 1300     inputfile <opt2> -o outputfile <opt3> would also work.
 1301 
 1302   - (maybe) incorporate some sort of sanity/bounds checking into the
 1303     option definitions API - i.e. in the C definition of an option,
 1304     there could be optional parameters to indicate the type and bounds
 1305     of valid input to that option.  Won't always be possible, but may
 1306     be a good feature to have if it can save lots of repetitive coding
 1307     of bounds checking in programs.
 1308 
 1309   *might* be worth taking a look at http://rpm5.org/files/popt/ to see
 1310   if they have any code we could snarf to make life easier, but
 1311   regardless we need a libbu API on top of any other code - at such a
 1312   core level, we can't introduce an external API.
 1313 
 1314 * investigate the libngpcore and libngput libraries from the ngPlant
 1315   project as a possible means of procedurally generating plant models
 1316   in BRL-CAD (libraries are BSD licensed:
 1317   http://ngplant.sourceforge.net)
 1318 
 1319 
 1320 OVERLAP TOOLS
 1321 -------------
 1322 
 1323 * implement quasi-random unbiased iterative spherical ray sampling.
 1324   requires devising an algorithm whereby we obtain a set of points on
 1325   a sphere with rays randomly going through those points, so we sample
 1326   the volume evenly.  we need to be able to add additional sets of
 1327   points/rays (incrementally or step-wise) in order to evaluate
 1328   convergence and estimate error.  this feature is useful for checking
 1329   overlaps, surface area, volume, and moments of inertia.
 1330 
 1331 * add an overlap depth reporting tolerance parameter to the
 1332   ray-tracers (similar to -R).
 1333 
 1334 * a_logoverlap doesn't work with rt_shootrays because it overwrites
 1335   a_uptr
 1336 
 1337 * sort gqa/rtcheck/check/lint/analyze/g_lint functionality into
 1338   logical groupings (probably analyze - calculate properties and
 1339   lint - find problems). Come up with a command design that
 1340   lets us rationalize the features and reduce the command set.
 1341 
 1342 * add support for custom and random views to gqa.  provide an option
 1343   to evaluate every N degrees for all unique az/el pairings, e.g.,
 1344   every 15 degrees.  should automatically discard duplicate views.
 1345 
 1346   command line usage:
 1347   -a begin[:end[:count]][,...] -e begin[:end[:count]][,...]
 1348 
 1349   the begin, end, and count can be any real or integer number or can
 1350   be a literal '#' to request a random integer number ranged [0,360]
 1351   inclusive.  examples:
 1352 
 1353     Default 3 views (1 duplicate discarded): -a 0,90 -e 0,90
 1354     One specific view: -a 35.12 -e 25.6
 1355     360 orbital, every 30 degrees: -a 0,30,60,90,120,150
 1356     360 orbital, every 30 degrees: -a 0:180:6
 1357     10 random views: -a #:#:5 -e #:#:2
 1358     Up to 129600 random views: -a #:#:# -e #:#:#
 1359     Comprehensive "front" view, 1-degree increments: -a -90:90 -e -90:90
 1360     Comprehensive orbital, 1/2-degree increments: -a 0:360:720
 1361 
 1362 * implement an overlap reporting function (boolean and volume)
 1363 
 1364 * have gqa calculate the volume of overlapping regions, not just
 1365   shotline overlap distances.  that will allow output to be sorted by
 1366   volumetrically significant regions and should eliminate a common
 1367   source of user misunderstanding.  It should eliminate the perception
 1368   that large overlaps are suddenly appearing when there are changes in
 1369   grid alignment/density.
 1370 
 1371 * fix gqa spewing of massive amounts of plot data with th -Av -v
 1372   options:
 1373   ../src/gtools/gqa -u m,m^3,kg -g 0.25m-0.5mm -p -Av -v gqa.g closed_box.r
 1374   -rw-rw-r--  1 morrison users 41572569618 Apr 23 15:14 volume.pl
 1375 
 1376 * make gqa overlap reporting suck less.  uselessly reports the same
 1377   objects multiple times instead of keeping track of uniquely
 1378   overlapping pairs of objects (rtcheck used to have this problem but
 1379   not now).  also reports overlaps even when not requested (e.g. -Aa)
 1380 
 1381 * gqa semaphore locking on results is very slow and gets worse as the
 1382   number of cores and speed of cpu increases.  resource contention on
 1383   semaphores slows everything down substantially.
 1384 
 1385 * gqa needs to be more informative when it runs - needs a header
 1386   letting you know what it's doing, and if possible a "progress
 1387   report" for longer runs that provides some notion of how much of the
 1388   total job is done.
 1389 
 1390 * modify gqa to search for >1 region flag in a tree path.
 1391 
 1392 * modify default behavior of the overlap GUI to do what overlaps_tool
 1393   -F does or to supply some togglable means to enable that option in
 1394   the GUI.
 1395 
 1396 * extend overlap GUI to report null/empty regions and regions not hit
 1397 
 1398 * need some means to control the runtime and/or density of the overlap
 1399   GUI sampling, ideally without exposing grid size options so that it
 1400   remains agnostic to future sampling methods.  a good solution would
 1401   be better status reporting of the current density sampled and a
 1402   means to interrupt the process cleanly (while retaining progress and
 1403   ability to pick up from that point)
 1404 
 1405 
 1406 DATABASE MAINTENANCE/ADMINISTRATION
 1407 -----------------------------------
 1408 
 1409 (Note: See src/util/admin-db.cpp for a starting admin tool which could
 1410 be expanded to do the following tasks.)
 1411 
 1412 * implement some means (perhaps glint) to check a .g file for
 1413   duplicate region IDs and material inconsistencies.  perhaps exposed
 1414   as a new command, it should take an assembly/comb name as input,
 1415   walk the tree, and report duplicates.  if no arg, it walks all
 1416   top-level objects but processes them independently and only reports
 1417   sub-paths once (so you don't get the same object repeatedly reported
 1418   for all N top-level copies).  in the output, group together regions
 1419   with same and different material properties together:
 1420 
 1421 DUPLICATE ID NUMBERS
 1422 comp.r1 ID 1234
 1423 comp.r2 ID 1234
 1424 
 1425 DUPLICATE ID NUMBERS WITH DIFFERENT MATERIAL PROPERTIES
 1426 comp.r3 ID 5678 material code 1 LOS 50
 1427 comp.r4 ID 5678 material code 5 LOS 75
 1428 
 1429 * develop a low-level tool for investigating, reporting statistics on,
 1430   and repairing geometry database files.  the tool should nominally
 1431   perform big/little endian conversions, report number and types of
 1432   objects, allow deletion/undeletion/hiding/unhiding, provide some
 1433   general means to manipulate the packed and unpacked .g file data for
 1434   performing low-level modifications
 1435 
 1436 * evaluate performance of using an SQL/XML store for BRL-CAD geometry,
 1437   particularly as it pertains to rt_dirbuild() run times on large
 1438   models and db_lookup() times.
 1439 
 1440 * multiple-representation geometry.  support storing different
 1441   "versions" of a given combination node, as selectable subtrees where
 1442   one selectable subtree is always marked active/selected.  the
 1443   selectable subtrees could generally be entirely different
 1444   configurations (e.g., different poses) or different geometry
 1445   structure (e.g., a blast, signature, or lethality version of a given
 1446   model).  These could be implemented as a modification to the union
 1447   tree and exposed to the user as a parametric selection on a comb.
 1448   Something perhaps like this:
 1449 
 1450   union tree {
 1451     ...
 1452     struct tree_representation {
 1453       uint32_t magic;
 1454       int tr_op;
 1455       const char *tr_name;
 1456       union tree *tr_subtree;
 1457     } tr_r;
 1458     ...
 1459   };
 1460 
 1461 
 1462 LIBGED
 1463 ------
 1464 
 1465 * See src/libged/TODO for new command and subcommand ideas.
 1466 
 1467 * libged needs to support "temporary" objects that are in-memory only
 1468   and will disappear when the ged instance is destroyed, yet is
 1469   otherwise considered real objects in a given database.  this
 1470   supports temporary additions to the wireframe (e.g., plot data from
 1471   nirt from cvt_vlblock_to_solids()) and in-progress selections.
 1472 
 1473 * restore libged axis/grid commands code made in r44153 but with
 1474   libged decoupled from libdm/libfb.
 1475 
 1476 * the 'l' and 'analyze' commands now require an object be specified
 1477   and won't use the currently highlighted solid.  undoubtedly related
 1478   to libged refactoring.  this is related to sf request 2954409.  this
 1479   needs to be handled in a generalized way so that most/all commands
 1480   have a notion of operating on the currently 'selected' object(s).
 1481 
 1482 * fix !!! in src/libged/tables.c where a temporary file is getting
 1483   used.  needs to call bu_temp_file().
 1484 
 1485 * refactor the libtclcad go_*() functions and invocation wrappers
 1486   (also in mged) into libged where appropriate. the 'png' command
 1487   comes to mind.
 1488 
 1489 * refactor wdb_obj and view_obj in libged. they should disappear but
 1490   shouldn't have wdb_*() funcs in libged regardless.
 1491 
 1492 * make ged command names aware of object arguments for automatic
 1493   globbing and regular expression expansion:
 1494 	attr set [regex .*\.r] t 1
 1495 	attr set [glob *.r] t 1
 1496 	attr set *.r t 1
 1497 
 1498 * review adding support for infix and postfix CSG operators for
 1499   libged/mged.  be sure to revive or at least check out the previous
 1500   effort in src/mged/comb_bool_parse.y that already has support that
 1501   recognizes the classical infix notation.
 1502 
 1503 * Explore possibility of expanding dm command to accept object names
 1504   as a way of tweaking display manager specific properties (wireframe
 1505   vs solid drawing, shading on normals, etc.) that are currently
 1506   controlled only via the draw command.  Many of the undocumented (or
 1507   poorly documented) draw options are very specific and there are many
 1508   more possible similar options that aren't defined.  Initial thought
 1509   is to allow passing "dm" subcommands to draw (maybe --dm key=val or
 1510   some such) and using the dm command to offer display type aware
 1511   hooks (for example, solid drawing isn't a valid option in text mode
 1512   display, so options about how to shade normals don't make much
 1513   sense.  On the other hand, a full scene graph could have many
 1514   per-object display options the user (or application) would want to
 1515   tweak on a per object basis, e.g. dm obj.r transparency 0.3. Hard
 1516   wiring draw options isn't going to be flexible or user friendly;
 1517   need something similar to the new dm ability to supply dm-backend
 1518   specific options to the user.
 1519 
 1520 * use the globbing work needed for proper rm support to enhance the
 1521   ls command.  filesystem/URI work relates to this - in "flat" viewing
 1522   ls */* is meaningless, but in the hierarchy view it should do the
 1523   same glob resolution rm will need to do in that context.
 1524 
 1525 * make the idents command not list subtracted objects by default,
 1526   optionally list everything
 1527 
 1528 * improve performance of these commands that seem to have exponential
 1529   cost: bot_split, killtree, and
 1530   make s sph; make a arb8; sed a; e a; tra 0 0 500; r hemi u s - a; tol norm 1 ; facetize hemi.bot hemi
 1531   # compared to tol norm 2, # triangles is up ~20% but facetize is >200%
 1532 
 1533 * translate lc command to libged (discovered in Feb. 2015 to have already
 1534   been done -- need information regarding when this was done and committed).
 1535 
 1536 * BoT mesh editing command.  Subtasks:
 1537 
 1538   - enumerate functions desirable
 1539   - catalog features of other mesh manipulation tools
 1540   - investigate mesh editing libraries and/or relying on NMG editing
 1541   - bind GUI editing to the BoT mesh editing command
 1542 
 1543 * object error heuristic.  implement a function/command to report how
 1544   big of an error a given geometry object has.  the intent is to help
 1545   prioritize geometry modeling errors based on their spatial impact.
 1546   this is particularly relevant for nurbs/brep and nmg geometry where
 1547   there may be solidity gaps in the topology that need to be sealed or
 1548   dangling faces/surfaces of different sizes.  this is meant to be a
 1549   relative heuristic applicable across all geometry, not necessary an
 1550   exact measure.  this may make more sense added as an output option
 1551   to glint or as a warning category for a geometry debugger.
 1552 
 1553 * implement a region anointment feature where the user can turn an
 1554   assembly into a region and change all lower or higher regions into
 1555   combinations.  basically consolidate or distribute region flags.
 1556   this is partially covered by the 'comb' command but it tries hard to
 1557   ensure geometry isn't left in a broken state.  needs to be a way to
 1558   do the simple consolidate/distribute operation regardless of
 1559   resulting state.
 1560 
 1561 * the 'comb' command both updates and creates combinations.  this is a
 1562   problem because it's not possible to infer an intended result from
 1563   the command string alone.  it should either append to an existing
 1564   combination and fail if it doesn't exist (with flag to create) OR it
 1565   should create a combination and fail if there is an existing
 1566   combination (with flag to append).
 1567 
 1568 * Update the comb "region lift" capability to handle automatic duplication
 1569   and substitution of the duplicate into the tree of combs who can't have
 1570   their definitions changed without impacting other geometry in the .g file.
 1571 
 1572 * change 'mirror' command offset to be prior to mirror instead of
 1573   after, so that you can mirror intuitively over a specified point
 1574   along a given axis.
 1575 
 1576 * add option to 'mirror' command to delete the source object.  support
 1577   specification of a plane as the view plane, 3 points, XY, YZ, XZ.
 1578 
 1579 * killall command reports db_lookup failures if the target object
 1580   doesn't exist (maybe we only care about refs).  should keep quiet.
 1581 
 1582 * the new "exists" command is a beautiful corollary to the unix 'test'
 1583   command.  make the usage match, remove options that make no sense
 1584   after you've replaced instances of 'file' with 'object', and add
 1585   options specific to testing geometry (like whether two objects
 1586   overlap, whether an object's volume is greater than some value or
 1587   equal to zero, whether two objects are actually the same object
 1588   (geometrically), etc.).
 1589 
 1590 * replace sed and oed commands: functionality provided by new 'edit'
 1591   command, but requires testing (unit tests) to make sure it's working
 1592   correctly.
 1593 
 1594 * make sure 'preview' works, particularly the 'tree' subcommand.
 1595 
 1596 * add support for a custom unit conversion factor to the units command
 1597   (e.g. 'units 9.3120223' or 'units metertons 9.3120223')
 1598 
 1599 * deprecate dbfind - ensure functionality is fully captured by the
 1600   search and ls commands, make it report a deprecation statement on
 1601   use and utilize ls under the hood.
 1602 
 1603 * implement some sort of archive/backup command in mged in order to
 1604   save the currently open database out to a file.
 1605 
 1606 * add a -color option to all mged commands that draw geometry (B, eid,
 1607   and E come to mind)
 1608 
 1609 * have mged record a timestamped command history by default
 1610 
 1611 * implement 'analyze' command option to write output to a file
 1612 
 1613 * implement mged object name globbing similar to tclsh's globbing
 1614   (i.e. via a globbing command and quoting globs that use []).  testing
 1615   shows db_glob doesn't seem to behave correctly, at least not like
 1616   glob.  hook globbing into all commands so glob_compat_mode
 1617   statefulness can go away.  a db_glob expression that doesn't match
 1618   anything should not return the expression.
 1619 
 1620 * incorporate some variety of spatial partitioning into the facetize
 1621   command (may involve just rewriting it) to try and realize MUCH
 1622   faster tessellation of CSG geometry.  Current routines are doing a
 1623   lot of unnecessary work that tends to result in explosive completion
 1624   times for worst-case scenarios - try to get closer to the "only do
 1625   the work we need to" ideal.  Once a new idea is proven in that
 1626   command, it should be made into a libgcv routine and
 1627   converters/other commands retargeted to use it.
 1628 
 1629 
 1630 SHADED DISPLAYS
 1631 ---------------
 1632 
 1633 * See doc/TODO.shaded_displays
 1634 
 1635 
 1636 ARCHER
 1637 ------
 1638 
 1639 * See src/archer/TODO
 1640 
 1641 
 1642 ATTRIBUTES
 1643 ----------
 1644 
 1645 * See src/libbu/TODO.binary_attributes for more info about
 1646   bson based binary attribute work.
 1647 
 1648 * attr command change to only output non-standard attributes
 1649 
 1650 * attr command change to have an optional object argument and to work
 1651   with multiple objects.  make output format scriptable.
 1652 
 1653 * implement an attribute versioning system.  can hang attribute
 1654   version off of _GLOBAL (ideally) or per-object so application codes
 1655   (including our own tools) know whether they're compatible or whether
 1656   the attributes must be upgraded.
 1657 
 1658 * implement an "attr upgrade" subcommand that allows for forwards AND
 1659   backwards conversion of attributes.  the command will need two
 1660   function pointers per version that describes how to upgrade and
 1661   downgrade for that version transition.  this will allow new files to
 1662   be downgraded for use on older versions and obviously lets new files
 1663   be upgraded to the latest conventions.
 1664 
 1665 * implement namespacing for attributes as a means to group attributes
 1666   together.  examples: cad:color, cad:region_id, muves:component.
 1667   similar to svn properties, the namespace is predominantly (perhaps
 1668   entirely) a naming convention, but allows us to document and assert
 1669   requirements/conventions over a given prefix (e.g., 'cad:'), and
 1670   provides 3rd party applications with a sandbox to work with.
 1671 
 1672 * expose the list of internally recognized attributes via the man page
 1673   documentation and some internal method (e.g., an 'attr standards'
 1674   subcommand).
 1675 
 1676 * clean up default attributes to be consistent and upgrade old
 1677   attributes to their new names.  includes likes of region, region_id,
 1678   material_id, air, los, rgb, oshader, and inherit.  see
 1679   doc/docbook/system/man5/en/attributes.xml for more detailed listing.
 1680 
 1681 * implement an option to "attr upgrade" for reading upgrade/downgrade
 1682   plugins/instructions from an external file for 3rd party use.
 1683 
 1684 * prevent nirt from outputting a trailing space after values when
 1685   there are no attributes to be displayed.  the problem is in the nirt
 1686   format strings where they use " %s" for displaying any attributes.
 1687   need to left-pad a space conditionally, perhaps by supporting %*s
 1688   and sizeof(var).
 1689 
 1690 * add additional support for user-specified sorting for the attr
 1691   command when new attribute attributes are added (e.g., creation
 1692   date)
 1693 
 1694 * binary attributes, see backwards-incompatible section for details.
 1695 
 1696 
 1697 NEW OBJECTS
 1698 -----------
 1699 
 1700 * multi-region VOL objects.  this basically will either introduce a
 1701   notion of data-reuse where multiple regions reference the same VOL
 1702   and get different spatial results, or a single primitive reports
 1703   distinct material/region/spatial information that will get
 1704   propagated up into separate region hits.  the prior is probably
 1705   easier and less error-prone.
 1706 
 1707 * view/camera objects.  non-geometry object type that encapsulates the
 1708   concepts handled by saveview/loadview including awareness of
 1709   orthogonal vs perspective, ambient lighting levels, and possibly
 1710   styling/render modes.
 1711 
 1712   obviously need to be able to derive a homogenous transformation
 1713   matrix, but may want to encode/preserve scale, translate, rotate
 1714   with prescribed ordering separately for proper reversibility.
 1715 
 1716   vect_t: eye point
 1717   vect_t: view center point
 1718   vect_t: up vector
 1719   float: perspective angle (-1 ortho?)
 1720   float: ambient intensity
 1721   color_t: background / ambient color
 1722   uint[2]: size / pixel dimensions
 1723 
 1724   vect_t: rotation vector
 1725   vect_t: scale vector
 1726   vect_t: translation vector
 1727   derivable (or vice-versa):
 1728   float[2]: grid cell (ortho-only)
 1729   float[6]: view frustum (implies perspective matrix)
 1730   float[4]: perspective projection (fov angle, aspect ratio, znear, zfar)
 1731 
 1732 * datum objects.  implement support for datum points, axes, planes,
 1733   and coordinate systems.  Nominal prioritized task decomposition with
 1734   time estimates:
 1735 
 1736   2 day - stub in datum object into librt with sub-object types
 1737   1 day - implement typein support for datum axes
 1738   1 day - implement matrix pushing / verify rt_generic_xform()
 1739   1 day - implement listing / text / plot callbacks
 1740   1 day - implement adjust support for datum axes
 1741   1 day - update in.xml documentation on typein interface
 1742   2 day - add datum axis creation to archer GUI
 1743   2 day - implement datum axis option panel in archer GUI
 1744   2 day - implement datum axis mouse editing in archer GUI
 1745   3 day - write up documentation on datums (with example)
 1746   1 day - serialization+typein support for datum planes
 1747   1 day - serialization+typein support for datum point sets
 1748   1 day - serialization+typein support for datum coordinate systems
 1749   3 day - callbacks for planes, point sets, and coordinate systems
 1750   2 day - add datum plane to archer
 1751   2 day - add datum point sets to archer
 1752   2 day - add datum coordinate systems to archer
 1753   1 day - update in.xml documentation on typein
 1754 
 1755 * annotation primitive.  specifically a means to create an object in
 1756   the database that can optionally be associated with another object
 1757   and/or position(s) that a label refers to.  there are various styles
 1758   such as a single line from a point to text and two lines (e.g.,
 1759   indicating measurement) to text.
 1760 
 1761   the object should allow for different line styles including having
 1762   no lines.  there should also be support for view-fixed or
 1763   view-independent annotation placement (which requires a change to
 1764   plot()'s and possibly prep()'s signature).  it would also be useful
 1765   to allow an optional _annotation_ "thickness" so that the
 1766   annotations can represent physical geometry (so they raytrace).
 1767 
 1768   the concept is nearly equivalent to a combined sketch+extrude object
 1769   but with options specific to annotations.  the underlying export
 1770   form should be fully generalized as much as possible with a
 1771   higher-level "in" command constraining available options into a
 1772   user-friendly form.  a new "annotate" command will similarly be
 1773   needed to support modification of existing annotations (as well as
 1774   creation ala the 'in' command).  see the web for tons of examples.
 1775 
 1776   References:
 1777   http://en.wikipedia.org/wiki/Geometric_dimensioning_and_tolerancing
 1778   ASME Y14.5 2009
 1779   http://www.draftingzone.com/shoppingzone/6-1.pdf
 1780   http://www.wikistep.org/index.php/Recommended_Practices_for_the_Representation_of_GD%26T
 1781   http://www.wikistep.org/index.php/Recommended_Practices_for_the_Presentation_of_Dimensions,_Dimensional_and_Geometric_Tolerances
 1782   http://www.wikistep.org/index.php/Associative_Text_in_3D_recommended_practices
 1783   http://www.wikistep.org/index.php/Model_viewing,_basic_drawing_structure_and_dimensions_recommended_practices
 1784   http://www.iigdt.com/Products/Images/0f390980.jpg
 1785   src/other/openNURBS/opennurbs_annotation*
 1786 
 1787   Types of annotations:
 1788 	text:                   text.
 1789 						   text --,
 1790 	leader:                 text ---->.                \
 1791 				      .            .        \           .        .         .  .
 1792 	linear dimension:             |            |         .          |        |         |  |
 1793 			    .         |<-- text -->|                --->|  text  |<--   -->|  |<---- text
 1794 	angular dimension:   \  text
 1795 			      \_____.
 1796 
 1797   Annotation placement:
 1798 	xyz position:             (1.0, 3.5, 2.1)
 1799 	named reference(s):        hull.r
 1800 	above/below/left/right:    below
 1801 	offset:                    33.4
 1802 		(e.g., "at 1.0,3.5,2.1" or "below hull.r offset 33.4" or "at hull.r", etc.)
 1803 
 1804   Text:
 1805 	user-defined string:     my awesome component -----> .
 1806 
 1807 	named/point reference:        hull.r1 -----> .
 1808 						  .               .
 1809 	automatic dimension (two points):         |_______________|
 1810 				   .        .           5.4 mm
 1811 	custom dimension label:    |<------>|<--.
 1812 						 \ Length of hull.r1: 5.4mm
 1813 
 1814 	      (custom label specified via format specifier: "Length of %target: %size")
 1815 
 1816   Point properties:
 1817        styles, for interface familiarity, provide option to describe
 1818        points as [empty] . + x * ! as well as all 6: in a circle, in a
 1819        box, and in a circle in a box.  that's 24 styles altogether.
 1820        non-arrow annotations that lead to/from a point should allow
 1821        source and target point styles to get set separately.
 1822 
 1823   Text properties:
 1824        font name
 1825        font size (height)
 1826        font style: bold/italic/regular
 1827        font color
 1828        justification: left, center, right, bottom, middle, top
 1829          (combineable options, e.g., "top left")
 1830        placement: default, above, below, inline, interior, exterior
 1831 
 1832   Line properties:
 1833        head style (point o-, arrow_to >-, arrow_from, <-, square #-)
 1834        tail style (point o-, arrow_to >-, arrow_from, <-, square #-)
 1835        line weight (thickness)                    .___.                     target        .---- text
 1836        2d points:               text  ._____.     |    \                    .     .      /
 1837 					     \    |     .---> target        |     |     /
 1838 					      .___.                      -->|     |<---.
 1839   Symbol type:
 1840        degree:   (superscript circle)
 1841        radius:   ('R', e.g., 'R10.5')
 1842        diameter: (circle with slash, null symbol)
 1843        ... several others
 1844        http://www.tec-ease.com/gdt-terms.php
 1845 
 1846   Annotation properties:
 1847        scale: fixed size or proportional to view
 1848        alignment: to datum (plane or axis) or to view
 1849        draw bounding plane
 1850        draw target axes at uv offset position
 1851        draw feature control frame (characteristic tolerances in
 1852          symbolic form: www.draftingzone.com/shoppingzone/6-1.pdf)
 1853        3d thickness
 1854 
 1855 * offset surfaces.  provide feature edit operation to create a solid
 1856   "level set" style object so you can represent degraded geometry
 1857   states (e.g., damage around a hole in a plate of metal might be
 1858   represented by the toroidal intersection with a cylinder some radius
 1859   larger than the hole, providing a separate region that can have
 1860   different material properties).
 1861 
 1862   geometrically, this is simply a means to separate a given object
 1863   into multiple objects without changing the cumulative volume.  a
 1864   linear offset from a given surface or set of surfaces is usually
 1865   desired.
 1866 
 1867 * minkowski and hull operations/objects.  These would be
 1868   meta-combination objects similar to blending where objects are
 1869   specified and a resulting operation is run on them.  minkowski sum
 1870   provides an intuitive means to blend and hull a means to simplify.
 1871 
 1872 * Cache objects.  These are proper non-geometric geometry database
 1873   objects intended to store binary results that have a dependency on
 1874   other object(s).  A named hash (e.g. md5) is recorded for each
 1875   dependent object along with the computed results.
 1876 
 1877   Three potential candidates for leveraging cache objects are 1) prep
 1878   objects containing the final prepped state of a given object
 1879   hierarchy (particularly useful for BoT and BREP geometry), 2)
 1880   raytrace objects containing the intersection results for a given
 1881   view (i.e., a grid of primary rays), and 3) rtgl point samples
 1882   (which is a variant of 2 but potentially view independent).
 1883 
 1884   Considerations:
 1885     fast dictionary with expiration by time? (eviction during writes)
 1886     cache rate read/write / sec > 10k @ 500bytes
 1887     remain fast with millions of entries
 1888     immediate retrieval (consistency)
 1889     provide for concurrent access (concurrency), perhaps via sharding (N locks)
 1890 
 1891 * alias objects.  this is an object handle in a geometry database that
 1892   refers to another geometry database object.  in effect, it
 1893   encapsulates the idea of a symbolic reference for database objects.
 1894 
 1895   alias objects should be very lightweight, corresponding to basically
 1896   a simple named reference to another object.  this allows for
 1897   geometry objects to have multiple names, all referencing a given
 1898   primary name.  whenever an alias is referenced, it returns the
 1899   object pointed to instead of the alias object itself (this includes
 1900   the rt_db_internal()).  this prevents the creation of cyclic
 1901   references.
 1902 
 1903   this directly supports geometry importers that contain object name
 1904   mappings (e.g., part numbers to engineering names) as well as
 1905   simply supporting multiple names per object that one might want to
 1906   persist.  there is an issue of whether aliases show as top-level
 1907   objects or even display by default without a listing option.
 1908 
 1909 * edge feature edit objects: highly related to feature edits, object
 1910   modifiers that add to or subtract from edges (e.g., smooth corners
 1911   or representing a weld):
 1912 
 1913     ext    int      ext  ext           ext      int
 1914     rounds/fillets, cuts/chamfers, and scallops/beads  (original)
 1915       ------_        ------.           -----.          ----------
 1916              \              \               /                  /
 1917               |              \             |                  /
 1918              /                \             \                /
 1919             /                 /             /               /
 1920            /                 /             /               /
 1921 
 1922 * feature edits: support for adding holes (diameter+parameters),
 1923   hollowing out objects (specify thickness), and (maybe) bending or
 1924   twisting objects.
 1925 
 1926 * CSG blending: smooth union, smooth subtract, smooth intersect.
 1927   specify a k parameter that defines a blending radius between two
 1928   objects as an additive operation.
 1929 
 1930 * clone/grid/pattern/repetition objects: similar to aliases and the
 1931   existing clone command which creates actual copies of objects, this
 1932   entity represents copies of objects implicitly.  it maintains the
 1933   grid pattern as a parameterization allowing it to be easily changed
 1934   and more efficiently processed.
 1935 
 1936 * image objects (tbd objects) for v5 geometry files.  not only the
 1937   ability to have images in the 3D space, but to view-align them for
 1938   image underlay modeling.
 1939 
 1940 * material objects (non-geometric attribute-only objects) for v5
 1941   geometry files.  instead of material attribute value becomes
 1942   material object name.  material object encompasses hierarchical
 1943   material traits.  some traits potentially of interest:
 1944     - density
 1945     - Young's modulus
 1946     - yield strength (in different dirs, e.g., rolling & transversal)
 1947     - ultimate tensile strength (also in different dirs)
 1948     - Poisson's ratio
 1949     - cost per ton?
 1950     - ...
 1951 
 1952 * parametric material properties.  support the ability to define
 1953   material properties based on parametric values such as distance from
 1954   surface, distance from medial axis, distance from centroid, distance
 1955   from plane, etc.  this supports parametric descriptions of materials
 1956   that have highly variable densities (e.g., bone, certain alloys and
 1957   plastics, etc.).
 1958 
 1959 * shader objects (non-geometric attribute-only objects) for v5
 1960   geometry files.  allow shader string to refer to said objects for
 1961   shader parameters.
 1962 
 1963 * 3D plot objects for v5 geometry files.  very closely related to
 1964   other ideas about having 3d wireframe objects, but these would
 1965   probably be non-geometric in nature.  basically the plot3 files that
 1966   are stored out to disk being stored as objects in the database with
 1967   support for the overlay command to import, export, display them.
 1968 
 1969   minimally should probably support the basic drafting elements
 1970   (predominantly from collada, dxf, iges, and step specifications):
 1971 
 1972 	point := x, y, z
 1973 	line := start point, end point
 1974 	polyline := various (closed, open, paired, modified, etc.)
 1975 	circle := center point, radius
 1976 	ellipse := center point, major radius, minor radius
 1977 	hyperbola := center point, major radius, minor radius
 1978 	parabola := center point, focal length
 1979 	arc := center point, radius, start angle, end angle
 1980 	spline := degree, control points, knot values
 1981 	text := string, insertion point, size, style, alignment
 1982 
 1983 * procedural geometry objects.  database objects that are described at
 1984   run-time by a scripted definition.  at core, this is a means to
 1985   define geometry via outboard descriptions that conform with a
 1986   particular syntax (e.g., tcl or python).
 1987 
 1988   minimally, an object will need to define what parameters are
 1989   required, what parameters are optional, and what default values will
 1990   be used.  the object will also need to provide a procedural
 1991   definition (e.g., a function or set of functions/objects) that
 1992   receives parameter values in order to describe geometry on-demand.
 1993 
 1994   similar to shader, material, and other object constructs, it'll
 1995   likely be desirable to support embedding of the procedural
 1996   definition within a .g file as well as the ability to reference an
 1997   external file that may be more conveniently edited.
 1998 
 1999   care will need to be taken to avoid bad behavior when presented with
 2000   a malformed procedure (e.g., an infinite loop, fork bomb, syntax
 2001   error, thrashing condition, etc.).
 2002 
 2003 * spheroid (quadratic) - special performance case of ell
 2004 
 2005 * ovoid - a 3D rotated oval "egg" shape.  can be constructed as the
 2006   union of two separate ell.  very similar to our pill/particle
 2007   primitive except that an elliptical curve connects the two shapes
 2008   (and depending on which oval curvature is used) -- could probably
 2009   use eto+sph evaluation for shot().
 2010 
 2011   http://www.mathematische-basteleien.de/eggcurves.htm
 2012   http://www.geocities.jp/nyjp07/Egg/index_egg_E.html
 2013   https://en.wikipedia.org/wiki/Oval
 2014 
 2015 * conical edge (cubic) - unsure of this one's practical utility except
 2016   as a means to construct a pinched tgc (unioning two halves).
 2017 
 2018 * apple (quartic) - this is basically a continuation of torus where
 2019   the ID > OD/2.
 2020 
 2021 * cushion (quartic) - bowl shape, related to elliptical torus with
 2022   filled interior.
 2023 
 2024 * eight/piriform (quartic) - a conic/ellipsoid blending shape.
 2025 
 2026 * goursat/tanglecube/tooth (quartic) - related to superellipsoid
 2027   surface, provides corner/edge blending and rounding shapes.
 2028 
 2029 * lemon (quartic) - elliptical nose cap (requested shape) shape.
 2030 
 2031 * box-spline blend - blending object that is defined by an arb8
 2032   volume, blending any entities within that volume that intersect
 2033 
 2034 * lipschitz blend - means to procedurally blend surface edges based on
 2035   a blend function and sphere tracing. see "Combining CSG modeling
 2036   with soft blending using Lipschitz-based implicit surfaces".
 2037 
 2038 
 2039 WINDOWS
 2040 -------
 2041 
 2042 The following binaries are not yet available on Windows.  The reason
 2043 is identified in parentheses.
 2044 
 2045 bombardier (possibly just a problem with the build logic)
 2046 enigma     (not ported)
 2047 fbcolor    (TERMLIB)
 2048 fbed       (TERMLIB)
 2049 fbpoint    (TERMLIB)
 2050 fbzoom     (TERMLIB)
 2051 ir-X       (X11 specific)
 2052 irdisp     (X11 specific)
 2053 lgt        (TERMLIB)
 2054 pl-X       (X11 specific)
 2055 pl-dm      (possibly X11 specific)
 2056 pp-fb      (TERMLIB)
 2057 remrt      (remrt dir commented out for WIN32 in src/CMakeLists.txt)
 2058 rtsrv      (remrt dir commented out for WIN32 in src/CMakeLists.txt)
 2059 scriptsort (lex)
 2060 ttcp       (not ported)
 2061 
 2062 The MGED points support doesn't appear as an executable, but it is
 2063 missing on Windows due to needing lex.
 2064 
 2065 
 2066 CONVERTERS
 2067 ----------
 2068 
 2069 * add glTF importer/exporter (.gltf and .glb file formats)
 2070 
 2071 * add 3MF importer/exporter (3D printing file format like STL that
 2072   supports materials, colors, and other information.)
 2073 
 2074 * add gcv support for the Microstation file format (DGN), probably
 2075   leveraging http://dgnlib.maptools.org/ (MIT-licensed)
 2076 
 2077 * integrate the submitted x3d-g (Web3D, VRML successor) importer
 2078   (pending patch on sf)
 2079 
 2080 * add support to x3d-g for NURBS entities
 2081 
 2082 * compare libIGES (lgpl, https://github.com/cbernardo/libIGES) as
 2083   potential replacement for our compelx IGES conversion logic.
 2084   appropriate time for review when IGES gets added to libGCV.
 2085 
 2086 * investigate the asset import library (assimp.sf.net) to see whether
 2087   we can replace a lot (but probably not all) of our bot-centric
 2088   importers/exports (ply, obj, stl, etc.) with the assimp library to
 2089   save us the time/effort of supporting those parser ourselves.
 2090 
 2091 * make the converters export all top-level objects by default
 2092 
 2093 * implement support for exporting sketch objects via g-iges
 2094 
 2095 * by default, only export valid (manifold, solid if 3d, etc) objects.
 2096   have option to override and export invalid entities.
 2097 
 2098 * add csv, xml, nff, bzw, pov, blend geometry import and export
 2099   support
 2100 
 2101 * finish obj-g importer.  need to test more inputs and make sure all
 2102   geometry is preserved on import in some form.  make sure new libobj
 2103   parser works and is integrated with new front-end.
 2104 
 2105 * implement a g-step exporter (with NURBS, implicit CSG, and NMG/BoT
 2106   options)
 2107 
 2108 * implement a g-dae (Collada) exporter and dae-g importer
 2109   http://en.wikipedia.org/wiki/Collada
 2110 
 2111 * implement a g-nc (g-code) exporter.  ideally this converts geometry
 2112   to NURBS format, trims surfaces, evaluates boolean expressions, and
 2113   then generates tool paths on resulting surfaces and interior paths.
 2114   http://en.wikipedia.org/wiki/G-code
 2115 
 2116 * implement a u3d-g importer
 2117   http://en.wikipedia.org/wiki/Universal_3D
 2118   http://libharu.org/wiki/Main_Page
 2119 
 2120 * implement a g-pdf exporter and/or open source 3D PDF library
 2121   http://developer.techsoft3d.com/adobePDF/index.html
 2122 
 2123 * SVG renderer.  go straight from 3D model to a 2D vector image for a
 2124   given view.  similar to the plot/postscript wireframe view saves,
 2125   this would need to store projected contours (ala rtedge) and filled
 2126   color regions.
 2127 
 2128 * implement a g-sat (Solidworks) exporter and sat-g importer
 2129   http://local.wasp.uwa.edu.au/~pbourke/dataformats/sat/sat.pdf
 2130 
 2131 * implement a g-json exporter
 2132   http://www.json.org/
 2133 
 2134 * implement a g-xml exporter
 2135   http://en.wikipedia.org/wiki/XML
 2136 
 2137 * implement a ls-dyna "keyword" file format importer.  perhaps extract
 2138   as nmg/bot boundary representation meshes.  lots of great vehicle
 2139   datasets at http://www.ncac.gwu.edu/vml/models.html
 2140   Update - above link seems to be down as of 2020, see:
 2141   https://www.nhtsa.gov/crash-simulation-vehicle-models
 2142   https://www.ccsa.gmu.edu/models/
 2143 
 2144 
 2145 
 2146 STEP
 2147 ----
 2148 
 2149 * add hierarchy preservation support to step-g
 2150 
 2151 * implement g-step exporter (see above)
 2152 
 2153 * see additional TODO items in file './src/other/step/README'
 2154 
 2155 
 2156 BREP/NURBS
 2157 ----------
 2158 
 2159 * optimize prep.  crazy slow building a surface tree deeply to ensure
 2160   surface evaluations will converge to proper hit points.  this uses a
 2161   lot of memory and requires cpu-costly derivative evaluations during
 2162   surface splitting.  it also uses classic object structures and
 2163   incoherent pointer chasing during construction and traversal.
 2164 
 2165   among several optimization approaches discussed, one plan involves
 2166   making prep only minimally subdivide surfaces (e.g., only one
 2167   subdivision per surface initially) and letting ray tracing
 2168   dynamically evaluate surfaces as needed.  a heuristic that takes
 2169   volume and/or structural complexity into account (e.g., no
 2170   derivative changes across all encompassed knots) could result in a
 2171   better initial per-surface prep.  with knowledge of the prep
 2172   subdivision bounding volume sizes, it should be possible to
 2173   calculate static arrays per surface that will serve as coherent
 2174   book-keeping during shot.  instead of pre-calculating the depths
 2175   during prep, the static arrays get filled in on-demand during shot
 2176   and are used to track bounding box and UV extents as rays require
 2177   additional surface subdivision.  it should be possible to construct
 2178   an extents container such that for a given depth, a ray will only
 2179   calculate further depths as needed with minimal locking:
 2180 
 2181   0) prep: organize surfaces into BSP container (kd-tree)
 2182   1) prep: calculate maximum possible subdivision depth
 2183   2) prep: allocate extent container array depths
 2184   3) prep: calculate initial required subdivision(s)
 2185   4) prep: fill initial subdivisions into array
 2186   5) shot: traverse BSP to find surfaces in proximity
 2187   6) shot: traverse subdivision array to lowest initialized level
 2188   7) shot: evaluate surface to determine need for further subdivision
 2189   8) shot: while subdivision needed, calculate subdivision and store
 2190   9) shot: evaluate and return surface hits
 2191 
 2192   The way to do step 8 with minimal locking involves having an
 2193   initialization / sentinel value that is checked for non-zero and
 2194   only set after array values are already locked, written, and
 2195   unlocked.  Doing this, it is possible for multiple rays to evaluate
 2196   the same subdivisions unnecessarily, but avoids locks entirely in
 2197   the common case and minimizes lock contention.
 2198 
 2199 * create a BC_Brep class that inherits from ON_Brep so we can cleanly
 2200   extend and implement functions that were intentionally removed from
 2201   openNURBS.
 2202 
 2203 * implement tessellation support.
 2204 
 2205 * tighten up the bounding boxes around nurbs geometry.  seems to be
 2206   bounding the untrimmed surfaces instead of the trimmed edges
 2207   resulting in boxes (hopefully) larger than they need to be.
 2208 
 2209 * update to openNURBS 5.0 (2011-02-02)
 2210 
 2211 * identify useful concepts implemented in the old NURBS code that are
 2212   not present in openNURBS, and port that code to openNURBS data
 2213   structures and routines.  This will eventually allow us to remove
 2214   the old NURBS code.
 2215 
 2216 * implement boolean evaluation of nurbs surfaces
 2217 
 2218 * plate mode NURBS/BREP objects.  Similar, if not identical, to plate
 2219   mode BoTs, 'brep' objects need the ability to have a thickness
 2220   described so you could automatically handle non-solid NURBS and
 2221   sheet-metal style geometry without requiring surface solidity.
 2222 
 2223 * NURBS editing command, let you interactively
 2224   add/update/join/split/remove component points, edges, surfaces.
 2225 
 2226 
 2227 NMG/BoT
 2228 -------
 2229 
 2230 * bot overlaps when unoriented, when clearly not overlapping
 2231 
 2232 * resolve bot bin sort optimization crash, disabled during release
 2233 
 2234 * rt moss.g facetize rt bot bug
 2235 
 2236 * implement a means to store per object, face, and vertex information
 2237   on BoT mesh geometry.  useful for per-face/vertex shading as well as
 2238   storing analytic information during conversion (e.g., per-face
 2239   fastgen material codes)
 2240 
 2241 * bot bounding box size -- see below
 2242 
 2243 * libbn's tri_specific structure requires user-provided memory for
 2244   normals.. this certainly saves memory if the triangles don't have
 2245   normals but at a rather expensive malloc cost (which is being seen
 2246   on large BoT models) during prep.
 2247 
 2248 * implement conversion of plate-mode BoT into volume-mode BoT,
 2249   probably as a 'bot' command subcommand.  this basically entails
 2250   implementing the BoT tessellation callback for plate-mode which will
 2251   let boolean evaluation succeed as-is.  might require adding a
 2252   parameter in case we want to dump the mesh as-is.
 2253 
 2254 * ensure robust and fast nmg->bot conversion
 2255 
 2256 * facetize creates BoTs crappily by only looking at first region,
 2257   first shell, instead of the whole nmg model.
 2258 
 2259 * nmg_bot() and nmg_from_bot() only work with shells.  verify that all
 2260   callers iterate over all shells or write a model version that does a
 2261   complete conversion correctly.
 2262 
 2263 * refactor all of the nmg processing (back) into its own library so
 2264   that external users can manage mesh geometry without needing to pull
 2265   in everything else in librt.  consider moving other polygonal
 2266   specific logic to libnmg, eventually moving all polygonal logic out
 2267   of librt, libtie, etc., and into libnmg.
 2268 
 2269 * enhance the bot data structure to contain a generic pointer that
 2270   could be used to point back to the NMG it was generated from.  This
 2271   could allow ALL raytracing of polygonal models to use libtie/BoT
 2272   raytracing routines, speeding up NMG raytracing and simplifying the
 2273   raytracing code.
 2274 
 2275 * optimization of NMG ray tracing.  the hitmiss bookkeeping presently
 2276   used has a malloc/free occurring per shot().  allocations need to
 2277   occur during prep only.  the presently render more than an order of
 2278   magnitude slower than tracing that nmg converted to an equivalent
 2279   BoT due to malloc/free calls being made during shot(). Confirmable
 2280   with a simple test case of a sphere converted to an nmg:
 2281 
 2282     make sph sph ; facetize -n sph.nmg sph
 2283 
 2284 * implement a routine/command to convert from a bot to an nmg
 2285   (similar/related to the nmg-bot tool, but the reverse).
 2286 
 2287 * need a simplified means to programmatically create and edit BoT
 2288   meshes via the command line without resorting to get/put.
 2289 
 2290 
 2291 RTGL
 2292 ----
 2293 
 2294 Need before enabling:
 2295 
 2296 Blasting havoc_tail when raytracing havoc doesn't result in a re-set
 2297 of the raytracing - it just re-sizes the view to havoc_tail and
 2298 continues with the original raytrace.  Track down why - should clear
 2299 everything and start over.  (Appears on Linux, not on OSX).
 2300 
 2301 Need general robustness testing - ensure no crashes when switching
 2302 display manager types multiple times in multiple locations.
 2303 
 2304 For cleanup:
 2305 
 2306 Move pattern raytracing logic into librt.
 2307 
 2308 Need a way to cache point data so we don't re-raytrace unchanged
 2309 geometry over and over.
 2310 
 2311 Job server should be reworked into a general mechanism, instead of
 2312 being rtgl specific.
 2313 
 2314 Provide a generic mechanism in MGED run loop to hook in features like
 2315 point cloud rendering, instead of hard-coding it.
 2316 
 2317 * consider utilizing something like moodycamel::ConcurrentQueue for
 2318   handling ray dispatch: https://github.com/cameron314/concurrentqueue
 2319 
 2320 
 2321 INFRASTRUCTURE
 2322 --------------
 2323 
 2324 * ensure successful build on mingw
 2325 
 2326 * the binary windows installer is missing headers for our external
 2327   dependencies (Tcl, zlib, and OpenNURBS in particular as the likes of
 2328   bu.h and raytrace.h requires them)
 2329 
 2330 * remove all of the MSVC sections in the CMakeLists.txt files.
 2331   perform proper library/function/flag tests where necessary.
 2332 
 2333 * ensure primary cmake option parity with summary option listing
 2334 
 2335   -- Um.  Not sure this is fully achieveable - we only want to
 2336      summarize a subset of the src/other settings in the summary
 2337      printout, was my (CY) understanding...
 2338 
 2339 * investigate ignoring .hidden directories/files from dist packing so
 2340   that internal build directories can be used instead of external ones
 2341 
 2342   -- is this needed?  what's not working with make package and
 2343      make package_source?
 2344 
 2345 * ensure it's possible to set global CFLAGS/CPPFLAGS/LDFLAGS that are
 2346   in addition to any/all that we automatically set
 2347 
 2348 * fix failure disabling IF_X when X11 headers are not found.
 2349   include/fb.h still ends up entering the IF_X section and declaring a
 2350   function that takes a Display and other X11 objects
 2351 
 2352 
 2353 THESE BREAK PROTOCOL OR ARE BACKWARDS-INCOMPATIBLE
 2354 (i.e., v6 database format)
 2355 --------------------------------------------------
 2356 
 2357 * support matrices over any object, including over top-level combs
 2358   without affecting members and including over primitives so they may
 2359   optionally retain a local coordinate system even after a push
 2360   operation this also will allow primitives like the torus support
 2361   non-uniform scaling.
 2362 
 2363 * change convention of using 'u', '+', and '-' for unions,
 2364   intersections, and subtractions respectively to symbols that
 2365   unambiguously describe the underlying CSG operation.
 2366 
 2367   '+', 'x', and '-' are the dominant ASCII option or (better) using
 2368   unicode logic symbols for U and upside-down U.
 2369 
 2370   Union/Disjunction: + ∨ v u (logical OR)
 2371   Intersection/Conjunction: x ∧ ^ . & n (logical AND)
 2372   Subtraction/Difference: - (logical AND NOT)
 2373   Negation/Complement: ! ¬ (logical NOT)
 2374 
 2375 * remove the bspline primitive
 2376 
 2377 * remove the poly primitive
 2378 
 2379 * remove the hf primitive
 2380 
 2381 * a cut feature edit.  implementation could be represented as the cube
 2382   that bounds a geometry object.  eight points somewhere on the edges
 2383   of the cube define an intersection volume on the object.  by
 2384   default, the eight points could be positioned at the corners of the
 2385   cube and would remain constrained to reside on one of the three
 2386   adjoining edges for their respective corner.  this would provide a
 2387   simple user interface where a face could be selected to move a cut
 2388   plane through an object (moving four points along four edges), or an
 2389   edge could be moved to move two points simultaneously, or each
 2390   individual point could be moved along their edges to define the
 2391   intersection object.  allowing the points to be deconstrained so
 2392   they can move into the interior of the bounding volume or into the
 2393   interior of a face could be an advanced option.
 2394 
 2395 * fix the database I/O writing to properly support the addition of new
 2396   primitive types.  this includes modifying the major/minor code or
 2397   combinations/regions and binary objects
 2398 
 2399 * add database support for constraints, expressions, parametric
 2400   values, construction history, and timestamping.
 2401 
 2402 * see the CHANGES file for items that have been marked as deprecated
 2403   or available to be removed as obsolete items.
 2404 
 2405 * make struct rt_functab's ft_label bigger and/or dynamic (e.g., vls)
 2406 
 2407 * remove the storage of the never-implemented keypoint parameter for
 2408   extrude objects.
 2409 
 2410 * rename 'part' primitive to 'pill' or remove it entirely in favor of
 2411   a more generalized metaprimitive primitive.
 2412 
 2413 * binary objects need to write out their minor type during export, not
 2414   relying on the raw wrapper to encode it, so that proper
 2415   import/export can be performed without relying on minor_type hacks
 2416   in the API.
 2417 
 2418 * implement support for binary attributes.  the general idea is to
 2419   allow collections of (at a minimum) 64-bit integer, 64-bit floating
 2420   point, and strings.  the type needs to be encoded when written out
 2421   to storage.  there is high-desirability towards using a binary
 2422   encoding format already defined and in popular use like BSON,
 2423   UBJSON, or CBOR.
 2424 
 2425   It's highly likely that binary attributes can be implemented in a
 2426   backwards-compatible manner.  The v5 spec separately tracks the size
 2427   of attributes and objects from the size of the strings that are
 2428   serialized out into them.  It may be possible to store a
 2429   shortened/empty string, but record a larger attribute/object size,
 2430   allowing for binary data beyond the attribute value '\0' termination.
 2431 
 2432 * change format of related programs (especially filters) so the
 2433   input/output files are handled identically. two examples of
 2434   different handling:
 2435 
 2436     png-pix   file.png > file.pix
 2437     pix-bw  < file.pix > file.bw
 2438 
 2439   (desired style to be determined)
 2440 
 2441 
 2442 FUNCTIONALITY NEEDED TO SPEED UP RAYTRACING
 2443 -------------------------------------------
 2444 
 2445 * merge shot and vshot
 2446 
 2447 * implement bundles shot - array of rays
 2448 
 2449 * separate ray structs - make fit in cache line
 2450 
 2451 * refactor primitive data -  make fit in cache line
 2452 
 2453 * implement SIMD shots
 2454 
 2455 * implement SAH for all primitives (routine that fires a ray at each
 2456   primitive for initial estimate, caches result)
 2457 
 2458 * write and use kdtree - make traversal cache coherent
 2459 
 2460 
 2461 GEOMETRY MODELS
 2462 ---------------
 2463 
 2464 * CSG shaderball
 2465 
 2466 * solid teapot
 2467 
 2468 * studio box
 2469 
 2470 * CSG lightcycle
 2471 
 2472 
 2473 DOCUMENTATION
 2474 -------------
 2475 
 2476 * BRL-CAD Primitives
 2477 	An overview of the various primitive object types in BRL-CAD,
 2478 	their range of features, and a description of their input
 2479 	parameters.
 2480 
 2481         Create a catalog of all possible entity types.  Include
 2482         distinct parameterizations with sufficient variety that
 2483         conveys the object's parameterization options (e.g. ell as
 2484         sphere, flat disc, long spike, etc.).  this is necessarily
 2485         defined per object type and possibly programmable.  See
 2486         src/proc-db/csgbrep.cpp for a basic start.
 2487 
 2488 * BRL-CAD Ray Tracing Shaders
 2489 	An overview of the various shaders and shader options
 2490 	available in BRL-CAD.  Create a catalog of all
 2491 	possible/distinct/useful shader settings.  See
 2492 	regress/shaders.sh for a basic start.
 2493 
 2494 * update the rt* manual pages to note that they can all write out to
 2495   various image formats like png just by specifying an output file
 2496   extension.
 2497 
 2498 * document gqa centroid and moments of inertia options
 2499 
 2500 * document the new NURBS/BREP primitive, capabilities and limitations
 2501 
 2502 * Low-hanging fruit, add missing manual pages:
 2503 
 2504     archer
 2505     bombardier
 2506     bot_fuse (ged)
 2507     damdf
 2508     dauto
 2509     dauto2
 2510     dconv
 2511     ddisp
 2512     dfft
 2513     dmod
 2514     dpeak
 2515     dsel
 2516     dstats
 2517     dwin
 2518     gcv
 2519     ihist
 2520     imod
 2521     isst
 2522     istats
 2523     lowp
 2524     pix3filter
 2525     pixcount
 2526     pixelswap
 2527     pixembed
 2528     plot3stat
 2529     rtsil
 2530     rtsrv
 2531     smod
 2532     step-g
 2533     umod
 2534     ustats
 2535 
 2536   Shape tools installed without docs.  may absorb into ged as plugins
 2537   or may rename, but still need docs:
 2538 
 2539     bolt
 2540     fence
 2541     gastank
 2542     handle
 2543     human
 2544     picket_fence
 2545     window
 2546     window_frame
 2547     wire
 2548 
 2549   User-facing commands reported by 'help' needing docs.  some are
 2550   implemented as Tcl, others to consolidate, but still need docs:
 2551 
 2552     adjust
 2553     bot_smooth
 2554     cc
 2555     closedb
 2556     dbversion
 2557     dmtype
 2558     dsp
 2559     dump
 2560     e_id
 2561     form
 2562     joint
 2563     labelface
 2564     loadview
 2565     lod
 2566     match
 2567     mirror
 2568     nmg_fix_normals
 2569     png
 2570     put
 2571     relos
 2572     remat
 2573     reset
 2574     rmats
 2575     rt_gettrees
 2576     rtabort
 2577     rtedge
 2578     rtweight
 2579     savekey
 2580     shaded_mode
 2581     unhide
 2582 
 2583   Need to revisit utility of spherical mapping, used by sh_spm and
 2584   sh_points, used for environment mapping (e.g., stars):
 2585 
 2586     pix-spm
 2587     spm-fb
 2588 
 2589   3rd party tools we control / bundle, but need docs if anyone else is
 2590   to use them or contribute:
 2591 
 2592     perplex
 2593     re2c
 2594 
 2595   Needs separate repo:
 2596 
 2597     ttcp
 2598 
 2599   Converters that belong in GCV:
 2600 
 2601     3dm-g
 2602     g-dot
 2603     g-jack
 2604     g-off
 2605     g-step
 2606     g-voxel
 2607     jack-g
 2608     off-g
 2609     raw-g
 2610     shp-g
 2611     step-g
 2612     tgf-g
 2613 
 2614 * DocBook: create a DB index.xml to generate a doc listing (with
 2615   hot links) for the html and pdf collection
 2616 
 2617 * DocBook source: add xsl customizations for figure and table title
 2618   positions, float centering, etc.; add automatic figure, table, and
 2619   other similar references; add separate markup for html (role='html')
 2620   and pdf (role='fo') image sizing and placement; remove unnecessary
 2621   image markup; lift child namespaces to each document's root element.
 2622 
 2623   Particular targets for improvement:
 2624 
 2625     doc/docbook/presentations/en/brlcad-app-devel.xml
 2626     doc/docbook/presentations/en/intro-to-tcltk.xml
 2627     doc/docbook/specifications/en/BRL_CAD_g_format_V5.xml
 2628 
 2629 * write up some documentation on other build tools besides make -
 2630   CMake supports other generators, wouldn't hurt to detail how to
 2631   trigger builds in them (MSVC is partially covered, make sure to
 2632   coverage is complete - others include Eclipse, XCode once we get the
 2633   kinks ironed out there, CodeBlocks.  Ninja build tool and its
 2634   CMake support are worth documenting too.
 2635 
 2636 * all of the rt* tracers share common code and common options, but do
 2637   not share common documentation.  refactor documentation to use
 2638   include directives so that there is one place where all of the
 2639   common options are documented.  update usage statements to reflect
 2640   commonality as well.
 2641 
 2642 * Categorize the entity types from STEP * IGES into geometry,
 2643   relationship definitions, metadata, etc., add any missing types
 2644   of interest (like, say, metaballs) - try to create a comprehensive
 2645   list of things we might need to consider when writing converters.
 2646 
 2647 * document the saveview/loadview options.
 2648 
 2649 * BRL-CAD Overview Diagram
 2650 	Completed, but not integrated
 2651 
 2652 * BRL-CAD Industry Diagram
 2653 	Completed, but not integrated
 2654 
 2655 * BRL-CAD Architecture Diagram
 2656 
 2657 * Technical Papers
 2658 	- Fast Malloc
 2659 	- STEP Conversion
 2660 	- GCV
 2661 	- Solid Modeling
 2662 	- Representation Methodology / Sensitivity
 2663 	- NURBS Ray Tracing
 2664 
 2665 * BRL-CAD Commands Quick Reference
 2666 	Partial
 2667 
 2668 * MGED Quick Reference
 2669 	Completed, but not integrated
 2670 
 2671 * MGED Interface Reference
 2672 	Keybindings, GUI elements, scripting
 2673 
 2674 * Introduction to BRL-CAD Tutorial
 2675 	mged, rt, pix-png, rtcheck, rtarea, rtweight, gqa, fbserv,
 2676 	nirt.  Succinct overview of less than 10% of the core
 2677 	functionality in 10 pages or less (plus pictures).
 2678 
 2679 * Technical Overview of BRL-CAD
 2680 	Describes everything in the package succinctly yet
 2681 	comprehensively.  Survey of all the major features,
 2682 	methodologies, and tools implemented in BRL-CAD with coverage
 2683 	on code maturity, library encapsulation, and tool aggregation.
 2684 
 2685 * BRL-CAD Validation and Verification
 2686 	Overview of how contributions to BRL-CAD are reviewed and
 2687 	tested including regression, performance, and system
 2688 	integration testing as well as independent ARL configuration
 2689 	review.  This specifically addresses the issue of world-wide
 2690 	and potentially anonymous contributions to BRL-CAD and how
 2691 	those changes are managed.
 2692 
 2693 * DoD V/L M&S Industry Diagram
 2694 	Similar to existing Industry Diagram.  Survey of all the major
 2695 	features, methodologies, and tools implemented in BRL-CAD with
 2696 	coverage on code maturity, library encapsulation, and tool
 2697 	aggregation.  This one is a particularly useful marketing and
 2698 	educational visual aid for describing how the various M&S
 2699 	codes interoperate in terms of features and scope.
 2700 
 2701 * Commercial CAD Comparison Diagram
 2702 	Comparison of how BRL-CAD overlaps feature-wise with various
 2703 	major commercial CAD systems.
 2704 
 2705 * Solid Geometry Representation Comparisons
 2706 	Describe the implications, tradeoffs, and conversion issues
 2707 	involved when converting between different geometry
 2708 	representations.  Includes describing implicit geometry,
 2709 	explicit polygonal boundary representations, explicit spline
 2710 	surface representations, volumetric models, wireframes,
 2711 	boolean operations, feature edit operations, and parametric
 2712 	modeling.
 2713 
 2714 * BRL-CAD Open Source
 2715 	An overview of how BRL-CAD is organized as an open source
 2716 	project and community describing the developer meritocracy,
 2717 	code reviews, development prioritization, and change
 2718 	management.  This introduces and explains the concept and
 2719 	philosophy of open source software, its fundamental tenets,
 2720 	and the basic "why and how" it works.
 2721 
 2722 * History of BRL-CAD
 2723 	Covers the 30-years development history of BRL-CAD, from 1979
 2724 	to 2009, documenting the origins of the project, major
 2725 	development achievements, the conversion to open source, and
 2726 	lesson's learned.
 2727 
 2728 * BRL-CAD Manifesto
 2729 	Vision & Scope
 2730 
 2731 * BRL-CAD Taxonomy
 2732 	Description of the common terminology used throughout BRL-CAD,
 2733 	conventions employed, and tool categorization.
 2734 
 2735 * Implementing a BRL-CAD Primitive
 2736 	How-To for creating a new primitive in BRL-CAD that can be
 2737 	ray-traced, tessellated, plotted, and transformed seamlessly.
 2738 
 2739 * Procedural Geometry in BRL-CAD
 2740 	How-To for creating new tools that create geometry.
 2741 
 2742 * BRL-CAD Ray Tracing Shader Development
 2743 	How-To for creating new shaders.
 2744 
 2745 * Geometry Conversion with BRL-CAD
 2746 	Overview of the various geometry conversion facilities in
 2747 	BRL-CAD and how they related to solid geometry
 2748 	representations.
 2749 
 2750 ---
 2751 See the feature request and bug trackers for more tasks and future
 2752 planning efforts: https://sourceforge.net/tracker/?group_id=105292
 2753 
 2754 TODO items should be formatted to column 70 (M-q in emacs), no tabs.