Skip to content
Work in progress. These docs describe Spawnite at launch, and some parts are still being built.

createGroundSurface

createGroundSurface(values?, terrain?): Readonly<{ baseHeights: Float64Array<ArrayBuffer>; cell: number; getHeightAt: (position) => number; getNormalAt: (position, target) => Vector3; isUnderWaterAt: (position) => boolean; map: Readonly<{ cell: number; ground: { base: string; rules: readonly object[]; steep: string; steepAbove: number; }; hills: Readonly<{ amplitude: number; detail: number; wavelength: number; }>; materials: Readonly<Record<string, { animate?: { frames?: number; frameTime?: number; scroll?: …[]; }; bumps?: number; cover?: { colour?: string; density?: number; height?: number; kind: Grass; sway?: boolean; }; from?: string; hexTiling?: boolean; rotate?: boolean; sharpness?: number; texture?: string; tile?: number; tint?: string; tintAmount?: number; wet?: boolean; }>>; paths: Readonly<Record<string, Readonly<{ fade: number; halfWidth: number; points: readonly readonly [number, number][]; surface?: "dirt" | "stone" | "sand"; }>>>; props: Readonly<Record<string, Readonly<{ color: string; kind: PropShape; position: readonly […, …] | readonly […, …, …]; scale: number | readonly […, …, …]; size: readonly [number, number, number]; yaw: number; }> | Readonly<{ kind: ScatterKind; position: readonly […, …] | readonly […, …, …]; scale: number; yaw: number; }> | Readonly<{ model: string; position: readonly […, …] | readonly […, …, …]; scale: number | readonly […, …, …]; yaw: number; }>>>; regions: Readonly<Record<string, Readonly<{ center: readonly [number, number]; fade: number; hills: Readonly<{ amplitude: number; detail: number; wavelength: number; }>; material?: string; radius: number; scatter: Readonly<{ bushRound: number; clearing: number; grassTuft: number; rockBoulder: number; rockFlat: number; seedOffset: number; treeRound: number; treeTall: number; }>; }>>>; revision?: number; rim: number; scatter: Readonly<{ bushRound: number; grassTuft: number; rockBoulder: number; rockFlat: number; seedOffset: number; treeRound: number; treeTall: number; }>; sea?: number; seed: number; size: number; terrain?: { base: Readonly<{ hills: Readonly<{ amplitude: number; detail: number; wavelength: number; }>; paths: Readonly<Record<string, Readonly<…>>>; regions: Readonly<Record<string, Readonly<…>>>; rim: number; seed: number; }>; blend?: string[]; cell: number; erased?: Partial<Record<ScatterFamily, […, …][]>>; height?: string[]; overlay?: string[]; paint?: string[]; palette?: string[]; scatter?: Partial<Record<ScatterFamily, string[]>>; size: number; }; views: Readonly<Record<string, Readonly<{ eye: readonly [number, number, number]; fov: number; ortho?: number; target: readonly [number, number, number]; }>>>; }>; offsets: Float64Array<ArrayBufferLike>; sea: number; seed: number; segments: number; size: number; terrain: Pick<{ base: Readonly<{ hills: Readonly<{ amplitude: number; detail: number; wavelength: number; }>; paths: Readonly<Record<string, Readonly<{ fade: …; halfWidth: …; points: …; surface?: …; }>>>; regions: Readonly<Record<string, Readonly<{ center: …; fade: …; hills: …; material?: …; radius: …; scatter: …; }>>>; rim: number; seed: number; }>; blend?: string[]; cell: number; erased?: Partial<Record<ScatterFamily, [number, number][]>>; height?: string[]; overlay?: string[]; paint?: string[]; palette?: string[]; scatter?: Partial<Record<ScatterFamily, string[]>>; size: number; }, "height" | "size" | "overlay" | "cell" | "paint" | "blend" | "scatter" | "palette" | "erased"> | undefined; getPathDistanceAt: number; getPathSurfaceAt: { surface: NonNullable<"dirt" | "stone" | "sand" | undefined>; weight: number; } | undefined; getPointAt: Vector3; getRegionWeightsAt: number[]; getShoreDistanceAt: number; getSlopeAt: number; }>

The map’s ground: its base baked from the hills, the regions, the paths and the rim, then its terrain’s offsets added over it: the map’s own terrain block, or terrain where given, as the editor’s newest write is. Terrain written for another grid is refused.

