(NOTE: This file is out of date)

Outline of envisioned functionality:

     Omnitruncated tilings (including regular, truncated regular, ...
     as special cases):
        Given schlafli symbol {p,q}
        (i.e. q regular p-gons surround each vertex)
        and wythoffCoeffs[3], draws the tiling.
        wythoffCoeffs is actually the barycentric coords
        of where to put the canonical vertex within the schwarz triangle;
        it is implicitly normalized so that they sum to 1
        (it is illegal for them to sum to 0).
        Examples of various wythoffCoeffs:
            {1,0,0} -- regular {p,q} (truncation=0)
            {1,1,0} -- truncation=1
            {0,1,0} -- truncation=2
            {0,1,1} -- truncation=3
            {0,0,1} -- dual {q,p} (i.e. {p,q} with truncation=4)

            {1,0,1} -- runcinated
            {1,1,1} -- omnitruncated
        The initial view of the regular {p,q}
        has a vertex at the origin and an edge along the positive x axis.
        p must be >= 3 or 0 (meaning infinity), and
        q must be >= 3.
        Note that q can't be infinity due to the initial viewing position
        (infinite-arity vertices can only occur at infinity, i.e.
        at the edges of the Poincare disk).
        However, you can view the {p,infinity} in a
        different orientation (face-first),
        by instead drawing the dual {infinity,p} with wythoffCoeffs={0,0,1}.

        Special controls for this mode:
            (XXX maybe shift, alt, ...?)
            - Shift-drag a vertex alters the wythoff coefficients
              without changing the orientation of the whole figure.
              (Should clamp at boundaries of barycentric triangle)
            - Can enter wythoff coeffs explicitly.
            - Colors for each of the three edge types of the primal
            - Color for each of the three edge types of the dual
    
     Snub regular tilings:
        Given p,q, draws the snub {p,q}.
        Initial view corresponds to the initial view of the {p,q}
        (described above);
        i.e. the p-gons of the snub are centered at the p-gons
        of the {p,q} and the q-gons of the snub are centered
        at the vertices of the {p,q}.
        p must be >= 3 or 0 (meaning infinity), and
        q must be >= 3.
        Note that since this is a uniform tiling,
        it can be produced by the general uniform tiling function (see below)
        with vertex configuration pp={3,p,3,q,3} and the appropriate
        neighbor specifications; however, this function
        is provided so that the initial view
        corresponds nicely to the initial view of the {p,q}
        (also it is faster to generate than the general uniform specification,
        since its symmetry group is known to be the same as that of the {p,q}
        without reflections).

    General uniform tilings:
        Given a vertex configuration pp[]
        (i.e. a specification of the polygons surrounding each edge)
        and a specification of how the canonical vertex
        must be rotated or reflected to match each of its neighbors,
        draws the resulting uniform tiling.
        The default for each neighbor vertex is for it
        to be a reflection of the canonical vertex
        along the corresponding edge.
        (Thus the fundamental tilings with all-even vertex
        configurations can be specified simply, just using the defaults.)
        The initial view is with the canonical vertex at the origin,
        with the pp[i]-gons in CCW order around the origin as i increases,
        with the edge between the pp[n-1]-gon and the pp[0]-gon
        along the positive x axis.
        Note that in general, the program has no way of checking
        whether a given configuration is possible
        until it actually tries to construct it; furthermore
        it does not detect edge crossings during the construction,
        so instead of realizing it's screwed up, it produces a big mess.
        Each pp[i] must be >= 3 or 0 (meaning infinite).
        There is another input parameter q, which specifies
        the number of times the pp[] list should be repeated;
        so for example pp={4,6,8},q=2
        is the same as pp={4,6,8,4,6,8},q=1.





GUI:
    Radio button:
        Motion model
            TRACKBALL
            DRAG_GEODESIC
            DRAG_NONPRECESSING
            DRAG_PURETRANSLATE
            DRAG_PURETRANSLATE_CLAMPED
    Radio button:
        Function
            Truncate=0 (primal)
            Truncate=.5
            Truncate=1
            Truncate=1.5
            Truncate=2
            Truncate=2.5
            Truncate=3.5
            Truncate=4 (dual)
            Runcinated
            Omnitruncated
            Custom (enter numbers by hand)
    Button:
        Reset Orientation
    Slider?
        Verbosity
    Toggle:
        Suspend drawing altogether (while user is messing with gui, typically)
    Three sets of the following: still, dragging, gui updating, maybe keys?
        Toggle:
            AntiAliasing
        Text:
            Max Levels
            Max Isometries

    Text of most recent (maybe still, dragging, gui updating)
        - How many isometries
        - What limited it
        - How many lines
