This release features some important bug fixes and a greatly improved
script object script editor, now featuring line number display,
syntax and brace highlighting, and a configurable font.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
18. Apr 2024
Here is a summary of the most important recent
changes
of Ayam in the Mercurial tip:
there is now a curve offset mode that explicitly offsets along the
curve plane normal,
the script object editor has been improved, there is now syntax
highlighting, brace highlighting, a optional line number display, and
a dynamically appearing scrollbar, in addition, the font is now
configurable:
Improved Script Editor with Context Menu
There is a new example Script object that creates fillets with
adjustable tangent vector lengths.
Fillet Curve Script Object Example
There is a new example scene, that demonstrates the use of the
Wavefront MTL realizing surface shaders, see an example rendering:
Wavefront MTL Shader Example Scene
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
The Ayam team is happy to announce the feature freeze and public beta
test of Ayam 1.33. Major new features of this release are interactive
face selection (to improve Subdivision NURBS usability) and Isophotes
display.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
29. Nov 2022
The first hotfix for Ayam 1.31 is now available for
download, it fixes a problem
with external views on X11 when using Tk 8.5.
This does not apply to those on Windows, MacOSX, or using Tk 8.4.
8. Jul 2022
Ayam 1.31 has been released.
The major new feature in this release is the -guiscale
command line option that can be used to adapt the GUI to high resolution
displays. Furthermore, Pixie shader parsing is now available for the
Windows 64-bit build and updated for the other builds.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
6. Feb 2022
Now that the 1.30 release is out of the door, it is time to discuss
the roadmap for the next release. Here are some ideas:
face selection mechanism, especially useful for Subdivision NURBS;
employ peek in trim drawing;
employ common tools (revert, refine, coarsen, split, concat) in more
tool objects;
add trimming and PV tag support to RTESS;
improve Clone to support placing on surfaces, random placement;
research ways for employment of common tools in Script objects;
research ways for allowing Script objects to offer/use editable points;
research Material subclassing and potential support for gltf2 assets;
make more common tools callable from main window;
integration of T-Splines from Grapetec;
PV tag GUI editor;
make action menu configuration code generic and employ it to allow GUI
configuation of the other view icon menus, the scripts and plugins
preferences, and the toolbox;
support for shader array parameters;
draw curvature information as texture to assess curve/surface quality;
This release also contains the first official versions that were compiled
with Tcl/Tk 8.5 and are therefore considered experimental.
You are cordially invited
to try them and report findings to the
forum
or via e-mail.
9. Jan 2022
The Ayam team is happy to announce the feature freeze and public beta
test of Ayam 1.30.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
13. Nov 2021
Here is a summary of the most important recent
changes
of Ayam in the Mercurial tip:
the implicit modelling scope management (point vs. object) has been
reintroduced and is the new default,
panning of perspective views is much improved, paving the way for
potentially adding at least point editing to these views,
support for modelling with approximating surfaces has been added,
Gordon surfaces now support three parameter curves to form a triangular
surface; to improve the rendering of this triangular NURBS surface with its
inevitable degeneracy, the RTESS tesselation (as already known from the
X3DOM NURBS tesselator) with additional degeneracy detection and handling
has been introduced:
In the above example a triangular Gordon surface was tesselated to
approximately 200 triangles using RTESS and GLU (with two different sampling
methods and parameters adapted to yield the best possible result). Compare the
triangle shapes and numbers on the degenerate upper corner of the surface.
added an advanced quadrangulation to the NURBS tesselation
post process, which, in contrast to a pure polymesh quadrangulation,
introduces new points that are directly on the tesselated NURBS surface
leading to much higher surface fidelity:
NURBS Guided Quadrangulation Example
(l: NURBS Guided Quadrangulation,
m: Original Tesselation,
r: Polygonal Quadrangulation)
many complex NURBS tools now support preview for easier exploration
of parameters:
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
13. Feb 2021
Here are the most important changes of Ayam in Mercurial.
The action icon menu can now be configured using a new preference
dialog:
Action Menu Configuration Dialog
As you can also see in this dialog, there are two new selection actions...
These two selection actions, for NURBS surface boundary curves, form
the base of much improved tool object hierarchy building tools.
After the selection of multiple boundary curves e.g. a Skin object
connecting the originating surfaces using a set of automatically
created and parameterized ExtrNC objects can be created with a single
click.
The boundary curve selection uses a new feature of the Ayam core,
the peek mechanism, that allows tool objects or tools direct
access to the internal data structures of other objects. The old provide
mechanism always creates copies of the data, which is much less efficient
and therefore unsuitable for interactive contexts or very large tool object
hierarchies.
The Gordon surface tool object finally supports the general case
of n by m parameter curves, where the internal intersection points are
computed automatically.
See also the following image:
General Gordon Surface Example (click for larger version)
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
29. Jan 2021
Thanks to the hard work of Alain Siksik, a
french translation of the reference manual of
Ayam 1.28 is now available, thanks again Alain.
Because of his unfamiliarity with some of the more advanced technical
terms, Alain is kindly asking you for feedback/improvements.
1. Nov 2020
The first hotfix for Ayam 1.28 is now available for
download, it fixes a problem
with the AutoFocus preference setting.
25. Sep 2020
Due to errors in the install scripts the Linux installer executables
of Ayam 1.28 have been re-released.
The Mac OS X / X11 distribution has also been updated due to the missing
fifodspy plugin.
Get the new versions from the
download page.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
18. Jul 2020
Here are the most important changes of Ayam in Mercurial.
Introducing simple curve fairing:
Curve Fairing Example, Original (u), Selection (m),
Faired (l) Curves
Curvature Plots of Original (l) and Faired (r) Curves
Multiple points now flash fully and are painted completely red,
if all their individual points are selected.
Viewport rendering now also works on Windows.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
29. Apr 2020
Here are the most important changes of Ayam in Mercurial since last release.
A new rendering mode (Viewport) has been implemented that allows to
render directly into a view window:
Viewport Rendering Example (click for larger version)
The RIB export preferences have been reorganized for increased clarity
and do not show all renderer and shadow maps options at once anymore.
RIB Export Preferences
The curvature of NURBS curves can now be displayed in an interactive
diagram (with resizing, zooming, panning, and live updates), implemented as
object property:
Curvature Diagram Property (u) of Curve (l)
Extracted boundary curves can now also carry extracted surface normals
and tangents.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
4. Feb 2020
Due to the discovery of major bugs in Ayam 1.27 it has been re-released.
Get the new version from the
download page, see also the
complete list of changes.
We apologize for the inconvenience.
The Ayam 1.27 beta release is now available in a second version to
reflect a massive set of changes to the property management code
that occurred in the last two weeks.
These changes were necessary to improve compatibility with newer
versions of Tcl/Tk. Get the new beta from the
SourceForge File Release System.
Expected release date for 1.27 final is still 27. Jan 2020.
14. Dec 2019
The Ayam team is happy to announce the feature freeze and public beta
test of Ayam 1.27.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
1. Jun 2019
The first hotfix for Ayam 1.26 is now available for
download, it fixes a problem
with Alt-F4 on Windows.
23. Feb 2019
Introducing Quick Parameter GUIs that pop up in interactive modelling
actions as soon as a number key is pressed and help to parameterize
the action exactly by keyboard.
Quick Parameter GUI Example
Currently supported are all object and point transforming actions that
work with one parameter value, e.g. all scale, rotate, and move
1D actions.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
18. Feb 2019
Due to errors in the project setup the originally distributed
X3D import/export plugin does not work correctly on Windows.
A fixed version can be downloaded from the
SourceForge File Release System.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
11. Aug 2018
Here are the most important changes of Ayam in Mercurial since last release.
Introducing a new custom object for modelling
with Subdivision Curves:
Subdivsion Curve Examples
RiInc and RiProc objects can now convey the shape of the objects they
represent via their child objects. Those will be drawn in a dashed
style:
RiInc Example
Another Script object example is the
extruden script that extrudes
arbitrary curves along their mean normal or a manually specified vector:
ExtrudeN Example
The insert point, delete point, and revert actions are now also
available to custom objects. Also NCircle objects profit from that
and can now be reversed very easily.
Script objects now support caps and bevels directly, there is no need
to extract curves and build the caps/bevels on them in complex hierarchies
anymore. This greatly enhances the usability of Script objects that
create NURBS surfaces (e.g. dualsweep, tsurf, extruden).
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
11. Apr 2018
A new version of the Ayam 1.25 Linux 64 bit binary distribution has been
released, as the original version was broken.
Get the new version from the
download page.
Due to the decomissioning of CVS on the SourceForge platform the Ayam
team was forced to convert the Ayam CVS repository to Mercurial, which
is a distributed version control system.
See this new section of the Ayam
homepage for instructions on how to use it.
We apologize for any inconvenience this may cause.
The new repository may also be browsed through a simple
web interface.
20. Nov 2017
The Ayam team is happy to announce the feature freeze and public beta
test of Ayam 1.25.
See
Changes.txt for a complete list of the bug fixes and changes since the
last release.
10. Nov 2017
As the SourceForge hosting platform terminates CVS write support
effective 30. Nov 2017,
the Ayam source code will be transferred to a Git Mercurial repository
on 15. 25. Nov 2017.
21. Oct 2017
Modelling Action Improvements
The past months saw some considerable improvements of the modelling
actions:
drag selection is now supported in the set mark, initial
numeric edit, find u, and split curve actions,
inserting points into curves now allows immediate interactive placing
of the new points,
the weight edit action now works in a more predictable way and
visualizes the current weights by color (see also the image below),
Weight Visualization
the find u and split curve actions now display the
breakpoints (distinct knots) of the curve as rhombuses (see also the image
below),
Breakpoint Display
the breakpoints are also pickable and the picked/selected
knots can be used by other tools like the refine knots
tool.
See
Changes.txt for a complete list of other changes since the
last release.
29. Apr 2017
Periodic Birails Revisited
While periodic
birails
are already supported for quite some time in Ayam,
their use is somewhat limited by the standard birail surface creation algorithm
that does not rotate planar cross section curves to be perpendicular to either
rail, even though the most probable use case of a periodic birail is an object
with cylindrical topology where such behavior would indeed be desirable.
The resulting surface always looks similar to a sweep with the rotate
option turned off. See also the image below.
To improve this situation, the Ayam team introduces a new surface creation
algorithm called DualSweep.
The DualSweep algorithm draws inspiration from the final step of the Gordon
surface creation algorithm, which is a boolean combination of three partial
surfaces (two skinned surfaces and a interpolating surface).
In similar fashion, the DualSweep algorithm combines two swept surfaces with an
additional interpolation control surface (a new feature of the
tween
surface tool as of Ayam 1.25). The swept surfaces, in turn, are created
with adapted cross section curves and, of course, rotation of the cross
section curves to be perpendicular to the trajectory. The adaptation
merely makes sure, that the respective swept surface interpolates the
corresponding end of the cross section curve to fulfill a promise also kept
by the birailing algorithm.
The results of this approach are impressive, as can be seen in the
examples below.
It is much easier now to publish your NURBS models on the web, as the Ayam
team introduced a lightweight implementation of the
<NurbsPatchSurface>and<NurbsTrimmedSurface> X3D nodes for x3dom.
The tessellator is an adaption of the
simple recursive tessellator
by A. J. Chung and A. J. Field.
See the following example:
Trimmed NURBS display in x3dom
In contrast to the original algorithm and example code,
memoization is employed to avoid re-calculating surface and
curve points multiple times,
trim curves are sampled with greater fidelity, but linear trim
segments are not refined to speed up the intersection tests,
partially trimmed triangles are not drawn completely and transparent
(as suggested by the original authors) but instead split again at
the trim intersection.
Still to do:
complete the NURBS support wrt. texture coordinates,
use the X3D tessellation quality attributes for sampling control,
see if the last kinks in the trim outline can also be removed,
enhance the splitEdge() function to consider curvature and/or
trim vicinity,
improve the x3dom integration by e.g. proper reaction to
fieldChanged()-events,
put the tessellator into a webworker to avoid interaction lags and employ
multi core CPUs.
The marsrakete scene has been exported to x3dom
using a simple GLSL toon shader as material.
To facilitate export with such advanced material properties to x3dom,
the X3D export of material objects now supports adding arbitrary
XML data to the respective <Appearance> and
<Material> nodes.
Conversion of tool objects with caps and bevels now preserves the caps
and bevels as tags.
See
Changes.txt for a complete list of other changes since the
last release.
See
Changes.txt for a complete list of the latest changes since the
last release.
9. Nov 2015
Interaction Improvements
Introducing a new interactive selection action for polymesh boundaries
that eases the application
of the manual polymesh gap filling / connect tool below.
See the following image:
Boundary Selection (Origin)
The gap filling / connect tool
requires completely selected (all points) boundaries, but how do you
do this in this sea of points?
Simply start the boundary selection action
and pick a single point on the boundary. See below image.
Boundary Selection (Picking)
Wrongly selected points would do no harm, one can just pick another point
until the boundary is complete. The action also works for multiple selected
objects, i.e. in our example actually two boundaries will be selected by a
single click, see the below image.
Boundary Selection (Result)
Now the gap filling / connect tool can be started, see its
result in the image below.
Polymesh Gap Filling (blue: original meshes, white: new triangles)
See
Changes.txt for a complete list of the other changes in the CVS head.
3. Oct 2015
Towards Watertight Tessellation
The attentive visitor surely noticed, that the example for the
RoundToNormal bevel mode below exhibits
minor defects (holes) where the surface based on the extracted trim curve
meets the base surface. These defects are caused by different
tessellation/sampling densities at the respective edges that in turn result
from the surfaces being incompatible (different number of control points and/or
order) and simply adjusting the tessellation parameters will not help much.
The holes will not be visible when exporting the scene to a RenderMan
renderer that samples the NURBS surfaces to pixel precision anyway.
But if a flawless polygonal mesh is the goal, those holes can
now be filled with a new polymesh tool that connects two mesh edges by
first offsetting them in the direction of the respective surface tangents
and then creating a strip of new triangles
between the edges.
See the following example:
Merely by accident1 the Ayam team
lately discovered that under certain circumstances, the GLU NURBS tessellator
indeed generates and sends us quads as primitives. But in previous
versions Ayam immediately tore them down to triangles. Those quads can now
be kept intact. We introduced a tessellation option that controls which
primitives to generate (triangles or triangles and quads). There is also a
third mode where neighboring triangles are combined to quads if their face
normals are compatible. Whether this third mode should also generate
degenerate quads is currently under consideration.
See the following example tessellations:
Tessellation Primitives
(l: Triangles,
m: Triangles and Quads,
r: Quads)
In the above examples the tessellated cone consists of 176 triangles [l],
152 triangles and (GLU generated) quads [m], and
108 (Ayam generated) quads [r] whereas the number of control points is
constant (117). The use of quads leads to a decreased file size of
about 10%.
1 a forgotten debug printf-command
29. Jul 2015
Introducing a script, cvview, that displays control point arrays
in a Tk canvas as property. The current control point position is shown
as tool tip and control points can be selected by clicking. Very helpful
when control points lump together in 3D space or have irregular values
that let OpenGL freak out. CVView works with all editable curves and
parametric surfaces.
See the following image:
Screenshot of CVView Property
The object search UI has been streamlined by introducing a new user
interface element hat toggles display of seldom used options,
see the following image:
See
Changes.txt for a complete list of the latest changes in the CVS head.
30. May 2015
Here is a summary of recent
changes of Ayam in the CVS head:
There is now an option to switch between display of rational
points in homogeneous or euclidean style.
The STESS NURBS tessellation uses less memory and is much faster now.
Furthermore, to avoid constant re-tessellation when switching interactive
modelling actions, there are now two versions of the tessellation stored.
RIB import is now handling the handedness of the scene correctly,
even if switched in the file via RiOrientation.
RIB import of object instances improved in terms of attribute
handling, plus, for multiple surfaces there will now be an enclosing
Level object to ease later creation of Instances via Automatic Instancing.
Custom knots of concatenated curves/surfaces now preserve the
relative knot spacing of the parameter curves/surfaces.
There were also some serious bug fixes, so that the release of the next
version (1.22) is scheduled for next month (June 2015).
As always, if you are interested in the project: get the
latest release or CVS head and report bugs.
15. Mar 2015
The Linux release archives have been updated with improved
installation support (we now correctly install the libtiff.so).
7. Feb 2015
Ayam 1.21 has been released.
Major improvements are
64 bit Linux build,
caps and bevels for all NURBS objects,
more bevel options (3D, round-to-cap, round-to-normal),
extraction of trim boundaries,
trim support in surface concatenation,
higher tessellation quality at trim edges,
STESS tessellation is faster, more robust, uses less memory,
and features a new high quality mode for planar trimmed surfaces,
new display mode "HiddenWire" (with silhouette detection),
In Ayam, complex objects can be constructed by connecting simple patches or
patch creating tool objects (like Revolve or Skin) smoothly via their
boundaries.
This is easy for normal boundaries as tangents and normals can be extracted
from the underlying surface. It is tricky for trim boundaries, as the
surface tangents generally point into the wrong directions.
Nevertheless, this time we are introducing a new bevel mode,
RoundToNormal, that allows to connect surfaces via trim boundaries
smoothly. See the following example:
Round to Normal Bevel on Extracted Trim Boundary
In the example above a
bevel
was constructed on the extracted hole trim
boundary curve, starting in the direction of the surface tangent and
rounding off to the mean normal. The remote boundary of this bevel was
then used as parameter curve for a
skin surface. Also compare this
smooth surface connection with the sharp surface connection below.
See
Changes.txt for a complete list of other changes in the CVS head.
25. Oct 2014
The curve extraction facility in Ayam has been enhanced to support the
extraction of trim boundaries.
Even though there can not be an exact solution to this problem in the
general case, just tessellating enough points on the trim boundary and
then constructing an interpolating curve can yield satisfactory results,
as can be seen in the following example:
Trim Boundary Extraction
In the example above the extracted hole trim boundary curve, which is
non-planar, as the trim curve is not circular, was used as parameter
curve for a skin surface.
See
Changes.txt for a complete list of other changes in the CVS head.
25. Sep 2014
The Extrude and Text objects have, finally, been converted to use the new
offset based bevel creation algorithms. As consequence, even in the
challenging case of bevelling font outlines, where Ayam 1.20 really
struggles, now convincing geometry results, as can be seen in the following
image:
Beveled Font Outline
For comparison, here is what Ayam 1.20 creates:
Beveled Font Outline (Ayam 1.20)
Here is a tessellation of the beveled font outline:
Tessellation of Beveled Font Outline
See
Changes.txt for a complete list of other changes in the CVS head.
27. Aug 2014
The quest for NURBS tessellation quality continues. This time we introduce
a new specialized tessellation mode for planar trimmed NURBS patches in
Ayam's own tessellator (STESS). This new mode views the tessellated trim
curves as complex polygon with potential holes and tessellates this polygon
with the GLU polygon tessellator for shaded display, see the following example
image:
Specialized Polygon based Tessellation for Trimmed Planar NURBS
For comparison, here is what the normal STESS tessellation creates:
STESS Tessellation for Trimmed Planar NURBS
The results are surely already better than what Ayam 1.20 delivers, but
there are still missing and extraneous patches.
See
Changes.txt for a complete list of other changes in the CVS head.
18. Jul 2014
When tessellating trimmed NURBS patches with Ayam, the underlying GLU API
offers two functions for the specification of trim curves, gluNurbsCurve()
and gluPwlCurve(). The latter is for polygonal trims (Pwl standing for
piecewise linear) that often appear as outer trim loop to limit the
parameter space or generate triangular surfaces. gluPwlCurve() also has
a simpler interface than gluNurbsCurve() as there is no need to specify
the order or a knot vector.
The usage of gluPwlCurve(), however, has an unpleasant and undocumented
side effect in tessellators that stem from the SGI GLU sample implementation:
edges of the tessellated surface that are generated by / run
along such polygons will often not be broken down into smaller
pieces but rather appear unchanged in the tessellation.
In order to fulfill the contract wrt. surface fidelity, dictated by the
respective tessellation mode and parameters, GLU therefore must generate
many triangles in the form of thin spikes adjoining those edges. The coarse
trim edges may even result in clearly off-surface triangles:
Poor Tessellation Caused by gluPwlCurve()
When, instead of gluPwlCurve(), gluNurbsCurve() is used for the specification
of the polygonal trim, a much more pleasant tessellation results:
Good Tessellation Using gluNurbsCurve() Instead of gluPwlCurve()
Therefore, since Ayam 1.21, there is a new hidden parameter
(AvoidPwlCurve) that instructs Ayam to avoid the usage of
gluPwlCurve(). This parameter is enabled by default.
Users of the current release (Ayam 1.20) can enforce this by elevating the
order of all polygonal trims to 3 prior to tessellation.
Depending on the actual tessellation mode, the tessellation fidelity near the
trims may still leave something to be desired. This can be ameliorated
by refining the trim curves for tessellation. Consequently, the tessellation
GUI and TP tags have been enhanced with another parameter
(RefineTrims) that controls how many times the trim curves are to
be refined before being sent to GLU. See the following example of a simple
planar NURBS patch trimmed by the standard NURBS circle:
Example Tessellations (left: RefineTrims 0, right: RefineTrims 2)
Note the rugged tessellation along the trim curve on the left patch whereas
the trim on the right patch displays a nearly perfect circular hole. But
we need much more triangles to do this, right? Wrong!
The left tessellation results in 201 triangles, whereas the much nicer
tessellation on the right hand side consists of 208 triangles.
The wire support for NURBS patches in X3D export has been enhanced to also
cover trimmed patches:
X3D Export Wire Support for Trimmed NURBS
The partially invisible wires are due to lower sampling quality of the
underlying surface, to keep the file size down to a manageable 308kB.
(The Ayam scene file of this object weighs a mere 1464 bytes, as the trim
curves are generated by a Clone object and bevel and cap surface are
also automatically generated.)
The trimmed wire geometry stems from the STESS tessellation, which has
been improved greatly in terms of robustness, speed, and memory consumption
in the progress.
Current work in this area is focused on improving the visibility of the
wires by an adaptive offset and more tessellation configuration options.
In the course of the retirement of SourceForge hosted apps,
the Ayam Wiki was disabled altogether. You did not use it anyway.
The Trim object now has an option to control how the trim curves
are to be scaled to the surface parameter space and works better with
curve providing objects as trim curves.
Gordon objects automatic corner matching now also works with
ACurve, ICurve, and curve providing objects (but the latter are never
modified).
There is now a stripped down version of the notifyOb command
available in Script objects. Thus, Script objects can now create and
control tool objects (e.g. Sweep) more easily.
Based on the already working basis transformation for bicubic
patches (see the new command tobasisPM), current activities
are focused on improving the PatchMesh conversion to NURBS patches and
therefore display of PatchMeshes with arbitrary bases.
5. Apr 2014
Here is a summary of other
changes of Ayam in the CVS head:
Automatic instancing and recursive resolving of instances now have a
scope parameter.
Removing complex object hierarchies with instances, and management
of those hierarchies using the object clipboard works much better
now.
The rendering GUI is more stable and can read progress data from the
stderr channel (this is important for e.g. Gelato).
In object picking mode, the potentially picked objects can now
be highlighted when the mouse pointer hovers over them, as it already
works for points in the point edit modes.
See the new hidden preference setting FlashObjects.
For illustration purposes, there is now also a plugin that exports
data from the feedback buffer (i.e. OpenGL fragments) to vector based
image formats (e.g. PostScript or SVG). The plugin is based on gl2ps
and more useful for line drawings than shaded displays.
30. Mar 2014
Introducing a new drawing mode HiddenWire with advanced
(albeit image based) silhouette detection:
HiddenWire Drawing Mode
The silhouette display works even better in anti-aliased mode:
HiddenWire Drawing Mode with AA
For comparison, here is the result of the normal wire drawing
mode:
Complementing the 3D-bevels there is now a 3D cap generation mode, that,
in conjunction with round to cap bevels (see below), closes the
heavily edited truncated cone smoothly: