RLS Studios
ProjectsPatreonCommunityDocsAbout
Join Patreon
BeamNG Modding Docs

Guides

Reference

server/commands - Camera & Input Commandsge_utils - Game Engine Utility Functionsmain.lua - GE Lua Entry Point & Game Loopmap.lua - Navigation Graph (AI Road Map)screenshot.lua - Screenshot Systemserver/server - Level Loading & Game ServerserverConnection - Client-Server Connection Manager`setSpawnpoint` - Default Spawn Point Persistence`simTimeAuthority` - Simulation Time & Bullet Time Control`spawn` - Vehicle Spawning & Safe Placement`suspensionFrequencyTester` - Suspension Natural Frequency Analysis
Auto AnnotationBoosterCalibrate ESCCompile ImpostersCompile MeshesConfig List GeneratorDecal Roads EditorDependency TreeDoc CreatorExport (glTF)Follow The White RabbitForest GeneratorGround Model DebugInput System UtilsInstanced Line Render DemoJBeam StatsLog StreamsMap TilesNode Beam ExportNode StreamPhotomodePrecompile ShadersPrecompile VehiclesProcedural Track (Gymkhana Generator)Rectangle GeneratorRender Components APIResave MaterialsRich PresenceSave Dynamic DataScreenshot Creator (Vehicle Thumbnails)ShowroomSort LinesStep HandlerTerrain GeneratorTest Extension ProxiesTest JSON Files Syntaxutil/vehicleRopeDebug - Rope Physics Debug UIutil/worker - Batch Job Workerutil/wsTest - WebSocket Test Server
Track Builder - Basic BordersTrack Builder - Basic CentersTrack Builder - Border Wall MeshTrack Builder - Camera TransitionTrack Builder - Ceiling MeshtrackBuilder/markers - Track Marker Interpolation & VisualizationtrackBuilder/materialUtil - Track Material ManagementtrackBuilder/meshes - Cross-Section Mesh DefinitionstrackBuilder/multiTrackMerger - Track Intersection MergingtrackBuilder/obstaclePlacer - Track Obstacle PlacementtrackBuilder/pieces - Track Piece Geometry GenerationtrackBuilder/proceduralPrimitives - Procedural 3D Primitive GeneratorstrackBuilder/quickraceSetup - Quick Race Track LoadertrackBuilder/segmentToProceduralMesh - Segment Mesh GeneratortrackBuilder/splineTrack - Main Track Builder Engine

UI

Resources

BeamNG Game Engine Lua Cheat SheetGE Developer RecipesMCP Server Setup

// RLS.STUDIOS=true

Premium Mods for BeamNG.drive. Career systems, custom vehicles, and immersive gameplay experiences.

Index

HomeProjectsPatreon

Socials

DiscordPatreon (RLS)Patreon (Vehicles)

© 2026 RLS Studios. All rights reserved.

Modding since 2024

API ReferenceGE ExtensionsutiltrackBuilder

trackBuilder/splineTrack - Main Track Builder Engine

Reference for `extensions/util/trackBuilder/splineTrack.lua`. The central module of the track editor - manages track pieces, converts them to spline geometry, handles markers, materials, checkpoints,

Reference for extensions/util/trackBuilder/splineTrack.lua. The central module of the track editor - manages track pieces, converts them to spline geometry, handles markers, materials, checkpoints, intersections, and serialization.


Internal State

FieldTypeDescription
M.camDistancevariesAssigned as camDistance
M.emptyOffsetvariesAssigned as emptyOffset
M.fresnelSCvariesAssigned as fresnelSC
M.getHdgVectorvariesAssigned as getHdgVector
M.initialTrackPiecevariesAssigned as initialTrackPiece
M.interpolateFieldvariesAssigned as interpolateField
M.interpolateSegmentvariesAssigned as interpolateSegment
M.materialUtilvariesAssigned as materialUtil
M.offsetCurvevariesAssigned as offsetCurve
M.setAllPiecesToAsphaltvariesAssigned as setAllPiecesToAsphalt
M.spiralvariesAssigned as spiral

