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/obstaclePlacer - Track Obstacle Placement

Reference for `extensions/util/trackBuilder/obstaclePlacer.lua`. Places static and procedural obstacles (rocks, ramps, rings, etc.) along track segments.

Reference for extensions/util/trackBuilder/obstaclePlacer.lua. Places static and procedural obstacles (rocks, ramps, rings, etc.) along track segments.


Exports

KeySignatureDescription
placeObstacles(track)Places all obstacles for the entire track
placeProceduralObstacles(segment)Creates/updates procedural mesh obstacles for one segment
clearReferences()Clears all cached obstacle object references

Internals

  • Static obstacles use predefined .dae shapes: sharp1, sharp2, obstacle1, obstacle2 (rocks and sharp angles from GridMap).
  • Procedural obstacles use proceduralPrimitives to generate: ring, cube, cylinder, cone, bump, ramp.
  • Object pooling: Static obstacles are pooled per type via expandTruncateList. Excess objects are deleted; missing objects are created on demand.
  • Positioning: getAdjustedPosRotWidth(o, piece) computes the world position/rotation by interpolating along the segment's points based on o.offset (0–1 normalized position along the piece).
  • Anchoring: Each obstacle has an anchor value that offsets it laterally relative to the track width.
  • All objects are rotated 90° via turn90 quaternion to match the track coordinate system.

How It Works

  1. placeObstacles(track) iterates all pieces, collecting static obstacle placement data.
  2. For each obstacle type, the object pool is resized and objects are positioned/scaled/rotated.
  3. For each segment, placeProceduralObstacles handles procedural meshes:
    • Counts how many procedural obstacles the segment needs
    • Creates/destroys ProceduralMesh objects to match
    • Generates the mesh geometry (ring, cube, etc.) and sets position/rotation
  4. The obstaclesChanged flag on segments prevents unnecessary rebuilds.
-- Place all obstacles on the track
obstaclePlacer.placeObstacles(track)

-- Obstacle data structure on a piece:
piece.obstacles = {
  {value = 'ring', variant = '', offset = 0.5, position = vec3(0,0,1),
   rotation = quat(0,0,0,1), scale = vec3(2,0.5,1), anchor = 0,
   material = 'track_editor_A_border'}
}

Additional Exports

  • M.clearReferences - (undocumented)
  • M.placeObstacles - (undocumented)
  • M.placeProceduralObstacles - (undocumented)

trackBuilder/multiTrackMerger - Track Intersection Merging

Reference for `extensions/util/trackBuilder/multiTrackMerger.lua`. Creates procedural meshes at intersection points where multiple track segments meet, filling the gaps with bezier-interpolated surfac

trackBuilder/pieces - Track Piece Geometry Generation

Reference for `extensions/util/trackBuilder/pieces.lua`. Converts abstract track piece descriptions (forward, curve, spiral, loop, bezier) into concrete segment data with positions, headings, and cont

On this page

ExportsInternalsHow It WorksAdditional Exports