================================================================================
// Summary:     Geodesica-SFX release notes
// Author:      Nicholas Shea
// Copyright:   Nicholas Shea 2005-2018
================================================================================
Geodesica-SFX-OpenGL-0-9-9-3 Codename: Rheims                     [In the works]

Dual generation update
Modified code so that any Dual EPD faces or trifan centers are not lost during
Dual generation, but recreated from data stored in the Primal.
================================================================================
Geodesica-SFX-MesaGL-0-9-9-2 Codename: Notre-Dame     [Uploaded on 20 Sept 2018]
Geodesica-SFX-MesaGL-0-9-9-2 Codename: Notre-Dame     [Uploaded on 20 Sept 2018]

Faster spaceframe generation. Implemented a "top lock" mechanism that is set by
the top level callback function. When "top lock" is true, other functions are
prevented from unlocking the UI and updating the screen; this makes spaceframe
generation about eight times faster.

IMPORTANT: Geodesica-SFX-OpenGL-0-9-9-2 uses multi-sampling as default. If the
program fails to launch with your graphics card, you will have to edit the prefs
file. Please read the following distribution document for instructions.

Docs/Multisampling-Prefs-Switch.txt
================================================================================
Geodesica-SFX-MesaGL-0-9-9-1 Codename: Notre-Dame     [Uploaded on 18 Sept 2018]
Geodesica-SFX-OpenGL-0-9-9-1 Codename: Notre-Dame     [Uploaded on 18 Sept 2018]

A. Bug fix for 'Make Trifans' on a truncated Dual
B. Bug fix for 'Smooth' operation on a truncated Dual

These operations were designed specifically for generating cross-target space-
frames and work well for that purpose. However, the operations sacrificed the 
Primal by corrupting the Primal Truncation floor trifan. This was not a problem
because the Primal was no longer required, so it was hidden from view.
But in the case of A, if the user made the Primal visible again, and attempted 
to re-project or change its extents, a crash would occur. The fix involves:

1. Removing the truncation plane bisectors from the Primal.
2. Deleting the Primal truncation floor trifan.
3. Inserting truncation plane bisectors in the Dual.
4. Creating a Dual truncation floor trifan.
5. Regenerating Primal from Dual.

The result is that the Dual has a truncation floor trifan instead of the Primal,
and the Primal floor forms correctly around the truncated Dual.

NOTE: whilst these bugs have been fixed, operations A and B still rescind the 
Primal geometry. This is fixed in 0-9-9-2 Rheims.
--------------------------------------------------------------------------------
Truncation window
Fixed UI glitch where the Model X Extent was shown in the Radius field, rather 
than the length of the radius vector at the _projected_ Theta. Note the Y value
will change depending on the extents/shape of the current envelope.
--------------------------------------------------------------------------------
Attributes window
Fixed critical bug where hub flanges did not render correctly when GL_FILL was
used for the hub rendering mode.
--------------------------------------------------------------------------------
Target switching
Faster target switching, especially for the MesaGL build which was several
orders of magnitude slower when switching targets.

Ensured that the current tab of 'Hubs and Struts' window does not change when
switching targets.
================================================================================
Geodesica-SFX-OpenGL-0-9-8-9 Codename: Notre-Dame     [Uploaded on 10 Sept 2018]
Geodesica-SFX-MesaGL-0-9-8-9 Codename: Notre-Dame     [Uploaded on 09 Sept 2018]

Fixed the following truncation issues:

If the Primal 'Project' box was unchecked with a truncated sphere, vertices on
the Primal truncation plane remained on the envelope boundary. A truncated
Primal may now be "unprojected" as in earlier releases.

Fixed model extent issues for truncated Primals with X and Z extents < 1.0

Redesigned Truncation window so that Range Adjust by Theta shows the Y value
for 'New'.
================================================================================
Geodesica-SFX-OpenGL-0-9-8-8 Codename: Notre-Dame     [Uploaded on 06 Sept 2018]

Truncate window
Revamped for a clearer UI syntax.

Fixed bug where the adjustment would reset if 'Project Adjustment' was ON and
'Truncate after adjustment' was OFF.

CRITICAL RANGE ADJUST / TRUNCATE BUG FIX
There was truncation plane bug introduced in a previous release whereby the
spherical coordinate was not set to the virgin state. This meant successive re-
projections of the sphere caused incremental changes of truncation plane
radii. I have no explanation of how this bug was introduced, as the file in
question has not been altered since the working version. However a line of code
was deleted. My development computer is kept offline so it cannot be hacked.
But there are ways of jumping between computers with Flash cards. I have tested
the fix in 0-9-8-8 by changing envelopes (which incurs a re-projection).

The following Range Adjust Truncate was tested:

A 5V Icosahedral subdivision, class I, Method 1.
Range truncate theta values were:
Min: 107
Max: 110
New: 109.49915455

Envelope: Ellipsoid
Envelope extents:
X = 1
Y = 1
Z = 1
All spherical coordinate radii on truncation plane = 1 [Correct]

Changed envelope extents:
X = 1
Y = 1.1
Z = 1
All spherical coordinate radii on truncation plane = 1.00872260 [Correct]

Changed Envelope: Egg of revolution, Type 1
Envelope extents:
X = 1
Y = 1.1
Z = 1
All spherical coordinate radii on truncation plane = 1.00059119 [Correct]

Changed Envelope: Egg of revolution, Type 3
Envelope extents:
X = 1
Y = 1.1
Z = 1
All spherical coordinate radii on truncation plane = 1.01137625  [Correct]
--------------------------------------------------------------------------------
CRITICAL DUAL OFFSET FIX FOR DUAL VERTICES ON TRUNCATION PLANE

Fixed code so that Dual offset vertices around the truncation plane lie on the
envelope. Tested using Primal Ellipsoid envelope with a Dual offset of 0.1

A 5V Icosahedral subdivision, class I, Method 1.
Range truncate theta values were:
Min: 107
Max: 110
New: 109.49915455

All Dual offset vertices around the truncation plane have the following values:

Theta: 107.66482439     [Correct]
Radius: 1.1             [Correct]
Y value: -0.33379295    [Correct]

Same as above but with a negative offset of -0.1...
All Dual offset vertices around the truncation plane have the following values:

Theta: 111.76996450    [Correct]
Radius: 0.9            [Correct]
Y value: -0.33379295   [Correct]

The offset for a Dual vertex on a non-equatorial truncation plane is always
greater than the envelope offset; previous code did not account for this.
--------------------------------------------------------------------------------
Envelopes Window
Keep Truncation Y is now working again after the above corrections.

Redesigned UI and callback mechanism for the Envelope Choice and Extents. User
must now click the 'Apply' buttons to update the envelope. This consolidates
input checks and prevents illegal entries without interferring with user input
when a zero is entered as the first digit.

When extents are changed user must click 'Apply Exents' or press the 'Enter'
key.

Added warning icons with info for illegal inputs.
--------------------------------------------------------------------------------
OpenGL window
Fixed change camera bug when user right-clicks in a viewport to select a new
camera; previously, if the selected camera name on the pop-up menu entered
an adjacent viewport, that viewport's camera was erroneously changed instead.

Removed idle callback to make application more friendly to background processes.
Windows Task Manager now shows zero load on CPU when application is idling.
--------------------------------------------------------------------------------
Prefs window - Colours tab
Revamped with new Colour Mode choice pop-up menu. The modes available are:

   1. AuoCAD 8bit 256 colour ramp.
   2. FLTK 8bit 256 colour ramp.
   2. FLTK 24bit colour wheel.
   4. X11 533 named colour swatch.
   
When 4 is selected the named colour is shown in the log for Isolate groups.

Moved 'Deselect after changed colour' and 'Deselect after making Trifans' to
the 'Select' menu.
--------------------------------------------------------------------------------
Isolate Logging
Consolidated logging options when isolating vertex sets; the options are now
presented in a dialog that appears after clicking on a vertex. User can select
between 'Basic Logging' and 'Connectivity Logging'.

If 'Basic Logging' is selected, the 'Flip Symmetric Hubs' option activates.
If 'Connectivity Logging is selected, the 'Print Hub Variants' option activates.

Previously these options were dispersed between the 'Hubs' tab of the Prefs
window and the 'Output' menu of the Log window.

Improved formatting and justification for Isolate set logging so that the Group
name and Quantity does not shift the Measurement line to the right. If using the
new X11 colour swatch mode, the colour name is appended to the group. Eg:

UNIQUE EDGES
  Scale Factor = 10.000000000
         Units = Feet and Inches