Public API

FunctionSignatureDescription
M.onPreRender(dt)-
M.positionTrackAboveVehicle()-
M.positionTrackBeforeCamera()-
M.rotateTrackToCamera()-
M.rotateTrackToTrackVehicle()-
M.getLastPieceWithMarker(markerName, lastIndex)-
M.setHighQuality(hq)-
M.stackToCursor()-
M.stack(count)-
M.applyStack(count, keep)-
M.deepcopy(orig)-
M.getStackCount()-
M.clearStack()-
M.getSelectedTrackInfo()-
M.setDefaultLaps(laps)-
M.setReversible(rev)-
M.setAllPiecesHighQuality()-
M.focusCameraOn(index, distance, force)-
M.unselectAll()-
M.refreshAllMaterials()-
M.invalidatePiece(index, types, force)-
M.calculateCustomPoints(piece)-
M.getArcPoints(segment)-
M.addOffsetCurve(len, off, hardness, index, replace)-
M.addSpiral(size, inside, dir, index, replace)-
M.addLoop(rad, off, index, replace)-
M.addEmptyOffset(xOff, yOff, zOff, dirOff, absolute, index, replace)-
M.rotateVectorByQuat(v, q)-
M.setSegmentMaterial(segment)-
M.exportTrackToTable()-
M.importTrackFromTable(import)-
M.loadJSON(originalFilename)-
M.save(filename, saveOptions)-
M.rename(oldName, newName)-
M.getCustomTracks()-
M.getPreviewNames()-
M.onClientEndMission()-
M.snapToGrid(point)-
M.getAllCheckpoints()-
M.convertToSpline()Generates bezier/arc/custom points for all invalid segments
M.createMarkers()Creates/updates 3D editor marker objects in the scene
M.curve(radius, angle, direction, hardness, radiusMult)Curve piece definition (delegated to pieceBuilder)
M.forward(length)Straight piece definition (delegated to pieceBuilder)
M.load(filename, instantHQ?, increasePointMult?, clearShapes?, silent?, ignoreCol?)Loads a track from file
M.loop(xOffset, radius, isHex)Loop piece definition (delegated to pieceBuilder)
M.measureTrack()Computes cumulative length along all segments
M.toSegments()Converts abstract pieces to concrete segments with positions/headings
M.getBezierPoints(segment)-
M.onCollectScreenshotMetadata(metadata)-
M.saveHistory()-
M.setIntersectionMesh(name, mesh)-
M.setIntersectionMaterial(name, center, border)-
M.getIntersection(name)-

Key Exports

Track Management

KeySignatureDescription
initTrack(noUnload?)Initializes a fresh track with default piece
unloadAll()Clears all track data, meshes, markers
removeTrack()Removes track meshes and markers from the scene
makeTrack(instantHQ?, ignoreCollision?)Full rebuild: segments → spline → interpolation → mesh
onUpdate()Per-frame quality upgrade timer

Piece Operations

KeySignatureDescription
addPiece(piece, index?, replace?)Adds a track piece
addForward(len, index?, replace?)Adds a straight segment
addCurve(len, hardness, dir, index?, replace?)Adds a curve
revert()Removes the last piece
removeAt(index)Removes a piece at a position
addClosingPiece()Closes the track loop

Sub-Tracks & Intersections

KeySignatureDescription
createNewSubTrack(position, hdg) → indexCreates a new sub-track
switchSubTrack(index)Switches active sub-track
removeSubTrack(index)Removes a sub-track
mergeMultiTrack(segments, centerMat?, borderMat?, borderMesh?)Creates an intersection
removeIntersection(name)Removes an intersection

Markers & Materials

KeySignatureDescription
markerChange(type, index, value)Changes a marker value (bank, width, height, etc.)
setMaterial(index, sub, field, material, fill?)Sets material for a segment
setMesh(index, field, mesh, fill?)Sets mesh type for a segment
showMarkers(show)Toggles editor marker visibility
focusMarkerOn(index, dontRefresh?, force?)Selects and focuses a piece

Positioning

