# Giant Mushroom Tree

> A fantasy giant mushroom tree: a tall, gently bent pale stalk with a skirt ring carries a broad domed cap, while smaller caps branch off on curving side stems in layered tiers. Optional glowing spots, gills and tiny glowing mushrooms at the foot light up enchanted forests, fairy glades, alien worlds and dark caves.

![Giant Mushroom Tree preview](https://codels.download/m/mushroom-tree.png)

Multi-view sheet (3/4, front, side, top): https://codels.download/m/mushroom-tree.sheet.png

## Facts

- Category: Nature › Trees
- Size (W × H × D): 4.16 × 5.74 × 4.23 m — units are meters, +Y up, front faces +Z
- Origin: center of the base (y = 0)
- Triangles: 1,740 · Meshes: 47 · Materials: 6
- License: CC0-1.0 (Codels built-in)
- Tags: giant-mushroom, mushroom, toadstool, tree, cartoon, low-poly, stylized, fantasy, cave, forest, swamp, adventure, platformer, rpg, decoration, landmark, vegetation, organic, tall, emissive, parametric, color-orange, color-purple, size-large, poly-medium
- Page: https://codels.download/models/mushroom-tree

## Files

| Format | URL |
|---|---|
| three.js ES module (`createMushroomTree()`) | https://codels.download/m/mushroom-tree.js |
| React Three Fiber component (`<MushroomTree />`) | https://codels.download/m/mushroom-tree.jsx |
| Instancing module (`createMushroomTreeInstances(count, place)`, one draw call per material) | https://codels.download/m/mushroom-tree.instanced.js |
| Standalone HTML demo | https://codels.download/m/mushroom-tree.html |
| glTF binary | https://codels.download/m/mushroom-tree.glb |
| glTF binary, Meshopt-compressed (2–3× smaller; GLTFLoader needs `setMeshoptDecoder(MeshoptDecoder)`) | https://codels.download/m/mushroom-tree.glb?compress=meshopt |
| glTF JSON | https://codels.download/m/mushroom-tree.gltf |
| OBJ (vertex colors) + MTL | https://codels.download/m/mushroom-tree.obj · https://codels.download/m/mushroom-tree.mtl |
| STL | https://codels.download/m/mushroom-tree.stl |
| CodelSpec JSON | https://codels.download/m/mushroom-tree.json |

## Parameters

Append them as query parameters to any URL above to get a customized variant (e.g. `?height=...`).

| Param | Type | Range / options | Default | Current |
|---|---|---|---|---|
| `height` | number | 3 – 10 | 5.5 | 5.5 |
| `tiers` | int | 1 – 4 | 3 | 3 |
| `cap` | color | #rrggbb | #7a4ab0 | #7a4ab0 |
| `glow` | boolean | true \| false | true | true |
| `glowColor` | color | #rrggbb | #6ff3e8 | #6ff3e8 |

## Parts

- foot (lathe · stalk)
- stalk1 (cylinder · stalk)
- stalk2 (cylinder · stalk)
- stalk3 (cylinder · stalk)
- stalk4 (cylinder · stalk)
- skirt (cylinder · stalkDark)
- mainCap (group)
  - cap (lathe · cap)
  - gills (lathe · gill)
  - spot1 (sphere · spot)
  - spot2 (sphere · spot)
  - spot3 (sphere · spot)
  - spot4 (sphere · spot)
  - spot5 (sphere · spot)
  - spot6 (sphere · spot)
  - spot7 (sphere · spot)
  - spot8 (sphere · spot)
  - spot9 (sphere · spot)
- sideStem1 (cylinder · stalk)
- sideStem1Tip (cylinder · stalk)
- sideCap1 (group)
  - cap (lathe · capAlt)
  - gills (lathe · gill)
  - spot1 (sphere · spot)
  - spot2 (sphere · spot)
  - spot3 (sphere · spot)
  - spot4 (sphere · spot)
  - spot5 (sphere · spot)
  - spot6 (sphere · spot)
- sideStem2 (cylinder · stalk)
- sideStem2Tip (cylinder · stalk)
- sideCap2 (group)
  - cap (lathe · cap)
  - gills (lathe · gill)
  - spot1 (sphere · spot)
  - spot2 (sphere · spot)
  - spot3 (sphere · spot)
  - spot4 (sphere · spot)
  - spot5 (sphere · spot)
  - spot6 (sphere · spot)

## How to use

Save the code below as `mushroom-tree.js`, then:

```js
import { createMushroomTree } from './mushroom-tree.js';
const model = createMushroomTree();
scene.add(model);
```

## Code

```js
/**
 * Giant Mushroom Tree — Codels 3D model library (https://codels.download/models/mushroom-tree)
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 1,740 · Size (W × H × D): 4.16 × 5.74 × 4.23 m
 *
 * Usage:
 *   import { createMushroomTree } from './mushroom-tree.js';
 *   
 *   const model = createMushroomTree();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

// Revolve a 2D profile [[radius, y], ...] around the Y axis.
function lathe(points, segments, phiStart = 0, phiLength = Math.PI * 2) {
  return new THREE.LatheGeometry(points.map(([x, y]) => new THREE.Vector2(x, y)), segments, phiStart, phiLength);
}

export function createMushroomTree() {
  const root = new THREE.Group();
  root.name = 'MushroomTree';

  // Materials
  const stalkMat = new THREE.MeshStandardMaterial({ name: 'stalk', color: 0xe4d9c3, roughness: 0.8, flatShading: true });
  const stalkDarkMat = new THREE.MeshStandardMaterial({ name: 'stalkDark', color: 0xc4b59b, roughness: 0.85, flatShading: true });
  const capMat = new THREE.MeshStandardMaterial({ name: 'cap', color: 0x7a4ab0, roughness: 0.6, flatShading: true });
  const capAltMat = new THREE.MeshStandardMaterial({ name: 'capAlt', color: 0x643d90, roughness: 0.6, flatShading: true });
  const gillMat = new THREE.MeshStandardMaterial({ name: 'gill', color: 0xbca0c6, roughness: 0.8, emissive: 0x6ff3e8, emissiveIntensity: 0.25, flatShading: true });
  const spotMat = new THREE.MeshStandardMaterial({ name: 'spot', color: 0x6ff3e8, roughness: 0.3, emissive: 0x6ff3e8, emissiveIntensity: 1.2, flatShading: true });

  // Shared geometries
  const cylinderGeo = new THREE.CylinderGeometry(0.0787, 0.1609, 0.555, 5);

  // Parts
  const foot = new THREE.Mesh(lathe([[0, 0], [0.6793, 0], [0.6256, 0.275], [0.4469, 0.66], [0.3647, 0.99], [0, 1.1]], 10), stalkMat);
  foot.name = 'foot';
  foot.position.set(-0.1648, 0, 0);
  root.add(foot);
  const stalk1 = new THREE.Mesh(new THREE.CylinderGeometry(0.3414, 0.3575, 1.2577, 9), stalkMat);
  stalk1.name = 'stalk1';
  stalk1.position.set(0.0122, 1.0051, 0.0502);
  stalk1.rotation.set(deg(2.7141), deg(-0.2152), deg(-9.0661));
  root.add(stalk1);
  const stalk2 = new THREE.Mesh(new THREE.CylinderGeometry(0.3253, 0.3414, 1.2458, 9), stalkMat);
  stalk2.name = 'stalk2';
  stalk2.position.set(0.131, 2.0694, 0.0946);
  stalk2.rotation.set(deg(2.0227), deg(-0.0641), deg(-3.6284));
  root.add(stalk2);
  const stalk3 = new THREE.Mesh(new THREE.CylinderGeometry(0.3092, 0.3253, 1.2449, 9), stalkMat);
  stalk3.name = 'stalk3';
  stalk3.position.set(0.134, 3.1336, 0.1222);
  stalk3.rotation.set(deg(0.9437), deg(0.0272), deg(3.3003));
  root.add(stalk3);
  const stalk4 = new THREE.Mesh(new THREE.CylinderGeometry(0.2932, 0.3092, 1.2559, 9), stalkMat);
  stalk4.name = 'stalk4';
  stalk4.position.set(0.0202, 4.1979, 0.1282);
  stalk4.rotation.set(deg(-0.3008), deg(-0.0234), deg(8.8796));
  root.add(stalk4);
  const skirt = new THREE.Mesh(new THREE.CylinderGeometry(0.3754, 0.572, 0.22, 10, 1, true), stalkDarkMat);
  skirt.name = 'skirt';
  skirt.position.set(-0.0827, 4.07, 0.1254);
  root.add(skirt);
  const mainCap = new THREE.Group();
  mainCap.name = 'mainCap';
  mainCap.position.set(-0.0629, 4.4924, 0.1254);
  mainCap.rotation.set(deg(2.0709), 0, deg(2.7496));
  root.add(mainCap);
  const cap = new THREE.Mesh(lathe([[1.9206, -0.0594], [1.98, 0.1188], [1.8216, 0.4752], [1.4256, 0.8712], [0.8316, 1.1484], [0, 1.2474]], 12), capMat);
  cap.name = 'cap';
  mainCap.add(cap);
  const gills = new THREE.Mesh(lathe([[0.2127, 0.4356], [0.99, 0.198], [1.9206, -0.0594]], 12), gillMat);
  gills.name = 'gills';
  mainCap.add(gills);
  const spot1 = new THREE.Mesh(new THREE.SphereGeometry(0.1868, 7, 3), spotMat);
  spot1.name = 'spot1';
  spot1.position.set(1.3303, 0.9141, 0.0123);
  spot1.rotation.set(deg(6.4667), deg(-1.4265), deg(-24.8552));
  spot1.scale.set(1, 0.3, 1);
  mainCap.add(spot1);
  const spot2 = new THREE.Mesh(new THREE.SphereGeometry(0.1812, 7, 3), spotMat);
  spot2.name = 'spot2';
  spot2.position.set(0.5971, 1.1346, 0.5793);
  spot2.rotation.set(deg(17.938), deg(-2.8539), deg(-17.938));
  spot2.scale.set(1, 0.3, 1);
  mainCap.add(spot2);
  const spot3 = new THREE.Mesh(new THREE.SphereGeometry(0.1867, 7, 3), spotMat);
  spot3.name = 'spot3';
  spot3.position.set(0.6502, 0.9134, 1.1609);
  spot3.rotation.set(deg(24.8552), deg(-1.4265), deg(-6.4667));
  spot3.scale.set(1, 0.3, 1);
  mainCap.add(spot3);
  const spot4 = new THREE.Mesh(new THREE.SphereGeometry(0.2054, 7, 3), spotMat);
  spot4.name = 'spot4';
  spot4.position.set(-0.3187, 1.165, 0.6065);
  spot4.rotation.set(deg(6.7856), deg(0.1076), deg(1.8142));
  spot4.scale.set(1, 0.3, 1);
  mainCap.add(spot4);
  const spot5 = new THREE.Mesh(new THREE.SphereGeometry(0.1926, 7, 3), spotMat);
  spot5.name = 'spot5';
  spot5.position.set(-1.2769, 0.8699, 0.5597);
  spot5.rotation.set(deg(10.7603), deg(4.3767), deg(44.1691));
  spot5.scale.set(1, 0.3, 1);
  mainCap.add(spot5);
  const spot6 = new THREE.Mesh(new THREE.SphereGeometry(0.1605, 7, 3), spotMat);
  spot6.name = 'spot6';
  spot6.position.set(-0.564, 1.1789, -0.0439);
  spot6.rotation.set(deg(-1.8142), deg(-0.1076), deg(6.7856));
  spot6.scale.set(1, 0.3, 1);
  mainCap.add(spot6);
  const spot7 = new THREE.Mesh(new THREE.SphereGeometry(0.1847, 7, 3), spotMat);
  spot7.name = 'spot7';
  spot7.position.set(-0.719, 0.9371, -1.0356);
  spot7.rotation.set(deg(-17.938), deg(-2.8539), deg(17.938));
  spot7.scale.set(1, 0.3, 1);
  mainCap.add(spot7);
  const spot8 = new THREE.Mesh(new THREE.SphereGeometry(0.1843, 7, 3), spotMat);
  spot8.name = 'spot8';
  spot8.position.set(-0.0901, 1.1581, -0.7259);
  spot8.rotation.set(deg(-6.7856), deg(-0.1076), deg(1.8142));
  spot8.scale.set(1, 0.3, 1);
  mainCap.add(spot8);
  const spot9 = new THREE.Mesh(new THREE.SphereGeometry(0.2024, 7, 3), spotMat);
  spot9.name = 'spot9';
  spot9.position.set(1.0646, 0.7717, -1.0187);
  spot9.rotation.set(deg(-30.972), deg(8.7792), deg(-30.972));
  spot9.scale.set(1, 0.3, 1);
  mainCap.add(spot9);
  const sideStem1 = new THREE.Mesh(new THREE.CylinderGeometry(0.1448, 0.1609, 0.9823, 7), stalkMat);
  sideStem1.name = 'sideStem1';
  sideStem1.position.set(0.4625, 3.0363, -0.1826);
  sideStem1.rotation.set(deg(-47.738), deg(22.0745), deg(-47.5766));
  root.add(sideStem1);
  const sideStem1Tip = new THREE.Mesh(new THREE.CylinderGeometry(0.1287, 0.1448, 0.8148, 7), stalkMat);
  sideStem1Tip.name = 'sideStem1Tip';
  sideStem1Tip.position.set(0.9286, 3.4213, -0.6499);
  sideStem1Tip.rotation.set(deg(-27.2933), deg(6.7275), deg(-27.2176));
  root.add(sideStem1Tip);
  const sideCap1 = new THREE.Group();
  sideCap1.name = 'sideCap1';
  sideCap1.position.set(1.0917, 3.5934, -0.8134);
  sideCap1.rotation.set(deg(-9.8889), deg(0.8554), deg(-9.8633));
  root.add(sideCap1);
  const cap2 = new THREE.Mesh(lathe([[0.9987, -0.0309], [1.0296, 0.0618], [0.9472, 0.2471], [0.7413, 0.453], [0.4324, 0.5972], [0, 0.6486]], 12), capAltMat);
  cap2.name = 'cap';
  sideCap1.add(cap2);
  const gills2 = new THREE.Mesh(lathe([[0.1126, 0.2265], [0.5148, 0.103], [0.9987, -0.0309]], 12), gillMat);
  gills2.name = 'gills';
  sideCap1.add(gills2);
  const spot12 = new THREE.Mesh(new THREE.SphereGeometry(0.0981, 7, 3), spotMat);
  spot12.name = 'spot1';
  spot12.position.set(0.5518, 0.5181, -0.1864);
  spot12.rotation.set(deg(-6.4684), deg(1.4273), deg(-24.8622));
  spot12.scale.set(1, 0.3, 1);
  sideCap1.add(spot12);
  const spot22 = new THREE.Mesh(new THREE.SphereGeometry(0.0809, 7, 3), spotMat);
  spot22.name = 'spot2';
  spot22.position.set(0.2036, 0.6089, 0.2522);
  spot22.rotation.set(deg(4.9548), deg(-0.2145), deg(-4.9548));
  spot22.scale.set(1, 0.3, 1);
  sideCap1.add(spot22);
  const spot32 = new THREE.Mesh(new THREE.SphereGeometry(0.1061, 7, 3), spotMat);
  spot32.name = 'spot3';
  spot32.position.set(-0.4026, 0.4002, 0.6821);
  spot32.rotation.set(deg(30.972), deg(8.7792), deg(30.972));
  spot32.scale.set(1, 0.3, 1);
  sideCap1.add(spot32);
  const spot42 = new THREE.Mesh(new THREE.SphereGeometry(0.0807, 7, 3), spotMat);
  spot42.name = 'spot4';
  spot42.position.set(-0.3726, 0.5994, 0.1544);
  spot42.rotation.set(deg(1.8116), deg(0.1073), deg(6.7756));
  spot42.scale.set(1, 0.3, 1);
  sideCap1.add(spot42);
  const spot52 = new THREE.Mesh(new THREE.SphereGeometry(0.1066, 7, 3), spotMat);
  spot52.name = 'spot5';
  spot52.position.set(-0.6032, 0.3684, -0.525);
  spot52.rotation.set(deg(-30.972), deg(-8.7792), deg(30.972));
  spot52.scale.set(1, 0.3, 1);
  sideCap1.add(spot52);
  const spot62 = new THREE.Mesh(new THREE.SphereGeometry(0.0744, 7, 3), spotMat);
  spot62.name = 'spot6';
  spot62.position.set(0.1971, 0.5996, -0.3596);
  spot62.rotation.set(deg(-6.7756), deg(0.1073), deg(-1.8116));
  spot62.scale.set(1, 0.3, 1);
  sideCap1.add(spot62);
  const sideStem2 = new THREE.Mesh(new THREE.CylinderGeometry(0.1448, 0.1609, 1.0865, 7), stalkMat);
  sideStem2.name = 'sideStem2';
  sideStem2.position.set(0.0147, 2.1979, 0.5614);
  sideStem2.rotation.set(deg(73.2898), deg(11.8967), deg(15.9467));
  root.add(sideStem2);
  const sideStem2Tip = new THREE.Mesh(new THREE.CylinderGeometry(0.1287, 0.1448, 0.8533, 7), stalkMat);
  sideStem2Tip.name = 'sideStem2Tip';
  sideStem2Tip.position.set(-0.1901, 2.5829, 1.2751);
  sideStem2Tip.rotation.set(deg(41.4486), deg(4.1523), deg(10.946));
  root.add(sideStem2Tip);
  const sideCap2 = new THREE.Group();
  sideCap2.name = 'sideCap2';
  sideCap2.position.set(-0.2617, 2.7708, 1.5249);
  sideCap2.rotation.set(deg(13.482), deg(0.4534), deg(3.8347));
  root.add(sideCap2);
  const cap3 = new THREE.Mesh(lathe([[0.8451, -0.0261], [0.8712, 0.0523], [0.8015, 0.2091], [0.6273, 0.3833], [0.3659, 0.5053], [0, 0.5489]], 12), capMat);
  cap3.name = 'cap';
  sideCap2.add(cap3);
  const gills3 = new THREE.Mesh(lathe([[0.1126, 0.1917], [0.4356, 0.0871], [0.8451, -0.0261]], 12), gillMat);
  gills3.name = 'gills';
  sideCap2.add(gills3);
  const spot13 = new THREE.Mesh(new THREE.SphereGeometry(0.0867, 7, 3), spotMat);
  spot13.name = 'spot1';
  spot13.position.set(0.6197, 0.3814, -0.0355);
  spot13.rotation.set(deg(-10.7603), deg(4.3767), deg(-44.1691));
  spot13.scale.set(1, 0.3, 1);
  sideCap2.add(spot13);
  const spot23 = new THREE.Mesh(new THREE.SphereGeometry(0.0709, 7, 3), spotMat);
  spot23.name = 'spot2';
  spot23.position.set(0.0851, 0.5162, 0.2518);
  spot23.rotation.set(deg(6.7918), deg(-0.1078), deg(-1.8159));
  spot23.scale.set(1, 0.3, 1);
  sideCap2.add(spot23);
  const spot33 = new THREE.Mesh(new THREE.SphereGeometry(0.0946, 7, 3), spotMat);
  spot33.name = 'spot3';
  spot33.position.set(-0.2235, 0.4417, 0.4424);
  spot33.rotation.set(deg(24.8576), deg(1.4268), deg(6.4673));
  spot33.scale.set(1, 0.3, 1);
  sideCap2.add(spot33);
  const spot43 = new THREE.Mesh(new THREE.SphereGeometry(0.0902, 7, 3), spotMat);
  spot43.name = 'spot4';
  spot43.position.set(-0.3777, 0.4973, 0.0199);
  spot43.rotation.set(deg(6.4673), deg(1.4268), deg(24.8576));
  spot43.scale.set(1, 0.3, 1);
  sideCap2.add(spot43);
  const spot53 = new THREE.Mesh(new THREE.SphereGeometry(0.0723, 7, 3), spotMat);
  spot53.name = 'spot5';
  spot53.position.set(-0.104, 0.4388, -0.4806);
  spot53.rotation.set(deg(-24.8576), deg(-1.4268), deg(6.4673));
  spot53.scale.set(1, 0.3, 1);
  sideCap2.add(spot53);
  const spot63 = new THREE.Mesh(new THREE.SphereGeometry(0.0626, 7, 3), spotMat);
  spot63.name = 'spot6';
  spot63.position.set(0.2801, 0.4975, -0.2425);
  spot63.rotation.set(deg(-17.9396), deg(2.8544), deg(-17.9396));
  spot63.scale.set(1, 0.3, 1);
  sideCap2.add(spot63);
  const root1 = new THREE.Mesh(cylinderGeo, stalkDarkMat);
  root1.name = 'root1';
  root1.position.set(0.3871, 0.143, 0.2947);
  root1.rotation.set(deg(32.2653), deg(-31.5055), deg(-88.5617));
  root.add(root1);
  const root2 = new THREE.Mesh(cylinderGeo, stalkDarkMat);
  root2.name = 'root2';
  root2.position.set(-0.2402, 0.143, 0.6211);
  root2.rotation.set(deg(104.0115), deg(8.6637), deg(6.7725));
  root.add(root2);
  const root3 = new THREE.Mesh(cylinderGeo, stalkDarkMat);
  root3.name = 'root3';
  root3.position.set(-0.7486, 0.143, -0.2249);
  root3.rotation.set(deg(-22.5262), deg(-24.9536), deg(96.0234));
  root.add(root3);
  const root4 = new THREE.Mesh(cylinderGeo, stalkDarkMat);
  root4.name = 'root4';
  root4.position.set(-0.0324, 0.143, -0.6115);
  root4.rotation.set(deg(-102.0356), deg(15.0769), deg(-12.2256));
  root.add(root4);
  const babyMushroom1 = new THREE.Group();
  babyMushroom1.name = 'babyMushroom1';
  babyMushroom1.position.set(1.1172, 0.0077, 0.6312);
  babyMushroom1.rotation.set(deg(-8.2994), deg(299.0295), deg(-2.5648));
  root.add(babyMushroom1);
  const stem = new THREE.Mesh(new THREE.CylinderGeometry(0.0528, 0.0731, 0.4061, 6), stalkMat);
  stem.name = 'stem';
  stem.position.set(0, 0.2031, 0);
  babyMushroom1.add(stem);
  const cap4 = new THREE.Mesh(new THREE.SphereGeometry(0.1705, 8, 3, 0, Math.PI * 2, 0, Math.PI / 2), spotMat);
  cap4.name = 'cap';
  cap4.position.set(0, 0.3654, 0);
  cap4.scale.set(1, 0.75, 1);
  babyMushroom1.add(cap4);
  const babyMushroom2 = new THREE.Group();
  babyMushroom2.name = 'babyMushroom2';
  babyMushroom2.position.set(-1.6388, 0.0067, -0.4437);
  babyMushroom2.rotation.set(deg(6.8698), deg(357.6838), deg(-0.6519));
  root.add(babyMushroom2);
  const stem2 = new THREE.Mesh(new THREE.CylinderGeometry(0.0405, 0.0561, 0.3119, 6), stalkMat);
  stem2.name = 'stem';
  stem2.position.set(0, 0.156, 0);
  babyMushroom2.add(stem2);
  const cap5 = new THREE.Mesh(new THREE.SphereGeometry(0.131, 8, 3, 0, Math.PI * 2, 0, Math.PI / 2), spotMat);
  cap5.name = 'cap';
  cap5.position.set(0, 0.2807, 0);
  cap5.scale.set(1, 0.75, 1);
  babyMushroom2.add(cap5);
  const babyMushroom3 = new THREE.Group();
  babyMushroom3.name = 'babyMushroom3';
  babyMushroom3.position.set(-0.6436, 0.0026, -1.0128);
  babyMushroom3.rotation.set(deg(3.5432), deg(277.8287), deg(5.4572));
  root.add(babyMushroom3);
  const stem3 = new THREE.Mesh(new THREE.CylinderGeometry(0.0572, 0.0791, 0.4397, 6), stalkMat);
  stem3.name = 'stem';
  stem3.position.set(0, 0.2199, 0);
  babyMushroom3.add(stem3);
  const cap6 = new THREE.Mesh(new THREE.SphereGeometry(0.1847, 8, 3, 0, Math.PI * 2, 0, Math.PI / 2), spotMat);
  cap6.name = 'cap';
  cap6.position.set(0, 0.3957, 0);
  cap6.scale.set(1, 0.75, 1);
  babyMushroom3.add(cap6);

  root.traverse((o) => {
    if (o.isMesh) {
      o.castShadow = true;
      o.receiveShadow = true;
    }
  });
  return root;
}

export default createMushroomTree;
```

---
Codels — 3D models as code for three.js. Search more: https://codels.download/api/v1/models?q=<query> · Guide: https://codels.download/llms.txt