TsQEIcosahedron 9V, Class I, Method 1
  Primal Lattice
   Total edges = 2430
   Unique Edges = 18
    Edge    Quantity     Length
     E1     [60]         1.054423137 Feet or 12.653077644 Inches. Yellow
     E2     [120]        1.140069810 Feet or 13.680837720 Inches. PaleGoldenrod
     E3     [60]         1.172755411 Feet or 14.073064932 Inches. OrangeRed
     E4     [120]        1.222673764 Feet or 14.672085168 Inches. PaleVioletRed1
     E5     [60]         1.237824865 Feet or 14.853898380 Inches. DeepSkyBlue
     E6     [120]        1.262439835 Feet or 15.149278020 Inches. Brown1
     E7     [60]         1.274848509 Feet or 15.298182108 Inches. SandyBrown
     E8     [120]        1.293235180 Feet or 15.518822160 Inches. DarkSlateGrey2
     E9     [120]        1.301733301 Feet or 15.620799612 Inches. AntiqueWhite
     E10    [240]        1.341548928 Feet or 16.098587136 Inches. LightBlue1
     E11    [180]        1.345045420 Feet or 16.140545040 Inches. OliveDrab3
     E12    [240]        1.359629413 Feet or 16.315552956 Inches. LimeGreen
     E13    [90]         1.370182028 Feet or 16.442184336 Inches. DarkOliveGreen
     E14    [120]        1.398903564 Feet or 16.786842768 Inches. Tomato3
     E15    [240]        1.414016570 Feet or 16.968198840 Inches. VioletRed
     E16    [240]        1.424566791 Feet or 17.094801492 Inches. LemonChiffon
     E17    [120]        1.454552174 Feet or 17.454626088 Inches. Gold
     E18    [120]        1.458435017 Feet or 17.501220204 Inches. DarkSalmon

    Total edges = 2430
    
Fixed bug where menu labels were left checked if user bailed out.
--------------------------------------------------------------------------------
Attributes Window
Added Label visibility toggles to save user having to plough through the Labels
menu. These work in synch with the items in the Labels menu.
--------------------------------------------------------------------------------
Other fixes and improvements:
   1. Tweaked and improved the 'Auto Fog Depth Cue'.
   2. Tweaked and improved the AutoCAD color select window.
   3. Fixed some colour preference bugs.
================================================================================
Geodesica-SFX-OpenGL-0-9-8-6 Codename: SqueazePipe     [Uploaded on 13 Aug 2018]
Geodesica-SFX-MesaGL-0-9-8-6 Codename: SqueazePipe     [Uploaded on 13 Aug 2018]

Attributes Window

Added GL_POLYGON_MODE menu choice to the Struts and Hubs panels. The menu has 
three items:

   GL_FILL    // Solid rendering
   GL_LINE    // Wireframe
   GL_POINT   // Vertices only.
   
When GL_POLYGON_MODE for Hubs is set to GL_LINE, the strut ingress (if set above
zero), can be visualized.

Added Back Face Culling toggles for Cells, Struts and Hubs.
--------------------------------------------------------------------------------
Preferences Window - OpenGL Tab.

Revamped for GL_POLYGON_MODE during Trackball or Camera Transformation.
When rotating the trackball or moving the camera, the GL_POLYGON_MODE for Cells, 
Hubs and Struts is changed to the setting on the OpenGL tab of the Preferences
window. This speeds up the frame rate. When the motion has finished, and the
mouse is released, the elements are rendered according to the GL_POLYGON_MODEs
settings on the Attributes window.

Depending on build type (OpenGL or MesaGL), changed the multi-sampling warning
message to either: "Multisampling not supported by the software renderer" or 
"Multisampling not supported by the graphics card".
--------------------------------------------------------------------------------
Fog Window

Added a 'Defaults' button to quickly reset the depth cue, apply function,
density function and density value.

Added an AUTO checkbox
When checked, the fog depth (Start and End) automatically recomputes when the
camera position changes. This ensures the fog depth cue remains constant as the
camera moves in and out of the scene, and saves manual reconfiguration of the
depth cue for each camera location.
--------------------------------------------------------------------------------
MesaGL Improvements.

Updated the OpenGL32.dll software renderer to fix some bugs in the fog depth cue
when drawing vertices.
--------------------------------------------------------------------------------
Critical bugfixes

Fixed bug that would crash the application on quitting if the camera was not
set to Orbiter.
================================================================================
Geodesica-SFX-OpenGL-0-9-8-4 Codename: SqueazePipe     [Uploaded on 04 Aug 2018]
Geodesica-SFX-MesaGL-0-9-8-4 Codename: SqueazePipe     [Uploaded on 04 Aug 2018]

Fixed critical bug in Rotate Zenith that would hang the application if struts
and hubs were visible. Struts and Hubs are now turned OFF before applying the
operation.
================================================================================
Geodesica-SFX-0-9-8-3 Codename: SqueazePipe            [Uploaded on 03 Aug 2018]

Geodesica-SFX now comes in two builds:

1. Geodesica-SFX-Mesa
2. Geodesica-SFX-OpenGL

Geodesica-SFX-Mesa uses software rendering rather than the accelarted hardware
rendering of the graphics card.

Only use Geodesica-SFX-Mesa if Geodesica-SFX-OpenGL does not run on your PC.
Whilst Godesica-SFX-Mesa is slower than Geodesica-SFX-OpenGL, it is still
perfectly usable for moderate frequencies (up to 10V).
--------------------------------------------------------------------------------
Made various tweaks to the sources so that the Fog Depth Cue, Ground plane and
near camera frustum all worked correctly with the software renderer.
================================================================================
Geodesica-SFX-0-9-8-2 Codename: Underhill              [Uploaded on 20 Jul 2018]

1. Modify menu bug fixes for:

   a). Project Target A Primal Trifan Centroids to Target B Dual Vertices
   b). Project Target B Primal Trifan Centroids to Target A Dual Vertices
   
   An error dialogue now appears if the Dual is not generated for the
   projection target.
   
   c). Project Target A Dual Trifan Centroids to Target B Primal Vertices
   d). Project Target B Dual Trifan Centroids to Target A Primal Vertices
   
   If the Dual has not been generated for the projection target, the Primal
   vertices are not assigned their corresponding Dual trifan centroid IDs;
   consequently, the projection fails. The fix entails switching to the
   projection target, generating the dual, and then turning it off again.
   In this instance, no user message need be given.
   
   e). Project Selected Dual Vertices to Primal Envelope
   f). Project Selected Dual Vertices to Dual Envelope
   
   Fixed bug introdued in previous version where the selection was reprojected 
   back to the Dual envelope when 'Project to Envelope' was ON in the Dual tab 
   of the Envelopes window. NOTE: the moment the Dual is reprojected via another 
   process, the selected vertices _will_ get reprojected back to the Dual 
   envelope.
--------------------------------------------------------------------------------
2. Envelopes Window

   Improved error handling for XYZ Model Extents and Actual Extents inputs: when
   entering an illegal value, a clamped value is used instead.
--------------------------------------------------------------------------------
3. Fog Window

   Made Fog settings persistent.
================================================================================
Geodesica-SFX-0-9-8-0 Codename: Underhill              [Uploaded on Jul 07 2018]

New Symmetry Map Window for Quad-Edge Mode.

Long time users of Geodesica will be familiar with the Symmetry Map window which
was rescinded with PPT Mode. The Map has now been re-implemented for use in
Quad-Edge mode with higher resolution maps.

1. Click on a PTT within the map window to toggle its visibilty.
2. Hold down the 's' key and click on a PPT to split it down the median.
3. Hold down the 'w' key to weld the PPT back together.

   NOTE: Unless the envelope is a unit sphere, the above operations are best
   performed with 'Project to Envelope' OFF. You can re-project the vertices
   after splitting/welding the PPT's.
   
   Alternatively, work on the unit sphere and check 'Project bisection points'
   in the Symmetry Map Window.
   
   To split all PTTs click the button 'SPLIT ALL'
   To weld all PPTs click the buttom 'WELD ALL'
   
   Wrote documentation for this feature:
   www.neolithicsphere.com/geodesica/doc/symmetry_maps.htm
--------------------------------------------------------------------------------
Ensured app is locked when changing between Class I and Class II spheres.
================================================================================
Geodesica-SFX-0-9-7-4 Codename: Underhill              [Uploaded on Jun 12 2018]

1. Now locks renderer when switching base polyhderon; previously hubs and struts
   would redraw progressively around the sphere which became slow at higher
   frequencies. (This problem was introduced after implementing the new progress
   window). 

2. Fixed bug where certain hub mesh normals were not normalized during OBJ
   export. Tested new OBJ export code.

3. Added strut generation hint to the Struts and Hubs window when selecting
   flange type hubs.
   
3. Updated relevant code sections to point to the new home page.
================================================================================
Geodesica-SFX-0-9-7-3 Codename: Underhill              [Uploaded on Mar 13 2018]

1. Improved feedback during build so that Fl::check() does not destabalize
   program during lengthy operations. Progress bar is now a modal window that
   pops up during strut and hub generation. Status bar at bottom of view
   provides pick feedback as before.
   