Parameter Type Default value
values TerrainMap terrainMap
terrain? Pick<{ base: Readonly<{ hills: Readonly<{ amplitude: number; detail: number; wavelength: number; }>; paths: Readonly<Record<string, Readonly<{ fade: number; halfWidth: number; points: readonly readonly […, …][]; surface?: "dirt" | "stone" | "sand"; }>>>; regions: Readonly<Record<string, Readonly<{ center: readonly [number, number]; fade: number; hills: Readonly<{ amplitude: …; detail: …; wavelength: …; }>; material?: string; radius: number; scatter: Readonly<{ bushRound: …; clearing: …; grassTuft: …; rockBoulder: …; rockFlat: …; seedOffset: …; treeRound: …; treeTall: …; }>; }>>>; rim: number; seed: number; }>; blend?: string[]; cell: number; erased?: Partial<Record<ScatterFamily, [number, number][]>>; height?: string[]; overlay?: string[]; paint?: string[]; palette?: string[]; scatter?: Partial<Record<ScatterFamily, string[]>>; size: number; }, "height" | "size" | "overlay" | "cell" | "paint" | "blend" | "scatter" | "palette" | "erased"> undefined

Readonly<{ baseHeights: Float64Array<ArrayBuffer>; cell: number; getHeightAt: (position) => number; getNormalAt: (position, target) => Vector3; isUnderWaterAt: (position) => boolean; map: Readonly<{ cell: number; ground: { base: string; rules: readonly object[]; steep: string; steepAbove: number; }; hills: Readonly<{ amplitude: number; detail: number; wavelength: number; }>; materials: Readonly<Record<string, { animate?: { frames?: number; frameTime?: number; scroll?: …[]; }; bumps?: number; cover?: { colour?: string; density?: number; height?: number; kind: Grass; sway?: boolean; }; from?: string; hexTiling?: boolean; rotate?: boolean; sharpness?: number; texture?: string; tile?: number; tint?: string; tintAmount?: number; wet?: boolean; }>>; paths: Readonly<Record<string, Readonly<{ fade: number; halfWidth: number; points: readonly readonly [number, number][]; surface?: "dirt" | "stone" | "sand"; }>>>; props: Readonly<Record<string, Readonly<{ color: string; kind: PropShape; position: readonly […, …] | readonly […, …, …]; scale: number | readonly […, …, …]; size: readonly [number, number, number]; yaw: number; }> | Readonly<{ kind: ScatterKind; position: readonly […, …] | readonly […, …, …]; scale: number; yaw: number; }> | Readonly<{ model: string; position: readonly […, …] | readonly […, …, …]; scale: number | readonly […, …, …]; yaw: number; }>>>; regions: Readonly<Record<string, Readonly<{ center: readonly [number, number]; fade: number; hills: Readonly<{ amplitude: number; detail: number; wavelength: number; }>; material?: string; radius: number; scatter: Readonly<{ bushRound: number; clearing: number; grassTuft: number; rockBoulder: number; rockFlat: number; seedOffset: number; treeRound: number; treeTall: number; }>; }>>>; revision?: number; rim: number; scatter: Readonly<{ bushRound: number; grassTuft: number; rockBoulder: number; rockFlat: number; seedOffset: number; treeRound: number; treeTall: number; }>; sea?: number; seed: number; size: number; terrain?: { base: Readonly<{ hills: Readonly<{ amplitude: number; detail: number; wavelength: number; }>; paths: Readonly<Record<string, Readonly<…>>>; regions: Readonly<Record<string, Readonly<…>>>; rim: number; seed: number; }>; blend?: string[]; cell: number; erased?: Partial<Record<ScatterFamily, […, …][]>>; height?: string[]; overlay?: string[]; paint?: string[]; palette?: string[]; scatter?: Partial<Record<ScatterFamily, string[]>>; size: number; }; views: Readonly<Record<string, Readonly<{ eye: readonly [number, number, number]; fov: number; ortho?: number; target: readonly [number, number, number]; }>>>; }>; offsets: Float64Array<ArrayBufferLike>; sea: number; seed: number; segments: number; size: number; terrain: Pick<{ base: Readonly<{ hills: Readonly<{ amplitude: number; detail: number; wavelength: number; }>; paths: Readonly<Record<string, Readonly<{ fade: …; halfWidth: …; points: …; surface?: …; }>>>; regions: Readonly<Record<string, Readonly<{ center: …; fade: …; hills: …; material?: …; radius: …; scatter: …; }>>>; rim: number; seed: number; }>; blend?: string[]; cell: number; erased?: Partial<Record<ScatterFamily, [number, number][]>>; height?: string[]; overlay?: string[]; paint?: string[]; palette?: string[]; scatter?: Partial<Record<ScatterFamily, string[]>>; size: number; }, "height" | "size" | "overlay" | "cell" | "paint" | "blend" | "scatter" | "palette" | "erased"> | undefined; getPathDistanceAt: number; getPathSurfaceAt: { surface: NonNullable<"dirt" | "stone" | "sand" | undefined>; weight: number; } | undefined; getPointAt: Vector3; getRegionWeightsAt: number[]; getShoreDistanceAt: number; getSlopeAt: number; }>