KeySignatureDescription
setTrackPosition(x, y, z, hdg?, sub?)Sets track origin position/heading
getTrackPosition() → tableReturns current track position/heading/unit vectors
positionVehicle(reverse?, index?)Places player vehicle at track start
addCheckPointPositions(reverse?)Creates BeamNGWaypoint checkpoints for racing

Query

KeySignatureDescription
getPieceInfo(index?, sub?)Gets piece data or full track info
getSegmentInfo(index, sub?)Gets computed segment data
getEndOfTrack()Returns the last track segment

Internals

  • Two-layer architecture: subPieces holds abstract piece definitions; subTracks holds computed segment geometry.
  • Grid scaling: gridScale=4 (horizontal) and heightScale=1 (vertical) convert piece coordinates to world units.
  • Quality system: Segments start at quality 4 (low detail) and upgrade to 1 (full detail) via timers, preventing frame drops during editing.
  • Closed track detection: Automatically detects if first/last positions match within tolerance.
  • Bezier/Arc/Custom: Three point generation methods - bezier curves (most pieces), circular arcs (hardness=0 curves), and custom point arrays (loops).

How It Works

  1. Add pieces - user adds abstract pieces (forward, curve, etc.) to subPieces.
  2. toSegments() - converts pieces to concrete segments with positions/headings via pieceBuilder.
  3. convertToSpline() - generates bezier/arc/custom points for each invalid segment.
  4. measureTrack() - computes cumulative length along all segments.
  5. interpolate() - applies marker interpolation (bank, width, height, walls, checkpoints).
  6. materialize() - creates ProceduralMesh objects for segments needing refresh.
  7. createMarkers() - positions/updates 3D editor marker objects.
  8. placeObstacles() - places static and procedural obstacles.
-- Initialize and build a simple track
splineTrack.initTrack()
splineTrack.addForward(5)
splineTrack.addCurve(3, 0, 1) -- hex curve right
splineTrack.addForward(3)
splineTrack.makeTrack(true) -- instant high quality

-- Position vehicle and add checkpoints for racing
splineTrack.addCheckPointPositions(false)
splineTrack.positionVehicle(false)

Additional Exports

  • M.addCheckPointPositions - (undocumented)
  • M.addClosingPiece - (undocumented)
  • M.addCurve - (undocumented)
  • M.addForward - (undocumented)
  • M.addPiece - (undocumented)
  • M.createNewSubTrack - (undocumented)
  • M.focusMarkerOn - (undocumented)
  • M.getEndOfTrack - (undocumented)
  • M.getPieceInfo - (undocumented)
  • M.getSegmentInfo - (undocumented)
  • M.getTrackPosition - (undocumented)
  • M.initTrack - (undocumented)
  • M.makeTrack - (undocumented)
  • M.markerChange - (undocumented)
  • M.mergeMultiTrack - (undocumented)
  • M.onUpdate - (undocumented)
  • M.positionVehicle - (undocumented)
  • M.removeAt - (undocumented)
  • M.removeIntersection - (undocumented)
  • M.removeSubTrack - (undocumented)
  • M.removeTrack - (undocumented)
  • M.revert - (undocumented)
  • M.setMaterial - (undocumented)
  • M.setMesh - (undocumented)
  • M.setTrackPosition - (undocumented)
  • M.showMarkers - (undocumented)
  • M.switchSubTrack - (undocumented)
  • M.undo - (undocumented)
  • M.unloadAll - (undocumented)

trackBuilder/segmentToProceduralMesh - Segment Mesh Generator

Reference for `extensions/util/trackBuilder/segmentToProceduralMesh.lua`. Converts track segments (with computed spline points) into ProceduralMesh objects rendered in the scene.

AI Module Reference

Module defined in `lua/vehicle/ai.lua`. This module handles high-level artificial intelligence behaviors, including pathfinding, traffic simulation, and reactive driving modes (chase, flee, follow).

On this page

Internal StatePublic APIKey ExportsTrack ManagementPiece OperationsSub-Tracks & IntersectionsMarkers & MaterialsPositioningQueryInternalsHow It WorksAdditional Exports