2. When changing frequency, windows deactivate to prevent multiple threads from
   being initiated.
   
3. Vastly improved quad-edge build time for high frequency spheres. A 20V
   icosahedron and its dual will now build almost instaneously.
================================================================================
Geodesica-SFX-0-9-7-2 Codename: Underhill              [Uploaded on Mar 07 2018]

1. Bug fix for smoothing truncated Primal manifolds.
   The truncation plane trifan is now removed before smoothing and re-created
   afterwards; in addition, if the the 'Make dual sit flat' option is ON, then 
   the truncation bisectors are deleted before smoothing and inserted again
   afterwards.
   
   NOTE: This is an emergency patch, and has not been extensively tested; if you
   encounter problems, you can still smooth manually be following the steps
   on the documentation page 'How to Smooth a Truncated Primal Manifold' at:
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/targets_example_4.htm
   
   The fix essentially automates the steps outlined at the above link.
   
   Remember: if you are smoothing extrusuions, you will only see the result
   when 'Project to Envelope' is OFF - otherwise the smoothed vertices will
   get projected to the envelope.
================================================================================
Geodesica-SFX-0-9-7-1 Codename: Underhill              [Uploaded on Mar 05 2018]

1. Star Flange Hubs
   The Star Flange code has been updated so that flanges use the same hub 
   intersection planes as the struts; this removes the need for shifting 
   spaceframe struts up and down the hub axis since stuts can now be attached to 
   the top or bottom of the hub core. Fixed bug that caused crash when 
   generating certain cross-target configurations.
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/strut_hub_intersections_2.htm
   
   Two new check boxes on the Star Flange Hubs panel:
   
    [x] Use Strut Width
    [x] Use Strut Height
      
   Wnen checked, the flange mortices adjust to the strut dimensions; this means
   each strut type (primal, dual, or spaceframe variant) can have a different
   cross section profile, and the flanges will adapt accordingly.
   
   Fixed winding order bug when building flanges.
   
   IMPORTANT: Strut/Hub intersection must be ON when using Star Flange Hubs,
   and this is now the default for all [Edge] type struts.
   
   IMPORTANT: Because Star and Ring Flanges now use the intersection planes of
   theirr respective struts, Strut generation must be ON or the flanges will not
   get built.
--------------------------------------------------------------------------------
2. Envelope Window
   If spaceframes are generated before showing window, a request is made to turn 
   them OFF.
--------------------------------------------------------------------------------
3. Spaceframe code
   Re-designed linkage mechanism so that more than two spaceframe types can be 
   logged at a vertex. Number of loggable spaceframe types at a vertex is now 
   limited only by the available memory. This fixes an intermittent ANALYSE bug 
   where the wrong spaceframe edges were retrieved for a clicked vertex. Fixed 
   bug where labels would not get shown if the number of spaceframe edges at a 
   vertex was greater than the number of non-spaceframe edges.
--------------------------------------------------------------------------------
4. Status bar
   Removed the 'Bailout' button. Long operations are now cancelled with the
   'Escape' key.
--------------------------------------------------------------------------------
5. Fixed ANALYSE bug for hubs on truncation plane so that labelling always
   starts with the horizontal right-most edge, as seen from the exterior of the
   sphere, e.g.:
                                C       B
                                 \     /
                                  \   /
                                   \ /
                            D-------o------A
                         
   This ensures that when spaceframe edges occupy the intervening spaces, a
   consecutive order is maintained because the truncation radial always comes
   last.
   
   Fixed ANALYSE bug that might have caused a crash when only one spaceframe 
   edge was found at the clicked vertex.
--------------------------------------------------------------------------------
6. Log Window menu
   Added checkbox item 'Omit Truncation Radials'; if checked, truncation
   radials are excluded when using the ANALYSE functions 'Angles at a Vertex'
   and 'Edges at a Vertex'; if unchecked, user may click on the primal's
   truncation plane trifan center and obtain angle/length data for radials;
   alternatively, the truncation radial will be included when analysing vertices 
   on the truncation plane perimiter.
--------------------------------------------------------------------------------
7  Trifan Window
   Fixed selection bug when making trifans for selected Dual cells: the cells 
   were de-selected after performing the Primal/Dual swap, so the operation 
   failed.
   
   Added option to trifan illegal cells such as those on the truncation plane,
   with a warning dialogue when the user elects to trifan such a cell. The
   option is implemented as a 'Censor' box on the Trifan UI with two radio 
   buttons: 'Ignore illegal cells' and 'Ask every time'.
--------------------------------------------------------------------------------
8. Reduced executable size by stripping out old PPT code that was lying latent
   within the source.
--------------------------------------------------------------------------------
9. Stability Issues.
   The program appears stable when not using the experimental feature 'Swap
   Primal and Dual. The feature is only intended for minimal operations, such
   as those described here:
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/exotic_spaceframes_swap_dual.htm
   
   Please note that Status bar feedback for the build process (which was
   introduced in 0-9-6-1) has now been removed due to stability issues which 
   were caused by calling Fl::check() during critical states.
================================================================================
Geodesica-SFX-0-9-6-9 Codename: Stella                            [Not released]

1. Star Flange Hubs
   The code has been updated so that flanges use the same intersection planes
   as the struts. This removes the necessity for shifting spaceframe struts up 
   and down the hub axis since struts can now be attached to the top or bottom
   of the hub cylinder.
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/strut_hub_intersections_2.htm
   
2. Envelope Window
   This is mow a modal window. Dragging the mouse in an input field has been
   disabled; the only way to change a field's value is to type it manually.
================================================================================
Geodesica-SFX-0-9-6-8 Codename: Stella                 [Uploaded on Feb 08 2018]

1. AutoCAD Color Index mode.
   Implemented new colour chooser dialogue with a pallette that matches the
   AutoCAD colour index system.
   
   Set the colour mode on the Colour tab of the Preferences window:
   
   ACI = AutoCAD index 256 8 Bit colour
   CW  = Colour Wheel  24 bit colour (or max depth of graphics card).
   
   Important: You must regenerate the Random Colour Set after switching modes.
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/colours.htm
   
   The advantage of using ACI mode comes when exporting DXF files. If you choose
   to layer by Group in the 'Advanced DXF' options window, then the LAYER
   colours will match the Isolate Group colours; thus the DXF model will look
   exactly the same as it does in Geodesica-SFX.
   
   If a group colour is not found in the ACI Index table, then a default colour
   will be used as the LAYER colour. The default colour index is given by an
   counter value that increments whenever a new LAYER is created. When the
   counter reaches 255 it is reset to 0.

   Added an info message after saving a DXF file which informs user of the LAYER
   quantity.
--------------------------------------------------------------------------------
2. Fixed non cross-target Spaceframe bug where the Target was not restored after
   a temporary switch. This caused an 'Undefined Hub Normal' error dialogue to 
   appear repeatedly during strut generation. The bug only appeared with certain
   Spaceframe combinations and when the original Target had been changed by the
   user.
--------------------------------------------------------------------------------
3. Silenced the cross-target spaceframe warning dialogues. Face and Vertex
   counts in the resepective lattices now ignore truncation plane faces and
   truncation center vertices. A warning appears only when the pseudo Duality is
   violated but this does not necessarily signify an error. For example, 
   consider the following case:
   
   TARGET A V4 ICOSAHEDRON with generated trifans, truncated at Theta = 90.
   TARGET B V4 ICOSAHEDRON trunacted at Theta = 90 with 'Make Dual sit flat'
   
   The user now requests the spaceframe type:
   
   'Taget B Dual Cell to Target A Primal Vertex'
   
   A warning dialogue will appear:
   
   Face Quantity = 91
   Vertex Quantity = 251
   
   The Primal Vertex Quantity of Target A is not equal to the Dual Face quantity
   of Target B because the primal lattice of Target A is trifanned. However, the
   spaceframe will form correctly because trifan centroids are ignored during
   generation.
--------------------------------------------------------------------------------
4. Improved Logging output for Primal and Dual Lattice data so that it includes
   truncation bisector quantity and truncation plane face quantity. Eg:

   MODE: QuadEdge. Primal Data.
   Primal lattice:
      Total Vertices  = 112
        Non Degenerate vertices = 112
        Degenerate vertices     = 0
        Truncation bisectors    = 20
      Total Edges = 290
        Non Degenerate edges = 290
        Degenerate edges     = 0
      TotalCells = 180
        Non Degenerate cells      = 180
        Degenerate cells          = 0
        Cells on truncation plane = 20
   Primal lattice satisfies Euler's formula V - E + F = 2
================================================================================
Geodesica-SFX-0-9-6-7 Codename: Stella                 [Uploaded on Feb 05 2018]

Spaceframe generation issue in Truncated Primal Manifolds:
'Target B Primal Cell to Target A Primal Trifan Centroid'.

