Render of Hedge segment (2 m)
The 3D view loads a preview copy of this asset with the SDK.
Props and vegetation

Hedge segment (2 m)

2 m clipped hedge segment with hedge-2m connectors at both ends for chaining.

Placed as is: this asset has no customization options. Requests to change it are refused.

Size (W × H × D)
2.00 × 0.94 × 0.62 m
Triangles
288
GLB
21 KB

Part of the Stylized Town kit

Install with the CLI
npx agent-ready-assets add stylized-town/hedge-01@0.1.0 --to public/assets

Renders from 6 views

Hedge segment (2 m), front view
front
Hedge segment (2 m), back view
back
Hedge segment (2 m), left view
left
Hedge segment (2 m), right view
right
Hedge segment (2 m), top view
top
Hedge segment (2 m), perspective view
perspective

No customization options

Load and place it as is. Every customization request is refused with a structured error that names the alternatives.

Details

Specifications288 triangles · 21 KB
Dimensions (W × H × D)
2.00 × 0.94 × 0.62 m
Triangles
288
Materials / textures
2 / 0
GLB file
21 KB
Package download
40 KB
Animation clips
None
Engines
Three.js, React Three Fiber
Tested with
three 0.186.1; no decoders
In the tested scenes
Small town (2×), Explorable town (8×)
Connectors2 connectors

In a scene, a connector of this asset snaps to a compatible connector of another piece, so pieces are placed without coordinates.

ConnectorTypeSnaps to
anchor-hedge-westhedge-2mhedge-2m
anchor-hedge-easthedge-2mhedge-2m
Compatibility2 of 10 supported
FeatureStatusDetail
Placement (position / rotation in a scene)Supportedscene.json position_m (meters) and rotation_euler_rad (XYZ radians); free scene scaling is not supported
Connector snapping (scene 1.1.0 attach_to)Supportedtyped connectors: anchor-hedge-west (hedge-2m -> hedge-2m), anchor-hedge-east (hedge-2m -> hedge-2m); mates within 1 mm, opposed outward, aligned up
Material recolor (runtime, Blender-free)Not supportedno material-color capability is advertised for this version
Uniform scale (runtime, Blender-free)Not supportedno uniform-scale capability; scene uniform_scale must stay 1
Node visibility togglesNot supportedno node-visibility capability is advertised for this version
Modular part swapNot supportedno modular-swap capability is advertised for this version
AnimationsNot supportedstatic asset: no animation clips
Custom mesh editing / parametric geometry (e.g. slat count)Advanced onlyL4 authoring in Blender or another DCC; not possible with the SDK. declared.recipe_parameters are publisher-only knobs.
Baked texture recolorNot supportedtexture pixels are never edited by the SDK
GLB re-export of a customized assetNot supportedcustomization is a declarative JSON config applied at runtime; no modified GLB is written
Integration codeThree.js and React Three Fiber

The entry file your agent writes, generated from the catalog. Run the commands inside your project, where the SDK is installed.

Three.js

src/main.ts
// stylized-town/hedge-01@0.1.0 in a plain Three.js scene
// Generated by the Agent-Ready Assets integration guide (target: plain Three.js, SDK 0.5.1, tested with three 0.186.1).
// The files are served from this project's own public/ folder (installed with `npx agent-ready-assets ...`):
// no CDN at runtime, no decoders, no Blender.
import * as THREE from 'three';
import { AssetLibrary, isCustomizationError } from '@agent-ready-assets/runtime-three';

const KIT_URL = '/assets/stylized-town/kit.json';
const ASSET = 'stylized-town/hedge-01@0.1.0';

const renderer = new THREE.WebGLRenderer({ antialias: true, preserveDrawingBuffer: true });
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.outputColorSpace = THREE.SRGBColorSpace;
document.body.style.margin = '0';
document.body.appendChild(renderer.domElement);

