Use when adding, importing, designing, reviewing, or animating low-poly / stylized 3D assets in Tiny World Builder, including Three.js procedural meshes, GLB/GLTF assets, Poly Pizza models, material palettes, scale/orientation, silhouettes, clouds/planes/crop dusters, and toolbar thumbnails.
68
82%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Use this together with:
.codex/skills/tinyworld-single-file/SKILL.md for single-file constraints..codex/skills/tinyworld-render-performance/SKILL.md for GPU/shadow/renderer limits..agents/skills/3d-modeling/SKILL.md for topology, UV, export, LOD, and GLB hygiene..agents/skills/poly-pizza-api/SKILL.md when sourcing low-poly models from Poly Pizza..agents/skills/lightweight-3d-effects/SKILL.md when adding decorative lightweight 3D effects.THREE.MeshLambertMaterial colors should remain the default for built-in objects.1 x 1 world unit.Box3 bounds, then apply a target span.window.voxelAvatarDescriptor in engine/world/53-voxel-avatar.js and
cleanAvatar in party/index.js in lockstep. The networked Tinyverse
descriptor currently allows kind, seed, body, skin, hairC, hair,
fit, head, height, build, and gear.userData.sharedAvatarAsset so
the avatar dispose path does not dispose shared assets while removing one
avatar instance.voxelAppearanceMaterial() should apply global
materialTexture even when a part has no inferred body/top role, and body/top
colours or textures should override only parts whose material/color maps to
the matching role.cable primitive for actual connections: balloon ropes,
crane lines, tethers, rigging, moorings, bridge suspension lines, and other
angled cords. Do not fake these as vertical stone/wood columns when endpoints
are known.sphere/ellipsoid primitives for rounded balloon
envelopes, domes, tanks, and soft canopies. Panel bands or ribs can be boxes
only when they read as raised seams; colored balloon fabric panels should use
curved ellipsoid slices (phiStart/phiLength) rather than square side
plates.customParts can express the model
directly.M.* material colors for one instance; clone or create a new material. The one allowed global exception is applySeasonFoliage(), which centrally retints shared foliage/grass materials for season changes.MeshLambertMaterial does not provide the same flatShading workflow as Standard/Phong; keep faceted model-stamp fallbacks through non-indexed/flat-normal geometry instead of unsupported material flags.engine/world/04-textures.js as
deterministic coarse canvas textures before adding per-object overrides.
Current coarse material maps include path-pavers, castle-block,
brick-building, roof-shingles, window-lit, window-unlit,
grass-voxel, grass-side, soil-side, fence-timber, crop-stalk,
corn-cob, sunflower maps, and island-side-blocks.
Keep them intentionally large and calm from the default/top-down camera; if
the whole island reads noisy, lower world-UV repeat before adding detail.
Ground path is brick/paver blockwork, not rock chips or gravel: keep path
terrain on path-pavers and avoid loose pebble overlays that make it read as
stone rubble. Ground grass and ground stone default back to the older calm
cottage-grass/cottage-stone maps; use the newer coarse maps on object
materials, side panels, or explicit user-selected terrain texture overrides
instead. Stone riser/side faces use a
separate large-block material (M.stoneSide) so cliffs can scale up without
changing the stone ground cap.
Home island edge grass/soil/rock strata is not a texture-map option: it is
the dedicated M.boardSideEdge shader material, aligned from TOP_H (the
visible grass-cap top) down a shallow side backing behind the foreground
greebles. It samples textures/island-side-strata-gpt.png, a fixed
1024x192 horizontal strata slice; keep that slice image-driven and the same
dimensions rather than rebuilding tall normalized procedural bands.
Grass richness should stay FPS-safe through shared texture maps (grass-voxel
or grass-side only when intentionally selected), not added blade meshes.
Stone blocks should stay light cool gray like the stair/column references
rather than tan or charcoal; fence timber should stay warm and use horizontal
grain bands so rails read correctly.texCottageGrass, texCottageWood, and the texture-folder atlases are still
useful for softer surfaces, but stone/path/roof/window/fence/crop references
should use the newer coarse maps when the requested style is square voxel
material.twSetTextureSRGB(texture) / texture.colorSpace = THREE.SRGBColorSpace and check flipY for GLTF compatibility.flipY = false), parse OBJ .mtl sidecars when present, warn when they are missing, and apply a deterministic TinyWorld palette fallback to blank palette/white materials so imports do not look like unpainted 3D prints.MeshStandardMaterial /
MeshPhysicalMaterial into TinyWorld-lit Lambert materials while preserving
base-color maps, vertex colors, transparency, emissive maps, skinning, and
morph flags. The app has no environment map, so metallic PBR GLBs otherwise
render nearly black beside native Lambert objects. Do not blindly preserve
occlusion or normal maps on that conversion path: black AO/ORM red channels
remove indirect lighting in the glTF spec, and broken/uniform normal maps can
dominate lighting. The model-stamp loader samples AO maps and drops black
ones, keeps non-color maps linear, and does not copy normal maps into the
TinyWorld-lit Lambert material. The scene also includes model-stamp import
safety fill lights so converted GLBs are not dependent on the shadow-casting
sun alone.opts.appearance themselves so world rendering, ghost previews, and selection previews share texture/color overrides; avoid applying the same model-stamp appearance again at the board render wrapper.economy metadata (fish, ore, plants, or meat) instead of
relying on material names, colors, or visual shape. Keep the visual asset
authoring separate from the authoritative economy tag.kind: "rock" and use appearance.oreMetal (copper, iron, silver,
gold). The built-in rock factories should render ore as natural stone
boulders with small embedded beveled metallic cubes, roughly a third of the
stone chunks' scale; do not turn the entire rock prop into metal.makeVoxelLiftEngine: mottled stone body, pipe-metal steel hubs/shaft, wood
crates/blades, and pale plank labels. Keep future engine material tweaks local
to that factory so terrain/object materials do not drift globally.appearance.fenceStyle: "garden"), not a separate object kind. They should stay dark timber with a
simple vine rail and small warm fruit accents, and still flow through the
contiguous fence span renderer for long runs.window.VoxelShield controls intact.makeStoneTower is the normal faceted/conical design and makeVoxelStoneTower is the voxel counterpart. Keep their silhouettes aligned when changing tower roof, balcony, window, door, or flag details. Castle/turret rendering should stay block-built: makeTurret delegates to the square voxel keep in makeVoxelTurret.models/ and ensure publish.sh copies them to dist/models/.vendor/three/tinyworld-three.r185.min.js (GLTFLoader, DRACOLoader, MeshoptDecoder, and KTX2Loader) and configure the loader before loading imported model stamps.
Surface remaining unsupported-extension errors instead of silently showing
the generic placeholder.Box3, center model at origin,userData,prop, propeller, blade, rotor, fan, wheel, flap.userData.landing pattern for placed cell objects.animatedCellObjects/runtime sets.MeshBasicMaterial; dispose particle materials when particles die.perl -0ne 'print $1 if m#<script>\s*(.*?)\s*</script>#s' tiny-world-builder.html | node --check../publish.sh copies any new assets into dist/.makeVoxelAnimal() in engine/world/09b-voxel-build-factories.js and animated by engine/world/70-animal-anim.js.userData.noVoxelBatch = true, expose parts under userData.anim, and register with window.__tinyworldRegisterAnimal(g) after rendering.world[x][z] or multiplayer harvest/resource state from this animation.__tinyworldAnimalTick(t, dt) hook from the main animation loop.f21f84b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.