Truncation bisector vertices are now ignored when 'Make Dual Sit Flat' is ON;
(i.e., there is no longer a spaceframe edge at the truncation bisector vertex).
Normally, one should not be using 'Make Dual Sit Flat' with this spacframe type,
but the corrected code now accounts for all criteria.
================================================================================
Geodesica-SFX-0-9-6-6 Codename: Stella                 [Uploaded on 03 FEB 2018]

1. DXF Export XDATA
   Ensured that layer names do not exceed 31 characters.
   Fixed XDATA omission for spaceframe strut, where the  Org and Dest Hub must
   be swapped, depending the Target lattice of origin.
   When adding STRUT CONNECTIONS XDATA for a HUB, appended INFO for a hub mesh
   that was turned off via hub's context menu.
   Added colours for Layers.
--------------------------------------------------------------------------------
2. Fixed Spaceframe strut generation bug for:

   Target B Primal Vertex to Target A Primal Vertex
   Target B Dual Vertex to Target A Dual Vertex
   
   This bug was introduced in a previous update.
--------------------------------------------------------------------------------
3. Labels Prefs
   Added label prefs for EPD Spaceframe types.
================================================================================
Geodesica-SFX-0-9-6-4 Codename: Stella                 [Uploaded on 31 JAN 2018]

1. DXF Export XDATA
   Completely revised and updated to include XDATA (Extended Entity Data).
   Now writes an audited DXF R12 file with the option to export ENTITIES only.
   
   New DXF Tweaks window with XDATA switches for Hub connections, Strut
   compound mitre angles, e.t.c.
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/export_dxf_sfx.htm
--------------------------------------------------------------------------------
2. Navigator
   Changed default FOV and postiion for all cameras so the model is bigger in
   the view.
--------------------------------------------------------------------------------
3. Utility Window
   Added 'Hands', 'Cables', 'Chains' and 'Links' to the Length conversion tab.
================================================================================
Geodesica 0-9-6-3k-win32 Codename: Bentham                         [25 JAN 2018]

1. Fixed limitation cited in Section 9 of Release note for 0-9-6-1-win32.
   If Strut and Hub generation are on when changing Frequency, Struts will now
   correctly intersect _shifted_ Hubs.
================================================================================
Geodesica 0-9-6-3j-win32 Codename: Bentham                         [24 JAN 2018]

1. UNICODE
   Enabled Unicode filenames for export. Your system must support Unicode.
   How to install Unicode on legacy versions of Windows is documented on the
   internet.

2. DXF EXPORT
   Improved the clarity of the UI, implemented previoulsy disabled features, and
   extended the naming of elements in the DXF file.
   
3. Fixed bug in OBJ export where invisible cells were not ignored.

   Tested file export into folders with Cyrillic, Chinese, Hebrew and Arabic
   character names.
================================================================================
Geodesica 0-9-6-2-win32 Codename: Epiphany                         [14 JAN 2018]

Unicode enabled file export. This has not been extensively tested but writes 
unicode file names.

NOTE: Because OBJ files are ASCII only, they cannot contain a material library
file with a unicode name. My work around was to assign material library files a
unique random number so that existing mtl files in the same directory do not get
over-written (e.g. 'MatLib_48060.mtl').

INSTALL

   This is a binary exe only distribution. To run the program, you must download
   the full distribution Geodesica 0-9-6-1-win32 and copy the exe file into the
   root folder so that the Data folder is accessible to the program.
   
1. If you have not already done so, download Geodesica-SFX-0-9-6-2-win32.zip.
2. Expand Geodesica-SFX-0-9-6-2-win32.zip onto your hard drive
3. Download the binary only distribution Geodesica-SFX-0-9-6-2-win32.zip
4. Expand Geodesica-SFX-0-9-6-2-win32.zip onto your hard drive.
5. Open the folder 'Geodesica-SFX-0-9-6-2-win32' and move the exe file into
   the root folder 'Geodesica-SFX-0-9-6-1-win32'
6. To write unicode file names, Geodesica-SFX-0-9-6-2-win32.exe should be used
   instead of Geodesica-SFX-0-9-6-1-win32.exe
================================================================================
Geodesica 0-9-6-1-win32 Codename: Epiphany                         [10 JAN 2018]

1. MODIFY MENU
   
   Three new menu items have been added:
   
   Split
   Split | Make Edges
   Splite | Make Edges | Truncate Corners
   
   These were implemented as part of a generalised 'Smooth' algorithm which is
   specifically to smooth Dual manifolds and so create the required geometry for
   'Eden Project' type domes. However, these topological operations may be
   applied to either the Primal or Dual. These new features are documented at:
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/smooth.htm
   
   NOTE: The menu items 'Truncate / Range Adjust...' and 'Set Envelopes...' have
   been removed. These operations are now initiated by two new buttons on the
   far left of the Toolbar: 'E' (Envelopes) and 'T' (Truncate).
   
   Swap Primal and Dual
   This menu item, which first appeared as an experimental feature in 0-9-2-4,
   and was later removed due to stability issues, has now re-appeared.
   Stability issues have hopefully been resolved.* You can now use all the
   Modify tools on the Dual manifold (previoulsy, the Modify tools could only
   be used on the Primal manifold). Note that when you swap the Primal and Dual,
   as far as Geodesica is concerned the Dual is the Primal, so to change the 
   attributes of what was previously the Dual, you must use the 'Primal' tab of
   the Attributes Window. Likewise for the Envelopes window.
   
   NOTE 1: When you switch the Base Polyhderon, the Primal and Dual are swapped
   back to their initial state; this is so that the Geodesic subdivision is
   always carried out on the Primal manifold.
   
   NOTE 2: When changing Targets, the swap state updates to reflect the current
   Target; the visual reference is very helpful in this instance.
   
   * WARNING: The 'Swap Primal and Dual' feature is still experimental and may 
     not be 100% stable in all cases.
     
     TIP: Perform 'swapped' modelling operations on *non truncated spheres*. 
     When finished, swap back, truncate and proceed as before.
--------------------------------------------------------------------------------
2. TOOLBAR

   MODIFY TAB
   1. Two new tools: EXTRUDE and CUPOLA. These are documented at:
   
      http://myweb.tiscali.co.uk/oaktree/geodesica/extrude.htm
      http://myweb.tiscali.co.uk/oaktree/geodesica/cupola.htm
      
   2. Two new buttons at the far left (below the Base Polyhderon buttons):
      'E' for Envelope, and 'T' for Truncate. These perform the same functions
      as the old menu entries in the 'Modify' menu, which have been removed.
   
   3. UNITS CHOICE
      You can now specify units in Inches or Centimeters when entering values
      for stellations, extrusions, splits, e.t.c.
   
   SWAP PRIMAL DUAL BUTTON*
   A new toggle button for swapping the Primal and Dual. When swapped the button
   turns yellow. This provides instant visual reference to the swapped state
   rather than having to refer to the check button in the Modify menu. The
   button appears as a vertical strip with two arrows and is located beside the
   'P' and 'D' pick buttons.
   
   * WARNING: The 'Swap Primal and Dual' feature is still experimental and may 
     not be 100% stable in all cases.
     
     TIP: Perform 'swapped' modelling operations on *non truncated spheres*.
     When finished, swap back, truncate and proceed as before.
--------------------------------------------------------------------------------
3. VERTEX AND HUB CONTEXT MENUS
  
   When picking Vertices or Hubs, hold down the ALT key and click the right
   mouse button. A context menu appears allowing you to:
   
   1. Set the Hub normal type.
   2. Turn Hub generation ON or OFF.
   
   These options were added after implementing extrusions and cupolas, and allow
   you to re-orientate hubs or turn them OFF at specific vertices. This feature
   is documented at:
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/hub_context_menu.htm
   
   You must set the hub normal to use the 'Facet Average Normal' option for hubs
   that lie on multiple extrusions when the option 'Project struts ends to Hub 
   Intersection Plane' in ON.
   
   To verify, selected hubs are now drawn with their normals.
--------------------------------------------------------------------------------
4. ANALYSE STRUT

   Completed compound angle logging for the following struts types:
   
   EStrutType_Cylinder_Hollow_Edge
   EStrutType_Cylinder_Solid_Edge
   EStrutType_Diamond_Square_Hollow_Edge
   EStrutType_Diamond_Square_Solid_Edge
   EStrutType_Ellipse_Solid_Edge
   EStrutType_Polygon_Solid_Edge
   EStrutType_Rectangle_Hollow_Edge
   EStrutType_Rectangle_Solid_Edge
   EStrutType_Square_Hollow_Edge
   EStrutType_Square_Solid_Edge
   EStrutType_Triangle_Solid_Edge
   EStrutType_Tetragon_Mitred_Butt_Face
 
   Modified strut angle computations to account for hub axis shift.
   
   Updated documentation for compound mitres:
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/compound_mitres.htm
--------------------------------------------------------------------------------
5. LOG MENU

   Updated File opertions to use the Native file chooser, and ensured that the 
   default extention when doing 'Save As' is 'txt'.
