=======================================================
CHANGELOG FOR VERSIONS 0.08, 0.07, 0.06, 0.05, and 0.04
=======================================================
What ChangeLog?

At the moment, there's really no point in my keeping such a detailed,
low-level ChangeLog. Reading the release notes provides a much
clearer look at what has really changed.

==========================
CHANGELOG FOR VERSION 0.03
==========================
(Most recent to oldest...)

* View::_draw_overlay() has been removed, since there is no "current 
location" to draw, except that indicated by the X-drawn cursor.

* Class View no longer is aware of "projected points", and instead 
simply keeps track of the 3D cursor location. On a more general level, 
this means that drawing operations are now based on the actual mouse 
location, instead of the location of the nearest vertex. This change 
includes the removal of View::_set_current(), View::_projected_points, 
View::_update_projected_points, and View::_find_projected_points(). 
View::_set_3d_cursor_location() has been added to actually set the 3D 
cursor location. It is called from View::draw() if 
bool View::_update_mouse_location is true.

* Vertex3D::PolygonIndices has been renamed to Polygons, and is now a 
vector of Polygon3D pointers.

* This entry is being added not for a single change, but for sweeping 
changes in the structure of View and Mesh, which have been made to 
increase speed when working with high polycount models. Changes have not 
been listed as they were made because most of the changes were 
themselves changed, since this major revision was largely 
experimentation, in terms of time and code produced. Certain of the more 
important changes are being listed above.

* GL_RESCALE_NORMAL is no longer enabled in View.

* The second OpenGL light is now disabled if View::DoubleSided is false.

* The call to "glShadeModel" has been moved in View from draw() to 
_initialize(). It now sets the mode to GL_FLAT instead of GL_SMOOTH.

* Fl_Light_Button MainWindow::double_sided has been added to control 
View::DoubleSided.

* bool View::DoubleSided has been added to control whether 
GL_CULL_FACE is enabled or disabled.

* View::_find_projected_points() is now called slightly less 
frequently, possibly with some slight performance gains.

* double View::_projection_matrix has been added to hold the current 
OpenGL projection matrix. It is updated in View::_initialize().

* int View::_viewport has been added to hold the current OpenGL 
viewport. It is updated in View::_initialize().


==========================
CHANGELOG FOR VERSION 0.02
==========================
(Oldest to most recent...)

* The View class no longer includes Mesh, as _m_swap has been removed. 
Various unused includes and members have been removed. Names have been 
clarified, and other minor cleanups have been done.

* The ArcBall class has been cleaned up a bit (moved and removed 
headers, cleaned up code, and clarified names ), and it handles the 
rotation a bit better now when the cursor is outside the virtual sphere.

* Class View now splits some of the OpenGL initialization code out into 
a seperate function that is called only when needed, instead of every 
time View::draw() is called.

* An Fl_Box has been added to MainWindow which acts as a status bar.

* MainWindow's _no_file has been removed; its message has been moved to 
the new status bar.

* Mesh has two new functions, VertexCount and PolygonCount, to return 
the number of vertices and polygons a mesh currently has.

* Mesh::InfoDrawSize is now unused, and has been removed.

* When opening a model file or creating a new model with NEW, the status 
bar reports the completion of these tasks and the number of points and 
faces in the model.

* The two lights in the modeling scene have been made purely 
directional, which avoids the problem of a model being to dark or to 
bright due to its distance relative to the lights.

* The `==' operator of Point3D has been overloaded.

* It is now possible to remove all points in a mesh that are equal, 
leaving only one point in their place, by calling 
Mesh::RemoveDuplicates, which returns the number of points removed.
NOTE: This function isn't perfect yet. It is very slow, and sometimes 
odd problems appear in the resulting mesh.

* The Deform dialog has been reworked to more properly seperate work 
into different functions, and also to get rid of the silly "messaging 
system" it had to tell MainWindow what it was doing. It now has direct 
access to the _mesh_history, and does the deformations itself.

* DeformDialog adds a new string `Output' for the purpose of returning 
human-readable information to MainWindow, to be displayed in the status 
bar.

* The Deform dialog now includes a button to activate the 
RemoveDuplicates function. The number removed is printed in the status 
bar.

* Vertex3D has `=' overloaded to work with Point3D

* Point3D now has `+=', `/=', `+', and `/' overloaded.

* Mesh::Subdivide has been added for subdividing a mesh. It works with 
any number of points. In the resulting mesh, each old polygon will 
become X number of new ones, where X is equal to the number of sides in 
the original polygon. All resulting polygons quads. NOTE: This function 
isn't perfect yet. It is very slow, largely due to the fact that a 
call to RemoveDuplicates is used at the end, and sometimes odd problems 
appear in the resulting mesh.

* The Deform dialog now includes a button to subdivide the mesh. Data on 
the resulting mesh is printed to the status bar.

* Mesh now includes three functions, StartGrab, ContinueGrab, and 
EndGrab, the purpose of which is to allow the user to drag a set of 
points around.

* The (non-functioning) SMOOTH button in MainWindow has been replaced by 
a GRAB button. When activated, the Mesh Grab functions are used instead 
of DrawArea. The actual grabbing, however, is somewhat unsophisticated, 
as points are only dragged around on the X-Y plane in model coordinates. 
A more appropriate behaviour will have to be implemented later. Also, 
the current system does not support mirroring.

* Class Mesh is now a friend of class View.

* Mesh::InfoDraw function has been removed. View::_find_visible_points 
no longer uses glFeedBack to find the locations of all the points; 
gluProject is used instead.

