Morrowind places its grass, ferns, kelp and lilypads one static at a time, like any rock. OpenMW
has a better home for them: plugins loaded with groundcover= are drawn as groundcover, in bulk,
without collision, and thinned by the player’s density setting. Greenmote moves grass into that
home and keeps it standing on the ground your load order actually has.
Two jobs, one load order
Convert and unclip both read the load order OpenMW reads, and both write plugins OpenMW loads as groundcover.
source
Your openmw.cfg
The data folders, content files and groundcover= plugins OpenMW loads, found where OpenMW finds them.
tool
Greenmote
Reads that load order the way OpenMW does: its statics, its terrain, its textures and its water.
result
OpenMW
Grass drawn as groundcover, standing on the ground this load order has.
service
convert
Grass statics placed by your content files become groundcover.omwaddon; deleted_groundcover.omwaddon hides the originals.
service
unclip
A groundcover plugin is measured reference by reference; what floats, sinks, sits on a road or water, or clips into a rock is fixed or deleted.
How the pieces relate
Your openmw.cfg
→
Greenmote
Greenmote
groundcover=→
OpenMW
convert
writes new plugins→
Greenmote
unclip
rewrites a plugin→
Greenmote
Convert reads your load order, finds the grass statics every content file places in exterior
cells, and writes two plugins: groundcover.omwaddon, which places that grass again as
groundcover, and deleted_groundcover.omwaddon, which hides the originals. The meshes are copied
beside them.
Unclip takes a groundcover plugin, such as a grass mod generated for somebody else’s
landscape, and measures every reference in it against your terrain, water, roads and statics. Grass
that floats is lowered, grass buried too deep is raised, tilts follow the slope, and grass on a
road, under new water or inside a rock is moved or deleted. It reports first and writes only when
asked, keeping the original beside the plugin.
Run greenmote with no arguments and both are in a window, with a Settings tab for
greenmote.toml. The GUI speaks English, French, German, Russian, Spanish and Swedish.
DreamWeave clientsCHIMERA and other tools that read the manifest
Give the tool this page's address, or the manifest directly. It finds the release for its channel, checks compatibility and dependencies, downloads from any listed source and refuses bytes whose SHA-256 does not match.
Convert writes groundcover.omwaddon, deleted_groundcover.omwaddon and Meshes/grass/ into
your data-local folder. Enable them in openmw.cfg, or pass --auto-enable:
Remove the groundcover=groundcover.omwaddon and content=deleted_groundcover.omwaddon lines
from openmw.cfg, then delete the two plugins and Meshes/grass/ from the output folder. Unclip
keeps the plugin it first rewrote as <plugin>.greenmote-original; copy it back over the plugin
to undo every unclip run.
Notes
Unzip the archive anywhere and run greenmote. With no arguments the Windows, macOS and Linux
builds open the GUI; greenmote convert and greenmote unclip run from the command line. The
Android and PortMaster builds are the command line only.
Greenmote finds your openmw.cfg the way OpenMW does. Start here walks
through a first conversion and a first unclip.
Unclip leaves references alone across terrain seams and caps how far it tilts them, convert keeps the newest plugin’s references, and the GUI closes the console Windows opens for it.
Breaking changes
Greenmote is licensed MIT OR Apache-2.0, at your option, instead of GPL-3.0-only. 0.2.0 and 0.3.0 stay GPL-3.0-only.
Added
The GUI window has Greenmote’s crescent-moon icon.
--max-tilt (and max_tilt in greenmote.toml) caps how far orient tilts a reference, 45 degrees by default; a value outside 0 to 90 is a usage error.
The unclip report states max_tilt beside the other tolerances.
Changed
Unclip keeps a reference unchanged where the terrain under its mesh is a seam between landmasses, judged on the tilted base and on the grounded origin.
Convert skips Verdant Bitter Coast fern trees by default.
Unclip refuses Greenmote’s own convert output as a target.
Fixed
Convert writes one CELL record per grid, so the newest plugin’s references win in game instead of the oldest.
Context plugins load with their headers, so inherited references resolve to their owning plugin instead of being dropped.
--output-plugin writes the plugin even when unclip changes nothing.
An [unclip] table that only sets max_tilt or max_sink_fraction is kept.
Unclip no longer stops on a static whose mesh cannot be loaded, and water-delete is a water-plane crossing test again.
A failed command prints its error as a message, and --help describes water-delete and static-delete as they behave.
The Unclip tab’s Open log button opens greenmote-unclip.log.
Starting the GUI from Explorer or a shortcut closes the console window Windows opens for it.
Check it yourself: sha256sum greenmote-Portmaster-ARM64.zip must print the digest above.
0.3.0stable2026-09-27
Unclip measures every reference against the real terrain and collision triangles of your load order, and only writes when asked.
Breaking changes
Unclip is a dry run by default again: --write rewrites the plugin in place, keeping <plugin>.greenmote-original and <plugin>.bak, and --output-plugin writes the rewritten plugin elsewhere. --dry-run, --instances, --meshgenerator-ini, --origin-epsilon and the all and none actions are gone; --write-actions is now --actions, and the old name still works.
float_tolerance, max_sink, max_sink_fraction and sink replace origin_epsilon.
Added
Every reference is measured directly: its mesh’s base against OpenMW’s triangle-split terrain, the texture OpenMW draws under it, the water plane, and the collision triangles of the statics around it. A reference inside a closed rock is recognised by ray parity.
Burial is judged against plant height: the limit is the larger of max_sink units and max_sink_fraction of the mesh.
A plugin outside every data folder brings its mod’s meshes folder into the VFS, so a downloaded grass mod can be checked before it is enabled.
References placed outside their own cell are deleted: OpenMW draws them only from far away.
--verbose writes one line per reference to greenmote-unclip.log; --structured prints the report as JSON; GREENMOTE_PROFILE=1 prints phase timings.
The Unclip tab lists every groundcover= plugin in openmw.cfg with a checkbox and fixes the checked ones.
Changed
Every write is reloaded and checked against the plan, and unclip run again on its own output plans nothing.
Context plugins and occluder meshes load in parallel, and every reference is decided in parallel.
openmw-config 2.0, vfstool_lib 0.10 and rapier3d 0.36.
Fixed
Reference rotations compose as OpenMW composes them; references rotated about more than one axis were measured with the order reversed.
A static moved or deleted by a later plugin no longer leaves a copy behind to clip against.
Dependencies updated past a compile-time security advisory.
Migration
Unclip no longer writes unless you pass --write. Replace --dry-run with nothing, and
--write-actions with --actions. In greenmote.toml, remove [unclip] keys the report warns
about; the Settings tab drops them when it saves.
Check it yourself: sha256sum greenmote-Portmaster-ARM64.zip must print the digest above.
0.2.0stable2026-06-03
Unclip deletes grass on roads and grass that ends up under water, the GUI has tabs and runs several plugins in turn, and Greenmote is GPL-3.0-only.
Added
The water-delete and road-delete unclip actions, with configurable road texture patterns.
Scriptless activators are converted like statics.
Convert, Unclip and Settings tabs in the GUI; the Unclip tab runs a list of plugins one after another, can be cancelled, and can write each to its own output plugin.
Changed
Unclip writes by default; --dry-run inspects without writing.
Tree-like statics no longer count as occluders by default.
Unknown greenmote.toml keys are ignored instead of rejected, and run-time choices are no longer saved to it.
Greenmote is licensed GPL-3.0-only; 0.1.0 carried no license.
Fixed
Static collision follows RootCollisionNode, including hidden ones.
Without a discoverable openmw.cfg, the default user config is used without asking.