BREP TODO
=========

Included below is a basic work breakdown related to the implementation
of boundary representation (BREP) support in BRL-CAD.  Feel free to
add to or expand this list and/or embellish it with additional
information as appropriate.  If you would like to work on the BREP
implementation, send a note to the brlcad-devel mailing list.

This file is a general scratch pad for categorizing and itemizing BREP
implementation tasks.  It is not an implementation plan.

This is a work in progress.


Geometry Entities
-----------------

point
line  (e.g., line segment, ray, bidirectionally infinite line)
line set  (e.g., polyline, polygon)
curve  (e.g., spline, arc, circle, ellipse)
plane
surface (e.g., spline, polygonal)
surface+curve  (i.e. a trimmed surface)
solid


Geometry Evaluation
-------------------

point -> point
point -> line
point -> curve
point -> plane
point -> surface
point -> surface+curve
point -> solid

line -> line
line -> curve
line -> plane
line -> surface
line -> surface+curve
line -> solid

curve -> curve
curve -> plane
curve -> surface
curve -> surface+curve
curve -> solid

plane -> plane
plane -> surface
plane -> surface+curve
plane -> solid

surface -> surface
surface -> surface+curve
surface -> solid

surface+curve -> surface+curve
surface+curve -> solid

solid -> solid


Geometry Queries
----------------

[ geometric properties ]
intersects
inside
outside
on
intersectionSet
firstIntersectionSet
closestDistance
closestSet  (e.g., closestPoint)
booleanEvaluation
insideSet  (e.g., insideSolid, insideLoop (trimmed))
outsideSet
onSet

[ parametric properties ]
uvSpace <--> ImageSpace Mapping (for ALL primitive types)
curvatures
normalSet  (e.g., normalVector, normalPlane)
tangentSet  (e.g., tangentVectors, tangentPlanes)

[ checks ]
isValid
isSolid
isManifold
isFlat

[ bounding volumes ]
boundingBox
boundingSphere


Geometry Modifiers
------------------

scale
rotate
translate
shear

mirror
copy/clone
delete

invertRepresentation
evaluateBoolean  (i.e. CSG)
snapTogether  (e.g., | -)

sweep
extrude
revolve
extend/stretch

trim  (e.g., cutting plane)
split  (i.e. copy and two trims)

fillet
chamfer


Ray Tracing
-----------

intersectionSet query
  boundingBox
  line -> solid evaluation
normalSet query
  line -> solid evaluation

line->solid evaluation
  line->surface || line->plane

line->plane
  line->line

line->surface
  line->curve || line->line
  closestDistance

closestDistance
  point->plane
  point->point

line->curve
  line->point

line->line
  line->point

line->point
  point->point


Interactive Visualization
-------------------------

implicit primitive to solid conversion
solid on solid CSG evaluation  (i.e. unevaluated to evaluated BREP)
solid tessellation


Conversion
----------

3DM to BRL-CAD
BRL-CAD to 3DM
STEP to BRL-CAD
IGES to BRL-CAD
BRL-CAD to STEP
BRL-CAD to IGES


********************************************************************************
 Below are some thoughts and notes about specific issues related to the above
 topics - may be useful as comments at some point, or at least food for thought.
********************************************************************************

