Bedrock is the stone shelf of the materialLibraryKit material library, the same library the metals and woods collections plug into. It holds 26 stones, each seamless when tiled, drawn at real-world size (one unit is one metre), physically plausible (no lighting painted into the colour, never metallic, glossy only where the real stone is, like polished marble and obsidian) and light enough for the browser.
Open the world and you are standing in the gallery: every stone in its own bay on a floor tile, a wall, a cube, a sphere, a shader ball and a cylinder, with its reference picture framed beside it. The toolbar switches the lighting for everyone (daylight, overcast, golden hour, moonlight, warm interior, studio), and Materials opens the picker.
The stones
- Natural rock: granite, basalt, obsidian, cliff rock, limestone, sandstone
- Polished and dressed: white marble, dark veined marble, polished granite, cleft slate, travertine
- Laid and built: cobblestones, flagstones, dry-stone wall, ashlar blocks, carved temple stone, river pebbles
- Weathered and overgrown: mossy stone, eroded sandstone
- For boulders and rough shapes: cliff rock and mossy stone, projected from three sides so they need no texture layout
- Stylised: toon rock, toon cobbles, hand-painted dungeon stone, pixel-art stone block, low-poly cliff
Every stone is tagged with its category (stone), kind, style, tile size, roughness and metallic range, texture cost and animated = false, so a world can filter the list: Materials.list({ collection = "stones", style = "toon" }), Materials.list({ collection = "stones", tag = "glossy" }).
Use it
Install stoneMaterials from ZeroMind. That one install brings the material library (materialLibraryKit 1.3.1) with it and nothing else: no copies of the engine's own parts. Then, in any world:
local Materials = require("~materialLibraryKit.Materials")
-- the wall is made on the machine that runs this code; other players do not get it
local wall = entity.spawn("stoneWall", { components = { Model = { model = "cube" } } })
wall.localPosition = { 0, 1, 4 }
wall.localScale = { 2, 2, 0.3 }
local model = wall.component.get("Model")
model.material = Materials.get("ashlarBlocks").material
-- the same wall in a cartoon world: only the name changes
model.material = Materials.get("toonRock").material
A wall a script spawns exists only on the machine that ran the script (in edit mode even with synced = true), so only that machine sees its stone. Materials.apply(target, id) puts a stone on any object with a Model, your own included, and shares the choice with every player whose machine holds the same object, such as the gallery's swatches. To walk round every stone in your own world, run zero scene load stoneMaterials.StonesGallery. The package's README has the full table of stones, their measured scores, and how each was made.
Checked
Every stone passes the library's own checks: seamless when tiled 4 x 4, no shimmer at 30 m under the harshest light (the toon stones are closest, at about 5.3 against a limit of 6), within the browser's per-material limits, and confirmed by the albedo, roughness, metallic and normal views. The checks travel with the package as its test suite.
- Texture memory: 54.8 MB for all 26 stones, 63.5 MB with the reference pictures.
- Download: about 73 MB.
Version history
- 1.2.1 Fixes 1.2.0, which did not work when installed into a new world: its tests did not load, the two boulder stones drew nothing (their shader did not compile on a newer engine), and the first example answered "has no Model to put a material on". 1.2.1 points every reference at the published material library 1.3.0 and records no engine version, the boulder shader takes its lit shading from the engine itself, the gallery's boards use the engine's plain parts, and the first example sets the stone on the object's own
Model, which works in every world. The stones are unchanged. It also moves to the material library 1.3.1, which brings no copies of engine parts (1.3.0 did, and the gallery's boards then used a copiedModel), andMaterials.applyworks on objects a world builds itself. If you installed 1.2.1 before 17:45 UTC on 2026-10-24, install it again. - 1.2.0 One install of the package brings the published material library 1.3.0 as a dependency, with no copies of it; tests run isolated from other players. Did not work in a new world (fixed in 1.2.1).
- 1.1.0 Eight stones redone against their references; download halved.
- 1.0.0 First release: 26 stones, reference pictures, gallery and tests.
Known limits
- The engine's cube, sphere and cylinder show one texture repeat per face, so a stone is at real scale on them only when the object is sized to the stone's tile size. The gallery's floors and walls, and the boulder stones, are always at real scale.
- The toon stones have no albedo, roughness or metallic diagnostic views (they shade themselves).
- Two stones, cliff rock and carved temple stone, come from scans of their reference pictures and can't be re-baked from code.
Comments · 0
Open discussion, no rating attached. Ask questions, swap notes, follow threads.