--------------------------------------------------------------------------------
6. HUB & STRUT INTERSECTIONS

   Struts now intesect ACTUAL SURFACES of the hub. It is up to you to ensure
   that hub suface is large enough for the strut to intersect. Alternatively,
   check the new option 'Elongate Hub Intersection Cylinder' which uses an
   Infinite hub cylinder to avoid intersection errors for all hub types.
   
   Updated documentation at:
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/strut_hub_intersections.htm
--------------------------------------------------------------------------------
7. BUGFIXES

   KillEdge and KillVertexEdge
   Fixed bug where the QuadEdge entry was deleted unecessarilly. This caused an
   intermittent crash when modelling on the Dual or when swapping manifolds.
   
   Remember you can only model on the Primal. So to model on the Dual, you must
   first select the menu item 'Swap Primal Dual'. Be sure to swap back when you
   are done.
--------------------------------------------------------------------------------
8. IMPROVEMENTS

   1. Improved QuadEdge code for deleting vertices in the manifold: this means
      truncations, bevels and trifan deletions are much faster.
   
   2. Improved the Status bar feedback during the build process.
   
   3. Improved status bar feedback during OBJ export
   
   4. Improved build logic so that Dual does not get rebuilt unecessarily.
--------------------------------------------------------------------------------
9. CURRENT LIMITATIONS

   Flange, Ring and Star Flange Hub types were designed for spherical convex
   hulls and are not suitable for use with Cupulas and Extrusions. Please use
   Cylinder or Sphere type hubs instead.
   
   If strut generation is ON when changing Frequency, and you have applied a Hub
   Axis Shift, you must re-generate the struts again AFTER changing frequency by
   clicking 'Apply Struts' in the 'Struts and Hubs' window. Doing this will
   ensure that struts intersect correctly with the shifted hubs.
--------------------------------------------------------------------------------    
Release notes for Geodesica 0-9-5-8-win32                 [Uploaded 20 NOV 2017]

1. ISOLATE SET COLOUR GENERATOR

   You can now set colours for Isolate groups on the ‘Colours’ tab
   of the ‘Preferences’ window.
  
   Click the ‘GENERATE’ button to generate a new set of random
   colours, or fine tune the generated set by clicking on the colour wells.
   There are enough colours for 68 groups, which should be more than enough in
   most instances. When the number of Isolate groups exceeds 68, a random colour
   is generated for the element.
    
   When the radio button ‘Use generated colors’ is ON, the generated
   colours will be used for all Isolate sets (Faces, Struts, Hubs,
   etc). When the radio button ‘Use random each click’ is ON, a new
   array of random colours is generated every time you click an element with the
   Isolate tool. (This was the default behaviour for previous versions). The
   Isolate Set colours are persistent and saved to the prefs.
--------------------------------------------------------------------------------
2. COLOUR SELECTION

   Changed all colour-well selectors to use the FLTK standard RGB color chooser.
   (The previous behaviour was to display a pop-up 256 colour map).
--------------------------------------------------------------------------------
3. BUGFIXES

   1. Fixed Labels menu bug where the Strut menu item was not checked after
      doing an Isolate Struts operation.
================================================================================
Release notes for Geodesica 0-9-5-6-win32                 [Uploaded 16 NOV 2017]

1. NEW ISOLATE ID SYSTEM

   Two separate Element IDs are now in use.
   
   The implementation of Cross-Target spaceframes requires identical IDs in both
   targets. The drawback is that the inventory contains duplicate IDs.
   For example a Face in Target A must have the same ID as its duplicate Face in
   Target B. Further, a Hub in the Dual of Target A must have the same ID as its
   correspodning Face in the Primal of Target B.
   
   Whilst the Quad-Edge ID system encapsultes the duality of the system, and is
   useful for identifying cross target correspondances, it is not entirely
   practical for production purposes. The reason being that duplicate IDs exist
   in simultaneous targets. So identifying a component by its ID alone,
   without previous knowledge of the Target and manifold (Primal or Dual) soon
   becomes impossible. (Imagine a yard full of cut struts for a Dual target
   system).
   
   To fix this, another ID system has been implemented which is guaranteed
   unique across all elements in the system. The old ID system is still in
   effect, working under the hood, to make cross-target spaceframes possible.
   But now a unique 'Isolate ID' appears alongside it in the Log. This new
   Isolate ID should now be used to identify and isolate components.
   
   For example, the log now outputs information like this:
  
        TsQEIcosahedron
          Primal_E_A
        
         QUAD EDGE
          Scale Factor = 10.000000000
                 Units = Feet and Inches
          Edge Label: ?
          Edge    QE_ID: 137
                  UN_ID: 4560
                  Length =  3.486154888 Feet or 41.833858658 Inches.
            Org   QE_ID: 2
                  UN_ID: 4377
            Dest  QE_ID: 17
                  UN_ID: 4557
             Left face QE_ID: 20
                       UN_ID: 4528
            Right face QE_ID: 29
                       UN_ID: 4939
                       
   IDs that begin with 'QE_' are the original Quad-Edge IDs that encapsulate the
   duality of the system.
   
   IDs that begin with 'UN_' are the Unique IDs and are guaranteed so for the
   lifetime of the application (UN_IDs start at zero each time the application
   is launched).
   
   NOTE: The Look-At feature in the Log window now requires that you enter the
   UN_ID instead of the old QE_ID. The menu items have been updated and now
   include a 'Search All' item. When this is selected, Geodesica will search the
   entire scenegraph in both Targets for the UN_ID. If the element is found, the
   Target is made visible (whilst the other Target is hidden); the element is
   then selected with billboards or markers. If the element is in the Dual, the 
   Primal faces will be hidden, and vice-versa. If the element is within the
   Spaceframe node, the relevant node will be selected in the Spaceframe pop-up
   on the Attributes window.
   
   It is possible the QE_IDs will be removed from the Log output in future, but
   for the time being, they remain as a development reference.
--------------------------------------------------------------------------------
2. ISOLATE STRUTS (as opposed to EDGES).
   
   When you select 'Strut' on the Isolate tab and click on a strut, you are
   presented with a 'STRUT DIMENSIONS' modal dialogue. This offers three options
   for calculating strut lengths:
   
   A. Length of original quad-edge
   B. Length of strut's center line.
   C. Length of strut's outermost edge (as seen from the system center).
   
   NOTE: Option two is disabled for Face Type struts.
    
   Which length option you choose for deriving the Isolate set will depend on
   your own particular design and production process (eg how your mitre-saw is
   configured, etc).
   
   Added documentation to explain this feature:
   
   http://myweb.tiscali.co.uk/oaktree/geodesica/strut_hub_intersections.htm
--------------------------------------------------------------------------------
3. PREFERENCES WINDOW

   Labels Tab
   Added a new slider control to scale the "Pick Vertex" spheres (these include
   the yellow 'highlight' sphere that selects the nearest vertex as you move the
   mouse, and also the red spheres used when measuring). The reason for adding
   this feature was to reduce the pick-sphere size when an element is close to
   the camera's near fustrum plane; specifically, strut vertices become crowded
   at the mitred ends, and this allows a more accurate selection.
   
   Note: a future version will may have an 'auto' option where the labelling
   system is scaled by factoring in the length of the pick ray.
