Here is the most recent version (1.7.14) of the LionSnake Modeler, fabled in story and song. This modeler is designed for creating posable subdivision surface models for use with the Persistence of Vision Ray Tracer, but you can also use it for editing Alias/Wavefront mesh files.
A 16-bit color screen is good enough. (Does anybody still have one of those?)
Features
Posable models |
The models can be built around a linked skeleton. |
UV-mapping |
You can create uv-mapped meshes. |
POV-Ray Export |
The models can be exported to an include file readable by the Persistence of Vision Ray Tracer. The files are designed to work with my Catmull-Clark Surface Subdivision Suite to produce smooth, organic shapes. |
OBJ file import and export |
You can import and export Alias/Wavefront OBJ files. |
OpenGL for rendering. |
I would have used DirectX, but Microsoft made DirectX more difficult to program than was necessary. |
Downloads
Contains:
- The binary (lsm_1_7.exe);
- An sample model file (sample.lsm);
- An exported version of the sample file;
- A POV-Ray scene file which shows how an exported file can be used in POV-Ray;
- The Catmull-Clark Surface Subdivision Suite files (see above for the link to the explanatory page);
- A help file in HTML format;
- A README file to guide you through the installation process (which is not idiot-proof);
- And another file, in HTML format, explaining the new LSM file format.
Contains:
- The C++ source files, plus the resource (.rc) file, the toolbar image file, and the icon file.
If you make a custom compile, you will need to include your compiler's version of comctl.lib, glu32.lib, opengl32.lib, and shell32.lib when linking.
Screen shot
If you've been using LionSnake for a while, and feel you have reason to be proud of what you've accomplished, send me a link to a render and I'll try and see if I can whip up a gallery here. For now, here's a view of the sample model that now comes with the download:
Release History
- In the version number, the first number indicates the major version, the second indicates the minor version, and the third indicates releases within the minor version.
- A change to the minor version indicates a change to the file format; all versions can read the files of earlier versions, but earlier versions cannot read the saved files from later versions.
- A change to the release number indicates bug fixes and feature changes that don't require a change to the file format.
Version 1.7.14, 11 July 2009
The subdivision preview now shows the limit surface, edges, and vertices, instead of the hull values of these objects.
In another of those "does anybody care" areas, I created another class for application-wide data that deals with the user interface (such as window handles, etc.), and have begun moving all of the user interface code, especially the OS-specific code, into this new class. My goal is to have exactly one source file that contains the dreaded line, #include <windows.h>
You can now drag a face (and any other marked vertices) along that face's normal vector.
Hiding a vertex made it impossible to mark any edge or face which contained that vertex. Fixed.
The gadget for scaling an inset face was not properly calculating the distance from the center of the gadget to the drag point. Fixed.
Textures were not being smoothed consistently. Fixed.
After changing the file from which a texture was loaded, the update would not show without performing undo and/or redo operations. Fixed.
When an edge and a face covered the same spot in the view, there was some unsightly artifacting. Fixed.
The zoom no longer changes when the application window is resized.
Version 1.7.13, 14 February 2009
The Bones were not being displayed for some reason. Fixed.
There was a bug in .obj
file import which would cause a crash if the texture vertices were specified using the relative indexing option. Fixed.
Version 1.7.12, 14 February 2009
The subdivision preview now approximates (pretty much) the final subdivision level. The refinement of this preview can be set from a menu option.
A lot of the time, Bones were too being drawn too small to be of much use. Fixed.
When Bone display was on, and there were Bones in the model, many of the on-screen objects would not highlight when the mouse rolled over them. Fixed.
You can insert a cube from the main menu or the context menu. The cube runs from <-1,-1,-1> to <1,1,1> and its edges are parallel to the coordinate axes.
You can now extrude or inset a single face (from an item in its context menu). A gadget appears that allows you to adjust the amount of extrusion or the scaling of insetting.
The gadgets for Bone scaling and Bone translation now look and operate differently.
Lines are now drawn with anti-aliasing, to improve its overall appearance.
Some of the global variables have been moved to a class built for holding application-wide data. This currently has no effect on the user experience, and was instituted in order to support an upcoming feature.
The dotted lines that once showed Bone dependency have been returned to service.
Building the skeleton has changed quite a bit. While in this mode, the most recently-created Bone will turn as the mouse moves, and clicking on an existing Bone will cause that Bone to be made the parent of the next Bone created while in Bone adding mode. The mode for adding bones can now be entered from the context menu for the highlighted bone.
When the mouse is over the end knob of a Bone, the rotation gadget for that Bone will be displayed. If you make any use of this gadget, it will remain visible and usable until you right-click it away.
Version 1.7.11, 14 July 2008
- The way Bones are drawn, the way Bone dependency is depicted, and the rotation tool for Bones have all been changed greatly. You can now rotate a Bone by individually dragging its coordinate axes, or by dragging its end knob.
- When reading an
obj
file, extra white space before a field caused the field to be read twice. Fixed.
- The old C-style way for representing points and vectors (namely, three-member arrays of
float
values) was replaced with code that is more object-oriented. The code that handles the analytical geometry has been simplified, greatly so in many cases.
- If a Bone is highlighted, and the user clicks the Add Bone button, the highlighted Bone becomes the parent of the first new Bone.
Version 1.7.10, 22 April 2008
- Bones are now drawn differently, and Bone dependency is depicted differently.
.obj
import is now available from the File menu.
- The model name is now displayed in the window title bar.
- The application would crash when the user tried to save the model. Fixed.
- Texture mapping is now back on in subdivision preview.
Version 1.7.9, 2 Apr 2008
- The application would crash when trying to load files in the original archive format. Although I suspect that this format was never used in a release version, I'm not 100% certain, so this has been fixed.
- There was a crash whenever the user tried to subdivide a portion of the mesh. Fixed.
- There was a crash whenever the mesh topology was changed during subdivision preview. Fixed.
- The previous bug was discovered while the subdivision preview was in the middle of a large rewrite. The texture-mapping still hasn't been added back in yet, so for now there is no texture-mapping in subdivision preview.
- Floating point error was causing values that should have been zero to be displayed as very small numbers near zero. Now values that are supposed to be zero look like zero.
- When the view was rotated the right way, there was a gap between the edge of the axis grid and the corner of the screen. Now the grid, when visible, always occupies the whole screen.
Version 1.7.8, 28 Mar 2008
- Although it still looks the same, the subdivision preview was modified to eliminate unnecessary rebuilding of the data structures. Users who look at the source code will notice the appearance of the files
subdata.h
, obvec.h
, subdata.cpp
, and obvec.cpp
, which handle this now.
- You can now zoom to the selected portion of the mesh.
- Zoom-to-fit now zooms only to the visible portions of the mesh.
Version 1.7.7, 17 Mar 2008
- The hidden portions of the mesh are no longer displayed in subdivision preview.
- In addition to hiding the marked portions of the mesh, you can now hide the unmarked portions as well.
- The POV-Ray macro that was supposed to give all the faces a uniform winding was only pretending to work (in fact, it was messing up meshes that already had uniform windings). The new macro appears to work.
- When mesh objects were marked and hidden, they remained marked. This left them subject to any subsequent transform operation, which is probably unwanted behavior. Fixed.
- When creating a model from an existing
.obj
file, the edges were not immediately built. This caused a crash if subdivision preview was turned on in this state. Fixed.
Version 1.7.6, 17 Mar 2008
- If two faces share one edge, they can be merged into one face by selecting an option from the context menu for that edge.
- There is now a feature to lock one or two coordinate axes so that vertices that are dragged move only in the free axes.
- Active options are now checked in the menus in addition to being in the pressed state in the toolbar.
Version 1.7.5, 9 Mar 2008
- After reparenting Bones, editing the properties of a Face, or subdividing any part of the mesh, the attachment of Vertices to Bones was forgotten. Fixed.
- After making a chain of Bones, the very last Bone could not be highlighted until one of the others was dragged or otherwise edited. Fixed.
- The
.inc
files exported to POV-Ray invoked a macro from the previous version of the subdivision surface macros. Fixed.
- I changed the background color from black to middle gray, and changed the gridlines to match.
- In mesh adding mode, when the user includes an existing vertex in the circuit of edges, the view point shifts so that Vertices added after this point are at the same depth as the existing point.
- I have taken more steps along the path from C to C++, mainly in order to eliminate global variables and stuff like that. People who nose around in the sources will observe the appearance of
appdata.h
and appdata.cpp
, which declare and implement a class consisting of static variables to hold the data that applies to the entire application.
Version 1.7.4, 1 Mar 2008
- When you start the program without specifying an
.lsm
file in the command line, a blank Model project will be created, just like version 1.6.x and earlier.
- The way I solved the
O(n^2)
performance problem for large meshes caused the Face creation function to return NULL results to the extrusion function. The extrusion function didn't check the pointer before accessing its referent object, so there was a crash. Fixed.
Version 1.7.3, 29 Feb 2008
- Merging vertices often created an orphan edge that was not always deleted. Fixed.
- The vertex merge operation was allowing more than two faces to border on an edge. Fixed.
- When adding Bones to the model, if you add more than one Bone, each Bone is parented to the one created before it.
- The
.obj
import feature was ignoring the .mtl
file specified in the .obj
file. Fixed.
- The
.obj
import feature was treating blank lines as the end of .obj
and .mtl
files. Fixed.
- The
.obj
export feature was not properly writing the filepath for .mtl
files in the mtllib
statement when the filepath for the .obj
file contained more than one period in it. Fixed.
Version 1.7.2, 28 Feb 2008
- The Bone objects are drawn in a way that makes them more distinct (instead of tiny little diamond shapes, there are three polygons centered at the same point, and every dependent Bone has a line connecting it to its parent.
- Mesh objects (vertices, edges, and faces) can be hidden in order to see and access objects that are behind them.
Version 1.7.1, 27 Feb 2008
- There was an entry in the file menu which didn't do anything. This entry said Import..., but importing is actually implemented in the dialog box which comes up when a new project is created. So the separate menu function for importing was not needed. Removed.
- Bones can be pushed to the bottom of the Bone queue so that the user doesn't have to move a Bone in order to access another Bone located in the same place.
Version 1.7, 25 Feb 2008
- LionSnake now supports faces with more than four sides. The limit now is 32,767 sides per face. If you try to exceed that, I can't be held responsible.
- LionSnake can now import and export Alias/Wavefront
.obj
and .mtl
files. Presently edge sharpness is not saved in the files, but the face grouping assignment is. I was considering making this the primary file format, but it does not support all of the features that I wanted, so I stayed with my own format with the .lsm
extension.
- A bug with the mouse mode was causing crashes after a certain number of undo and redo operations. Fixed.
- When a Bone with dependent Bones or Vertices is deleted, a confirmation dialog box now appears, and among other things lets you specify whether to make the dependent items non-dependent, make them dependent on the deleted Bone's parent (if any), or to cancel the deletion altogether.
- You can select all of a continuous section of mesh at once, by selecting that operation from the context menu for any vertex, edge, or face in the desired section.
- The display of the axes is now more consistent.
- The subdivision preview is no longer as smooth as it once was. I hope to get it back to something nice (and, hopefully, better) soon.
- The default color for faces is now a full white (
<255,255,255>
), instead of the medium-light gray (<160,160,160>
) used before. This was done because the default color for Alias/Wavefront objects is white.
- Performance is now vastly improved for large meshes. There was an O(N^2) situation that came up with file loading and mesh validation. This caused some meshes to take a long time (two minutes or more) to load from file or make any edit to the mesh topography. Fixed.
- Mesh selection is more consistent as well. You can select mesh portions by selecting vertices, edges, or faces.
- The POV-Ray macros have been replaced with a new set, based on the Catmull-Clark subdivision scheme. The names of the files have been changed (they start with
c2s3
instead of the former nsss
) so that using the new macro suite won't overwrite older work.
- And nobody cares, but all of the C-style
malloc()
, calloc()
, and free()
calls have been replaced with C++ equivalent (new
and delete
) statements.
- And some of you may care that the header files in the source code have been rearranged from their former evil state to something that is easier to follow; the crazy way of nesting them has been replaced with something more sensible.
- Furthermore, the sources have been re-arranged. With some exceptions, all of the member functions for the
Model
class are now in files named model_*.cpp
, where the *
stands for the first letter of the function name. There are now more source files, but they are now mostly smaller, and it's easier to find a function in the source files.
- And to make things easier for any masochist who wants to port this to Mac or Linux (and to eliminate a global variable to track an end-of-file condition), I have encapsulated the code for reading and writing files into a set of file handling classes. I developed my own set of classes instead of using the standard library streaming operators, because at least on my compiler those things are bloated.
Version 1.6.9, 20 November 2007
- When texture mapping is removed from a face, the mapping points that are no longer in use were still being written to file instead of being quietly discarded. Fixed.
Version 1.6.8, 19 November 2007
- The uv mapping edit mode was not displaying the map edges correctly when the map points are not shared across the edge. Fixed.
- The dotted lines that form the uv mapping edges were not being drawn properly. This was purely cosmetic and most users probably didn't notice it. Fixed.
- The uv mapping data was not being read from saved files. Fixed.
- LionSnake is now developed using the OpenWatcom C++ compiler. The Dev-C++ compiler is no longer supported, so migration was in order anyway, and OpenWatcom produces a slightly smaller binary.
Version 1.6.7, 24 February 2007
- While working on v1.7, I found that sometimes the function which makes the windings of the faces uniform was not working correctly. After fixing it in that version, I modified the v1.6 code to match, and eliminated some unnecessary lines of code as well.
Version 1.6.6, 17 February 2007
- I have a custom-made container for my linked lists, and this container had a member which kept track of the number of items in the list. When an item was removed from the list, the remove function had only a pointer to the object, and not to the container; the dummy head of the list is also the first member of the container, so I could find the container by tracing back from the object to the start of the list, re-casting the pointer, and then accessing the population member. This was not good coding practice, was probably hurting performance, and may have been the cause of a crash that sometimes happened at program exit. I was able to eliminate all access to the population member, and therefore remove it, and therefore eliminate the list trace.
Version 1.6.5, 22 January 2007
- A bug in one of the undo/redo functions, which was noticed during work on version 1.7, was causing the undo feature to erroneously delete some objects. Fixed.
Version 1.6.4, 6 January 2007
- A very subtle bug was causing crashes, sometimes, when strings were compared. It was an intermittent bug, striking some users everytime, and others only once in a while. It turns out that the standard function
strcmp()
doesn't check for NULL
input. Fixed.
Version 1.6.3, 5 January 2007
- The application would hang when trying to load an .lsm file which specified a face that could not be created. Fixed.
Version 1.6, 22 December 2006
- The extrusion operation now operates slightly differently. Formerly, only orphan edges (those with no bordering face) and border edges (those with one bordering face) could be extruded. Now an interior edge can be extruded if one face is marked and the other is not, so that a face or a group of faces can be moved out from the surface that they're part of.
Version 1.6, 6 December 2006
- The function which merges vertices was not deleting unneeded edges when this took place. Among other things, this resulted in improper subdivision results. Fixed.
- There was a problem with one of my
#define
s causing compile-time errors when reading the standard headers. Fixed. I had originally "fixed" this by editing the standard header (wincon.h
), but then I realized that I shouldn't expect other people trying to compile this to edit their standard headers, so I rearranged the order of the header files so that standard headers are included prior to my own rather haphazardly organized headers. I tried replacing the offending #define
s with const
variables, but for some strange reason this made the executable larger.
Version 1.6, 4 November 2006
- After sketching out ideas for a scene building capability (it will be part of version 2.0), I concluded that the parts and knobs skeleton system was not going to work and had to be redesigned. The new system uses one object type—they're called Bones—and this new system works differently (and has more features). The new system is reflected in the saved files, hence a new version number. Version 1.6 will load older files (v1.5 and earlier), and will replace the old-style skeleton with a new-style skeleton (which you will probably want to delete and rebuild).
- LionSnake's save files are now text files instead of binaries, and can be viewed and edited with a text editor. Among other things, this makes it easier for me to debug file operations...
- Some of the vertex editing functions have been moved to one dialog box.
- At some point during the last few version changes, the undo/redo feature began to misbehave. I was in no mood to debug it, but I was in the mood to implement it in a completely different way, and it appears to be fixed (and probably performs better).
- Splitting faces from the context menu wasn't working. Fixed.
- In addition to splitting the mesh, you can also subdivide it using a modified Loop scheme. This is just like splitting, except that the vertices of the new mesh are adjusted to produce a smoother result.
- In uv-mapping mode, the edges between mapping points were drawn in an inconsistent way (they would oscillate between solid and dotted while a point was dragged). Fixed.
- If the window was resized down to the point that there was no room for the model display, the program would hang. Fixed.
- The scroll bars, which didn't work, have been removed. They'll be back when they work.
- Layering now only applies to faces. Vertices and edges will display unless all bordering faces are hidden.
Version 1.5b, 29 March 2006
- Vertex selection with the mouse is now more interactive. Instead of marking and unmarking vertices when the left button is released, the selection changes to match the box as the mouse moves.
- The appearance of the select box was changed.
Version 1.5b, 28 March 2006
- Lionsnake will now export OBJ files for use in other applications.
Version 1.5a, 6 December 2005
- The texture edit dialog was allowing the user to give the same name to more than one texture in a model. Fixed.
- The layer edit dialog was allowing the user to give the same name to more than one layer in a model. Fixed.
Version 1.5a, 27 November 2005
- Riser knob deletion was causing attempts to delete the knob multiple times, which led to bugs. This was fixed by not allowing a knob to be deleted if it is in use by a part (whether as a base, riser, or end).
- Although it is transparent to the user, a great number of the program's C-style (read: global) functions have been converted to C++ member functions.
Version 1.5a, 3 November 2005
- When a vertex was part of a hidden layer, it would still highlight on mouse roll-over. Fixed.
Version 1.5a, 14 July 2005
- I have begun converting the code from C to C++, in order to get the code organized so that I can add scene building to the application without going insane. As with any C-to-C++ conversion, most of the work involved turning global functions (272 of them) and global variables into member functions and variables. If you glance through the download archive you'll see the
.cpp
extension instead of .c
on the source files. I'm using the Dev C++ compiler again; the "bloat" that I reported earlier was probably debugger info, and not bloat. The size of the executable only went up by 10%. LionSnake remains "the modeler on a floppy," for those of you who still use floppies, or even have a floppy drive...
- I also implemented the Dialex object as described on this page. The change is transparent to the user, but the client code is easier to understand. There's already something along these lines in Micro$oft Visual C++, but for those of you who don't have the $$$ to buy MSVC, it may be helpful.
- A misguided attempt to optimize the edge drawing in uv-mapping view caused the edges to be drawn in a crazy way. Fixed.
- While I was fixing the above problem, I replaced the fat edges with thin, stippled ones. This should be less distracting from the map texture.
- The uv-mapping view is first centered at <.5,.5> instead of at <0,0>. This should more-or-less center the view for the first switch to uv-mapping mode.
- Resizing the application window was causing uv-mapped faces to be rendered as solid white. Fixed.
- Zoom-to-fit didn't work in uv-mapping mode. Fixed.
- You can now merge two vertices, by dragging one vertex on top of another. When you release the first one, a dialog box will ask for confirmation.
- When exiting from the program with two models open, the program would crash. This appears to be fixed.
Version 1.5, 28 February 2005
- The program now makes use of OpenGL texture objects, instead of re-loading the same data over and over. This drastically improves performance when a large number of faces use the same texture.
Version 1.5, 13 December 2004
- Undo and redo now work. This required a change to the way some objects were saved to file, and earlier versions may not read them, hence a new version number. BTW, when writing the undo/redo function, I searched the Internet for documents by people who had done this before, and found nothing. Come on, guys. Help out a brother.
Version 1.4, 7 December 2004
- The little boxes that formed the vertices and uv-mapping points weren't coming out consistently, so I made them into solid boxes which work right.
- Highlighting was changed a bit.
- Axis drawing was changed a bit.
- When a texture was selected from the dialog, it was not made the current texture. Fixed.
- When a vertex's selection was toggled, the edges and faces were not updated accordingly. Fixed.
- When selecting a large number of vertices with click-n-drag, there was a limit to the number of vertices that could be selected. Fixed.
Version 1.4, 29 November 2004
- There are now layers, which allow vertices, edges, and faces to be logically grouped. This information is saved to file, therefore there is a new version number.
- To facilitate coloring of layers, edges are not colored according to their sharpness, but instead are stippled according to their sharpness.
- The tint selection and tint editing dialog boxes were combined.
- You can now texture all marked faces at once.
- The default UV-mapping pattern uses colors that are more contrasting.
Version 1.3f, 16 November 2004
- Quad faces were slightly distorted in the subdivision preview. Fixed.
- Part names were not being loaded from file. Fixed.
Version 1.3f, 11 November 2004
- The subdivision preview is now available within the mesh edit view. You can now edit the mesh and see the results as you edit. The preview algorithm uses less memory, too.
- Some dialog boxes had mislabeled edit boxes. This was purely cosmetic. Fixed.
Version 1.3e, 4 October 2004
- The axis marking was buggy in the uv-mapping view. Fixed.
Version 1.3e, 20 September 2004
- The limited subdivision preview is somewhat improved. The previous version used quadric Bezier patches based on a single subdivision step; the current version uses quartic Bezier patches based on two subdivision steps.
- The axis marking was buggy in some of the views. Fixed.
Version 1.3e, 6 September 2004
- Added a lathe function.
- There was a bug in the subdivision surface macros, which caused finitely sharp edges to yield pinched-looking normals when the sharpness level was exceeded in subdivision. Fixed.
- Floating-point precision errors were cropping up when returning values of some angles. Added code to round off such.
Version 1.3d, 26 August 2004
- The skeleton editing was behaving strangely. Fixed. I think.
Version 1.3d, 14 August 2004
- The X-Y, X-Z, and Y-Z view buttons have been replaced with six different view buttons, which view the model from above, below, left, right, front or behind. The older views tended to show the model from behind or from below, and I usually wanted to see the model from the front or above. Also, using terms like above, below, etc., increases the inutitiveness of the interface for those who are not interested in analytical geometry.
- The menus were tweaked a bit.
- A minor bug in the lighting caused the diffuse lighting to change when the view was zoomed in and out. Fixed.
Version 1.3c, 11 August 2004
- There is now a limited subdivision preview. There is no smoothing of the faces, and the results are not accurate.
- Part angles were not always stored in the right place after being calculated, resulting in part angles being reset to zero after an attempt to edit them. Fixed.
Version 1.3b, 6 July 2004
- The exported INC files were lacking an equal sign in the
#local
statements which declared the independent vertices. Fixed.
- The file
sample.inc
was from an old version of the modeler, instead of being a recent sample export. Fixed.
Version 1.3b, 5 July 2004
- For some reason
nsss.inc
was missing from the archive. Fixed.
Version 1.3b, 9 June 2004
- Diffuse lighting of faces has been added.
- When using mesh add mode to add a third face to an edge, the program crashed. Fixed.
- When something deleted a uv-map point, a dialog box popped up saying what had just happened. I had added this during a debugging session and had forgotten to remove it. Removed.
Version 1.3a, 8 June 2004
- Edge splitting added.
- In uv-mapping mode, all of the uv-mapping points were editable, even though those affecting non-current textures were invisible (except when the mouse was over them). Fixed; when in uv-mapping mode, only the uv-map points for faces using the current texture are visible or accessible.
Version 1.3, 3 June 2004
- When an edge that already has a face on one side is extruded, the texture and uv-mapping data (if any) of the old face is extended into the new face.
- The program crashed when the user changed the texture of a face. Fixed.
- Vertex locking added. Vertex locking is included in the saved files, so a new version number was required.
Version 1.2, 30 May 2004
- The macro
SSS_BuildFlatMesh()
had a parse-killing bug in it. Fixed.
Version 1.2, 28 May 2004
- I converted the code completely back to C code, so that I could migrate from the bloated Dev-C++ compiler back to the much leaner Lcc-Win32 compiler. This reduced the size of the executable by over 60%, with no reduction in functionality.
- I replaced the range limits on part parameters with locking. The locking is completely gone from the exported POV-Ray .INC files; if you're smart enough to script for POV-Ray, you should be smart enough not to make your models do wacky things (unintentionally).
- I added a toolbar. The user interface is mostly one-handed now.
- Due to an inconsistency in the Windows GUI, some context menus appeared above and/or to the left of the mouse pointer. Fixed.
- There are now three kinds of parts, which differ by the way they bend at the base. This data is part of the saved files, so a new version number was necessary.
- In the .INC file, the lines that handled the delta parameters were erroneously prefixed with the part name (which would result in parsing errors in POV-Ray). Fixed.
23 April 2004
- A bug in the tint selection dialog box kept new tints from being displayed properly. Fixed.
- I replaced the C++ file streaming with old C file writing. None of the affected code was speed critical, but the size of the executable dropped by over 55%.
- The source files are now included in the download.
22 April 2004
- Original program released to widespread acclaim.
Known Issues