Export Formats
Your vegetation. Your data. Save manifests locally or push them straight to poqpoq World.
Vegetation Manifest
The Landscaper manifest is a JSON document that describes every placed instance: position, rotation, scale, species, and layer membership. It's the universal interchange format — any renderer can read it and populate a scene.
{
"version": "1.0",
"timestamp": "2025-12-15T14:30:00.000Z",
"instanceId": "world-abc-123",
"regionBounds": {
"type": "bounds",
"minX": -128, "maxX": 128,
"minZ": -128, "maxZ": 128
},
"layers": [
{
"layerId": "layer-pine",
"speciesId": "pine",
"algorithm": "poisson",
"instances": [
{
"position": { "x": 12.5, "y": 3.2, "z": -45.8 },
"rotation": { "x": 0, "y": 2.14, "z": 0 },
"scale": { "x": 1.1, "y": 1.1, "z": 1.1 }
}
]
}
],
"stats": {
"treeCount": 200,
"triangleCount": 850000
}
}
Manifest Structure
| Field | Type | Description |
|---|---|---|
version | string | Manifest format version ("1.0") |
timestamp | string | ISO 8601 creation timestamp |
instanceId | string? | World instance UUID (present when exported from World mode) |
regionBounds | object | Scatter region boundaries (minX, maxX, minZ, maxZ) |
layers | array | Array of layer entries, each containing instances |
stats | object | Summary statistics (tree count, triangle count) |
Export Methods
Local Download (JSON)
Click the download button to save the manifest as a JSON file. The filename includes the date: landscaper-2025-12-15.json. This is a standard browser download — the file is created client-side via the File API. No server involved.
Save to World (postMessage)
When running inside poqpoq World, click Save to World to send the manifest directly to the parent World app via postMessage. The World app receives the manifest and persists it via NEXUS. No file download needed.
Using Manifests
A manifest is renderer-agnostic. Any Three.js, Babylon.js, or custom renderer can parse it and create instances. The typical workflow:
- Parse the manifest — Read JSON, iterate layers and instances
- Look up species — Use
speciesIdto find the generator or model - Create instances — Generate meshes and place them at the recorded positions with recorded transforms
- Optimize rendering — Use instanced meshes, LOD cascades, or billboards for performance
// Loading a manifest in any Three.js app
const manifest = JSON.parse(jsonString)
for (const layer of manifest.layers) {
for (const inst of layer.instances) {
const mesh = generateSpecies(layer.speciesId)
mesh.position.set(inst.position.x, inst.position.y, inst.position.z)
mesh.rotation.set(inst.rotation.x, inst.rotation.y, inst.rotation.z)
mesh.scale.set(inst.scale.x, inst.scale.y, inst.scale.z)
scene.add(mesh)
}
}
Manifests include both algorithmically scattered and brush-painted objects. Every instance in the scene at export time is captured — regardless of how it was placed. This means you can freely mix scatter and brush workflows and get a complete manifest.
OpenSim Compatibility
Species IDs map to OpenSim state IDs (0–20), ensuring manifests generated by Landscaper can be translated to Second Life / OpenSimulator tree objects. The species registry maintains this mapping.