--------------------------------------------------------------------------------
4. BUGFIXES

   1. Fixed bug that sometimes flagged a warning dialogue when turning off
      the menus 'Generate Struts' or 'Generate Hubs'.
      
   2. ANALYSE tool: 'DISTANCE BETWEEN TWO POINTS'.
      Fixed bug where the precision was applied before multiplication by the
      Unit Radius Scale Factor. This tool will now correctly measure strut
      widths with small dimensions.
      
   3. ISOLATE TABS: Edges and Struts. Same bug as in 2: the precision was
      applied before multiplication by the Unit Radius Scale Factor.
      A comparison of results showing the old and new code is given below:
      
      <----------------------------------------------------->
      First, the old code with the bug:
      
        UNIQUE EDGES
          Scale Factor = 10.0000000000
                 Units = Feet and Inches
        TsQEIcosahedron 5V, Class I, Method 1
          Primal Lattice
           Total edges = 750
        
        TsQEGEdges::GetUnique. Bisector insertion count = 0
           Unique Edges = 9
           Edge   Quantity     Length
            E1 =   [60]          1.9814743080 Feet or 23.7776916960 Inches.
            E2 =   [120]         2.2568578660 Feet or 27.0822943920 Inches.
            E3 =   [60]          2.3159759560 Feet or 27.7917114720 Inches.
            E4 =   [60]          2.3179025130 Feet or 27.8148301560 Inches.
            E5 =   [120]         2.4508578320 Feet or 29.4102939840 Inches.
            E6 =   [30]          2.4534642060 Feet or 29.4415704720 Inches.
            E7 =   [120]         2.4724290980 Feet or 29.6691491760 Inches.
            E8 =   [120]         2.5516701230 Feet or 30.6200414760 Inches.
            E9 =   [60]          2.6159809750 Feet or 31.3917717000 Inches.
        
            Total edges = 750
        <----------------------------------------------------->
        Second, the new corrected code:
        
              UNIQUE EDGES
          Scale Factor = 10.0000000000
                 Units = Feet and Inches
        TsQEIcosahedron 5V, Class I, Method 1
          Primal Lattice
           Total edges = 750
           Unique Edges = 9
           Edge   Quantity     Length
            E1 =   [60]          1.9814743080 Feet or 23.7776916960 Inches.
            E2 =   [120]         2.2568578657 Feet or 27.0822943884 Inches.
            E3 =   [60]          2.3159759564 Feet or 27.7917114768 Inches.
            E4 =   [60]          2.3179025127 Feet or 27.8148301524 Inches.
            E5 =   [120]         2.4508578320 Feet or 29.4102939840 Inches.
            E6 =   [30]          2.4534642057 Feet or 29.4415704684 Inches.
            E7 =   [120]         2.4724290985 Feet or 29.6691491820 Inches.
            E8 =   [120]         2.5516701231 Feet or 30.6200414772 Inches.
            E9 =   [60]          2.6159809747 Feet or 31.3917716964 Inches.
        
            Total edges = 750
        <----------------------------------------------------->
        
      In the above example, the Lengths precision was set to 10 in the Prefs.
      Note that that the old code produces unecessary rounding of the last 
      few decimal places. The user precision is applied to the main units first,
      in this case 'Feet' - which means the conversion to inches suffered a loss
      of precision in the 8th, 9th and 10th decimal places.
      
   4. STRUTS WINDOW
      Fixed bug where the 'Make strut end parallel to hub normal' button was
      accidentally activated for Tetragon [Face] type struts. This was an error
      because hubs are not intended for use with [Face] type struts.
================================================================================
Release notes for Geodesica 0-9-5-4-win32                 [Uploaded 07 NOV 2017]