/*
 *   Point-Point Evaluation
 *
 *   Answer Evaluation Questions involving two points:
 *
 *   1.  Intersection - for a point, there are three possible categories of of intersection:
 *   	    * Identical - point values identical and all bound values identical
 *
 *                                              * * * * * * * *
 *                                              *             *
 *                                              *    1   2    *
 *                                              *      *      *
 *                                              *             *
 *                                              *             *
 *                                              * * * * * * * *
 *
 *   	    * Contained - values not all identical but bounds of the point of interest all smaller than bounds of
 *   	                  point it is being compared to
 *
 *
 *                            * * * * * * * * * *             * * * * * * * * * *
 *                            *        1        *             *                 *
 *                            *       * * * * * *             *     * * * * *   *
 *                            *       *       * *             *     *  1    *   *
 *                            *       *   2   * *             *     *       *   *
 *                            *       *       * *             *     *    2  *   *
 *                            *       * * * * * *             *     * * * * *   *
 *                            * * * * * * * * * *             * * * * * * * * * *
 *
 *
 *   	    * Overlapping - values not all identical but bounds of the point of interest all overlap bounds of
 *   	    		  the point it is being compared to.  (Note:  a corner case is when the value of the upper
 *   	    		  bound of one point is equal to the lower bound of the other - this is defined to be
 *   	    		  overlapping.)
 *
 *
 *             	        * * * * * * * *              * * * * * * * *              * * * * * * * *
 *             	        *             *              *             *              *             *
 *                      *      1      *              *   * * * * * * * * *        *   * * * * * * * * *
 *                      *     * * * * * * * *        *   *  1      *     *        *   *  1      *     *
 *                      *     *       *     *        *   *         *     *        *   *         *     *
 *                      * * * * * * * *     *        * * * * * * * *     *        *   *      2  *     *
 *                            *      2      *            *        2      *        * * * * * * * *     *
 *                            *             *            *               *            *               *
 *                            * * * * * * * *            * * * * * * * * *            * * * * * * * * *
 *
 *
 *   2.  Outside - "If the points are not identical in value and/or error bounds, is the point of interest and its error
 *       bounds contained or overlapping with the comparison point, or vice versa?  If not, the point of interest is
 *       outside the comparison point.
 *
 *       Contained and Overlapping points present a problem.  Take the case where two points have an overlapping bound
 *       and a third point must decide its relationship with each of them:
 *
 *                                              * * * * * * * *
 *                                              *             *
 *                                              *      1      *
 *                                              *             *
 *                            	        * * * * * * * *   * * * * * * * *
 *                            	        *       *     *   *   *         *
 *                            	        *       * * * * * * * *         *
 *                            	        *     2       *   *      3      *
 *                            	        *             *   *             *
 *                            	        *             *   *             *
 *                            	        * * * * * * * *   * * * * * * * *
 *
 *       Point 1 and Point 2 overlap and may intersect.  When Point 3 evaluates its relationships with Point 1 and
 *       Point 2, it finds that it overlaps and may intersect Point 1, but it does NOT overlap Point 3.  This means
 *       that Point 1 may intersect Point 2 OR Point 3, but NOT both at the same time.  Any assumption of equality
 *       involving any of these three points must decide how to handle this situation, and the decision must be both
 *       consistent and reproducible.  The possible decisions are:
 *
 *       1 = 2, 1 != 3
 *       1 != 2, 1 = 3
 *
 *       In order to have a concrete method for deciding this question, point evaluation cannot be a local, two point
 *       only test.  It is necessary to search out all points which overlap the two points in question (i.e. the only
 *       points which might impact the decisions of which points are identical in this particular case) and resolve the
 *       question amongst all of them.  One possibility would be to assemble all the guaranteed non-equalities among
 *       the set, search for the shortest distance between values among the remaining possible relationships, and assign
 *       intersection status based on those results.  (This may not be sufficient - bounding box size may also be
 *       important.)  For the original two points supplied, the question of intersection or non-intersection is now
 *       resolved as long as no geometry changes are made to any element that has bounds overlapping their individual
 *       bound.
 *
 *       Once this near space evaluation is done, each point's list of intersecting and non-intersecting points is updated.
 *       A query routine with two points can first check the points' own intersection/non-intersection lists to see if
 *       the answer is already pre-determined.  If it is not, determining via the bounds inside/outside is straightforward
 *       and deterministic and it cannot be intersecting.
 *
 *       One question is what to do when the geometry DOES change. New geometry may potentially change the decisions
 *       on what is and is not intersecting - perhaps it should?  Potential trouble there with overlapping vs. non-
 *       overlapping regions.
 */