const scene = new THREE.Scene();
scene.background = new THREE.Color('#e9e4da');
scene.add(new THREE.HemisphereLight(0xffffff, 0x8d7c64, 1.4));
const sun = new THREE.DirectionalLight(0xffffff, 2.0);
sun.position.set(4, 8, 5);
scene.add(sun);
const camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 0.05, 400);

/** Points the camera at everything that was loaded (3/4 view). */
function frame(target: THREE.Object3D): void {
  const box = new THREE.Box3().setFromObject(target);
  const center = box.getCenter(new THREE.Vector3());
  const radius = Math.max(box.getSize(new THREE.Vector3()).length() / 2, 0.5);
  const dist = radius / Math.sin(THREE.MathUtils.degToRad(camera.fov / 2));
  camera.position.copy(center).add(new THREE.Vector3(0.55, 0.5, 1).normalize().multiplyScalar(dist * 0.95));
  camera.lookAt(center);
  camera.updateProjectionMatrix();
}

window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
  renderer.render(scene, camera);
});

async function main(): Promise<void> {
  const library = await AssetLibrary.fromKit(KIT_URL); // verifies every file against the sha256 pins first
  const original = await library.loadAsset(ASSET);
  scene.add(original.object);
  // stylized-town/hedge-01@0.1.0 is L1 (load as-is): it advertises no customization capabilities, so any customize request is refused.
  frame(scene);
  renderer.render(scene, camera);
  renderer.domElement.dataset.ready = 'true'; // handy for tests: the scene finished loading
}

main().catch((error: unknown) => {
  // Unsupported or invalid customizations are refused with a structured error instead of being approximated.
  const message = isCustomizationError(error) ? `${error.code}: ${error.message}` : String(error);
  renderer.domElement.dataset.error = message;
  console.error(message);
});

React Three Fiber

src/main.tsx
// stylized-town/hedge-01@0.1.0 with React Three Fiber
// Generated by the Agent-Ready Assets integration guide (target: React Three Fiber, SDK 0.5.1, tested with three 0.186.1).
// Assets are served from this project's own public/ folder; no CDN, no Blender.
import { StrictMode, useEffect, useState } from 'react';
import { createRoot } from 'react-dom/client';
import { Canvas } from '@react-three/fiber';
import { Asset, AssetLibraryProvider } from '@agent-ready-assets/runtime-r3f';
import { AssetLibrary } from '@agent-ready-assets/runtime-three';

const KIT_URL = '/assets/stylized-town/kit.json';
const ASSET = 'stylized-town/hedge-01@0.1.0';

/** Marks the canvas once every <Asset> reported onReady (handy for tests). */
function useReadyFlag(expected: number): () => void {
  const [count, setCount] = useState(0);
  useEffect(() => {
    if (count >= expected) document.querySelector('canvas')?.setAttribute('data-ready', 'true');
  }, [count, expected]);
  return () => setCount((n) => n + 1);
}

function App({ library }: { library: AssetLibrary }) {
  const onReady = useReadyFlag(1);
  return (
    <Canvas camera={{ position: [2.6, 1.8, 3.8], fov: 40 }} gl={{ preserveDrawingBuffer: true }}>
      <color attach="background" args={['#e9e4da']} />
      <hemisphereLight args={[0xffffff, 0x8d7c64, 1.4]} />
      <directionalLight position={[4, 8, 5]} intensity={2} />
      <AssetLibraryProvider library={library}>
        <Asset assetId={ASSET} position={[-1.5, 0, 0]} onReady={onReady} onError={(e) => console.error(e)} />
      </AssetLibraryProvider>
    </Canvas>
  );
}

AssetLibrary.fromKit(KIT_URL).then(
  (library) => createRoot(document.getElementById('root')!).render(<StrictMode><App library={library} /></StrictMode>),
  (error: unknown) => console.error(error),
);
Quality reportAutomated checks passed

Every automated check that applies passed on this exact file, including glTF validity, scale and pivots, materials and a Three.js render in Chromium. The asset was released after review.

These are the publisher's own automated checks, not an independent certification.

Read the full report