1. STRUTS AND HUBS UI

   Updated code so that the checkbox 'Make strut ends parallel to hub normal
   works for all [Edge] type struts, including polygonal, cylindrical and
   ellipsoid struts. (Previously, 'Make strut ends parallel to hub normal' only
   worked with Rectangle, Diamond and Square struts).

   This feature does not apply to [face] type struts so the inputs deactivate
   when a [face' strcut is selected in the Strut type pop-up.
--------------------------------------------------------------------------------
2. VERTEX EDITOR

   Spherical and Cartesian coordinate conversions.

   When you change a spherical coordinate, the cartesian fields update; when you
   change a cartesian coordinate, the spherical fields update. This auto-update
   was turned off in previous version because more than a single vertex might be
   selected. However I decided it was counter intuitive not to update the
   corresponding fields. Just be aware that in the case of a group selection,
   the values refer to the last clicked vertex.
--------------------------------------------------------------------------------
3. ISOLATE TAB

   Ensured that when switching to any Isolate tab, the Select Mode is switched
   to SINGLE. This stops an annoying message appearing when the previous select
   mode was AREA.
--------------------------------------------------------------------------------
4. TOOLBAR UI

   Tweaked the behaviour of the Breakdown Method pop-up so that the menu item
   'Method 3' doesn't vanish when using a Class I sphere but is merely
   deactivated.
================================================================================
Release notes for Geodesica 0-9-5-1-win32                 [Uploaded 01 NOV 2017]

1. Fixed UI bug where the Breakdown Method pop-up sometimes failed to update
   when switching to a Base Polyhedron with a Class II, Method 3 sphere.
================================================================================
Release notes for Geodesica 0-9-5-0-win32                 [Uploaded 31 OCT 2017]

1. Implemented Method 3 breakdown for Class II spheres

   Method 3 allows greater economy of fabrication at a slight cost in overall
   symmetry. The number of unique struts in a Method 3 subdivision is equal to
   the frequency, i.e., 12 unique struts for a 12V sphere, 16 unique struts for
   a 16V sphere, 20 unique struts for a 20V sphere, etc.
   
   WARNING: Method 3 should only be used on perfect spheres. All economy of
   fabrication is lost when using ellipsoidal or egg type envelopes.
   
   NOTE: The Method 3 breakdown option is only visble in the pop-up when using
   Class II (Triacon) spheres.
   
   Wrote new web documentation for Method 3 breakdown.
-------------------------------------------------------------------------------- 
2. Fixed 'Set New Zenith' bug that appeared when user cancelled the operation
   by clicking the red cross at the far right of the Status bar. The changed
   zenith flag was not reset for the base polyhedron. This bug was introduced
   in a previous update.
-------------------------------------------------------------------------------- 
3. Fixed 'Labels' menu bug where the item was not checked when the labels were
   made visible after performing a unique set operation.
================================================================================
Release notes for Geodesica 0-9-4-8-win32                 [Uploaded 27 MAY 2017]

1. UTILITIES WINDOW

   Fixed multiprecision bugs (that were not in my code) and added range input
   checks for DMS conversions. It seems that when using threads with FLTK and
   boost, mpreal and Float128 types do not work as expected when compiling with
   mingw on Windows 32 bit systems. The bug manifests as a thread lock which
   prevents the system from accessing memory owned by a thread; this causes the
   application to crash or spew out bogus multiprecision values. Consequently,
   Geodesica-SFX now uses boost_dec_float which does not suffer from this issue.
   A working precision of 25 decimal places is fixed at compile time; however,
   you can change the Target precision in the preferences.
================================================================================
Release notes for Geodesica 0-9-4-7-win32                 [Uploaded 16 MAY 2017]

1. UTILITIES WINDOW

   Fixed crital bugs that crashed the application.
   
   Lengths Conversions Tab
   Fixed bug that crashed the application when the input field was empty.
   This bug did not manifest when using the mpreal wrappers for mprf.

   Vectors and Matrices Tab
   Fixed bug that crashed the application when the input fields were empty.
   There was an issue using Boost multiprecision that crashed the application
   when performing matrix multiplication/addition. 
   
   NOTE: the above bugs did not manifest when using mpreal wrappers for mpfr
   and have only appeared after porting the code to use the Boost wrappers.
   Until I have resolved the issue, high precision matrix operations are
   disabled and use double precision instead. This alteration only concerns
   the Utilities Window.
================================================================================
Release notes for Geodesica 0-9-4-6-win32                 [Uploaded 13 MAY 2017]

1. PREFERENCES WINDOW - LABELS TAB

   This has been completely reworked to accout for cross-target spaceframes.
   There are separate labels/colours for both the underlying quad-edge lattice
   and the mesh superimpositions. Labels for both targets are persistent and
   written to the prefs file.
   
   The quad-edge labelling system is distinct from the mesh superimposition
   labelling system. Quad edge labels are for Vertices, Edges and Faces, whilst
   the equivalent mesh superimpostions are for Hubs, Struts and Panels. However
   please note that panels have not yet been implemented in the scenegraph.
   
   Spaceframe labels are lower case to distinguish them from lattice labels
   which are upper case.
   
   Be aware that label prefixes in the OpenGL view will not update until you
   re-analyse the appropriate Isolate Set.
--------------------------------------------------------------------------------
2. ISOLATE TAB

   This has been redesigned to handle both Targets A & B, as well as their
   cross target spaceframes. There are now three Isolate tabs:
   
   a). ISOLATE TA   Isolate mechanism for Primal and Dual of Target A
   b). ISOLATE TB   Isolate mechanism for Primal and Dual of Target B   
   c). ISOLATE SF   Isolate mechanism for cross-target spaceframes.
   
   The Isolate Mode is now selected via radio buttons rather than the menu on
   the 'ANALYSE' tab. The six Isolate Modes are:
   
             Quad Edge manifold                 Mesh Superimpostions
   
          [VERTEX]  [EDGE]  [FACE]             [HUB]  [STRUT]  [PANEL]
          
   NOTE: the 'PANEL' Isolate pop-up does not do anything yet because Panel
   meshes have not been implemented.
   
   Because there are separate isolate widgets for each manifold, new isolate
   sets may be loaded for each Target without clearing the previous set.
   
   
   Target Switching
   ----------------
   Clicking on an ISOLATE tab switches the current Target:
   
     Click tab 'ISOLATE TA'
       The current Target is switched to A.
       If the Primal tab is visible, the Pick Target is switched to Primal only
       (the 'P' button highlights yellow in the Toolbar whilst the 'D' and 'S'
       buttons are turned off.

       If the Dual tab is visible, the Pick Target is switched to Dual only (the
       'D' highlights yellow in the Toolbar whilst the 'P' and 'S' buttons are
       turned off.

     Click tab 'ISOLATE TB'
       The current Target is switched to B.
       If the Primal tab is visible, the Pick Target is switched to Primal only
       (the 'P' button highlights yellow in the Toolbar whilst the 'D' and 'S'
       buttons are turned off.
       
       If the Dual tab is visible, the Pick Target is switched to Dual only
       (the 'D' button highlights yellow in the Toolbar whilst the 'P' and 'S'
       buttons are turned off.

     Click tab 'ISOLATE SF'
       The current Target remains unchanged.
       The Pick Target is switched to Spaceframe only (the 'S' button highlights
       yellow in the Toolbar whilst the 'P' and 'D' buttons are turned off.
       
       The ISOLATE SF Tab has a menu choice to select the spaceframe node; the
       corresponding Isolate lists are then loaded into the Isolate pop-ups for
       Edges and Struts.

   
   HOW TO CREATE AN ISOLATE SET   (Example 'EDGE').
   ----------------------------
   The mechanism works as in previous versions, except that you must now select
   the Target lattice...
   
   1. Be sure you are on the correct ISOLATE Tab for the chosen Target, eg
      ISOLATE TA or ISOLATE TB.
      
   2. Select a Primal or Dual tab.
   
   3. Set the Isolate Mode by clicking the 'EDGE' button.
   
   4. Follow the instructions in the STATUS BAR at bottom of the Main window.
      In this case, simply click on an edge.
   
   5. The EDGE Isolate pop-up menu activates with a list of Isolate sets.
      Select an item from the Isolate menu and labels will only be drawn for
      that set.
      
      NOTE: When using FACE, STRUT, HUB and PANEL Isolate modes, only the
      selected set appears in the view, whilst other set elements are hidden.
      
      
   ISOLATE VERTEX, ISOLATE HUB Control Key option
   ----------------------------------------------
   The Control key option for these operations was turned off a few years back
   due to stablity issues. (If the Control is held down when clicking on a
   vertex/hub mesh, then only the spaceframe edges/struts are logged).
   
   This option has been turned on again in the hope that the stability issues
   have been resolved.
--------------------------------------------------------------------------------
3. LABELS MENU

   Label visibility toggles now have their own menu. They work as before but are
   now implemented for both Targets and individual cross-target spaceframe nodes.
--------------------------------------------------------------------------------
4. TETRAGON STRUTS

   Changed default width to 1.5 inches and default depth to 3 inches. This was
   simply to stop intersection errors at higher frequencies when the default
   strut width or depth was greater than the default hub width or depth.
--------------------------------------------------------------------------------
5. BUGFIXES

   Critical Bugfixes
   -----------------
   Fixed bug introduced in previous version that caused the applictaion to crash
   when changing frequency if 'Generate Struts' was on.
   
   Fixed bug that caused the application to crash when turning off 'Generate
   Spaceframe Struts' and then doing an Isolate Hubs operation with the Shift
   key held down. (The strut pointers for the spaceframe edges were not reset
   to NULL).
   
   
   Minor Bugfixes
   --------------
   ANALYSE UNIQUE EDGES [QE]
   Fixed UI bug were previous spaceframe labels vanished from the OpenGL view
   when analysing a new spaceframe set.
   
   Generate Dual menu
   Fixed UI bug when 'Generate Dual' was switched OFF and the appropriate
   spaceframe menus were not unchecked.
  
   Fixed UI bug where the RED menu colour for OFF spaceframes did not always
   reset to BLACK when 'Generate Dual' was switched OFF. (Attributes window;
   Struts window; and the Isolate SF Tab).
   
   Fixed UI bug where spaceframe menu items that were unchecked after turning
   OFF 'Generate Dual' came back on when changing the Target, even though no
   spaceframe was generated.
--------------------------------------------------------------------------------
6. SPEED IMPROVEMENTS

   'Generate Struts' and 'Generate Hub' menu items.
   Selecting a menu item now only rebulds the chosen item elements; other
   elements are left intact. (Eg, selecting 'Generate Dual Struts' now only
   rebuilds the Dual struts, whereas previously this also forced a complete
   rebuild of the Primal struts.
================================================================================
Release notes for Geodesica 0-9-4-4-win32

1. FULL CONNECTIVITY LOGGING

This has been updated to account for cross-target spaceframes and now works for
strut and hub meshes. The following outlines the steps to make a connectivity
log for a cross-target spaceframe. Note the connectivity is not complete until
all twelve steps have been completed.

Icosahedron V4
1.  Target A: Primal only
2.  Target B: Generate a Dual and hide the Primal using the Attributes window.
    Offset the dual by 0.1 units in the Envelopes window.
3   Spaceframe: Target B Dual Cell to Target A Primal Vertex.

4.  Target B: Generate Dual Struts.
5.  Target B: Generate Dual Hubs.

6.  Target A: Generate Primal Struts.
7.  Target A: Generate Primal Hubs.

8.  Target B: ANALYSE: Unique Set. 'FIND UNIQUE STRUTS [Mesh]'
    Click on a Dual Strut mesh.

9.  Target B: ANALYSE: Unique Set. 'FIND UNIQUE STRUTS [Mesh]'
    Click on a Spaceframe Strut mesh.

10. Target A: ANALYSE: Unique Set. 'FIND UNIQUE STRUTS [Mesh]'
    Click on a Primal Strut mesh.

11. Target A: ANALYSE: Unique Set 'FIND UNIQUE HUBS [Mesh]'
    Click on a Primal hub mesh with the 'SHIFT' key held down.
    This will also log the spaceframe connections.
    NOTE: because the Dual hubs of Target B have not been logget yet,
    these hubs will show as '?' marks in the log.

12. Target B: ANALYSE: Unique Set 'FIND UNIQUE HUBS [Mesh]'
    Click on a Dual hub mesh with the 'SHIFT' key held down.
    Because the Primal hubs of Target A have been logged in step 11
    the connectivity log is now complete.
    
*** Important Note for FIND UNIQUE STRUTS [Mesh] and FIND UNIQUE HUBS [Mesh] ***
    ------------------------------------------------------------------------
When doing FIND UNIQUE for [Mesh] superimpositions, hub meshes must have
adjoining strut meshes. If the hub meshes are isolated, with only the underlying
quad-edge attachments, the connectivity log will fail. This is because using the
[Mesh] mode, the code searches for hub and strut MESH superimpositions and NOT
the underlying manifold vertex/edge primitives.

*** Important Note for Union Tank Car Dome type spaceframes ***
    -------------------------------------------------------
When using FIND UNIQUE [Mesh] on the following spaceframe types:

a) Target B Dual Cell to Target A Dual Trifan Centroid
b) Target B_Primal_Cell to Target B Primal Trifan Centroid

Be sure to check 'Trifan Center Only' on the corresponding tab of the Attributes
window. This will hide all hubs except those on the trifan centers.

If you fail to check this option, and have not generated mesh struts for the
edges that connect to the non trifan center hubs, these hubs will be listed with
*** EMPTY *** connections in the log. For example:

    H9      [5]      Edge Group 1 for H9 at Vertex ID: 58
                       ? (to H1)
                       X2 (to H9)
                       X2 (to H6)
                       X3 (to H8)
                       ? (to H3)

                      Edge Group 2 for H9 at Vertex ID: 61
                       *** EMPTY ***

                      Edge Group 3 for H9 at Vertex ID: 63
                       *** EMPTY ***

                      Edge Group 4 for H9 at Vertex ID: 65
                       *** EMPTY ***

                      Edge Group 5 for H9 at Vertex ID: 69
                       *** EMPTY ***

         TOTAL VARIANTS for H9 = 2
           ----------------------
           Variant ID 1 for H9
           Quantity: 1
           Vertex ID: 58
           Edge Group
                       ? (to H1)
                       X2 (to H9)
                       X2 (to H6)
                       X3 (to H8)
                       ? (to H3)
           ----------------------
           Variant ID 2 for H9
           Quantity: 4
           Vertex IDs: 61
                       63
                       65
                       69
           Edge Group
                       *** EMPTY ***
           ----------------------

Note the '?' marks in the Edge Group listings. These do not constitute an error
in the case of spaceframe struts on a truncation plane, as meshes are never
generated for these edges.

Why have the 'Trifan Center Only' option?
-----------------------------------------
Because you might want to generate strut mesh connections to those hubs which
are not trifan centers. For example, consider the possibilities of using the
spaceframe type 'Target B Dual Cell to Target A Dual Trifan Centroid'. This was
designed for a 'Union Tank Car Dome' type spaceframe. However, if you also
want to generate strut meshes for the Dual of Target A, then you can leave the
'Trifan Center Only' option unchecked. 

If you inadvertantly leave strut meshes connecting to a hidden mesh hub, the log
will print "Invisible" after the Hub number, e.g.,

           Edge Group
                       S17 (to H12 Invisible)
                       X8 (to H12)
                       S16 (to H11 Invisible)
                       X7 (to H11)
                       S17 (to H6 Invisible)
                       X8 (to H6)
                       S17 (to H12 Invisible)
                       X8 (to H12)
                       S16 (to H11 Invisible)
                       X7 (to H11)
                       S17 (to H6 Invisible)
                       X8 (to H6)
--------------------------------------------------------------------------------
2. MAJOR BUG FIXES

   a) Hub normal angles for cross-target spaceframes.
      Previous code did not account for the spaceframe edge direction which now
      depends on the spaceframe type. This meant the Dest which was assumed to
      be the strut end was sometimes an Org, resulting in an erroneous 90 deg
      angle reported in the Log for all spaceframe struts.
       
   b) ANALYSE UNIQUE for hub meshes on a trifanned Dual.
      Previous code overwrote the vertex ID and thus corrupted the vertex
      counter of the lattice. The result was that some Isolate sets contained
      erroneous hubs. This was an issure that occured after swapping the Primal
      amd Dual to update the Primal manifold.
--------------------------------------------------------------------------------
3. SWAP PRIMAL AND DUAL
   
   This experimental feature which was enabled in Geodesica-0-9-2-4 has been
   temporarilly disabled because it is not yet stable enough for general use.
--------------------------------------------------------------------------------
4. SPACEFRAME LABELS

   Cross target spaceframes now have their own label. At present these cannot be
   changed in the preferences and are preset to the following:
   
   "X"
      Target A Primal Cell to Target A Dual Vertex
      Target A Dual_Cell to Target A Primal Vertex
      
   "K"
     Target B Primal Cell to Target B Dual_Vertex
     Target B Dual Cell to Target B Primal_Vertex
     
     
   "J"
     Target B Primal Cell to Target A Dual_Vertex
     Target A Dual Cell to Target B Primal_Vertex
     
   "Q"
     Target A Primal Cell to Target B Dual_Vertex
     Target B Dual Cell to Target A Primal_Vertex
     
   "U"
     Target B Dual Cell to Target A Dual_Trifan_Centroid

   "R"
     Target B Primal Cell to Target A Primal_Trifan_Centroid

   "Y"
     Target A Primal Vertex to Target B Primal_Vertex

   "Z"
     Target A DualVertex to Target B Dual_Vertex
   
    TO DO: Provide a mechanism for the user to change these in Preferences and
    update the old label system to account for both Targets.
================================================================================
Release notes for Geodesica 0-9-2-4-win32

1. CROSS TARGET SPACEFRAMES

Much work has been done for the implementation of cross-target spaceframes. The
purpose was to provide a simple way to create complex spaceframe structures such
as that found in the famous 'Union Tank Car Dome' that once stood north of Baton
Rouge, Louisana, U.S.A.

This has meant a complete overhaul of the code base. Attention has been paid to
update code for the Explore tools 'Angles at a vertex' and 'Edges at a vertex'.
These tools now log cross-target spaceframe members, irrespsective of the target
lattice. However, there is a caveat when using these tools...

Whilst you may generate as many spaceframes as you like, in general you can only
log one major spaceframe type from any vertex in addition to a minor UTCD
spaceframe connector type. (UTCD = Union Tank Car Dome Connector type). To make
this clear, it is best to divide spaceframe types into three sets: Primary,
Secondary and Tertiary.

The major Primary spaceframe types are:

A) Target A Dual Cell to Target A Primal Vertex
B) Target B Dual Cell to Target B Primal Vertex