* Mesh::BecomeQuadSphere has been added to allow the creation of a 
sphere. Currently it is still very slow, so only two or three 
subdivisions are practical at this point.

* NewDialog now shows only two model types - plane and sphere. Both of 
these now work.

* It's now possible to smooth a mesh by calling Mesh::Smooth

* A SMOOTH button has been added to DeformDialog.

* It is now possible to smooth an area of a mesh by calling SmoothArea. 
Mirror settings are used. SmoothArea uses Mesh::_smooth_area to do the 
actual smoothing.

* The button to enable the smooth brush has been readded to MainWindow. 
It sets View to the SMOOTH brush mode.

* Shortcut keys have been added for the three brush modes, the ADD 
button, the DEFORM button, and the three mirror toggles.

* Labels have been added for MainWindow::_radius and _strength.

* Selection of the current center point has been made much more 
accurate. Previously, many points were incorrectly removed from the list 
of visible points, as they were incorrectly detected as being behind other 
polygons. This has, to a large extent, been corrected.

* View::_draw_interface has become draw_overlay. It has been modified to 
draw (in red) the current selected vertex instead of the cursor 
location. That job has been changed back to the standard X way, using 
the FL_CURSOR_CROSS. This has the advantage of being faster and more easily 
visible over different background colors.

* Fixed: a bug where a newly-loaded or newly-created model does not fill 
the "visible points" list. This lead to the first brush stroke changing 
incorrect polygons and the red vertex-indicator being stuck in the 
lower-left corner until the list was updated.

* The code to actually draw the model has been moved from Mesh::Draw to 
View::_draw_mesh. This has the advantage of making class Mesh 
independent from the whatever is drawing the model, in this case, 
OpenGL.

* The DRAW CURVE button has been hidden, as it is still useless.

* SHIFT-drag in the View window has been fixed. It is now possible to 
drag the model around.

* View::_xloc, _yloc, and _zloc have been replaced with Point3D 
_location.

* Mesh::BoundingSphere is no longer used, and has been removed.

* Using the mouse wheel to resize the model now does so in smaller 
increments.

* Fixed: a bug where View is shown with no model data loaded.

* NewDialog and DeformDialog have been changed back to having borders 
and being none-modal.

* NewDialog::_horizontal_div and ::_vertical_div renamed to _div1 and 
_div2. Changed because when creating a sphere (using the current 
algorithm), you can't seperately control horizontal and vertical 
divisions.

* NewDialog now changes when either PLANE or SPHERE is pressed; when 
SPHERE is pressed, the second slider is removed, the label of the first 
is changed to "Subdivide", and the height of the dialog is decreased. 
These changes are reversed when PLANE is pressed.

* Using Mesh::BecomePlane now always creates a plane of the same size, 
with the X and Y vertex values ranging from 0 to 1. Creating a plane 
with different subdivide inputs will now result in a square-shaped 
model.

* When changing the camera distance from the model with the mousewheel, 
the size of the model now taken into account.

* Mesh::RecalculateBoundingSphere has been removed.

* MainWindow::_new_dialog and _deform_dialog no longer forget their 
settings after closing.

* When closing the program with an unsaved model open, the user is 
now asked if they wish to save it before closing.

* When loading a model with an unsaved model open, the user is now asked 
if they wish to save it before loading the new model.

* If a file that already exists is selected in the Save As dialog, that 
file is no longer overwritten without confirmation.

* Dragging the model (with LMB + SHIFT) no longer acts a change to mesh, 
so the undo stack is unaffected.

* The (currently useless) HELP button has been hidden.

* Fixed: a bug where settings aren't saved if no model has been loaded 
or created yet.

* Project info and MainWindow title updated to 0.03.

==============================
RELEASE NOTES FOR VERSION 0.02
==============================

I haven't kept a formal list of all the changes to the code, features 
added, or anything like that, but here are the highlights, in no 
particular order:

* I have switched from the Eclipse IDE to Anjuta. While I like Eclipse 
and found it quite useful, it simply does not run at a reasonable speed 
on an older machine like mine.

* The "New" dialog is now functioning partially: you can use it to make 
a plane, with anything from no subdivisions to one hundred.

* The brush shape used when modeling has been changed. It was using a 
power function, which gave it a pointy shape; the modified form uses a 
square root function, which gives it a much more rounded shape.

* I have begun work on a way to interactively set the shape of the brush 
through the "DRAW CURVE" button. As yet, though, the curve does not 
actually do anything.

* I have also started work on keeping track of whether the model is 
saved or not, though this isn't actually turned on anywhere in a way 
that is currently visible in the program.

* The interface has been improved by the addition of tooltips and 
keyboard shortcuts.

* There is now a seperate button to save the model without bringing up a 
file selection dialog; the latter function being moved the the "SAVE AS" 
button.

* The size of the undo stack has been increased to 32.

* Version 0.01 had code to write out a few preferences to 
HOME/.sharpconstruct/preferences; this code has been removed, and the 
Fl_Preferences object is now used, meaning preferences will (by default) 
be written to HOME/.fltk/Sharp3D/SharpConstruct.prefs.

* The "STRENGTH" slider's configuration has been adjusted; it now ranges 
from 0 to 1, in increments of 0.01.

* The View class no longer has a pointer to a mesh, instead it uses a 
pointer to the mesh history.

* A few common tasks have been moved into classes either as normal 
functions or overloaded operators, like "+=" in Point3D and 
"Normalize()" in Normal3D.

* And lots of other things, like renaming functions and removing unused 
variables and headers...