The major Secondary spaceframe types are:
C) Target A Dual Cell to Target B Primal Vertex
D) Target B Dual Cell to Target A Primal Vertex
E) Target B Dual Cell to Target A Dual Trifan Centroid
F) Target B Primal Cell to Target A Primal Trifan Centroid

The minor Tertiary spaceframe types are:
G) Target A Primal Vertex to Target B Primal Vertex
H) Target A Dual Vertex to Target B Dual Vertex

You may combine one Secondary spaceframe such as D with two Tertiary spacefames
G and H, and safely log angles and edges at a vertex in BOTH Targets. Id est,
you can click on a Dual vertex in Target B with the control key held down and
log spaceframe members which start at the Dual vertex of Target B and end at the
Primal vertex of Target A. And vice-versa: you can switch to Target A, click on
a Primal vertex, and log the same spaceframe members going in the opposite
direction to Target B. THE CAVEAT IS THE FOLLOWING: if you add another Primary
spaceframe type to Target B, such as 'Target B Dual Cell to Target B Primal
Vertex', the logging functions will no longer work when you click on the Primal
vertex of Target A. This is because there is both a Primary and Secondary
spaceframe type leaving the Dual vertices of Target B. In this instance, when
you click on a Primal vertex in Target A you will be greeted with the rather
misleading message: "Vertex ID: [id] does not appear to have a spaceframe."

Explanation. Edges are logged in the anti-clockwise orbit of the vertex; if more
than one Primary/Secondary spaceframe set connects to dual face of that vertex,
the order of the second set must be sanitized with respect to the first. Code
has been put in place to make this happen, but this code is not yet stable
enough for release. This will be done in the next update, but is quite tricky to
implement as it involves orbiting the clicked vertex twice; the first orbit uses
a pointer to the clicked vertex, the second orbit uses a pointer to a 'pseudo'
clicked vertex in the corresponding Target lattice. In either case, logging
'Angles at a vertex' would be confused, because both sets of spaceframe edges
lie directly one on top of the other, so their hub plane angles would be the
same.

There are occassions where you can safely log two Secondary spaceframe types in
each Target. For example, you can combine C & D types - 'Target B Dual Cell to
Target A Primal Vertex' & 'Target B Dual Cell to Target A Primal Vertex' without
conflict. The issue occurs when you add another Primary spaceframe type (A or
B).

In conclusion, if you want to log more than one spaceframe type, generate and
log each type individually.

Strus and Hubs window
There is now an option to shift spaceframe start/end points up or down the hub
axis. This is usefull for centering the strut end points on the middle of the 
hub. I found this a required feature when developing the Union Takn Car Dome
tyoe spaceframe, because shifting the hub alone is not always viable.
--------------------------------------------------------------------------------
2. SWAPPING THE PRIMAL AND DUAL

This feature is experimental and is intended ONLY for using the modelling tools
on the Dual lattice. When you have finished modelling the Dual, please ensure it
it is in a sane topological state (id est, it satisfies Euler's formula), before
swapping back.

The feature was originally implemented for trifanning the Dual lattice in order
to generate Union Tank Car Dome type surfaces. However, I decided to make a menu
item for it so that users might experiment. Be aware that when you swap the
Primal and Dual, you are in unchartered teritory as the feature has not been
extensively tested for all modelling tools. It seems stable for minor topologcal 
hanges such as 'Kill Vertex', 'Divide Edge', 'Make Face Edge', e.t.c., but the
swapped state is NOT intended to be used for other program operations.

IMPORTANT: Do not attempt to construct spaceframes on swapped Primal/Duals: to
do so will likely result in a crash.
--------------------------------------------------------------------------------
3. SPEED ISSUES

Why is Geodesica-SFX slow at high frequencies?

This is the result of managing the quad edge data structures. For each SINGLE
edge of a standard VEF mesh manifold, a quad-edge data structure contains FOUR.
For example, take a seed icosahedron with 20 (F), 12 (V) and 30 (E). This means
there are 4 x 30 = 120 Edges. The dual has 12 (F), 20 (V) and  30 (E). So that's
another 120 Edges for the dual, making a total of 240 Edges for a simple
icosahedral seed with its dual. As the frequency increases, the quad-edge data
structures soon start to gobble up memory.

Cross-target spaceframes incur another speed penalty because these must use
duplicate lattices, which quadruples the edge count. Further, pointers must be
kept to all corresponing cross-target verticies and facets, increasing the
mememoy footprint even further.

All of this is for a basic quad-edge manifold without mesh super-impositions;
once you start adding meshes for struts and hubs, the processing overhead
increases dramatically.

There are additional costs of maintaning precision and avoiding round-off errors
when converting between spherical and cartesian co-ordinates - an operation that
is carried out per vertex, whenever a sphere is modified or projected to the
envelope.

If you are unhappy that you have to wait 4 seconds for a 20V icosahedron to
build and project on an old machine, consider what is going on under the hood
with regard to the quad-edge data structures.

One of the main concerns in developing Geodesica-SFX is maintaing floating point
accuracy. It is a trivial task to subdivide a sphere at 40V using a standard VEF
manifold in a matter of seconds; however, it is a non trivial task to do the
same with four simultaneous quad-edge data structures, all linked together via
pointers that must be updated whenever the sphere is modified.

Geodesica was coded to provide the necessary information for building complex
domes with their duals and spaceframes. Whilst I endevour to make Geodesica-SFX
as fast as possible, and whilst further optimisations may be made to certain
portions of the code, accuracy always takes precedence over speed.
--------------------------------------------------------------------------------